Anglická verze
logolink

< Zpět na seznam lekcí

Podmínky - větvení programu

AlgortimyObsah lekce:

  • Co je to podmínka
  • Syntaxe příkazu IF (ELSE) v jazyce C
  • Jednoduché podmínky
  • Složitější podmínky a operátory AND a OR
  • Příklad pokročilejšího výpočtu matematického vzorce

Co je to podmínka

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:

  • Když prší, tak si vezmu deštník.
  • Když svítí na semaforu zelená, tak mohu jít, jinak ne.
  • Když svítí na semaforu zelená a opravdu nic nejede, tak mohu jít, jinak ne.

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.

Syntaxe příkazu if (else) v jazyce C

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í:

ZÁKLADNÍ SYNTAXE PŘÍKAZU IF V PROGRAMOVACÍM JAZYCE 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í.

SYNTAXE PŘÍKAZU IF (ELSE) V PROGRAMOVACÍM JAZYCE C
if (podmínka) 
{
	posloupnost-příkazů-1
}
else
{
	posloupnost-příkazů-2
}

Jednoduché podmínky

Ukažme si jednoduchý příklad:

IF V PROGRAMOVACÍM JAZYCE C
#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:

IF-ELSE V PROGRAMOVACÍM JAZYCE C
#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:

IF-ELSE V PROGRAMOVACÍM JAZYCE C
#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.

IF-ELSE V PROGRAMOVACÍM JAZYCE C
#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;
}

Složitější podmínky a operátory && a ||

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 &&

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}).

Příklad použití operátoru AND v podmínce
#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 ||

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 }).

PŘÍKLAD POUŽITÍ OPERÁTORU OR V PODMÍNCE
#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;
}

Příklad pokročilejšího výpočtu matematického vzorce

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.

Podíl dvou čísel v programovacím jazyce C
#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í:

Podíl dvou čísel v programovacím jazyce C
#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:

Podíl dvou čísel v programovacím jazyce C
#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;
}

Domácí úkol

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.

Domácí úkol

Napište program pro výpočet odmocniny ze zadané hodnoty A.

Otázky

  1. Jakým způsobem lze rozvětvit program?
  2. Jaký je správný zápis podmínek IF a ELSE? Ukažte více příkladů.
  3. Je možné provést za příkazem ELSE posloupnost více dalších příkazů?
  4. Obsahuje příkaz IF nebo ELSE nějakou specialitu ohledně syntaxe?
webdesign, xhtml, css, php - Mgr. Michal Mikláš