[ zlatko84 @ 13.09.2006. 11:39 ] @
Pomagajte kolege.Napisao sam program za igru vjesala u C-u ali mi ne radi dobro.Prvo ne radi mi "malloc" kada treba da alocira memoriju odnosno kad provjerava da li u datoteci ima rijeci koje ne mogu da se prikazu.Drugo kada zelim ponovo da igram nakon par puta mi zaglavi a zasto ne znam.I trece kada se u datoteci nalazi jedna rijec ali samo rijec bez entera kaze mi da je datoteka prazna.Molim Vas ako mozete da mi pomognete.Evo Vam i kod: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <conio.h> /*Ne radi malloc za alociranje memorije, kada je jedna rijec u datoteci i kada ponovo zelimo da igramo nakon nekoliko puta zaglavi!!!*/ int PrebrojRijeci(FILE * in){ char c='a',prethodnic; int maxDuzina=0,duzina=0,brojRijeci=0; while(1){ prethodnic=c; c=getc(in); if(c=='\n') { if(duzina>maxDuzina)maxDuzina=duzina; duzina=0; brojRijeci++; }else duzina++; if(c==EOF) { if(prethodnic!='\n') brojRijeci++; break; } } if(maxDuzina==0) brojRijeci=0; if(maxDuzina>1024) printf("Upozorenje.U fajlu ima rijeci duzih od 1024 karaktera!"); return brojRijeci; } char * Procitaj(FILE *in,int brojReda){ int uRedu=0,duzina=0,i=0; char c,*rijec; long pocetakReda; while(uRedu<brojReda){ c=getc(in); if(c=='\n') { uRedu++; pocetakReda=ftell(in); } } duzina=0; while(1){ c=getc(in); if(c=='\n'||c==EOF){ fseek(in,pocetakReda,SEEK_SET); break; }else duzina++; } /*if(duzina>80) return NULL; Zbog toga sto rijec ne moze cijela da stane na ekran! */ *rijec=(char *)malloc(sizeof(char) * duzina); if(rijec==NULL) return NULL; i=0; while(1){ c=getc(in); if(c=='\n'||c==EOF){ rijec='\0'; break; }else rijec[i++]=(isupper(c))?tolower(c):c; } return rijec; } int prikazi(char c,char *rijec,char *skrivenarijec){ int otkrivena=1; char *poc=skrivenarijec; while(*rijec!='\0'){ if(*rijec==c) *skrivenarijec=c; rijec++; skrivenarijec++; } while(*poc!='\0'){ if(*poc=='*') { otkrivena=0; break; }else poc++; } return otkrivena; } void nacrtaj(int j){ printf(" ---\n"); printf(" |\n"); switch(j){ case 1: printf(" O\n");break; case 2: printf(" O\n");printf(" /\n");break; case 3: printf(" O\n");printf(" / \\\n");break; case 4: printf(" O\n");printf(" /|\\\n");break; case 5: printf(" O\n");printf(" /|\\\n");printf(" /\n");break; case 6: printf(" O\n");printf(" /|\\\n");printf(" / \\\n");break; default : printf("\n"); } } int main(int argc, char** argv){ FILE *in; int i,brojrijeci=0,randomBr,brojPogadjanja=0,unijetiKarakteri[256],pogodio=0; char YesNo='d',*rijec,*pomRijec,c; if(argc!=2){ printf("Greska!\n<Ime programa> <ime ulazne datoteke-rijecnika>\n"); return 0; } in=fopen(argv[1],"r"); if(in==NULL || in=='\n'){ printf("Datoteka je prazna ili ne postoji!"); return 0; } brojrijeci=PrebrojRijeci(in); fseek(in,0,SEEK_SET); if(!brojrijeci){ printf("U datoteci ne postoji niti jedna rijec!"); return 0; } while (YesNo=='d'){ for(i=0;i<256;i++) unijetiKarakteri=0; clrscr(); YesNo='n'; if(YesNo=='d') in=fopen(argv[1],"r"); randomize(); randomBr=random(brojrijeci); while((rijec=Procitaj(in,randomBr))==NULL) if(fseek(in,0l,SEEK_SET)){ printf("Greska prilikom poziva fseek() funkcije!"); return 0; } close(in); *pomRijec=(char *)malloc(strlen(rijec)+1); for(i=0;i<strlen(rijec);i++) pomRijec='*'; pomRijec='\0'; brojPogadjanja=0; for(i=0;i<256;i++) unijetiKarakteri=0; printf("\n%s\n",pomRijec); while(brojPogadjanja<7){ while(!isalpha(c=getch())); /*if(c=='\n')continue;*/ c=(isupper(c))?tolower(c):c; pogodio=0; if((unijetiKarakteri[c]==1)&&(c!='\n')) { printf("\nKarakter '%c' vec jednom unijet!",c); continue; }else unijetiKarakteri[c]=1; if(strchr(rijec,c)!=NULL) pogodio=prikazi(c,rijec,pomRijec); else { if(++brojPogadjanja==6) { clrscr(); nacrtaj(6); printf ("\nKraj IGRE!!! Objeseni ste!!!"); break; } } if(pogodio){ system("cls"); printf("Cestitamo!\nRijec koju ste pogadjali je '%s'\n\n",rijec); break; } else{ system("cls"); printf("%s\n\n",pomRijec); if(brojPogadjanja)nacrtaj(brojPogadjanja); } } printf("\nZelite li da ponovo igrate (d\\n)?\n"); YesNo=getchar(); } } Unaprijed zahvaljujem! Zlatko I. |