Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Küsimus c++ kohta? märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
õppur01
HV vaatleja

liitunud: 22.03.2012




sõnum 09.05.2012 00:28:51 Küsimus c++ kohta? vasta tsitaadiga

Ü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++:
  1.  
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #define N 200
  6.  
  7. using namespace std;
  8. int main()
  9. {
  10.     char sonad[N][200];
  11.     int loend[N];
  12.     const char *failinimi=
  13.     "C:\\Mingi\\T.txt"; //topeltkriipsud peavad olema, siis leiab faili ja siis ta mahub 1-le reale ilma vahedeta ära
  14.     FILE *fp; //avame faili
  15.     char rida[120];
  16.     int ridu=0, i=0, j, marke=0, sonu=0, tahti=0, loend[26], maks=0; //massiiv
  17.     char mark;
  18.     fp=fopen(failinimi, "r");
  19.     if(!fp){printf("Faili %s ei leia!\n", failinimi); return 1;}
  20.     for(i=0;i<26;loend[i++]=0);
  21.     while(!feof(fp)){
  22.     fgets(rida, 120, fp); ridu++, i=0;
  23.     if(rida[0]=='\n')continue;
  24.     while(mark=rida[i++]){
  25.     if(mark!='\n')marke++; //pole reavahetust
  26.     else sonu++;
  27.     if(mark==' ')sonu++;
  28.     if(mark>='A'&& mark<='Z'){tahti++; loend[mark-'A']++;}
  29.     if(mark>='a'&& mark<='z'){tahti++; loend[mark-'a']++;}
  30.     }
  31.         while(!feof(fp)){
  32.         fgets(rida, sizeof(rida), fp);
  33.         strtok(rida, " ");
  34.         strcpy(sonad[i],strtok(NULL, "\n")); //igaksjuhuks \n reavahetuskood. Tühikut ei tohi olla, sest muidu ei loe ta perekonna nimesid välja!!!!
  35.         //eraldame eesnimed
  36.         strtok(sonad[i], " ");
  37.         loend[i]=1;
  38.         for(j=0;j<i;j++)if(!strcmp(sonad[i], sonad[j]))loend[i]++;
  39.         if(loend[i]>maks)maks=loend[i];
  40.         printf("%d. %s\n", loend[i], kuva(sonad[i]));
  41.         i++;
  42.     }
  43.     }
  44.     fclose(fp);
  45.     printf("Faili T.txt statistika on:\n");
  46.     printf("\t %3d sona\n", sonu);
tagasi üles
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 09.05.2012 09:39:56 vasta tsitaadiga

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++:
  1. using   namespace  std;
  2. int     main()
  3. {
  4.         char    sonad[N][200];
  5.         int     loend[N];
  6.         const   char       *failinimi="C:\\Mingi\\T.txt"//topeltkriipsud peavad   olema,     siis leiab    faili       ja     siis ta       mahub  1-le      reale ilma     vahedeta     ära
  7.         FILE    *fp;        //avame faili
  8.         char    rida[120];
  9.         int     ridu=0,      i=0,  j,        marke=0,        sonu=0, tahti=0, loend[26],       maks=0;        //massiiv
  10.         char    mark;
  11.         fp=fopen(failinimi,     "r");
  12.         if(!fp)
  13.         {
  14.                 printf("Faili   %s ei       leia!\n",      failinimi);   
  15.                 return  1;
  16.         }
  17.         for(i=0;i<26;loend[i++]=0);
  18.         while(!feof(fp))
  19.         {
  20.                 fgets(rida,     120, fp);     
  21.                 ridu++, i=0;
  22.                 if(rida[0]=='\n')
  23.                         continue;
  24.                 while(mark=rida[i++])
  25.                 {
  26.                         if(mark!='\n')
  27.                                 marke++;        //pole  reavahetust
  28.                         else   
  29.                                 sonu++;
  30.                         if(mark=='      ')
  31.                                 sonu++;
  32.                         if(mark>='A'&&  mark<='Z')
  33.                         {
  34.                                 tahti++;       
  35.                                 loend[mark-'A']++;
  36.                         }
  37.                         if(mark>='a'&&  mark<='z')
  38.                         {
  39.                                 tahti++;       
  40.                                 loend[mark-'a']++;
  41.                         }
  42.                 }
  43.                 while(!feof(fp))
  44.                 {
  45.                         fgets(rida,     sizeof(rida),        fp);
  46.                         strtok(rida,    "   ");
  47.                         strcpy(sonad[i],strtok(NULL,    "\n"));     //igaksjuhuks        \n      reavahetuskood.       Tühikut       ei     tohi olla,    sest        muidu   ei loe      ta    perekonna   nimesid    välja!!!!
  48.                         //eraldame      eesnimed
  49.                         strtok(sonad[i],        "       ");
  50.                         loend[i]=1;
  51.                         for(j=0;j<i;j++)
  52.                                 if(!strcmp(sonad[i],    sonad[j]))
  53.                                         loend[i]++;
  54.                         if(loend[i]>maks)
  55.                                 maks=loend[i];
  56.                         printf("%d.     %s\n",       loend[i],      kuva(sonad[i]));
  57.                         i++;
  58.                 }
  59.         }
  60.         fclose(fp);
  61.         printf("Faili   T.txt      statistika    on:\n");
  62.         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
vaata kasutaja infot saada privaatsõnum
Urmet
HV vaatleja

liitunud: 29.07.2005




sõnum 24.05.2012 20:33:49 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
matik
HV kasutaja

liitunud: 28.05.2008




sõnum 24.05.2012 21:02:38 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Küsimus c++ kohta?
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
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.