Obsah lekce:
V reálném životě se často setkáváme s podmínkami - rozhodováním se na základě nějakých skutečností - například:
Obecně řečeno: Když platí nějaká podmínka, tak ..., jinak ... Podmínky mohou být různě složité a v různém množství - tím se pak celá soustava podmínek komplikuje, ale může poskytovat řešení i pro poměrně složité situace.
V jazyce C (stejně jako v mnoha dalších programovacích jazycích) existuje příkaz if (else). Syntaxe tohoto příkazu je následující:
if (podmínka)
{
posloupnost-příkazů
}
Chceme-li také specifikovat co je má stát, když podmínka naplatí, pak příkaz IF obsahuje ještě část ELSE, která se vykoná, pokud podmínka neplatí.
if (podmínka)
{
posloupnost-příkazů-1
}
else
{
posloupnost-příkazů-2
}
Ukažme si jednoduchý příklad:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a;
scanf("%d", &a);
if (a > 5)
{
printf("a je vetsi nez 5")
}
fflush(stdin);
getchar();
return 0;
}
Pokud budeme chtít být přesnější informaci, pak použijeme kompletní tvar IF-ELSE:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a;
scanf("%d", &a);
if (a > 5)
{
printf("a je vetsi nez 5")
}
else
{
printf("a je mensi nez 5");
}
fflush(stdin);
getchar();
return 0;
}
Pokud budeme chtít být ještě přesnější a vyhodnotit jak obě nerovnosti, tak i rovnost, pak použijeme buď vnořený if nebo konstrukci if-else if-else:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a;
scanf("%d", &a);
if (a > 5)
{
printf("a je vetsi nez 5")
}
else
{
if (a == 5)
{
printf("a je rovno 5");
}
else
{
printf("a je mensi nez 5");
}
}
fflush(stdin);
getchar();
return 0;
}
Pozn.: V tomto příkladu si ještě můžeme všimnout operátoru "je rovno", není zde použit znak rovná se, který se používá pro přiřazení hodnoty, ale dva znaky rovná se.
Popřípadě můžeme tento zápis o něco zkrátit použitím konstrunce if – else if – else.
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a;
scanf("%d", &a);
if (a > 5)
{
printf("a je vetsi nez 5")
}
else if (a == 5)
{
printf("a je rovno 5");
}
else
{
printf("a je mensi nez 5");
}
fflush(stdin);
getchar();
return 0;
}
Potřebujeme-li podmínku složitější, pak je ji možno složit z více podmínek pomocí logických operátorů && (význam AND) a || (význam OR).
Operátor && je analogií spojky "a". Pokud spojíme několik podmínek spojkou && , pak je výsledná podmínka platná POUZE v případě, když je platná KAŽDÁ z podmínek. V běžném životě tento operátor používáme například při následující úvaze: "Když prší A jsem venku, pak si roztáhnu deštník." nebo "Když na mě prší A mám deštník, pak si jej roztáhnu." (if ((prsi na me) && (mam destnik)) {roztahnu ho}).
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a, b;
scanf("%d", &a);
scanf("%d", &b);
if (a < 0 && b < 0)
{
printf("Cisla a a b jsou zaporna!")
}
else
{
printf("Cisla a a b nejsou obe zaporna!")
}
fflush(stdin);
getchar();
return 0;
}
Operátor || je analogií spojky "nebo". Pokud spojíme několik podmínek spojkou ||, pak je výsledná podmínka platná VŽDY, když je platná ALESPOŇ JEDNA z podmínek (neboli není platná pouze v případě, že neplatí žádná z podmínek). V běžném životě tento operátor používáme například při následující úvaze: "Když mám hlad nebo mě honí mlsná, pak si dám něco dobrého." nebo "Když chci být dobrý student NEBO se nudím, pak se něco učím." (if ((chci byt dobry student) || (se nudim)) {se ucim }).
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a, b;
scanf("%d", &a);
scanf("%d", &b);
if (a > 0 || b > 0)
{
printf("Alespon jedno z cisel a a b je vetsi nez 0!")
}
else
{
printf("Cisla a a b jsou obe mensi nebo rovna 0!")
}
fflush(stdin);
getchar();
return 0;
}
V předchozích lekcích jsme řešili výpočet jednoduchých vzorců. Některé z nich vypadaly již docela komplikovaně. Zkuste se zamyslet a napsat program pro výpočet obyčejného podílu čísel a a b.
Příklad: Výpočet podílu dvou libovolně zadaných čísel a a b.
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a, b;
printf("Zadejte cislo a: ");
scanf("%d", &a);
printf("Zadejte cislo b: ");
scanf("%d", &b);
if (b == 0)
{
printf("Deleni nulou je nedefinovaná operace, proto nelze podil zadaných cisel spocitat.");
}
else
{
printf("Podil zadanych cisel je %d",a/b);
}
fflush(stdin);
getchar();
return 0;
}
Jak víme z matematiky, tak dělení nulou není povolená operace. A skutečně, pokud na tento fakt zapomeneme, tak program při pokusu o dělení nulou havaruje (což je neakceptovatelný stav). Vidíme, že bez podmínky if-else není ani možné korektně určit obyčejný podíl dvou libovolných čísel.
Pojďme si nyní úkol ještě nepatrně zkomplikovat tím, že budeme v předchozím programu požadovat, aby byl podíl a/b uložen v proměnné c. První, co nás asi napadne, je toto řešení:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a, b, c;
printf("Zadejte cislo a: ");
scanf("%d", &a);
printf("Zadejte cislo b: ");
scanf("%d", &b);
if (b == 0)
{
printf("Deleni nulou je nedefinovaná operace, proto nelze podil zadaných cisel spocitat.");
}
else
{
c = a / b;
printf("Podil zadanych cisel je %d",c);
}
fflush(stdin);
getchar();
return 0;
}
Při výpočtu narazíme na jeden problem. Pokud dělíme dvě čísla (např. 5 a 2), výsledkem bude vždy celé číslo (v našem případě 2). Co když ale budeme chtít přesnější výsledek?
Problém je v datových typech. Výsledkem podílu dvou celých čísel je v jazyce C celé číslo (I když jej poté ukládáme do reálné proměnné). Pokud chceme, aby bylo výsledkem reálné číslo a zároveň chceme na vstupu ponechat čísla celá (například kvůli paměťovým nárokům programu), je nutné jednu z hodnot přetypovat (změnit její datový typ pro potřeby výpočtu). To provedeme tak, že ve výpočtu uvedeme před jménem proměnné v závorce požadovaný datový typ.
Výsledný program bude vypadat následujícím způsobem:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a, b;
float c;
printf("Zadejte cislo a: ");
scanf("%d", &a);
printf("Zadejte cislo b: ");
scanf("%d", &b);
if (b == 0)
{
printf("Deleni nulou je nedefinovaná operace, proto nelze podil zadaných cisel spocitat.");
}
else
{
c = (float)a / b;
printf("Podil zadanych cisel je %f",c);
}
fflush(stdin);
getchar();
return 0;
}
Napište program pro výpočet vzorce X=(A+B)/(C/D). Uživatel zadá na vstupu proměnné A, B, C i D.
Napište program pro výpočet odmocniny ze zadané hodnoty A.