Miromurr Skrevet 4. juni 2008 Del Skrevet 4. juni 2008 Hei! Mens jeg satt og jobbet på ett program i går fikk jeg ikke switch til å fungere ordentlig... Først trodde jeg det var while som ikke ville fungere, men etter å ha skrevet første linje i while-loopen fant jeg ut at while fungerer som den skal. Men switch funker ikke... Jeg satt sammen dette her for å demonstrere hva jeg snakker om: #include <iostream> using namespace std; int main() { int test1 = 1; int test2; cout << "Assign 1 or 2 to int test2: "; cin >> test2; while ( test1 = 1 ) { cout << "Hello..."; switch ( test2 ) { case '1': cout << "Red/n"; break; case '2': cout << "Blue/n"; break; } } } Hvis du vil kompilere det kan det henne du må ta bort cout'en i loopen, den kan skape litt problemer... Men iallefall, noen som vet hva som er galt? Miromurr Lenke til kommentar
Joagamer Skrevet 4. juni 2008 Del Skrevet 4. juni 2008 Kan hende jeg er helt på jordet, men skal det ikke stå case 1: isteden for case '1': ? Lenke til kommentar
JeffK Skrevet 4. juni 2008 Del Skrevet 4. juni 2008 (endret) Kan hende jeg er helt på jordet, men skal det ikke stå case 1: isteden for case '1': ? Jepp. cin "ser" at den skriver til en int, så strengen som leses inn blir gjort om til en int. '1' er en ASCII-verdi som ikke er lik integeren 1. Programmet kan fikses på to måter. 1. Den mest naturlige er å gjøre som Joagamer sier. 2. Endre typen til test2 til char. Da vil cin tolke f.eks. "1" som '1' og lagre det i char-variablen. Men uansett hvordan du løser det, får du fortsatt en uendelig loop. Endret 4. juni 2008 av JeffK Lenke til kommentar
GeirGrusom Skrevet 4. juni 2008 Del Skrevet 4. juni 2008 while ( test1 = 1 ) Dette vil være en evig loop så lenge denne linjen ser slik ut Lenke til kommentar
Jaffe Skrevet 4. juni 2008 Del Skrevet 4. juni 2008 Den bør heller se slik ut: while (test1 == 1) ... = er tilordningsoperatoren, mens == er sammenligningsoperatoren. I motsetning til i noen språk, er det forskjell på disse to i C++. Lenke til kommentar
Miromurr Skrevet 4. juni 2008 Forfatter Del Skrevet 4. juni 2008 Jeg vet det er en uendelig loop, og et ganske slurvete og dårlig program... Jeg bare lagde det for å demonstrere hva jeg snakket om. Men uansett, takk for raske svar! Lenke til kommentar
GeirGrusom Skrevet 4. juni 2008 Del Skrevet 4. juni 2008 Selvom det er bra at det er sånn, så er det litt irriterende med debugging at det ikke er noen reell boolean datatype i C++ I C# ville while(i = 1) gitt compile feil, fordi while forventer et bool parameter som int ikke kan implisitt castes til (ikke eksplisitt heller for den saks skyld) f.eks. funker dette i C++ men ikke i C# int i = 100; while(i--) { // Kode } En av tingene i C++ som er litt elsk/hat Lenke til kommentar
Miromurr Skrevet 4. juni 2008 Forfatter Del Skrevet 4. juni 2008 Det der så ikke ut til å hjelpe allikevel... Jeg har nemlig ett projekt på gang, et program man kan øve på gange-tabellen i... Men når den kommer til det stedet der man skal svare på oppgavene, skjer det ingen ting! Poster koden her, så håper jeg dere kan hjelpe: Main.cpp #include <iostream> using namespace std; #include "main.h" int main() { int gangeTabell; Tabell printTabell; cout << "Skriv inn et tall fra 1-10 og press Enter: "; cin >> gangeTabell; if ( gangeTabell == 1 ) { cout << "\nLes gjennom tabellen:\n 1x1=1\n 1x2=2\n 1x3=3\n 1x4=4\n 1x5=5\n 1x6=6\n 1x7=7\n 1x8=8\n 1x9=9\n 1x10=10\n\n" << endl; system("pause"); system("cls"); printTabell.printTabell1(); } return 0; } Main.h #include <iostream> using namespace std; class Tabell { public: void printTabell1() { cout << "Skriv inn rett svar:" << endl; oppg = 1; CheckSvar = 0; while ( CheckSvar = 0 ) { switch ( oppg ) { case 1: cout << "1x1= "; cin >> svarOppg; CheckSvar = 1; oppgChecked++; oppg++; break; case 2: cout << "1x2= "; cin >> svarOppg; CheckSvar = 1; oppgChecked++; oppg++; break; case 3: cout << "1x3= "; cin >> svarOppg; CheckSvar = 1; oppgChecked++; oppg++; break; case 4: cout << "1x4= "; cin >> svarOppg; CheckSvar = 1; oppgChecked++; oppg++; break; case 5: cout << "1x5= "; cin >> svarOppg; CheckSvar = 1; oppgChecked++; oppg++; break; case 6: cout << "1x6= "; cin >> svarOppg; CheckSvar = 1; oppgChecked++; oppg++; break; case 7: cout << "1x7= "; cin >> svarOppg; CheckSvar = 1; oppgChecked++; oppg++; break; case 8: cout << "1x8= "; cin >> svarOppg; CheckSvar = 1; oppgChecked++; oppg++; break; case 9: cout << "1x9= "; cin >> svarOppg; CheckSvar = 1; oppgChecked++; oppg++; break; case 10: cout << "1x10= "; cin >> svarOppg; CheckSvar = 1; oppgChecked++; oppg++; break; } } while ( CheckSvar = 1 ) { switch ( oppgChecked ) { case 1: if ( svarOppg == 1 ) cout << " R"; else cout << " F"; break; case 2: if ( svarOppg == 2 ) cout << " R"; else cout << " F"; break; case 3: if ( svarOppg == 3 ) cout << " R"; else cout << " F"; break; case 4: if ( svarOppg == 4 ) cout << " R"; else cout << " F"; break; case 5: if ( svarOppg == 5 ) cout << " R"; else cout << " F"; break; case 6: if ( svarOppg == 6 ) cout << " R"; else cout << " F"; break; case 7: if ( svarOppg == 7 ) cout << " R"; else cout << " F"; break; case 8: if ( svarOppg == 8 ) cout << " R"; else cout << " F"; break; case 9: if ( svarOppg == 9 ) cout << " R"; else cout << " F"; break; case 10: if ( svarOppg == 10 ) cout << " R"; else cout << " F"; break; } CheckSvar = 0; } } private: int oppg; int svarOppg; int CheckSvar; int svarRettFeil; int oppgChecked; }; Sikkert en veldig dum måte å gjøre alt sammen på, men men... Feilen ligger ett eller annet sted etter linje 9 i Main.h (tror jeg). Takker for all hjelp! Miromurr Lenke til kommentar
GeirGrusom Skrevet 4. juni 2008 Del Skrevet 4. juni 2008 Uff... der var det mye å ta tak i... For det første må du være klar over at du jobber på en kjempeeffektiv kalkulator, da er det ikke nødvendig å løse oppgavene på forhånd. Du vet fortsatt ikke forskjellen på = og == enda ser jeg. Switch her er helt fullstendig unødvendig. I et godt skrevet program trenger du aldri å bruke Copy/Paste for å programmere. Del opp i mindre funksjoner. Lenke til kommentar
Miromurr Skrevet 4. juni 2008 Forfatter Del Skrevet 4. juni 2008 (endret) Jeg vet forskjellen på = og ==, jeg er bare så utrolig god til å blande dem sammen Problemet er at jeg ikke har noen som helst anelse om hvordan å gjøre dette uten switch... Hva foreslår du at jeg bruker istedenfor switch? Jeg vurderte do...while, tror du det kan brukes? Endret 4. juni 2008 av Miromurr Lenke til kommentar
GeirGrusom Skrevet 4. juni 2008 Del Skrevet 4. juni 2008 int a, b; int resultat; a = (rand() % 9) + 1; b = (rand() % 9) + 1; cout << a << "x" << b; cin >> resultat; if(resultat == (a * b)) cout << "Det er helt riktig!"; Tror det burde funke, har ikke testet though. Lenke til kommentar
x871kx6167ss7 Skrevet 4. juni 2008 Del Skrevet 4. juni 2008 Tror det kan være lurt å lære seg «basic» ting som hvordan lage mer genrelle funksjoner og løkker før du begynner med objekter. Sånn som koden er nå er det masse som er skrevet over og over igjen, pluss at oppgaven kan løses helt fint uten en klasse. if ( gangeTabell == 1 ) { cout << "\nLes gjennom tabellen:\n 1x1=1\n 1x2=2\n 1x3=3\n 1x4=4\n 1x5=5\n 1x6=6\n 1x7=7\n 1x8=8\n 1x9=9\n 1x10=10\n\n" << endl; Her må du skrive det for hver eneste gangetabell. Det kan gjøres mye lettere med en for-loop. Den vil skrive ut den «lille» gangetabellen for hvilket som helst tall. int tall; for (i = 1; i <= 10; i++) { cout << i << " * " << gangeTabell << " = " << gangeTabell * i << "\n"; } Videre kan du lage en mer generell funksjon for å teste personen. I stede for å lage en funksjon for hver tabell kan du lage en funksjon som tar i mot et tall og prøver personen i lille gangetabellen for det tallet. Det letteste er å, igjen, lage en forløkke som looper over alle tall fra 1 til 10 og spør om svaret, skjekker om det er riktig og sier ifra med en gang. Dersom du ønsker å vente med å gi resultatet til han har svart på alle oppgavene er vel det greieste å lagre resultatet i en tabell med boolske verdier (bool). Lenke til kommentar
Miromurr Skrevet 4. juni 2008 Forfatter Del Skrevet 4. juni 2008 Ok, takk GeirGrusom, din metode fungerte bra, her er koden min så langt: #include <iostream> using std::cout; using std::cin; using std::endl; #include <cstdlib> using std::rand; using std::srand; #include <ctime> using std::time; int main() { int gangeTabell; int a; int b; int resultat; int counter; srand( time( 0 ) ); cout << "Skriv inn et tall fra 1-10 og press Enter: "; cin >> gangeTabell; if ( gangeTabell == 1 ) { cout << "\nLes gjennom tabellen:\n 1x1=1\n 1x2=2\n 1x3=3\n 1x4=4\n 1x5=5\n 1x6=6\n 1x7=7\n 1x8=8\n 1x9=9\n 1x10=10\n\n" << endl; system("pause"); system("cls"); counter = 1; while ( counter <= 10 ) { a = 1; b = 1 + rand() % 10; cout << a << "x" << b << "="; cin >> resultat; counter++; system ("cls"); } } return 0; } Men vet du hvordan jeg kan forsikre meg om at alle tallene fra 1-10 blir printet, bare i randomisert rekkefølge? Blackjack: Jeg har lest fram til kappittel 6 i "C++: How to program", så jeg er ikke så nybegynner som dere kansje tror Lenke til kommentar
Emancipate Skrevet 4. juni 2008 Del Skrevet 4. juni 2008 (endret) Men vet du hvordan jeg kan forsikre meg om at alle tallene fra 1-10 blir printet, bare i randomisert rekkefølge?Og hva vil du gjøre når det er gjort? Starte på nytt eller avslutte? Det er forresten det samme. Du kan bruke en array med ti elementer som er 1 eller 0 avhenging om nummeret er brukt.Nar du velger et tall: do { n = rand() % 9 + 1; } while (array[n-1] == 1); array[n-1] = 1; Sett hele arrayen til 0 først. Blackjack: Jeg har lest fram til kappittel 6 i "C++: How to program", så jeg er ikke så nybegynner som dere kansje trorDet handler ikke om hvor langt man har lest, men om hvor mye man har forstått, og hvor mye man har skjønt hvordan man kan bruke det i praksis (det er det vanskeligste). Endret 4. juni 2008 av tsg1zzn Lenke til kommentar
Miromurr Skrevet 4. juni 2008 Forfatter Del Skrevet 4. juni 2008 Hmm... Jeg må si at jeg ikke forsto det der helt... Lenke til kommentar
Emancipate Skrevet 9. juni 2008 Del Skrevet 9. juni 2008 Bare forsett i samme tralten så forstår du nok det meste etter hvert (jeg forsto ikke helt hva du ikke forsto helt). Lenke til kommentar
Aetius Skrevet 14. juni 2008 Del Skrevet 14. juni 2008 Emnetittelen i denne tråden er lite beskrivende for trådens innhold og det er derfor ingen god emnetittel. Jo bedre og mer beskrivende emnetittelen er, jo lettere er det for andre å skjønne trådens innhold og det vil være lettere å treffe den riktige forumbrukeren med det rette svaret. Ber deg derfor om å endre emnetittel slik at du unngår at en moderator stenger tråden. Vennligst forsøk å ha dette i tankene neste gang du starter en tråd, og orienter deg om hva vår nettikette sier om dårlig bruk av emnetitler. Bruk -knappen i første post for å endre emnetittelen. (Dette innlegget vil bli fjernet ved endring av emnetittel. Ikke kommenter dette innlegget, men gjerne dette innlegget når tittelen er endret, så vil det bli fjernet..) Lenke til kommentar
Miromurr Skrevet 15. juni 2008 Forfatter Del Skrevet 15. juni 2008 Denne tråden kan vell egentlig stenges, har fått svar på problemet nå Lenke til kommentar
Anbefalte innlegg