C problem

poruka: 25
|
čitano: 3.309
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
C problem

dakle zanima me zašto mi sljedeći kod neradi dobro...iz koda ćete vjerovatno shvatit o čemu se radi...

#include <stdio.h>

int main()
{
 float i;
 float p;
 float d;
 int o;
 printf ("Ja sam tvoj kalkulator...\nU meni mozes djeliti, djeliti s ostatkom,\nmnoziti, oduzimati i zbrajati...\nreci sta zelis raditi!\n");
        scanf ("%i", &o);
 if (o = "djeliti" || "dijeliti" || "djelit" || "dijelit")
 {
  printf ("\nDobro...sada unesi prvo jedan broj, pa onda drugi...\n" );
  scanf ("%.2f", &p);
  scanf ("%.2f", &d);
  i = p / d;
  printf ("%.2f\n", i);
 }
 else
  {
  printf ("\a\a ne kužim te...");
 }
 return 0;
}

 

molim pomoć...

thunder in my room :prijevod: Moja mama viče! 92% tinejđera sluša turbo folk. Ako si ti među onih 8% koji još uvijek slušaju pravu glazbu kopiraj si ovo u potpis. Da se Facebook server sruši 90% m
 
0 0 hvala 0
16 godina
neaktivan
offline
C problem

Ovako na prvi pogled,

 

ovaj cijeli red nije dobar:

 

if (o = "djeliti" || "dijeliti" || "djelit" || "dijelit")

 

prije svega, o ti je integer, s '=' pridruzujes vrijednost, a s == radis usporedbu, te ne mozes tako koristiti OR.

 

mogao bi raditi recimo ovo:

 

if (o==2 || o==3 || o==111)

{

....

}

http://irale.deviantart.com
Poruka je uređivana zadnji put pon 24.8.2009 11:14 (RaLe).
 
0 0 hvala 0
15 godina
neaktivan
offline
C problem

kad napišem onako kao što si mi bio rekao prijavi mi 20-ak pogrešaka...i nije mi problem u uvjetima za if, kad pokrenem program i napišem djeli, napiše mi Dobro...sada unesi prvo jedan broj, pa onda drugi... i onda mi ispiše 0.00 a kad stavim %f umjesto %.2f napiše mi 0.000000005 (otprilike...)...

thunder in my room :prijevod: Moja mama viče! 92% tinejđera sluša turbo folk. Ako si ti među onih 8% koji još uvijek slušaju pravu glazbu kopiraj si ovo u potpis. Da se Facebook server sruši 90% m
 
0 0 hvala 0
15 godina
protjeran
offline
C problem

znakovni nizovi se ne uspoređuju s "==" već funkcijom strcmp.

Moj PC  
0 0 hvala 0
16 godina
offline
C problem

Problem je u tome sto ti uzimas od korisnika int, a analiziras ga kao string. Znaci, int je cijeli broj koji ni u kojem slucaju nemoze biti "neka_rijec".

Dakle, umjesto "int o;" napisi "string o;" i ispravi ono sto ti je netko iznad mene rekao.

Nothing is true, everything is permitted...
Moj PC  
0 0 hvala 0
16 godina
offline
RE: C problem

zanemari

Nothing is true, everything is permitted...
Poruka je uređivana zadnji put pon 24.8.2009 13:15 (Assassin).
16 godina
offline
RE: C problem

zanemari

Nothing is true, everything is permitted...
Poruka je uređivana zadnji put pon 24.8.2009 13:15 (Assassin).
16 godina
neaktivan
offline
RE: C problem
Assassin kaže...
Tracer kaže...

znakovni nizovi se ne uspoređuju s "==" već funkcijom strcmp.

Pa koliko ja znam, moze i ovako (nemam sad prilike to isprobat):

(...)

Jedino mbi mozda mogao biti problem da nejde if (s == "rijec") nego da ide if (s == 'rijec').

Znakovni niz je char[]. Ti pričaš o std::stringu, klasi definiranoj u STLu...

 

Ovo drugo je problem jer se '' koristi za znakove (char), a "" za znakovni niz, char[]

 

btw, imaš edit u  kutu posta ako želiš nešto dodati...

The candle flame gutters. Its little pool of light trembles. Darkness gathers. The demons begin to stir.
15 godina
neaktivan
offline
RE: C problem
Capitan Hook kaže...

dakle zanima me zašto mi sljedeći kod neradi dobro...iz koda ćete vjerovatno shvatit o čemu se radi...


 int o;
..
 if (o = "djeliti" || "dijeliti" || "djelit" || "dijelit")
 

 

molim pomoć...

Ovo ne može raditi. Tu uspoređuješ integer sa const char *, i normalno je da oni nisu jednaki. A usput ni ne usporedjujes jer trebas operator ==, dok je = operator pridruživanja.

Pored toga, i gore kod scanf, želiš učitati znakovni niz na mjesto u memoriji koje si alocirao za jedan integer, što ne može ići. A i format si promašio (%i).

 

To se vidi ovako na prvi pogled, a dalje bi se još koja greška našla vjerojatno.

Try to look unimportant - the enemy may be low on ammo...
15 godina
neaktivan
offline
RE: C problem
Assassin kaže...
Tracer kaže...

znakovni nizovi se ne uspoređuju s "==" već funkcijom strcmp.

Pa koliko ja znam, moze i ovako (nemam sad prilike to isprobat):

string s;

s = "rijec";

 

if (s == "rijec")

{...}

 

Jedino mbi mozda mogao biti problem da nejde if (s == "rijec") nego da ide if (s == 'rijec').

 

Nope, C ne može tako uspoređivati stringove. Zato imaš string.h i njegove pomoćne funkcije za operacije nad stringom. Sjeti se školskog natjecanja i zadatka nedavno korištenih datoteka (http://hsin.hr/skolsko2009/pasccpp1_zadaci.pdf). Dvostruki navodnici označavaju string, dok jednostruki char. I koristi edit ubuduće.

 

@Capitan Hook:

Uff, al si za zbrljao. Iskomentirao sam tvoj source da vidiš greške. Znači source koji ne valja je:

 

#include <stdio.h>

int main()

{

  float i;

  float p;

  float d; //ovo se moglo skratiti

  int o;

  printf ("Ja sam tvoj kalkulator...\nU meni mozes djeliti, djeliti s ostatkom,\nmnoziti, oduzimati i zbrajati...\nreci sta zelis raditi!\n");

  scanf ("%i", &o); //prva greška, za int ide %d, ne %i

  if (o = "djeliti" || "dijeliti" || "djelit" || "dijelit") //druga greška, int nije znak, nego broj

  {

  printf ("\nDobro...sada unesi prvo jedan broj, pa onda drugi...\n" );

  scanf ("%.2f", &p);

  scanf ("%.2f", &d); 

  i = p / d;

  printf ("%.2f\n", i);

  }

  else

  {

  printf ("\a\a ne kužim te...");

  }

  return 0;

}

 

A evo kod koji (provjereno radi). Ja sam koristio switch umjesto if/else if, jer mi je bilo brže. U biti se to moglo napraviti i sa:

if(o == 0)

{

   //kod

}

else if(o == 1)

{

  //kod

}

else if(o == 2)

{

  //kod

}

else if(o == 3)

{

  //kod

}

else

{

   printf("Ovdje ide poruka da ne prepoznaje operaciju, znači "default" iz switcha\n");

}

 

Točan kod s komentarima:

#include <stdio.h>

 

int main()

{

 float i,p,d;

 int o; //ovo mozes tako da ti je 0 = +, 1 = -; 2 = *; 3 = /

 printf("Taj header koji si vec stavio\n");

 scanf("%d", &o);

 printf("Koji brojevi?\n");

 scanf ("%f%f", &p, &d);

 

 switch(o) //umjesto if/else if kombinacije, mozes koristiti case, naravno samo int

 {

 case 0: // +

 i = p + d;

 break;

 

 case 1: // -

 i = p - d;

 break;

 

 case 2: // *

 i = p * d;

 break;

 

 case 3: // /

 i = p / d;

 break;

 

 default: //ukoliko nije niti jedan od tih brojeva, ovo se izvršava, kao glavni else

 printf("Try again\n");

 break;

 }

 

 printf("Rezultat: %.2f\n", i); //ispis rezultata

 scanf("%d", &o);

 

 return 0;

}

 

Ako ti nešto nije jasno, slobodno pitaj.

15 godina
neaktivan
offline
C problem

tnx svima, problem rješen...znao sam od prije da je int za pohranu brojeva ali sam vidio u nekoj knjizi takav primjer i da se tako omogućuje usporedba jer se nemogu uspoređivati rječi ali da mogu brojevi...malo sam još modificiro kod...uzeo sam jednu funkciju iz cmd-a...kada budete išli u execute u svom kompajleru pokrenut će vam se ovo ali će pisat da neprepoznaje msg * ali kada ga kompajlate i linkate onda će vam radit besprjekorno...važno je da ga pokrećete iz .exe file-a a ne iz kmpajlera jer tako neće radit...ugl. sada ću naljepit finalni kod...

#include <stdio.h>

int main()

{

 float i,p,d;

 int o, j; //ovo mozes tako da ti je 0 = +, 1 = -; 2 = *; 3 = /
 printf ("Bok!");
 do
 {
 printf("Napiši 0 ako želiš zbrajati.\nNapiši 1 ako želiš oduzimati.\nNapiši 2 ako želiš množiti.\nNapiši 3 ako želiš djeliti.\n");

 scanf("%d", &o);

 printf("Koji brojevi?\n");

 scanf ("%f%f", &p, &d);

 

 switch(o) //umjesto if/else if kombinacije, mozes koristiti case, naravno samo int

 {

 case 0: // +

 i = p + d;

 break;

 

 case 1: // -

 i = p - d;

 break;

 

 case 2: // *

 i = p * d;

 break;

 

 case 3: // /

 i = p / d;

 break;

 default: //ukoliko nije niti jedan od tih brojeva, ovo se izvršava, kao glavni else

 system("MSG * Greška: nepoznata operacija");

 break;

 }

 

 printf("Rezultat: %.2f\nNapiši 1 ako želiš još nešto računat...\n", i); //ispis rezultata
  scanf ("%d", &j);
}
 while (j = 1);

 return 0;

}

i sada sve radi besprjekorno...još jednom, hvala svima na pomoći...

thunder in my room :prijevod: Moja mama viče! 92% tinejđera sluša turbo folk. Ako si ti među onih 8% koji još uvijek slušaju pravu glazbu kopiraj si ovo u potpis. Da se Facebook server sruši 90% m
 
0 0 hvala 0
14 godina
offline
RE: C problem

A sta ako u varijablu d uneses 0?

15 godina
neaktivan
offline
RE: C problem
CalvinRi kaže...

A sta ako u varijablu d uneses 0?

Trebao je staviti da if 0, vraća na početak programa. Kad podijeliš s 0, morat ćeš ugasit prisilno cmd!

Bustin at people who said my name in vain, I got no time for them tricks, I'm heavy in the game!!! I wanna be a baller, please, But the bitches and the liquor keep on callin me...
Poruka je uređivana zadnji put čet 27.8.2009 8:27 (Smooth Operator).
14 godina
protjeran
offline
RE: C problem
CalvinRi kaže...

A sta ako u varijablu d uneses 0?

Imaš djeljenje sa nulom što je beskonačno i evo ti jedan lijepi overflow.

 

I slažem se sa rješenjem pomoću switch-a, koje je bolje nego da se grana sa if-else.

Nema potpisa jer egomainiaci odmah polude :)
15 godina
neaktivan
offline
RE: C problem
Buffer Overflow kaže...
CalvinRi kaže...

A sta ako u varijablu d uneses 0?

Imaš djeljenje sa nulom što je beskonačno i evo ti jedan lijepi overflow.

 

I slažem se sa rješenjem pomoću switch-a, koje je bolje nego da se grana sa if-else.

 

Za float je dijeljenje s nulom NaN, po IEEE 754.

&quot;Fans are clinging complaining dipshits who will never ever be happy for any concession you make. The sooner you shut up their shrilled tremolous voices, the happier are you going to be for it.&q
Poruka je uređivana zadnji put čet 27.8.2009 10:26 (Deus ex machina).
15 godina
neaktivan
offline
C problem

ekipa, imam još jedno pitanje...naime, zanimna me kako se mogu popunjavati array-i bez scanf-a ili tako nečeg (nešto kao array [i] = 6 )?

thunder in my room :prijevod: Moja mama viče!92% tinejđera sluša turbo folk. Ako si ti među onih 8% koji još uvijek slušaju pravu glazbu kopiraj si ovo u potpis.Da se Facebook server sruši 90% m
 
0 0 hvala 0
16 godina
neaktivan
offline
RE: C problem
Capitan Hook kaže...

ekipa, imam još jedno pitanje...naime, zanimna me kako se mogu popunjavati array-i bez scanf-a ili tako nečeg (nešto kao array [i] = 6 )?

Da, upravo tako.

 

Alternativno, možeš se koristiti aritmetikom pokazivača. Broj Y nadodan na memorijsku adresu tipa X rezultirat će adresom - od početne udaljenom za Y blokova veličine koju rezervira tip X. Primjer: postoji polje cijelih brojeva P. Izraz "P + 5" će dati adresu 6. člana u memoriji (razlog se krije u načinu na koji je polje definirano - prostor u memoriji veličine veličina-tipa * veličina-polja, a na poziciji k * veličina_tipa se nalazi k-ti član polja; k je element skupa [0, veličina-polja>). Dobivenu adresu je potrebno derefencirati, što znači pročitati i vratiti sadržaj memorije (na toj adresi). Sljedeći izraz to demonstrira: *(p + 5)

The candle flame gutters. Its little pool of light trembles. Darkness gathers. The demons begin to stir.
15 godina
neaktivan
offline
C problem

ništa nisam pokopčo...jel mi možete reć zašto mi sljedeći kod neispisuje 9 znakova u toj tablici nego samo 4? nema mi veze što su null, zapravo ima, ali to mi je drugi problem...

 

EDIT: ups, zaboravio postat kod...ajd priuljepit ču kod odcijelog programa iako NIJE gotov...

include <stdio.h>

char tabla[3][3];
char *tablica1, *tablica2, *tablica3, *tablica4, *tablica5, *tablica6, *tablica7, *tablica8, *tablica9;
char ime1[20], ime2[20];
int x, y;

void cunter(void)
{
 printf ("%s|%s|%s\n------\n%s|%s|%s\n------\n%s|%s|%s\n", *tablica1, *tablica2, *tablica3, *tablica4, *tablica5, *tablica6, *tablica7, *tablica8, *tablica9 );
}

void xpunjenje (void)
{
 printf ("%s je na redu!", ime1);
 printf ("U koje polje želiš upisati X?\n");
 scanf ("%d %d", &x, &y);
 tabla [x][y] = 'X';
 cunter();
}

void ypunjenje (void)
{
 printf ("%s je ne redu!\nU koje polje želiš upisati O?\n", ime2);
 scanf ("%d %d", &x, &y);
 tabla [x][y] = 'O';
 cunter();
}

void punjenje(void)
{
 ypunjenje ();
 xpunjenje ();
}
 
int main ()
{
 int a;
 *tablica1 = tabla [1][1];
 *tablica2 = tabla [1][2];
 *tablica3 = tabla [1][3];
 *tablica4 = tabla [2][1];
 *tablica5 = tabla [2][2];
 *tablica6 = tabla [2][3];
 *tablica7 = tabla [3][1];
 *tablica8 = tabla [3][2];
 *tablica9 = tabla [3][3]; 
 a = 0;
 /*while (tabla[a] == false)
 {
  tabla [a] = 0;
  a++;
   }*/
 printf ("Molim unesite svoje ime i ime drugog igrača\n");
 scanf ("%s %s", ime1, ime2);
 /*
 if ( tabla [1][1] && tabla [2][1] && tabla [3][1] || tabla [1][2] && tabla [2][2] && tabla [2][3] || tabla [3][1] && tabla [3][2] && tabla [3][3] )
 */
 punjenje();
 system ("PAUSE");
 return 0;
}

thunder in my room :prijevod: Moja mama viče!92% tinejđera sluša turbo folk. Ako si ti među onih 8% koji još uvijek slušaju pravu glazbu kopiraj si ovo u potpis.Da se Facebook server sruši 90% m
Poruka je uređivana zadnji put pet 25.9.2009 17:16 (Capitan Hook).
 
0 0 hvala 0
15 godina
neaktivan
offline
RE: C problem

Gdje ti je kod?

Private
15 godina
neaktivan
offline
C problem

evo, dodo sam ga u post gore...

thunder in my room :prijevod: Moja mama viče!92% tinejđera sluša turbo folk. Ako si ti među onih 8% koji još uvijek slušaju pravu glazbu kopiraj si ovo u potpis.Da se Facebook server sruši 90% m
 
0 0 hvala 0
15 godina
neaktivan
offline
RE: C problem

Ispisivati znakove sa %c umjesto %s. I želiš staviti tablica1 = &tabla [1][1]; umjesto *tablica1 = tabla [1][1]; (za sve) ako već radiš sa pointerima.

15 godina
neaktivan
offline
C problem

ok, dakle sada je igrica gotova ali ima jedan problem: nekaže kad je završila partija, a ja neznam kako da napravim da ispiše kad završi partija (budu 3 u redu/stupcu/dijagonali)...evo koda kakva je sada igrica...

#include <stdio.h>
#define true 1
#define false !true

char tabla[3][3];
char ime1[20], ime2[20];
int x, y;

void cunter(void)
{
 printf ("%c|%c|%c\n------\n%c|%c|%c\n------\n%c|%c|%c\n", tabla[0][0], tabla[1][0], tabla[2][0], tabla[1][0], tabla[1][1], tabla[1][2], tabla[2][0], tabla[2][1], tabla[2][2]);
}

void xpunjenje (void)
{
 printf ("%s je na redu!", ime1);
 printf ("U koje polje zelis upisati X?\n");
 scanf ("%d %d", &x, &y);
tabla [x][y] = 'X';
 cunter();
}

void ypunjenje (void)
{
 printf ("%s je na redu!\nU koje polje zelis upisati O?\n", ime2);
 scanf ("%d %d", &x, &y);
 tabla [x][y] = 'O';
 cunter();
}

void punjenje(void)
{
 ypunjenje ();
 xpunjenje ();
}
 
int main ()
{
 int a;
 a = 0;
 printf ("Molim unesite svoje ime i ime drugog igraca\n");
 scanf ("%s %s", ime1, ime2);
 while (a<=9)
 {
  a++;
  punjenje();
  }
  system ("PAUSE");
 return 0;
}

thunder in my room :prijevod: Moja mama viče!92% tinejđera sluša turbo folk. Ako si ti među onih 8% koji još uvijek slušaju pravu glazbu kopiraj si ovo u potpis.Da se Facebook server sruši 90% m
 
0 0 hvala 0
16 godina
neaktivan
offline
C problem

Mozes primjerice svaki put nakon sto pozoves ispis, pozvati i jednu funkciju u kojoj ces provjeriti jesu li jednaki elementi svih redaka, stupaca, i dijagonala.

 

Razumijes ideju? :)

 

EDIT: Ili jos bolje, za svaki UNESENI znak, provjeri moguce pobjednicke situacije. Naprimjer, ako imas slijedecu situaciju:

 

 

O  .  .

X  .  .

.  .  .

 

I sad uneses O na [2][2]

 

O .  .

X  .  .

.  .  O

 

Onda provjeris glavnu dijagonalu, zadnji redak, i zadnji stupac, jer su to jedino moguce win situacije unosom novog elementa u tablicu.

 

Takoder, provjeri si while petlju koja poziva Punjenje() iz main-a. Naime, ti zapravo 9 puta pozivas unos iksa i oksa, tj. 18 znakova trazis ako se ne varam.

A uz sve to, dozvoljavas i prijepis. Znaci moguce je staviti X gdje je protivnik vec stavio O. :)

Rjesava jednostavne probleme u podforumu Programiranje od 2008. xD http://irale.deviantart.com
Poruka je uređivana zadnji put sri 14.10.2009 16:06 (RaLe).
 
0 0 hvala 0
15 godina
neaktivan
offline
C problem

ok, to drži vodu...ali moje je pitanje bilo zapravo kako napraviti da ti kaže kad je gotova partija a da nepišem

if (tabla[0][0] = "x" && tabla[0][1] && tabla[0][2] || tabla [1][1] &&) ...i nerazumijem zašto mi loop neradi...jel može neko reć jel bezuvjetni skok (goto) baš mora bit u main funkciji ili se možeupotrebljavat i u drugim funkcijama?

thunder in my room :prijevod: Moja mama viče!92% tinejđera sluša turbo folk. Ako si ti među onih 8% koji još uvijek slušaju pravu glazbu kopiraj si ovo u potpis.Da se Facebook server sruši 90% m
 
0 0 hvala 0
16 godina
neaktivan
offline
RE: C problem
Capitan Hook kaže...

(goto) baš mora bit u main funkciji ili se možeupotrebljavat i u drugim funkcijama?

"goto" može biti u bilo kojoj funkciji, po mogućnosti niti u jednoj.

The candle flame gutters. Its little pool of light trembles. Darkness gathers. The demons begin to stir.
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice