praegune kellaaeg 20.06.2025 00:40:12
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
õppur01
HV vaatleja
liitunud: 22.03.2012
|
09.05.2012 00:28:51
Küsimus c++ kohta? |
|
|
Üritan siin teha programmi mis loeks mingi faili sõnad kokku ning väljastaks iga sõna korduvus arvu nt:
Kokku sõnu 190:
13 Mina
7 tegi
7 päike
Nimelt ma ei saa aru, kus ma siin vea teen või mille ma jätan panemata. Oskab keegi äkki aidata?
c++:
|
#include <iostream> #include <stdio.h> #include <string.h> #define N 200 using namespace std; int main() { char sonad[N][200]; int loend[N]; const char *failinimi= "C:\\Mingi\\T.txt"; //topeltkriipsud peavad olema, siis leiab faili ja siis ta mahub 1-le reale ilma vahedeta ära FILE *fp; //avame faili char rida[120]; int ridu=0, i=0, j, marke=0, sonu=0, tahti=0, loend[26], maks=0; //massiiv char mark; fp=fopen(failinimi, "r"); if(!fp){printf("Faili %s ei leia!\n", failinimi); return 1;} for(i=0;i<26;loend[i++]=0); while(!feof(fp)){ fgets(rida, 120, fp); ridu++, i=0; if(rida[0]=='\n')continue; while(mark=rida[i++]){ if(mark!='\n')marke++; //pole reavahetust else sonu++; if(mark==' ')sonu++; if(mark>='A'&& mark<='Z'){tahti++; loend[mark-'A']++;} if(mark>='a'&& mark<='z'){tahti++; loend[mark-'a']++;} } while(!feof(fp)){ fgets(rida, sizeof(rida), fp); strtok(rida, " "); strcpy(sonad[i],strtok(NULL, "\n")); //igaksjuhuks \n reavahetuskood. Tühikut ei tohi olla, sest muidu ei loe ta perekonna nimesid välja!!!! //eraldame eesnimed strtok(sonad[i], " "); loend[i]=1; for(j=0;j<i;j++)if(!strcmp(sonad[i], sonad[j]))loend[i]++; if(loend[i]>maks)maks=loend[i]; printf("%d. %s\n", loend[i], kuva(sonad[i])); i++; } } fclose(fp); printf("Faili T.txt statistika on:\n"); printf("\t %3d sona\n", sonu);
|
|
|
tagasi üles |
|
 |
napoleon
Unknown virus

liitunud: 08.12.2008
|
09.05.2012 09:39:56
|
|
|
See teine while, kus sees samuti fgets on keerab asja igal juhul peeti kui ma millestki väga valesti aru ei saanud. Lisaks proovi kood ikka treppi kirjutada, näiteks nii
c++:
|
using namespace std; int main() { char sonad[N][200]; int loend[N]; const char *failinimi="C:\\Mingi\\T.txt"; //topeltkriipsud peavad olema, siis leiab faili ja siis ta mahub 1-le reale ilma vahedeta ära FILE *fp; //avame faili char rida[120]; int ridu=0, i=0, j, marke=0, sonu=0, tahti=0, loend[26], maks=0; //massiiv char mark; fp=fopen(failinimi, "r"); if(!fp) { printf("Faili %s ei leia!\n", failinimi); return 1; } for(i=0;i<26;loend[i++]=0); while(!feof(fp)) { fgets(rida, 120, fp); ridu++, i=0; if(rida[0]=='\n') continue; while(mark=rida[i++]) { if(mark!='\n') marke++; //pole reavahetust else sonu++; if(mark==' ') sonu++; if(mark>='A'&& mark<='Z') { tahti++; loend[mark-'A']++; } if(mark>='a'&& mark<='z') { tahti++; loend[mark-'a']++; } } while(!feof(fp)) { fgets(rida, sizeof(rida), fp); strtok(rida, " "); strcpy(sonad[i],strtok(NULL, "\n")); //igaksjuhuks \n reavahetuskood. Tühikut ei tohi olla, sest muidu ei loe ta perekonna nimesid välja!!!! //eraldame eesnimed strtok(sonad[i], " "); loend[i]=1; for(j=0;j<i;j++) if(!strcmp(sonad[i], sonad[j])) loend[i]++; if(loend[i]>maks) maks=loend[i]; printf("%d. %s\n", loend[i], kuva(sonad[i])); i++; } } fclose(fp); printf("Faili T.txt statistika on:\n"); printf("\t %3d sona\n", sonu);
|
kas while/if/for/...(...){ või
while/if/for/...(...)
{
on muidugi maitse asi, mulle meeldib viimane rohkem.
Veel vihjeks, et while(feof(...)) pole antud juhul otseselt vajalik, võid kirjutada otse while(fgets(...))
|
|
Kommentaarid: 77 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
60 |
|
tagasi üles |
|
 |
Urmet
HV vaatleja
liitunud: 29.07.2005
|
24.05.2012 20:33:49
|
|
|
Esiteks on su kood puhas C, kui see #include <iostream> välja arvata.
Aga milles mittetöötamine täpselt avaldub? Ma ei ole kompilaatorit leidnud, mis oleks nõus seda koodi kompileerima, et ise saaks järgi katsetada.
|
|
Kommentaarid: 10 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
10 |
|
tagasi üles |
|
 |
matik
HV kasutaja
liitunud: 28.05.2008
|
24.05.2012 21:02:38
|
|
|
Silma hakkas see, et N on defineeritud 200 peale
loendi pikkuseks on defineeritud samuti 200
Initsialiseerid aga vaid esimesed 26 loendi elementi
for(i=0;i<26;loend[i++]=0);
Treppimisest, kommentaaridest ja klassidest oleks kõvasti abi, kõik on kuidagi väga koos ja üsna arusaamatu
edit: kummaline, leidsin et hiljem on defineeritud ka loend nii:
int loend[26];
see asi ei kompileeru ilmselt üldse ma pakun.
|
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|