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

5. lekcia C (Podmienky) škôlka


Príkaz if, if - else, if - else if - else, terárny operátor a operátor čiarky.

Na využitie podmienok v programe sa používajú príkazy: if, if - else, if - ifelse - else, terárny operátor a operátor čiarky.

Pre pochopenie skúsim príkazy vysvetliť po slovensky. ;)

1) Len jeden príkaz if:
if (ak) je podmienka pravda, vykonám stanovené a pokračujem na ďalšom riadku programu
ak podmienka nie je pravda, nevykonám nič a pokračujem na ďalšom riadku programu
Ak je v tele if, teda za podmienkou len jeden príkaz, nemusí sa uzatvárať do kučeravých zátvoriek.

#include <stdio.h>

int main(void)

{

int i = 5, j = 7;

if (i < j)				/* podmienka je pravda */

	printf("%d\n", i + j); /* vypocet sa vykona */

	return 0;

}

Ak je v tele if, teda za podmienkou viac príkazov, musia sa uzavrieť do kučeravých zátvoriek, inakšie by sa bral do úvahy len prvý príkaz!!!.

Poznámka: Telo príkazu je uzatvorené do { }. Ak je podmienka pravda, vykoná sa obsah tela.
Obrázok

Poznámka: Telo príkazu nie je uzatvorené do { }. Ak je podmienka pravda, vykoná sa len jeden príkaz tela (viac ich tam nie je), ale pretože ďalší príkaz sa nachádza za ním, tak sa vykoná aj ten.
Obrázok

Poznámka: Podmienka je nepravda. Telo sa nevypíše.
Obrázok

Poznámka: Podmienka je nepravda. Vypíše sa až nasledujúci riadok.
Obrázok

2) Viac príkazov if pod sebou:
if (ak) je podmienka pravda, vykonám stanovené a pokračujem na ďalšom if
if (ak) podmienka nie je pravda, nevykonám nič a pokračujem na ďalšom if
if (ak) je podmienka pravda, vykonám stanovené a pokračujem na ďalšom if
atď.
po poslednom if
if (ak) je podmienka pravda, vykonám stanovené a pokračujem na ďalšom riadku programu
ak podmienka nie je pravda, nevykonám nič a pokračujem na ďalšom riadku programu

Poznámka: Príkazy if sa vyhodnocujú ako idú po sebe. V ktorom je podmienka pravda, ten sa vykoná, v ktorom nie, ten sa nevykoná.
Obrázok

3) Príkaz if - else
if (ak) je podmienka pravda, vykonám stanovené a pokračujem za príkazom else
ak podmienka nie je pravda, vykonám stanovené príkazom else
else - ak if je nepravda, vykonám stanovené

Poznámka: Ak je podmienka if pravda, vykoná sa telo if, a preskočí príkaz else aj s telom.
Ak je podmienka if nepravda,preskočí sa telo if, a vykoná sa telo else.
Obrázok

4) Príkaz if -else if - else
Vyhodnocuje sa postupne kým nenarazí na splnenú podmienku. Potok zvyšok preskočí a pokračuje ďalej.

Poznámka: Výsledok je 3, myslím že funkcia je jasná.
Obrázok


Podmienený výraz – ternárny operátor

výraz_podmienka ? výraz_1 : výraz_2

má význam:

if výraz_podmienka then výraz_1 else výraz_2

Poznámka: Ak je splnená podmienka vľavo od ?, vtedy platí výraz vpravo od ? a vľavo od :.
Ak nie, platí výraz vpravo od :.
Obrázok

Zátvorky okolo podmienky nie sú nutné, ale uvádzajú sa pre zvýšenie čitateľnosti kódu.
Väčšinou sa podmienený výraz sa veľmi nepoužíva, pretože if – else je oveľa čitateľnejšie.

V niektorých prípadoch (klasických) je však užitočný, napr.: konverzia znakov na malé písmená:
c = (c >= 'A' && c <= 'Z') ? c + ('a' – 'A') : c;
Terárny operátor sa dá využiť viacnásobne za sebou v jednom príkaze:

Poznámka: Myslím, že z príklade je funkcia jasná.
Obrázok


Operátor čiarky

Syntax operátora čiarky je jednoduchý – výraz: výraz_1, výraz_2
Zpracocácá sa tak, že výraz_1 sa vyhodnotí a je zabudnutý, potom sa vyhodnotí výraz_2 a to je vlastne záverečný výsledok po použití výrazu s operátorom čiarky.
Príklad:
int i = 2, j = 4;	 /* toto nie je operátor čiarky */

j = (i++, i – j);	 /* i bude 3 a j bude -1 */
Poznámka
V tomto prípade sú zátvorky nutné, pretože operátor čiarky má najnižšiu prioritu, teda bez nich by vyhodnotenie bolo: (j = i++), i – j; čo nie je príkaz.

Niekoľko príkladov:
1) Program prečíta z klávesnice dva znaky a vytlačí znak s menším ordinárnym číslom.
#include <stdio.h>

int main()

{

int c, d;



c = getchar();

d = getchar();

putchar(c < d ? c : d);

return 0;

}
2) Rovnaký program trochu inakšie.
#include <stdio.h>

int main()

{

int c, d;



c = getchar();

putchar(c < (d = getchar()) ? c : d);

return 0;

}
Porgram prečíta tri reálne čísla a zobrazí najväčšie z nich.
#include <stdio.h>

main()

{

double x, y, z, max;



printf("Zadaj tri realne cisla : ");

scanf("%lf %lf %lf", &x, &y, &z);

		 /* prazdny riadok zvysuje prehladnost */

if (x > y) {	 /* zátvorka { nie je nutná, ale vhodná */

	if #(x > z)

	 max = z;

}		 /* zátvorka } nie je nutná, ale vhodná */

else {	/* zátvorka { nie je nutná, ale vhodná */

	if (y < z)

	 max = z;

else

	max = y;

}		 /* zátvorka } nie je nutná, ale vhodná */

		 /* prazdny riadok zvysuje prehladnost */

printf("\nNajvacsie cislo je %f \n", max);

}
Pozor:
V C programoch sa často objavuje, že namiesto príkazu:
if (výraz != 0) sa často píše len if (výraz)
a namiesto príkazu:
if (výraz == 0) len if (!výraz)
V lekcii č. 4 sme hovorili o tom, ako vytvárať podmienky a ako ich jazyk C
vyhodnocuje. V lekcii č. 5 si ukážeme niektoré spôsoby, ako sa to, či nejaká podmienka je alebo
nie je splnená dá použiť a zneužiť pre naše účely.
Ak chceme nejaký kus kódu vykonať iba vtedy, keď je splnená podmienka, používa sa na to
príkaz if (po slovensky „ak“). Tento príkaz má dva varianty. Jednoduchší funguje napríklad takto:
char c;

printf("Zadaj na vstup pismenko A: ");

c = getchar();

if (c != 'A')

{

printf("Vravel som A !!!\n");

}
Za príkazom if nasleduje podmienka uzavretá v zátvorkách. (Pozor! Častá začiatočnícka
chyba je, že sa na tie zátvorky okolo podmienky zabudne.) Potom nasleduje kus kódu v kučeravých
zátvorkách, ktorý sa vykoná len vtedy, keď je podmienka splnená.
Náš program najprv vypíše výzvu, aby sa zadalo písmenko. Potom sa zavolá funkcia
getchar(). Je to prvá funkcia, ktorá dáva nejaký výsledok, s ktorou sme sa zatiaľ stretli.
Výsledkom funkcie getchar() je jeden načítaný znak z terminálu. Ten sa vloží do premennej c.
Za príkazom if je podmienka, ktorá je splnená vtedy, keď v premennej c nie je 'A'. Takže ak tam
človek nedá A, tak mu program vynadá.
Druhý zložitejší variant je kombinácia príkazov if – else („ak – inak“). Zase
ukážka:

Na začiatku sa po výzve načíta jedno celé číslo. Za príkazom if je podmienka, ktorá je
splnená vtedy, keď je číslo v premennej i párne. (Zvyšok po delení dvoma (i % 2) je rovný nule.)
V prípade, že tá podmienka splnená je, vykoná sa kus kódu, ktorý nasleduje tesne po podmienke.
(Keďže je to len jeden príkaz, mohli sme vynechať { a }.) V prípade, že podmienka splnená nie je,
vykoná sa kód za príkazom else. (Keďže sú tam až dva príkazy, sú kučeravé zátvorky nutné!!!
Keby ste ich tam nedali, jazyk C by za súčasť príkazu else pokladal iba prvý z nasledujúcich
príkazov a druhý by vykonal vždy.)

Úlohy:

1. Napíš program podľa vzoru. Vyskúšaj ako funguje. Vynechaj kučeravé
zátvorky za else, znovu skompiluj a vyskúšaj. (úloha sa neodovzdáva)

#include <stdio.h>



int main (void)

{

int i;



printf("Zadaj cislo: ");

scanf("%d", &i);

if (i % 2 == 0)

	printf("%d je parne cislo\n", i);

else

/* { */

	printf("%d je neparne\n", i);

	printf("Toto vidno vidno ked nie su kucerave zatvorky a je zadane parne cislo.\n");

/* } */

}

2. Napíš program, ktorý sa ťa spýta, či máš rád programovanie a podľa tvojej
odpovede (A alebo N) ti povie niečo duchaplné.
3. Vylepši program z úlohy č.2 tak, aby v prípade, že neodpovieš ani A ani N oznámil, že
dostal neočakávanú odpoveď.
Spoiler

4. S pomocou príkazu if – else napíš program, ktorý načíta celé číslo. Ak je toto
číslo kladné, tak ho vypíše a inak vypíše nulu.
Spoiler

5. Napíš program, ktorý načíta dve čísla a vypíše to väčšie z nich. Skús to spraviť
s pomocou podmienených výrazov.
Spoiler

Nepovinný variant pre frajerov a guruov: Napíš
program, ktorý načíta tri čísla a vypíše ich od najväčšieho po najmenšie.
Spoiler

6. Na rýchlostnú skúšku na diaľnici sa dostavili bohužiaľ len 2 autá. Prvé auto bolo tvojho pocítača a prešlo trasu dĺžky 250m za 7s, druhé je užívateľa programu a prešlo ju za t2 (zadá užívateľ) sekund.

Výstupy:
■ Akou rýchlosťou v m/s a km/h každé auto išlo?
■ Ktoré auto bolo rýchlejšie?
■ Ktoré auto prekročilo rýchlosť 100km/h?
■ O koľko km/h bol víťaz rýchlejší ako porazený?
■ Ako sa volal vodič prvého auta?

Pomôcka: zaokrúhlenie číslo na určitý počet desatinných miest -> %0.2f
Spoiler

7. Uprav pomocou explicitnej typovej konvencie delenie f = i / j; tak, aby bola v premennej f hodnota 2.5, ktorú vypíš. V priradení hodnôt premenných i (5) a j (2) over tiež funkciu operátora čiarka.
Spoiler

8. Napíš program, ktorá prečíta dve celé čísla a pomocou ternárneho operátora ( ? : ) vytlačí napr.:
mensie cislo : 5
vacsie cislo : 8
Spoiler

9. Vyskúšaj funkciu programu: (úloha sa neodovzdáva)
so zátvorkami:
(c = getchar()) (správne)
int c;



printf("Zadaj pismeno 'B': ");

if ((c = getchar()) >= 'A' && c <= 'Z')

printf("%d \n", c);
bez zátvoriek:
c = getchar() (nesprávne)
int c;



printf("Zadaj pismeno 'B': ");

if (c = getchar() >= 'A' && c <= 'Z')

printf("%d \n", c);
Skús pochopiť, prečo sú výsledky rozdielne.
(Nájdi si na nete niečo o prioritách a poradí vyhodnocovania operátorov.)

10. Prečítaj znak a ak to nie je číslica ani písmeno, vypíše nápis:
interpunkcny znak
V ostatných prípadoch vytlačí nápis: Alfanumericky znak.
Použi len jeden príkaz (if – else) a nezabudni na malé písmená.
(if - else sa dá použiť ako podmienka terárny operátor)
Spoiler

11. Prežítaj jeden znak. Podľa jeho hodnoty vypíš jeden z nasledujúcich nápisov a prečítaný znak vypíš v apostrofoch, napr.:
interpunkčný znak : '>'
cislica : '3'
velke pismeno : 'K'
male pismeno : 'a'
Spoiler

12. Over na príklade, že podmienky:
if (vyraz != 0) a if (vyraz)
majú totožnú funkciu.
To isté over aj pre opačné podmienky:
if (vyraz == 0) a if (!vyraz)
Spoiler

13. Dopíš nasledujúci program tak, aby bolo možné overiť skrátené vyhodnocovanie && podmienky:
if (i == 5 && ++j == 3)
printf("podmienka platna\n");
Spoiler

14. Dopíš nasledujúci program tak, aby bolo možné overiť skrátené vyhodnocovanie || podmienky:
if (i == 5 || ++j == 3)
printf("podmienka platna\n");
Spoiler

15. Napíš program, ktorý prečíta dva znaky v rozsahu 0 – 9 alebo A – F. Pozor – nečítaj jedno hexadecimálne číslo! Tieto dva znaky potom považuj za hexadecimálne číslo a jeho hodnotu vypíš dekadicky.
To znamená, že výstup napr.: 59, 0D, A7, FF (označuje sa aj 0Dh) je hexadecimálne (šestnásťkové) číslo a treba ho previesť na dekadické (desiatkové).
Najdi si na nete tému "Prevody medzi číselnými sústavami" v sekcii "Často kladené otázky (FAQ)".
Spoiler
  • 0

Popis: Podmienky

- if
- if-else
- if-else if-else
- terárny operátor (podmienený výraz)
- operátor čiarky
- ú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