Gå til innhold

Problemer med switch..?


Anbefalte innlegg

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... :p

 

Men iallefall, noen som vet hva som er galt?

 

Miromurr

Lenke til kommentar
Videoannonse
Annonse
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 av JeffK
Lenke til kommentar

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

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

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

Jeg vet forskjellen på = og ==, jeg er bare så utrolig god til å blande dem sammen :p

 

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 av Miromurr
Lenke til kommentar

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

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
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 tror
Det 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 av tsg1zzn
Lenke til kommentar

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 p_edit.gif-knappen i første post for å endre emnetittelen.

 

(Dette innlegget vil bli fjernet ved endring av emnetittel. Ikke kommenter dette innlegget, men p_report.gif gjerne dette innlegget når tittelen er endret, så vil det bli fjernet..)

Lenke til kommentar
Gjest
Dette emnet er stengt for flere svar.
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...