Toon posts:

[CPP] CASE verkleinen met DO ... WHILE

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een stukje software waar erg vaak het zelfe in voor komt.

do
{
iOnjuist = 0;
char cKeus = getch();
switch(cKeus)
{
case '1': iInvoer = 1; break;
case '2': iInvoer = 2; break;
case '3': iInvoer = 3; break;
case '4': iInvoer = 4; break;
case '5': iInvoer = 5; break;
case '6': iInvoer = 6; break;
case '7': iInvoer = 7; break;
case '8': iInvoer = 8; break;
default = 1;
}
}
while(iOnjuist);
Dit moet je naar mijn id ook kunnen inkorten door nog een D0 ... WHILE statement te gebruiken.
Wie kan mij helpen om dat te produceren????

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Kijk eens naar de C functie atoi() deze kan een char converteren naar een int.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-09 18:14
Zoiets misschien?
code:
1
2
3
4
  if(cKeus<'1'||cKeus>'8')
    iOnjuist=1;
  else
    iInvoer=cKeus-'0';

Merk op dat je default case statement zo niet geldig; dat moet waarschijnlijk "default: iOnjuist=1;" zijn.

Volgende keer ook code tussen [code]-tags, s'il vous plait.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-09 18:14
Op maandag 18 maart 2002 21:50 schreef Orphix het volgende:
Kijk eens naar de C functie atoi() deze kan een char converteren naar een int.
Niet waar.

man atoi.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op maandag 18 maart 2002 22:12 schreef Soultaker het volgende:

[..]

Niet waar.

man atoi.
* Orphix zoekt ff in z'n legacy docs ...

hmmja idd alleen een char* versie :)
Nou dan doe je het toch gewoon zo?
code:
1
2
3
char *keuze = new char[2];
keuze[0] = getch();
int iInvoer = atoi(keuze);

;)

Nee de -'0' oplossing is de beste.

Ik vind het zowiezo een beetje wazige code, wat wil je bereiken met de default=1 in je switch? En waar wordt iOnjuist gezet?

Verwijderd

Topicstarter
Op maandag 18 maart 2002 22:19 schreef Orphix het volgende:

Ik vind het zowiezo een beetje wazige code, wat wil je bereiken met de default=1 in je switch? En waar wordt iOnjuist gezet?
het moet inderdaad zo zijn
code:
1
  default: iOnjuist = 1;

het doel is dat er niets andrs ingevoerd kan worden

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-09 18:14
Op maandag 18 maart 2002 22:19 schreef Orphix het volgende:
Nou dan doe je het toch gewoon zo?
code:
1
2
3
char *keuze = new char[2];
keuze[0] = getch();
int iInvoer = atoi(keuze);
Helaas. Char[1] is niet geinitialiseerd op 0, dus dit werkt in het gunstige geval onbetrouwbaar (en in 't ongunstige geval crasht de boel). Verder lek je geheugen om dat je de gealloceerde bytes niet vrijgeeft. Daarbij is 't natuurlijk ranzig, maar dat gaf je zelf al aan :) (ik vermeld 't nog even voor andere lezers).

Je ZOU het wel zo kunnen doen:
code:
1
2
char keuze[]={getch(),'\0'};
int iInvoer=atoi(keuze);

Maar dan kun je nog steeds geen onderscheid maken tussen ongeldige invoer en 0 (hoewel dat in dit geval niet nodig was).

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op maandag 18 maart 2002 23:02 schreef Soultaker het volgende:
Helaas. Char[1] is niet geinitialiseerd op 0, dus dit werkt in het gunstige geval onbetrouwbaar (en in 't ongunstige geval crasht de boel). Verder lek je geheugen om dat je de gealloceerde bytes niet vrijgeeft. Daarbij is 't natuurlijk ranzig, maar dat gaf je zelf al aan :) (ik vermeld 't nog even voor andere lezers).
Uhm je begrijpt toch wel dat ik de andere lezers even een voorbeeld gaf van hoe snel het fout kan gaan in C :P ;)
(ik had het idee wel goed in m'n kop alleen iets te snel ingetikt)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-09 18:14
Op maandag 18 maart 2002 23:05 schreef Orphix het volgende:
je begrijpt toch wel dat ik de andere lezers even een voorbeeld gaf van hoe snel het fout kan gaan in C
Ja, ik begrijp dat uiteraard wel, maar denk ook eens aan die andere (dommere!) Tweakertjes!

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
als het met een karakter moet, waarom dan niet isdigit? levert ook geen 0 op als het karakter geen nummer is (in tegenstelling tot alle atoi varianten)

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

code:
1
2
3
4
5
6
7
8
9
int    l_Getal    = 0;
char   l_Invoer;

do
  {
  l_Invoer = getch();
  l_Getal  = (l_Invoer >= '0' && l_Invoer <= '8') ? l_Invoer - '0' : 0;
  }
while(!l_Getal);

Professionele website nodig?


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-09 18:14
Ok, als het klein en efficient moet, wil ik ook wel een poging wagen:
code:
1
2
int getal;
while((unsigned)((getal=getchar()-'0')-1)>=8);

  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Op dinsdag 19 maart 2002 14:03 schreef curry684 code.

Hmm..
code:
1
2
3
4
5
6
int    l_Getal    = 0;

while (l_Getal < 1 || l_Getal > 8)
{
   l_Getal  = getch() - '0';
}

Het kan trouwens ook met een for-loop enzo, maar daar ben ik niet zo kapot van.

Motor-forum.nl


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op woensdag 20 maart 2002 00:24 schreef Bananeman2002 het volgende:
Het kan trouwens ook met een for-loop enzo, maar daar ben ik niet zo kapot van.
Waarvan akte:
code:
1
2
int l_Getal = 0;
for(;l_Getal < 1 || l_Getal > 8; l_Getal = getch() - '0');

Professionele website nodig?


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-09 18:14
Bah. Als l_Getal=0 een vereiste is voor je for loop, doe die assignment dan ook in de for-loop, zou ik zeggen.

Verwijderd

Op woensdag 20 maart 2002 13:56 schreef Soultaker het volgende:
Bah. Als l_Getal=0 een vereiste is voor je for loop, doe die assignment dan ook in de for-loop, zou ik zeggen.
Kost veel teveel karakters man ! 8-)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-09 18:14
Op woensdag 20 maart 2002 14:00 schreef Sneechy het volgende:
Kost veel teveel karakters man ! 8-)
Als dat het criterium was, is
code:
1
do{l_Getal=getch()-'0'}while(l_Getal<1||l_Getal>8);

of mijn eerdere suggestie:
code:
1
while((unsigned)((l_Getal=getchar()-'0')-1)>=8);

nog korter, aangezien die helemaal geen initialisatie behoeven.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op woensdag 20 maart 2002 13:56 schreef Soultaker het volgende:
Bah. Als l_Getal=0 een vereiste is voor je for loop, doe die assignment dan ook in de for-loop, zou ik zeggen.
Pardon, overheen gekeken :)

(had het ook maar ff snel in Notepad bij mekaar geklopt ;) )

Professionele website nodig?


  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Op woensdag 20 maart 2002 20:28 schreef curry684 het volgende:

[..]

Pardon, overheen gekeken :)

(had het ook maar ff snel in Notepad bij mekaar geklopt ;) )
Had je maar geen for-loop moeten gebruiken!! >:)

Motor-forum.nl

Pagina: 1