Tomzi Posted October 29, 2006 Posted October 29, 2006 Sziasztok! Nem régen kezdtem a c++-t ugyhogy lenne néhány kérdésem. Ezt a progit szeretném szépen összehozni: #include<stdio.h> #include<conio.h> #include<stdlib.h> #include<iostream.h> main() { clrscr(); char c; do { randomize (); int a=0; a=(rand() % 100); printf("\n\n\n0 ‚s 100 k”z”tt v‚letlenszeren kiv lasztottam egy sz mot. Eltal lod 5-b”l?"); for (int i=0;i<5;i++) { printf("\n\nA(z) %d", i+1); printf(". tipped: "); int b=0; do { cin>>b; if (b<0) printf("Hiba! Ez nem egy 0 ‚s 100 k”z”tti sz m!"); else if (b>100) printf("Hiba! Ez nem egy 0 ‚s 100 k”z”tti sz m!"); } while (b<0 && b>100); if(a==b) printf("\n\tEltal ltad! Gratul lok!", i=5); else if (i>3) printf("\n\tNem tal lt!\n\n\t\t\tSajnos vesztett‚l!"); else printf("\n\tNem tal lt!"); } printf ("\n\n\nSzeretn‚l m‚g egyet j tszani? (I/N)"); cin>>c; } while (c=='i' && c=='I'); getch(); } Na mármost a probléma a "b" beolvasásánál van. Az történik, hogy ha a szám nem 0 és 100 között van ugyan kiírja, hogy hiba, de továbbmegy és azt is kiírja, hogy nemtalált pedig nem kéne neki. A másik probléma az, hogy ha a "b" nem szám akkor a progi végtelen ciklusba kerül. Ezt gondolom string-gel lehetne megoldani viszont errõl semmit sem tudok, ugyhogy erre részletesen várom a válaszokat! Elõre is köszönöm a segítséget!
Gereby Posted October 29, 2006 Posted October 29, 2006 Az az else oda fölösleges, az okozza a hibát. C-ben nincs olyan külön, hogy string. Karakter tömöket használunk helyette: char sajt[20]; De szerintem nem stringel kéne megoldani. Én sima C-t tanulok, ott nem használjuk a cin-t (gondolom az a bevitel)... Mi scanf-et használunk. Cseréld ki azt a cin-t scanf("%d",&b); -re. Így biztos mûködni fog, mivel, ha betût is nyom le valaki, a fordító tipus konverziót hajt majd végre.
Tomzi Posted October 30, 2006 Author Posted October 30, 2006 Sajnos a scanf nem oldotta meg a problémát, ugyanúgy továbbmegy. Az else if-et nem lehet kihagyni, mert ha 100nál nagyobb számot írunk be nem fogja kiírni a hibaüzenetet. A char tömbösítésnél pedig azt írja, hogy nem lehet konvertálni int-et char-rá.
Gereby Posted October 30, 2006 Posted October 30, 2006 De nem az else if-et kell kihagyni... Csak az else-t. Mert minek oda egyébként ág? Mástrész meg oda már nyilván blokk utasítás is kéne. Szedd ki csak az else-et!
Tomzi Posted October 30, 2006 Author Posted October 30, 2006 Így is továbbmegy. Elképzelésem sincs, hogy miért...
ocsi Posted October 31, 2006 Posted October 31, 2006 Az én programom: #include <fcntl.h> #include <stdio.h> #include <conio.h> #include <dos.h> #include <stdlib.h> int tippeles(void) { int szam; int tipp; char c; int i=1; randomize(); szam=rand() % 101; clrscr(); printf("0 ‚s 100 k”z”tt v‚letlenszeren kiv lasztottunk egy sz mot.\n Tal ld el 5 tippel‚sb‹l!\n"); printf("a sz m:%i", szam); while(i<=5 && tipp!=szam) { tipp=0; printf("\n\nAz %i. tipped:", i); while((c=getch()) != '\r') { if(c>='0' && c<='9') { tipp=tipp*10+c-'0'; } else { i=6; printf("\n\nEz nem sz m!!!"); } } printf("%i\n", tipp); if(tipp>100) { printf("\n\nA tipped: %i Ez nagyobb mint 100!", tipp); } else { if(szam==tipp) { i=6; return tipp; } else { printf("Ez most nem sikerrlt!"); } } i++; } return 0; } void main(void) { int i; char ch; do{ i= tippeles(); clrscr(); if(i!=0) { printf("Gratul lok! kital ltad a sz mot: %i", i); } else { printf("Sajnos ez most nem sikerlt"); } printf("\n\nM‚g egy j t‚k? (i/n)"); }while((ch=getch()) == 'i'); }
csutomi Posted October 31, 2006 Posted October 31, 2006 @Tomzi: Ha nem veszed rossz néven, kicsit belekommenteztem, mert több dolog is volt, ami szerintem nem árt, ha megvan és persze beszúrtam azt a sort, ami miatt nem mûködött jól a programod. Sanos kipróbálni nem tudtam, mert jelenleg nincs C++ a gépemen, de remélem, hogy így már mûködik: #include<stdio.h> #include<conio.h> #include<stdlib.h> #include<iostream.h> main() { clrscr(); char c; do { randomize (); int a=0; a=(rand() % 100); // maradékos osztás, ha 100-at is akarsz, akkor (rand()%101) !!! printf("\n\n\n0 ?s 100 k?z?tt v?letlenszeren kiv lasztottam egy sz mot. Eltal lod 5-b?l?"); for (int i=0;i<5;i++) { printf("\n\nA(z) %d", i+1); printf(". tipped: "); int b=0; do { cin>>b; //ha b nem szám... -> na ez (is) az, amiért a C++-t rossz nyelvnek tartom. (ti. mert nem lehet itt tudni, //hogy milyen típusként kezeljük itt a b-t) getch(); //ez hiányzott (szerintem), de még vagy 3 másik módon is meg lehet oldani //ez a hagyományos C-s megoldás, de van rá C++-os is (a cin-nek valamelyik tagfüggvényével) if (b<0) printf("Hiba! Ez nem egy 0 ?s 100 k?z?tti sz m!"); else if (b>100) printf("Hiba! Ez nem egy 0 ?s 100 k?z?tti sz m!"); } while (b<0 && b>100); if(a==b) printf("\n\tEltal ltad! Gratul lok!", i=5); //így paraméterkét adod át printf függvénynek, veszélyes //így sokkal jobb: {printf("blabla"); i=5;} else if (i>3) printf("\n\tNem tal lt!\n\n\t\t\tSajnos vesztett?l!"); else printf("\n\tNem tal lt!"); //printf helyett használhatsz cout-ot is (így: cout << "blabla" << endl;) } printf ("\n\n\nSzeretn?l m?g egyet j tszani? (I/N)"); cin>>c; } while (c=='i' && c=='I'); // ez szép :) (mármint a külsõ while) getch(); } @Gereby: a scanf nem hajt végre típuskonverziót, egyszerûen csak mindent számként értelmez (ebben az esetben) Az if...else ágak egyébként jók voltak Tomzi eredetiében. A blokk pedig nem utasítás, a blokk a programnak egy olyan része, amelybe utasításokat tehetsz. @mindenki: egyébként, ha jól emlékszem, a scanf-nek is van külön ellenõrzõ része ezekre az esetekre, amikor pl szám helyett betût írunk be
Tomzi Posted October 31, 2006 Author Posted October 31, 2006 ocsi: A te megoldásod nekem kicsit átláthatatlan és vannak hibái. Lefuttattam és ezeket tapasztaltam: idegesítõnek tartom, hogy nem látom azt amit beírok, de gondolom így tudtad megoldani, hogy ne lehessen számon kívül mást beírni. Viszont ha betût írok vége a játéknak kiírja, hogy vesztettem ezt egyszerûbben meg tudom oldani, igaz hibaüzenetet nem tudok kiírni ebben az esetben. Csutomi: nem veszem rossz néven a kommenteket, sõt örülök is nekik, mivel ezekbõl sokat lehet tanulni. A getch sajnos nem sokat tett: a szám beírása után 2 entert kell nyomni, de ha az kisebb v nagyobb mint kellene, ugyanúgy hibaüzenet+nemtalált és kéri a következõ tippet. Érdekelne a másik a 3 megoldás Arra rájöttem, hogy hogyan lehet elkerülni, hogy végtelen legyen a progi ha nem számot írunk be: megváltoztattam az utolsó while kritériumát erre: } while (c!='n' && c!='N'); és a c felvételekor értéknek az 'n' et adom. Így a progi a végére ugrik és ki lehet lépni. Legközelebb használd a "Szerkeszt" gombot! Üdv.:Gereby
arpsoft Posted November 5, 2006 Posted November 5, 2006 while (b<0 && b>100); Meséljetek! Ez mikor igaz? Melyik az a szám, ami egyszerre kisebb, mint 0 és nagyobb mint 100? Persze, hogy tovább megy!
Tomzi Posted November 5, 2006 Author Posted November 5, 2006 Rendben ott a hiba. Úgy voltam vele, hogy a && azt jelenti "vagy". De ezek szerint "és". Akkor mi a "vagy"?
Tomzi Posted November 5, 2006 Author Posted November 5, 2006 Köszönöm a segítséget ez megoldotta. Ugy tudom ilyenkor adnom kéne pontokat vagy valamit, de nem találtam meg, hogy hol kell.
piem001 Posted January 3, 2007 Posted January 3, 2007 Sziasztok! Nagyon kérlek segítsetek nekem.... Vizsgára egy programot kértek tõlem, de nem akar mûködni. Minden lehetõséget megpróbáltam, de sehogy se csinálja azt amit kellene! Valaki megnézné nekem mi a probléma vele? Nagyon hálás lennék! Az a baj, hogy az ellenõrzés a 20000 Ft-osnál elakad. Nem jövök rá, hogy miért! #include <stdio.h> #include <conio.h> #include <math.h> void main () { /* Name: Penzvaltas Copyright: Piem Author: Thomas Bodi Date: 31. 12. 06. 16:20 Description: proba */ clrscr(); textcolor(5); float a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p; int a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,r1,s1,t1,u1, v1,w1,x1,y1,z1,z2; printf("K‚rem azt az eg‚sz sz mot, amellyel dolgozni k·v nunk ",a); scanf("%f",&a); printf("\n\nA megadott sz m : %f",a); a1=a/20000; printf("\n\nAz adott sz mban %d db 20000 Ft - s bankjegy lehet",a1); b1=a-a1*20000; c1=b1/10000; printf("\n\nAz adott sz mban %d db 10000 Ft - s bankjegy lehet",c1); d1=b1-c1*10000; e1=d1/5000; printf("\n\nAz adott sz mban %d db 5000 Ft - s bankjegy lehet",e1); f1=d1-e1*5000; g1=f1/2000; printf("\n\nAz adott sz mban %d db 2000 Ft - s bankjegy lehet",g1); h1=f1-g1*2000; i1=h1/1000; printf("\n\nAz adott sz mban %d db 1000 Ft - s bankjegy lehet",i1); j1=h1-i1*1000; k1=j1/500; printf("\n\nAz adott sz mban %d db 500 Ft - s bankjegy lehet",k1); l1=j1-k1*500; m1=l1/200; printf("\n\nAz adott sz mban %d db 200 Ft - s bankjegy lehet",m1); n1=l1-m1*200; o1=n1/100; printf("\n\nAz adott sz mban %d db 100 Ft - s ‚rme lehet",o1); p1=n1-o1*100; q1=p1/50; printf("\n\nAz adott sz mban %d db 50 Ft - s ‚rme lehet",q1); r1=p1-q1*50; s1=r1/20; printf("\n\nAz adott sz mban %d db 20 Ft - s ‚rme lehet",s1); t1=r1-s1*20; u1=t1/10; printf("\n\nAz adott sz mban %d db 10 Ft - s ‚rme lehet",u1); v1=t1-u1*10; w1=v1/5; printf("\n\nAz adott sz mban %d db 5 Ft - s ‚rme lehet",w1); x1=v1-w1*5; y1=x1/2; printf("\n\nAz adott sz mban %d db 2 Ft - s ‚rme lehet",y1); z1=x1-y1*2; z2=z1/1; printf("\n\nAz adott sz mban %d db 1 Ft - s ‚rme lehet",z2); b=a1*20000; printf("\n\nEllen”rz‚s:\n%d * 20000 = %f",a1,b); c=c1*10000; printf("\n%d * 10000 = %f",c1,c); d=e1*5000; printf("\n%d * 5000 = %f",e1,d); e=g1*2000; printf("\n%d * 2000 = %f",g1,e); f=i1*1000; printf("\n%d * 1000 = %f",i1,f); g=k1*500; printf("\n%d * 500 = %f",k1,g); h=m1*200; printf("\n%d * 200 = %f",m1,h); i=o1*100; printf("\n%d * 100 = %f",o1,i); j=q1*50; printf("\n%d * 50 = %f",g1,j); k=s1*20; printf("\n%d * 20 = %f",s1,k); l=u1*10; printf("\n%d * 10 = %f",u1,l); m=w1*5; printf("\n%d * 5 = %f",w1,m); n=y1*2; printf("\n%d * 2 = %f",y1,n); o=z2*1; printf("\n%d * 1 = %f",z2,o); p=b+c+d+e+f+g+h+i+j+k+l+m+n+o; printf("\n\nEllen”rz‚s: %f",p); getch(); }
Gereby Posted January 3, 2007 Posted January 3, 2007 Most nagyon reggel van, és alig aludtam, szóval nem valami tiszta a gondolkodásom... Egy a lényeg én is csináltam már ilyet, és nem volt ilyen hosszú meg bonyolult. Mi ez a sok változó? Majd nap végén megpróbálom elõkeresni az enyémet...
Gereby Posted January 3, 2007 Posted January 3, 2007 (Légyszi ne idézz be előtted íródott hozzászólást! ) Nos hát itt vagyok, a helyzet sajna csak rosszabbodott... Egyébként nem jó helyre írsz. Át lesz rakva ez a probléma a programozás C++ nyelven topicba. Namost: Nem bántani akarlak, de nem hallottál véletlen még a for ciklusról, meg a tömbökről? Egy a lényeg ez a két dolog töredékére csökkenti a progidat. Ahogy látom neked minden létező bankjegyben ki kell íratnod vagy mi... (Most nem nagyon néztem a kódodat, csak gyors átfutottam... ) Enyém ennél talán bonyolultabb is. A legkevesebb bankóval írja ki a pénzösszeg összetételét. #include <stdio.h> #include <conio.h> void main(){ unsigned int i, cimlet[14]={20000,10000,5000,2000,1000,500,200,100,50,20,10,5,2,1}, szam, x=0; clrscr(); printf("Kérek egy összeget (pozitív egész szám):"); scanf("%u",&szam); x=szam; clrscr(); printf("Az összeg (t) a következő címletekre bontható:", szam); for(i=0;i<13; i++){ if (x/cimlet[i]>0){ printf("\n%d db %dFt-os", x/cimlet[i], cimlet[i]); x=x%cimlet[i]; } } getch();
piem001 Posted January 4, 2007 Posted January 4, 2007 Szia Gereby! Nem bántasz, mivel sajna még nem tartok ott a suliban, hogy ezt a tankérem elmondta volna (d egyébként hallottam, csak fogalmam sincs, hogy hogyan kell létrehozni, és dolgozni vele)és még ezt is(amit csináltam), csak egyszerûen feladta és azt mondta, hogy a már meglévõ tudásunkkal (3. órám volt c++ - ból) simán meg tudjuk csinálni és akkor nosza hajrá! Hát így állok most és a meglévõ tudásom erre futotta , tudom, hogy ez nem sok, de igyekszem mindent elkövetni (még akkor is, ha közben butaságokat kérdezek), hogy amennyire tõlem telik gyorsan fejlõdjek c-ileg! Köszönöm a segítségedet, és !!!
yrrum Posted January 13, 2007 Posted January 13, 2007 Hali, bár már régen volt, de a számkitalálós progi c++ -ban: #include <iostream> using namespace std; int main(int argc, char *argv[]) { srand( time(0) ); char c = 'i'; int number; int tipp; while(c == 'i' || c == 'I') { system("CLS"); number = rand()%100;// cout << number; for(int i=0; i<5; i++) { while(!(cin >> tipp) || tipp < 0 || tipp > 100) { cout << "Ird be a tipped" << endl; cout <<"Nem szam vagy kisebb mint 0 vagy nagyobb mint 100." << endl; cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } if(tipp == number) { cout << "Mákod volt!!!" << endl; break; } else cout << "Ez nem nyert" << endl; } cout << "Akarsz uj jatékot kezdeni? (i/n)"; cin >> c; } return 0; } csutomi: cin>>b; //ha b nem szám... -> na ez (is) az, amiért a C++-t rossz nyelvnek tartom. (ti. mert nem lehet itt tudni, //hogy milyen típusként kezeljük itt a b-t) Kifejtenéd részletesebben, hogy miért nem lehet tudni, hogy milyen típusként kezeljük? Szerintem lehet tudni, hiszen elötte van egy int b = 0; sor.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now