Koden jag har skrivit ser ut som följande:
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
void main()
{
int n=0;
int i=0;
char c[20];
char filnamn[100];
cout<<"Vilken fil skall kontrolleras: ";
cin>>setw(100)>>filnamn;
ifstream lasfil(filnamn);
if(!lasfil)
{
cout<<"Filen finns ej eller kan ej oppnas"<<endl<<endl;
exit(EXIT_FAILURE);
}
while(!lasfil.eof())
{
lasfil.get(c, 20, ' ');
cout<<c;
}
}
Tanken är att programmet ska läsa in ett ord i taget från en textfil så att jag kan räkna ut vissa saker såsom antal ord, ordlängd m.m. Jag har nu lyckats få till det så att den i alla fall bara läser ett ord i taget men efter att den har läst in ett ord, fortsätter den inte med nästa o.s.v. cout-kommandot inne i while-satsen är bara till för att kolla om programmet läser in ett ord i taget men alla ord. Filen som jag testar på ser ut som följer:
Fact About the EU
EU is short for European Union. The EU is an organisation with 15 member states.
Sweden became a member in 1995. Within the EU, the member states cooperate, for example,
in areas such as the common market, foreign affairs and judicial matters. Cooperation
within the EU is extensive but does not cover all policies. Many issues are still being
dealt with by each member state separately. This holds for matters such as health care,
defence, school policy and housing policy.
PeWMedlem sedan juni 200010 432 inlägg Tjenare och välkommen till wF :)
Använd gärna kodtaggarna ([ kod]..[ /kod], men utan mellanslag mellan [ och k resp [ och /) när du postar kod. Blir så mycket lättare att läsa koden då ;)
Vet inte varför du låser dig vid en chararray om 20 element när du kan använda <string> och då inte behöva bry dig om hur många bokstäver som finns i ett ord. Men bortsett från det, för att läsa in text, kan du ivf byta ut din loop mot:
while(!lasfil.eof())
{
lasfil >> c;
cout<<c;
}
Så kommer varje ord automagiskt att ligga i array c vid varje varv i loopen.
Hur gör jag då för att räkna ordstorlek och meningslängd?
Jag hade precis hittat en annan lösning som i alla fall fungerade, men det känns som om din var lite lättare och mindre komplicerad. Om jag nu vill göra samma sak fast räkna antal meningar i texten samt antal bokstäver i varje ord, hur skall jag göra då? Det måste vara någon sorts kod för att bestämma var en mening tar slut, typ en punkt. Men jag kommer inte på något vidare bra sätt att lösa det på. Sen måste det väl bara finnas någon typ av räknefunktion så att man kan räkna storleken på varje <string> inbyggt i C++?
Jag har lyckats med att räkna antal bokstäver i varje ord, hittade en inbyggd funktion size som kunde räkna ut antal tecken i en sträng. Men nu har jag ett problem till, och det är att räkna ut hur många meningar texten innehåller. Har någon en idé på hur man skulle kunna lösa det?
UlfTMedlem sedan maj 20018 027 inlägg Räkna hur många gånger du träffar på "." i texten.
Det tycker jag också låter som en bra lösning, och jag har testat det på flera olika sätt men inte lyckats hitta något sätt att göra det på. Är det någon som har en lösning på det?
Programmet ser nu ut så här:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
void main()
{
int ord=0;
int longord=0;
string c;
char filnamn[100];
cout<<"Vilken fil skall kontrolleras: ";
cin>>setw(100)>>filnamn;
ifstream lasfil(filnamn);
if(!lasfil)
{
cout<<"Filen finns ej eller kan ej oppnas"<<endl<<endl;
exit(EXIT_FAILURE);
}
while(!lasfil.eof())
{
lasfil>>c;
ord++;
if(c.size()>6)
longord++;
}
cout<<longord<<endl;
cout<<ord;
}
THX
PeWMedlem sedan juni 200010 432 inlägg Att räkna punkt funkar väl? Isf är det väl bara att kasta in en liten funktion som gör det åt en för varje varv i loopen som läser in orden.
char check(char *word)
{
while(*word++)
if(*word=='.')
return 1;
return 0;
}
//din main
...
...
//anropas med
if(check(c)) //punkt eller inte?
sentence++;
Det verkar helt vettigt! Tackar!
Men vad tycker du om räkningen för att kolla om ett ord är längre än 6 bokstäver? Har kommit fram till att i vissa fall räknar programmet en punkt som en bokstav i ett ord. Detta skall programmet naturligtvis inte göra, men hur kommer jag undan det som? Måste jag ändra helt och hållet på räkningen av detta eller går det att dra bort en punkt eller liknande?
Tyvärr fungerar inte detta verkar det som, jag har nu skrivit in koden du skrev men får ändå ett felmeddelande:
error C2664: 'check' : cannot convert parameter 1 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char>
>' to 'char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Error executing cl.exe.
Den klagar på anropsraden till funktionen:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
char check(char *word)
{
while(*word++)
if(*word=='.')
return 1;
return 0;
}
void main()
{
int ord=0;
int longord=0;
int sentence=0;
string c;
char filnamn[100];
cout<<"Vilken fil skall kontrolleras: ";
cin>>setw(100)>>filnamn;
ifstream lasfil(filnamn);
if(!lasfil)
{
cout<<"Filen finns ej eller kan ej oppnas"<<endl<<endl;
exit(EXIT_FAILURE);
}
while(!lasfil.eof())
{
lasfil>>c;
ord++;
if(c.size()>6)
longord++;
}
[red] if(check(c)) //det är denna rad den klagar på[/red]
sentence++;
cout<<longord<<endl;
cout<<ord;
}
Jag har inte en aning vad felmeddelandet betyder, men antar att det har något med datatyperna att göra.
PeWMedlem sedan juni 200010 432 inlägg Jaha. Det är för att du böt ut char mot std::string för 'c'. Problemet avhjälps kanske med att du i anropet gör check(c.c_str()) istället. Lägg även till ett 'const' i funktionen check så att det blir check(const char *word)
Jag har nu fått till det så att programmet inte räknar med punkterna när det räknar ut om orden är längre än 6 bokstäver långa. Men nu har ett till problem dykt upp, nämligen att kommatecknen åxå räknas med när ordlängden ska räknas. Jag har försökt att lösa det på liknande sätt men inte lyckats med det. Är det någon duktig som vet hur man kan lösa detta?
Koden ser nu ut som följande:
void main()
{
int ord=0;
int longord=0;
int meningar=0;
int ordlangd=0;
string c;
char filnamn[100];
cout<<"Vilken fil skall kontrolleras: ";
cin>>setw(100)>>filnamn;
ifstream lasfil(filnamn);
if(!lasfil)
{
cout<<"Filen finns ej eller kan ej oppnas"<<endl<<endl;
exit(EXIT_FAILURE);
}
while(!lasfil.eof())
{
lasfil>>c;
ord++;
if(c[c.size()-1]=='.')
{
meningar++;
if(c.size()>7)
longord++;
}
else if(c.size()>6)
longord++;
}
cout<<meningar<<endl;
cout<<longord<<endl;
cout<<ord;
}
PeWMedlem sedan juni 200010 432 inlägg Är väl bara att du upprepar det du gör med punkten fast med komma, som ytterligare en else if mittemellan den nuvarande "else if'en" och "if'en".
void main()
är helt, helt fel.
Det skall vara
int main()
Det kommer inte att hjälpa det problem du för tillfället försöker lösa, men tro mig, det kan komma att underlätta i framtiden.
Så här ser programmet ut när det blev klart:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
double rakna(double, double, double);
void utskrift(double, double, double, double);
void main()
{
double ord=0;
double longord=0;
double meningar=0;
double index=0;
string c;
char filnamn[100];
cout<<"Vilken fil skall kontrolleras: ";
cin>>setw(100)>>filnamn;
ifstream lasfil(filnamn);
if(!lasfil)
{
cout<<"Filen finns ej eller kan ej oppnas"<<endl<<endl;
exit(EXIT_FAILURE);
}
while(!lasfil.eof())
{
lasfil>>c;
ord++;
if(c[c.size()-1]=='.')
{
meningar++;
if(c.size()>7)
longord++;
}
else if (isalpha(c[c.size() - 1]) || isdigit(c[c.size() - 1]))
{
if (c.size() > 6)
longord++;
}
else if (c.size() > 7)
longord++;
}
index=rakna(ord, longord, meningar);
utskrift(ord, longord, meningar, index);
}
double rakna(double ord, double longord, double meningar)
{
double index=0;
return ord/meningar+100*(longord/ord);
}
void utskrift(double ord, double longord, double meningar, double index)
{
cout<<endl<<"Antalet ord i texten: "<<ord<<endl;
cout<<"Antalet ord med mer an 6 bokstaver i texten: "<<longord<<endl;
cout<<"Antalet meningar i texten: "<<meningar<<endl<<endl;
cout<<"Textens lasbarhetsindex ar: "<<index<<endl<<endl;
}
PeWMedlem sedan juni 200010 432 inlägg Om du anser dig färdig med lösningen kan du markera inlägget som "accepterat" eller vad det nu står. Det blir då enklare för folk att hitta rätt vid sökning.
PeWMedlem sedan juni 200010 432 inlägg Det bör väl finnas en länk under "rapportera till moderatorn" som heter "Acceptera som slutgiltigt svar" (Är nog bara synlig för dig - tror jag) vid det inlägget som du väljer som lösning.