Posted: 18.09.2006 19:38 Post subject: C programiranje - help!
Ispricavam se sto upadam u ovaj forum - ovo mi je jako hitno, na sto cuda sam.
Program se cudno ponasa oko linije 15. Molim svjezi par ociju da mi to pogleda i javi sto je otkrio.
Unaprijed hvala
Quote:
Napisati funkciju koja simulira igru vješala. Za zadani znakovni niz, korisnik pogađa moguća slova riječi, maksimalno n puta pogrešno, nakon čega igra završava (uspješno ili neuspješno). Funkcija u petlji traži od korisnika da unosi znak po znak i ispisuje međurezultat (uspješno pogođene znakove niza), dok korisnik ne pogodi sve znakove ili dok ne pogriješi maksimalan broj puta. Funkcija kao parametre prima pokazivač na zadani znakovni niz i maksimalan broj pogreški, a vraća pokazivač na „pogođen“ niz. Znakovni niz pogađanja se memorijski alocira dinamično, sukladno dužini zadanog niza.
Napisati program koji prvo traži unos znakovnog niza koji će se pogađati i maksimalan broj pogreški, a zatim nakon poziva funkcije i odigrane igre uspoređuje unešeni znakovni niz s onim kojeg funkcija vrati te ispiše obavijest o mogućoj pobjedi (ili ne).
Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
char *pogadjanje(char *niz, int max) {
char *pogodak='\0', slovo; // pogodak pocinje kao prazan niz
char *pomocni=pogodak; // pomocni niz pokazivat ce uvijek na prvo mjesto pogodjenog niza
int n=0;
while((n<max) && (strlen(pomocni)<strlen(niz))) { // dok god nisu ispucani svi pokusaji i pogodjeni niz je kraci od zadanog
printf("\nUnesite slovo: ");
getchar(); // dodano da u varijablu slovo ne uleti znak za novi red \n
slovo=getchar();
if(strchr(niz,slovo) != NULL) { // provjera je li slovo u nizu
realloc(pogodak, sizeof(char)*(strlen(pogodak))); // ako jest, alociramo memoriju za jos jedno mjesto
*pogodak=slovo; // pisemo slovo na zadnje mjesto u pogodak - GRESKA!!!
//printf("%s\n", pomocni);
pogodak++; // pomicemo se za jedno mjesto
}
else n++;
printf("Broj pogresaka: %d. Uspjesno pogodjena slova: %s\n", n, pomocni); // ispis pogodjenih slova
}
*pogodak='\0'; // na kraj dodajemo \0 znak da se zna kako je ovdje kraj niza
return pomocni; // funkcija vraca pokazivac na 1. clan niza
}
int main() {
char niz[MAX];
int n;
//niz = malloc(sizeof(char)*MAX);
printf("Unesite niz koji ce se pogadjati: ");
scanf("%s", &niz);
printf("Unesite maksimalan broj pogreski: ");
scanf("%d", &n);
if(strlen(pogadjanje(niz,n))==strlen(niz)) // ako su duljine nizova iste, znaci da su sva slova pogodjena
printf("\nPobijedili ste!");
else printf("\nIzgubili ste!");
return 0;
}
if(strchr(niz, slovo)) { // provjera je li slovo u nizu
pogodak[i]=slovo;
i++;
realloc(pogodak, sizeof(char)*(i+1));
pogodak[i]=NULL;
}
else n++;
printf("Uspjesno pogodjena slova: %s", pogodak); // ispis pogodjenih slova
}
return pogodak; // funkcija vraca pokazivac na 1. clan niza
}
int main() {
char niz[MAX];
int n;
printf("\nUnesite niz koji ce se pogadjati: ");
scanf("%s", niz);
fflush(stdin);
printf("\nUnesite maksimalan broj pogreski: ");
scanf("%d", &n);
fflush(stdin);
// ako su duljine nizova iste, znaci da su sva slova pogodjena
if(strlen(pogadjanje(niz,n))==strlen(niz)) printf("\n\nPobijedili ste!");
else printf("\n\nIzgubili ste!");
hvala ti puno, pogledati cu to... uglavnom, do ovog sam ja dosla i radi za niz do 3 slova :/ nakon 4. slova mi uvijek doda na kraju "inf", ne kuzim zasto... grr.
btw, zasto moja deklaracija ne valja? ne vidim zasto bi trebalo malloc na pocetku, nikad to u programu nisam vidjela.
Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
char *pogadjanje(char *niz, int max) {
char *pogodak="\0", slovo; // pogodak pocinje kao prazan niz
char *pomocni=pogodak; // pomocni niz pokazivat ce uvijek na prvo mjesto pogodjenog niza
int n=0;
while((n<max) && (strlen(pomocni)<strlen(niz))) { // dok god nisu ispucani svi pokusaji i pogodjeni niz je kraci od zadanog
printf("\nUnesite slovo: ");
getchar(); // dodano da u varijablu slovo ne uleti znak za novi red \n
slovo=getchar();
if(strchr(niz,slovo) != NULL) { // provjera je li slovo u nizu, isto kao strstr samo sto je 2. argument character a ne string
realloc(pogodak, sizeof(char)*(strlen(pogodak))); // ako jest, alociramo memoriju za jos jedno mjesto
*pogodak=slovo; // pisemo slovo na zadnje mjesto u pogodak
pogodak++; // pomicemo se za jedno mjesto
}
else n++;
printf("Broj pogresaka: %d. Uspjesno pogodjena slova: %s\n", n, pomocni); // ispis pogodjenih slova
}
*pogodak='\0'; // na kraj dodajemo \0 znak da se zna kako je ovdje kraj niza
return pomocni; // funkcija vraca pokazivac na 1. clan niza
}
int main() {
char niz[MAX];
int n;
//niz = malloc(sizeof(char)*MAX);
printf("Unesite niz koji ce se pogadjati: ");
scanf("%s", &niz);
printf("Unesite maksimalan broj pogresaka: ");
scanf("%d", &n);
if(strlen(pogadjanje(niz,n))==strlen(niz)) // ako su duljine nizova iste, znaci da su sva slova pogodjena
printf("\nPobijedili ste!\n\n");
else printf("\nIzgubili ste!\n\n");
return 0;
}
Last edited by nel`chee on 19.09.2006 03:06; edited 1 time in total
Wedit output window build: Tue Sep 19 00:48:36 2006
Error c:\progs\lcc\projects\blah\vjesala2.c: 8 operands of = have illegal types 'char' and 'pointer to void'
Error c:\progs\lcc\projects\blah\vjesala2.c: 22 operands of = have illegal types 'char' and 'pointer to void'
Compilation + link time:0.1 sec, Return code: 1
ti koristiš lcc, ja sam kompajlirao sa cl (MS Visual C) - mislio sam da i vi to koristite pošto tjeraju ljude na FERu da koriste Visual Studio
probaj promijeniti liniju 22, dodati casting u char:
Code:
pogodak[i]= (char) NULL;
a moje prve dvije linije zamijeni sa
Code:
char *pogodak = "\n";
tvoj program:
Code:
char *pomocni=pogodak;
...
pogodak++;
ovo je glupo. stvaraš pomoćni pointer koji ostaje tamo gdje je bio originalan a ovaj prvi inkrementiraš ne diraj originalni pointer i napravi pomoćni integer kojeg inkrementiraš (kao kod mene)
druga greška:
Code:
*pogodak=slovo;
pogodak++;
napišeš slovo na kraj "pogodak" stringa, ali nisi terminirala string sa null znakom sve do kraja petlje (prije return)... to nije dobro jer unutar petlje radiš strlen() na tom nizu, treba biti null-terminiran
hmm sad je kasno za popravke, trebalo mi je za danas... i btw koristim getchar, ne znam gdje si vidio drugacije
razlog zasto koristim pointer koji pokazuje na prvi clan je taj sto sam istu metodu vidjela u rijesenim zadacima s FERa pa sam pretpostavila da je bolje. oh well. vidjet cu sto mi frend javi, nadam se da ce bit okej
gle ako trebaš pointer + offset, ne trebaju ti dva pointera od kojih jedan inkrementiraš nego ti treba pointer + integer - drugi način je bolji jer je fleksibilniji, makar naravno možeš i na prvi način
tvoj problem je bio što si povećavala string, dodavala slova na kraj, ali nisi terminirala sa NULL pa su zbog toga string funkcije na tom nizu poludjele (izbacile te iz programa ili što ti ja znam)
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum