h3. switch...case valintarakenne
* _Switch...case_ \-rakenteessa on testattavana yksi lauseke, jonka arvon perusteella haaraudutaan johonkin _case_\-haaraan.
* _case_\-haara voi sisältää useita lauseita, jotka suoritetaan peräkkäin, kunnes törmätään _break_\-lauseeseen, joka ohjaa kontrollin pois _switch_\-rakenteesta.
Switch-case valintarakenteen muoto:
{code}
switch (lauseke) {
case arvo_1 :
lauseita;
break;
case arvo_2 :
lauseita;
break;
case arvo_3 :
lauseita;
break;
...
default :
lauseita;
break;
}
{code}
* _Switch...case_ \-rakenteessa voi olla _case_\-vaihtoehtoja 127 kappaletta. Lisäksi siinä voi olla _default_\-osa, johon tullaan ellei yksikään _case_\-vaihtoehdoista vastaa lausekkeen arvoa. Jos _default_\-osa puuttuu eikä mikään tapausvakio vastaa lausekkeen arvoa, ohjelman suoritus jatkuu _switch_\-rakennetta seuraavasta lauseesta.
* Tapausvakiot ovat nimensä mukaisesti vakioita. Niiden arvot tulee näin ollen voida ratkaista jo ohjelman käännösvaiheessa. Tämä tarkoittaa, että tapausvakioina ei voi olla muuttujia. Vakiolausekkeiden arvojen on lisäksi oltava kokonaislukutyyppisiä (char, int, long).
* _break_\-lauseet, joihin yksittäiset _case_\-haarat päättyvät, eivät ole pakollisia. Mikäli ohjelmassa on haarauduttu _case_\-osaan, jonka lopusta puuttuu break-lause, ohjelman kontrolli "valuu" seuraavaan _case_\-osaan. Vasta, kun törmätään seuraavaan break-lauseeseen, kontrolli siirtyy pois _switch_\-rakenteesta. Joissain tilanteissa tämä voi olla toivottava toimintamalli.
h2. Esimerkki 1
Koodinpätkä, jossa suoritetaan yksi tominto useata _case_-haaraa kohden.
{code}
...
switch (muuttuja1) {
case 0 :
case 1 :
case 2 :
case 3 :
printf("Muuttuja1:n arvo on välillä 0...3\n");
break;
case 5 :
case 6 :
case 7 :
case 8 :
printf("Muuttuja1:n arvo on välillä 5...8\n");
break;
default :
printf("Muuttuja1:n arvo ei ole välillä 0...3 eikä 5...8\n");
break;
}
...
{code}
Yllä oleva ohjelmanpätkä toimisi siten, että jos {{muuttuja1}}:n arvo olisi *0*,*1*,*2* tai *3*, niin ohjelma tulostaisi:
{noformat}Muuttuja1:n arvo on välillä 0...3{noformat}
tai jos {{muuttuja1}}:n arvo olisi *5*,*6*,*7* tai *8*, niin ohjelma tulostaisi:
{noformat}Muuttuja1:n arvo on välillä 5...8{noformat}
tai jos arvo olisi jokin muu kuin yllä määritelty, niin ohjelma tulostaisi:
{noformat}Muuttuja1:n arvo ei ole välillä 0...3 eikä 5...8{noformat}
h2. Esimerkki 2
Koodi joka tulostaa valikon, ja tottelee käyttäjän antamia käskyjä sen mukaisesti.
{code}
void Valikko(); // tulostaa käyttäjälle ohjeet
void Funktio1();
void Funktio2();
void main()
{
unsigned int Valitsin = 0;
while (1) {
valikko();
Valitsin=getch();
switch (Valitsin) {
case '0' : return;
case '1' : Funktio1(); break;
case '2' : Funktio2(); break;
default : break;
}
}
}
void Funktio1()
{
system("cls"); // tyhjentää ruudun
printf("\n Funktio 1 PAINA JOTAIN");
getch();
}
void Funktio2()
{
system("cls"); // tyhjentää ruudun
printf("\n Funktio 2 PAINA JOTAIN");
getch();
}
void valikko()
{
system("cls"); // tyhjentää ruudun
printf("\n0........Lopetus");
printf("\n1........Funktio 1");
printf("\n2........Funktio 2");
}
{code}
Switch case rakenne entry do ja exit ehdoilla
Switch-case valintarakenteen muoto:
{code}
switch (lauseke) {
case arvo_1 :
//entry
if (laskuri==0){
//alustus
}
//do
if (laskuri>0{
//toiminnot oltaessa ko. askeleella
}
laskuri++;
if(laskuri>10){
laskuri=10;
}
//exit
if (postimuisiehto==true){
laskuri=0;
lauseke=arvo_2;
}
break;
case arvo_2 :
//entry
if (laskuri==0){
//alustus
}
//do
if (laskuri>0{
//toiminnot oltaessa ko. askeleella
}
laskuri++;
if(laskuri>10){
laskuri=10;
}
//exit
if (postimuisiehto==true){
laskuri=0;
lauseke=arvo_2;
}
break;
case arvo_3 :
...
break;
...
default :
lauseita;
break;
}
{code}
|