[ Bonaventura @ 05.03.2010. 18:49 ] @
Dobra večer...
srdačan pozdrav svima...

Ukratko radim program koji bi iz datoteke trebao čitati brojeve(u ovom slučaju 1-znam. i 2 -znam.) te nakon toga napraviti statistiku o tome koliko se koji broj puta pojavio u datoteci...napravio sam program koji radi ako se ručno unose brojevi...znači bez datoteka...sada kad sam pokušao s datotekama...neke stvari rade...ali neke ne...tj konkretno u datoteci iz koje čita su brojevi ovako napisani 1 2 3 4 5 6 7 8 9 10 11 12
a rezultat nakon kompajliranja je: 1 2 3 4 5 6 7 8 9 10 11 12(znači ispiše sve brojeve dobro)
ali kod brojanja je
broj 1:2 puta
broj 2:1 puta
broj 3:1 puta
broj 4:1 puta
broj 5:1 puta
broj 6:1 puta
broj 7:1 puta
broj 8:1 puta
broj 9:0 puta (itd.sve do kraja je 0)

problem je u tome što ne broji sve brojeve i ne broji 2-znamenkaste pravilno...npr ako stavim prvih 9 brojeva on će brojati dobro prvih 8...ali 9 neće primijetit...a drugi problem je da 2-znamenkaste brojeve ne broji pravilno,npr 12 broji kao 1 i 2 a ne kao 12...to su problemi...ne znam kako ih riješiti pa bi vas zamolio za pomoć...

#include <stdio.h>
#include <stdlib.h>

int main() {
FILE *inputfile;
int c,d;
int broj[41]={0};

inputfile=fopen("input1.txt","r");

if(inputfile == NULL) {
printf("Ne mogu otvoriti datoteku \n");
exit(1);
}


while((c=getc(inputfile))!=EOF ) {
printf("%c",c);
for(d=1;d<41;d++){
if(c==d+49) broj[d]++;
}
}

printf("\n\n 1: %d puta \n 2: %d puta \n 3: %d puta \n 4: %d puta \n 5: %d puta \n",broj[1],broj[2],broj[3],broj[4],broj[5]);
printf(" 6: %d puta \n 7: %d puta \n 8: %d puta \n 9: %d puta \n10: %d puta \n",broj[6],broj[7],broj[8],broj[9],broj[10]);
printf("11: %d puta \n12: %d puta \n13: %d puta \n14: %d puta \n15: %d puta \n",broj[11],broj[12],broj[13],broj[14],broj[15]);
printf("16: %d puta \n17: %d puta \n18: %d puta \n19: %d puta \n20: %d puta \n",broj[16],broj[17],broj[18],broj[19],broj[20]);
printf("21: %d puta \n22: %d puta \n23: %d puta \n24: %d puta \n25: %d puta \n",broj[21],broj[22],broj[23],broj[24],broj[25]);
printf("26: %d puta \n27: %d puta \n28: %d puta \n29: %d puta \n30: %d puta \n",broj[26],broj[27],broj[28],broj[29],broj[30]);
printf("31: %d puta \n32: %d puta \n33: %d puta \n34: %d puta \n35: %d puta \n",broj[31],broj[32],broj[33],broj[34],broj[35]);
printf("36: %d puta \n37: %d puta \n38: %d puta \n39: %d puta \n40: %d puta \n",broj[36],broj[37],broj[38],broj[39],broj[40]);
fclose(inputfile);

getch();
return 0;
}



[ Wajda.W @ 05.03.2010. 19:14 ] @
Trebas da parsiras brojeve, posto su oni u datoteci ispisani u tekstualnom obliku, najbolje je da koristis ' ' (razmak, space) za separator brojeva....
Da prvo smestis podstring koji predstavlja broj, tj koji je izmedju dva razmaka u neki novi string i onda koristis f-ju atoi koja pratvara string u broj.
npr ovako mozes izvaditi brojeve u neki novi string:
Code:

int toknum(char splitter, string str)
{
    int num = 0, prev = 0, t = 1;
    unsigned i;
    for(i=0;i<str.length();i++)
    {
        if(str[i] == splitter && prev == 1)
        {
            t = 1;
            prev = 0;
        }
        if(t == 1 && str[i] != splitter)
        {
            num++;
            t=0;
            prev = 1;
        }
    }
    return num;

}

string split(char splitter, string str, int index)
{
    int num=0, prev = 0, t = 1;
    unsigned i;
    string ret;
    for(i=0;i<str.length();i++)
    {
        if(str[i] == splitter && prev == 1)
        {
            t = 1;
            prev = 0;
        }
        if(t == 1 && str[i] != splitter)
        {
            num++;
            t = 0;
            prev = 1;
        }
        if(num == index+1 && str[i] != splitter)
        {
            ret+=str[i];
        }
    }
    return ret;
}


Samo je ovaj kod za C++, samo zameni TIP string za char[] i jos neke stvarcice i mislim da ces se snaci. ;)
Pozdrev
[ Bonaventura @ 05.03.2010. 19:22 ] @
Wajda hvala na pomoći...ali iskreno nisam baš shvatio...
[ Wajda.W @ 05.03.2010. 20:17 ] @
Ovako, npr citas iz datoteke sa f-jom fgets u neki string str, i onda uz pomoc toknum odredis broj tokena (delova stringa koji se dele separatorom) i onda ides for petljom i uzimas n-ti token iz tog stringa i smestas ga u npr string a i onda to konvertujes u broj. Ovako ide kod otprilike:
Code:


char str[80], a[10];
int brTokena, broj, pojavljivanja[50];

while(fgets(str, 80, fajl))
{
brTokena = toknum(' ', str);
for(i=0;i<brTokena;i++)
strcpy(a, split(' ', str, i));
broj = atoi(a);

pojavljivanja[broj]++;

}
\

Ovako nesto treba da izgleda, nadam se da je jasnije, samo treba da prepravis malo ove dve f-je da ne rade sa STL stringom nego sa C stringom.
[ Bonaventura @ 06.03.2010. 10:39 ] @
jasnije mi je sada...shvatio sam otprilike šta treba napraviti...jedini je problem šta već par sati pokušavam to implementirati u svoj kod...i baš mi ne uspijeva zasad...ali svejedno puno hvala na pomoći Wajda