Skočiť na obsah


Programovanie v jazyku C a C#

Návody pre začiatočníkov a pokročilých



Fórum: Škôlka jazyka C
* * * * -
Fotografia

7. lekcia C (Prepínač switch) škôlka


Prepínač switch
Výraz za príkazom switch je v zátvorkách niečo typu char alebo int. (Teda napríklad float tam byť nesmie.)

switch (výraz) {

case hodnota_1 : príkaz_1; break;

...

case hodnota_n : príkaz_n; break;

default : príkaz_def; break;

}
Poznámka:
Výpis niekoľkých hodnôt, pre ktoré má byť prevedený rovnaký príkaz má formu:
case hodnota_1_1 :

case hodnota_1_2 :

...

case hodnota_1_n : príkaz; break;
Príklad:
Tento úsek programu vypíše znaky 123 po stlačení klávesy 'a' alebo 'b' alebo 'c'. Po stlačení 'd' vypíše 23 a po stlačení inej klávesy vypíše 3.
switch (getchar()) {

case 'a' :

case 'b' :

case 'c' : putchar('1');

case 'd' : putchar('2');

default : putchar('3');

}
Prečo nepracuje tak ako má? Treba tam doplniť príkaz break!
Pre normálnu (očakávanú) funkciu prepínača je nutné program poopraviť takto:
switch (getchar()) {

case 'a' :

case 'b' :

case 'c' :

	putchar('1');

	break;

case 'd' :

	putchar('2');

	break;

default :

	putchar('3');

	break;

}
Príklad switch(int).

#include <stdio.h>



int main()

{

int i;



printf("Napis cislo 1, 2 alebo 3: ");

scanf("%d", &i);

switch (i) {

	case 1:

	 printf("Napisal si jednicku.\n");

	 break;

	case 2:

	 printf("Napisal si dvojku.\n");

	 break;

	case 3:

	 printf("Napisal si trojku.\n");

	 break;

	default:

	 printf("Napisal si nieco ine.\n");

}

return 0;

}

Príkaz goto

V dobre napísaných programoch sa používa málokedy, pretože v Céčku sa mu dá vťdy vyhnúť.
Pokiaľ je použitý, musí pre to byť seriózny dôvod a musí to byť "rozumne prevedené! použitie.
Jedno z mála serióznych použití je výskok z vnorených (zahniezdených) cyklov.

Príklad:
Jedno z klasických použití goto. Využíva sa preto, že zjednodušuje a zprehľadňuje program.

#include <stdio.h>



int main()

{

int i, j, k, x[15], a[15], b[15];



for (i = 0; i < 10; i++) {

	for (j = 0; j < 10; j++) {

	 for (k = 0; k < 10; k++) {

		printf("x[k] = %d\n", x[k]);

		if (x[k] == 0)				 /* ak bude splnená podmienka, */

		 goto error;					/* vyskočí to zo všetkých vnorených cyklov */

		printf("a[i] = a[i] + b[j] / x[k]\n");

		a[i] = a[i] + b[j] / x[k];

		printf("a[i] = %d\n\n\n", a[i]);

	 }

	}

}

error:								 /* a splní príkaz error: */

	printf("\nNulovy delitel\n");

return 0;

}

Obrázok

Túto časť programu zakomentuj a vyskúšaj čo to spraví:
if (x[k] == 0)
goto error;

Príkaz goto sa dá aj v tomto prípade nahradiť príkazom break, len break sa musí použiť na výskok z každého vnoreného cyklu.

#include <stdio.h>



int main()

{

int i, j, k, x[15], a[15], b[15];



for (i = 0; i < 10; i++) {

	for (j = 0; j < 10; j++) {

	 for (k = 0; k < 10; k++) {

		printf("x[k] = %d\n", x[k]);

		if (x[k] == 0)

		 break;

		printf("a[i] = a[i] + b[j] / x[k]\n");

		a[i] = a[i] + b[j] / x[k];

		printf("a[i] = %d\n\n\n", a[i]);

	 }

	 if (x[k] == 0)

		break;

	}

	if (x[k] == 0)

	 break;

}

printf("\nNulovy delitel\n");

return 0;

}

Príkaz return

Ak beh programu dojde na príkaz return, ukončí sa beh funkcie, ktorá tento príkaz obsahuje.
Vo funkcii main() ukončí príkaz return celý program
Často sa pomocou return vracia nejaká hodnota, ktorej typ záleží na type funkcie.

Príklad:
Ak boli operácie s poľami "[i]" z prechádzajúceho prípadu prevedené volaním funkcie, je potom vhodnejšie použitie príkazu return a nie goto.
Pre zaistenie, či funkcia splnila svoju úlohu správne, nám poslúži návratová hodnota. Ak je jej hodnota 1 - TRUE, ak je hodnota 0 - FALSE.

#include <stdio.h>



int vypocty(int i, int j, int k, int x[], int a[], int b[]) /* samostatná funkcia */

{





for (i = 0; i < 10; i++) {

	for (j = 0; j < 10; j++) {

	 for (k = 0; k < 10; k++) {

		printf("x[k] = %d\n", x[k]);

		if (x[k] == 0)

		 return (printf("\nNulovy delitel\n"));	 /* neuspech vypise "Nulovy delitel" */

		printf("a[i] = a[i] + b[j] / x[k]\n");

		a[i] = a[i] + b[j] / x[k];

		printf("a[i] = %d\n\n\n", a[i]);

	 }

	}

}

return (1);	 /* uspech */

}

int main() /* funkcia main */

{

int a, b, c, d[15], e[15], f[15]; /* deklarácia premenných */



vypocty(a, b, c, d, e, f);		/* volanie funkcie vypocty() */

printf("Program bezi dalej.\n"); /* vypise sa text */

return 0;

}

Výstup je rovnaký ako pri funkcii goto až na to, že je tam pridaný riadok: Program bezi dalej.

Poznámka:
Občas sa môžeme stretnúť s použitím funkcie exit().
Tá má podobný význam ako príkaz return. Rozdiel je v tom, že ak je vyvolaná z ktorejkoľvek funkcie, ukončí bezprostradne program, bez návratu do funkcie volajúcej.

#include <stdio.h>

#include <stdlib.h> /* knižnica aby sa dal použiť príkaz exit() */



int vypocty(int i, int j, int k, int x[], int a[], int b[]) /* samostatná funkcia */

{





for (i = 0; i < 10; i++) {

	for (j = 0; j < 10; j++) {

	 for (k = 0; k < 10; k++) {

		printf("x[k] = %d\n", x[k]);

		if (x[k] == 0)

		 exit(EXIT_FAILURE);	 /* ukončí program, aj keď nie je v hlavnom cykle */

		printf("a[i] = a[i] + b[j] / x[k]\n");

		a[i] = a[i] + b[j] / x[k];

		printf("a[i] = %d\n\n\n", a[i]);

	 }

	}

}

return (1);	 /* uspech */

}

int main() /* funkcia main */

{

int a, b, c, d[15], e[15], f[15]; /* deklarácia premenných */



vypocty(a, b, c, d, e, f);		/* volanie funkcie vypocty() */

printf("Program bezi dalej.\n"); /* nevypíše sa, pretože program skoncil vo funkcii vypocty() */

return 0;

}

Výstup je rovnaký ako pri funkcii return až na to, že riadok: Program bezi dalej sa nevypíše, pretože beh programu bol ukončený príkazom exit().


Úlohy:

1. S pomocou príkazu switch napíš program, ktorý si vypýta číslo, v prípade, že je to 1, 2 alebo 3 napíše obstojne cislo, ak je to 4 alebo 5, napíše ujde to a ak je to nejaké iné číslo, napíše humus.
Spoiler

2. S pomocou príkazu switch napíš program, ktorý si pýta znaky. Ak je znak 'a', 'b' alebo 'c', vypíše: Zadal si 'a', 'b' alebo 'c'. Ak je znak '5', 'U' alebo '*', vypíše: Zadal si '5', 'U' alebo '*'.
Ak je to znak 'X', ukončí sa program (použi exit(EXIT_FAILURE)). Ak je to iný znak ako sú uvedené, vypíše: Ostatne znaky.
Spoiler
  • 0

Popis: Prepínač switch

- switch-case-default
- goto
- return
- exit(EXIT_FAILURE);
- úlohy k lekcii
Poznámky: Ak chceš, aby ti niekto úlohy skontroloval, zabal ich do zip-u a zašli na e-mail:
libcosenior zavináč gmail botka com

Poprípade tam môžeš konzultovať, čo ti nie je jasné.
Odkazy:


0 Komentárov


Najlepšie lekcie


Najnovšie pridané lekcie


Najnovšie komentáre


Najviac komentované lekcie


Najviac zobrazené lekcie


Náhodné lekcie


Na tejto stránke bolo užívateľ(ov) za posledných 30 minút

členov, návštevníkov