Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Case -ongelma

Duthoron [20.06.2006 20:16:53]

#

Okei... The Tietämätön täällä taas...
Haluaisin tietää kaiken mahdollisen 'case'n käytöstä C/C++:lla; millaisessa tilanteessa, miten ja kaikki muu hyödyllinen/kätevä...
Yritin selailla Putkaa hiukan mutta en oikein löytänyt mitään kunnollista. Löysin muutamia esimerkkejä joissa oli jotain tyyliin

switch (muuttuja){
case 1:
kooooooooooodia
pari
riviä
case 2:
lisää
koodia
case 3:
jne...}

Onko mahdollista saada se tunnistamaan merkkijono (esim. sana)?
Aluksi tein kaiken if:llä mutta se venähti HIEMAN pitkäksi ja kaverini ehdotti case:a (...omalla omituisella tavallaan...) mutta en saanut häneltä mitään selitystä sen käytöstä. Lisäksi kun katsoin tuolta C-oppaasta josko siellä olisi ollut jotain mainintaa niin en löytänyt mitään hyödyllistä.

samlui [20.06.2006 20:25:11]

#

No siis rakennehan on seuraava:

switch(muuttuja)
{
  case tapaus:
    tapaus();
    break;
  case tapausKaksi:
    tapausKaksi();
    break;
  default:
    break;
}

Muuttuja voi olla joko kokonaisluku(int) tai merkki(char).
Itse en rakennetta juuri tykkää käyttää, mutta kai sitä on tarkoitus käyttää esim. tapauksissa tyyliin:

int main()
{
  int valinta;

  scanf("%i", &valinta);

  switch(valinta)
  {
    case 1:
      printf("Valitsit ykkösen\n");
      break;
    case 2:
      printf("Valitsit kakkosen\n");
      break;
    default:
      printf("Valitsit jonkun muun kuin ykkösen tai kakkosen\n");
      break;
  }

  return 0;
}

Default-kohta suoritetaan jos määriteltyä tapausta ei löydy.

Tumpelo [20.06.2006 20:49:18]

#

Duthoron kirjoitti:

Haluaisin tietää kaiken mahdollisen 'case'n käytöstä C/C++:lla; millaisessa tilanteessa, miten ja kaikki muu hyödyllinen/kätevä...

Switch-case -rakenne on erittäin kätevä peleissä, esimerkiksi nuolinäppäimin toteutetussa henkilön ohjaamisessa. If-else -rakenteen korvaajana se on joskus hyvä (jos case sopii tarkoitukseen, se ajaa paremmin asian kuin if) mutta aina sitä ei voi käyttää, koska if:n parametrit voivat olla tarkemmat, tyyliin (JOS tätä JA tuota MUTTA ei sitä JOS ei mitään NIIN SITTEN).

os [20.06.2006 21:37:07]

#

switchia voi myös "väärinkäyttää" jättämällä välillä breakin pois, jolloin ohjelman suoritus jatkuu seuraavasta casesta. Esim:

 // *** autopeli
enum { KAASU, JARRU, ILOKAASU };
switch(valinta) {
  case ILOKAASU: auton_nopeus++;
  case KAASU: auton_nopeus++; break;
  case JARRU: auton_nopeus--; break;
  default: break;
}

A-P [20.06.2006 22:07:33]

#

Pascalissa voisit kirjoittaa:

case arvo of
  0..9: writeln('Alle 10');
  else: writeln('Yli 10');
end;

Sama C:llä

switch (arvo) {
  case 0:
  case 1:
  case 2:
    .
    .
    .
  case 9: printf("Alle 10\n"); break;
  default: printf("Yli 10\n"); break;
}

Metabolix [20.06.2006 23:50:31]

#

Merkkijonoja switch-rakenteella ei siis voi tarkastella, niihin tarvitsee iffiä. Tietenkin voi tehdä jonkinlaisen purukumitoteutuksen:

int sanoja = 2;
char *sanat[] = {
  "Jee",
  "Moi"
};

// Monesko sana on?
for (i = 0; i < sanoja; ++i) {
  if (strcmp(sanat[i], sana) == 0) {
    break;
  }
}

switch (i) {
  case 0:
    /* "Jee" */
    printf("No jee itsellesi vain!\n");
    break;

  case 1:
    /* "Moi" */
    printf("Tervehdys, toveri!");
    break;

  default:
    printf("Sanaa ei ole.\n");
}

Duthoron [21.06.2006 10:20:44]

#

Kiitoksia.... Tuossa oli kyllä melko tyhjentävästi se mitä hain. Ilmoittelen taas jos keksin muuta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta