Opakování - kalkulačka
Dnes si naprogramujeme jednoduchou kalkulačku. Dřív, než se podíváte na řešení, vyzkoušejte si implementaci sami. Opravdu, věřte mi. Jenom čtením kódu se programovat nenaučíte, je potřeba samostatně zkoušet, chybovat a znovu zkoušet.
Upozorňuju, že se moje řešení může (a pravděpodobně bude) od vašeho lišit! Každý má jiné nápady, jiné myšlenkové pochody. V normálním světě, tam venku, by body, kde se názory rozcházejí, byly předmětem diskuze, případně by ideálně byly rovnou součástí specifikace (např. po poradě se zákazníkem). Pokud vaše řešení dělá to, co má, je to v pořádku. Pokud se budete držet zásady, že každá funkce má plnit jenom jednu úlohu, rozdělíte kód, budete ho udržovat hezky čitelný, o to lépe.
Začneme tím, že si vytvoříme základní kostru. Každý program potřebuje main-funkci, dodatečně k této hlavní funkci se zamyslíme i nad tím, jaké další funkcionality by naše kalkulačka měla mít.
Nejdříve se zamyslíme nad tím, co naše kalkulačka musí umět a jak to budeme testovat. Přičemž testování bude zatím nejjednodušší pomocí printf v mainu. A naše kalkulačka by měla umět sčítat, odečítat, násobit a dělit.
První základní kostra by mohla vypadat následovně:
#include <stdio.h>
int scitani(int a, int b)
{
return a + b;
}
int odecitani(int a, int b)
{
return 0;
}
int nasobeni(int a, int b)
{
return 0;
}
// TODO: deleni
int main(void)
{
printf("Test: %d\n", scitani(5, 3));
return 0;
}
Podařilo se vám naimplementovat odečítání a násobení? Vyzkoušeli jste, jestli funkce vrací požadovanou hodnotu? Pokud ano, tak se můžeme vrhnout na dělení.
Dělení:
#include <stdio.h>
int scitani(int a, int b)
{
return a + b;
}
int odecitani(int a, int b)
{
return 0;
}
int nasobeni(int a, int b)
{
return 0;
}
double deleni(int a, int b)
{
if (b == 0)
{
printf("Chyba: deleni nulou!\n");
return -1;
}
return (double) a / b;
}
int main(void)
{
printf("Test: %f\n", deleni(5, 3));
return 0;
}
Hurá, pokud jste se dostali až sem, tak už váš program počítá! Ale nezůstaneme jenom u toho. Zatím jsme čísla předávali v kódu. Zkuste si o čísla říct uživateli (připomínám kapitolu o scanf).
User input:
int main(void)
{
int a, b;
printf("Prosim zadejte 2 cisla (oddelena mezerou): ");
scanf("%d %d", &a, &b);
printf("Test: %f\n", deleni(a, b));
return 0;
}
Skvělé, uživatel dokáže určit, se kterými čísly bude chtít počítat. Už zbývá jenom nechat ho rozhodnout, kterou operaci by rád provedl a následně pomocí větvení provést vybranou početní operaci. Zkuste si příklad dořešit nejdříve sami.
Výsledný kód by mohl vypadat takto:
#include <stdio.h>
int scitani(int a, int b)
{
return a + b;
}
int odecitani(int a, int b)
{
return a - b;
}
int nasobeni(int a, int b)
{
return a * b;
}
double deleni(int a, int b)
{
if (b == 0)
{
printf("Chyba: deleni nulou!\n");
return -1;
}
return (double) a / b;
}
int main(void)
{
int a, b;
char operace;
printf("Prosim zvolte operaci (+, -, *, /): ");
scanf("%c", &operace);
printf("Prosim zadejte 2 cisla (oddelena mezerou): ");
scanf("%d %d", &a, &b);
double vysledek;
switch (operace)
{
case '+':
vysledek = scitani(a, b);
break;
case '-':
vysledek = odecitani(a, b);
break;
case '*':
vysledek = nasobeni(a, b);
break;
case '/':
vysledek = deleni(a, b);
break;
default:
printf("Neplatna operace!\n");
return -1;
}
printf("Vysledek: %d %c %d = %.2f\n", a, operace, b, vysledek);
return 0;
}
Gratuluju všem, kdo se prokousali až sem. Vím, že začátky nejsou jednoduché. Pokud něčemu nerozumíte, klidně se ozvěte na Discordu nebo tady dole v komentářích. Nezpomeňte, že žádná otázka není blbá otázka a pravděpodobně nebudete první ani poslední, co si takovou nebo podobnou otázku klade.