Vývoj iOS aplikací #6: První složité programy a funkce

Vývoj iOS

Tento díl velkého seriálu o programování aplikací pro iOS je výjimečný. Prvně si napíšeme ucelený program, který za nás bude řešit zadaný problém. V něm bude použito téměř vše z předchozích dílů. 

První program je něco speciálního. Najednou zjistíte, co všechno zvládnete udělat pomocí základních jazykových konstrukcí. Ovšem bude to mít jednu nevýhodu. Program nebude vypadat strukturálně dobře. Proto si představíme velmi zásadní část programování – funkce.

Řešení kvadratických rovnic

Jako první program jsem pro vás vybral řešení kvadratických rovnic. Má to jeden dobrý důvod. Je to matematika. A to znamená jediné – existuje zde popis jak kvadratické rovnice obecně řešit. Tedy algoritmus.

Algoritmus je přesný popis jak řešit konkrétní problém. Je to v podstatě kuchařka pro programátory. Algortimy musí splňovat následující vlastnosti:

  • konečný počet kroků
  • obecné řešení
  • pro stejné vstupy musí algoritmus vždy vracet stejné výstupy
  • každý krok musí být jednoznačně definovaný

Ne vždy platí třetí bod. Mohou existovat algoritmy, které mají pro stejné vstupy jiné výstupy, ale je to pouze výjimka. Všechny ostatní body musí algoritmus vždy splňovat. A algoritmus pro řešení kvadratický rovnic to splňuje. Pokud si myslíte, že nejste matematici, mohu vás uklidnit. Pro řešení kvadratických rovnic si vystačíte se sčítáním a násobením, maximálně s mocninami a odmocninami. 

Vývoj iOS

Jak řešit kvadratické rovnice

Kvadratické rovnice jsou rovnice druhého stupně, to znamená, že hledaná neznámá vystupuje ve druhé mocnině. Základní tvar kvadratické rovnice vypadá následovně: ax2 + bx + c = 0. Písmeno x je proměnná, kterou potřebujeme zjistit. To tedy bude náš výsledek, výstup algoritmu. Písmena a, b, c jsou koeficienty rovnice, jsou předem zadané, a tím pádem to jsou naše vstupy. To je náš základ algoritmu. Víme, co máme zadané a víme, co chceme získat.

Než přistoupíme k samotnému výpočtu, musíme si ošetřit podmínky. Máme zde jedinou podmínku a tou je, že koeficient a musí být různý od 0. Konkrétní kód najdete v repozitáři na webu, pokud si nepamatujete, jak zjistit jestli je podmínka splněna, podívejte se na minulý díl. Jestli je koeficient a roven nule, můžeme celý program ukončit, protože se nejedná o kvadratickou rovnici.

Výpočet kvadratické rovnice se skládá ze dvou, resp. ze tří částí, podle toho, jak vyjde první výpočet. Nejprve musíme vypočítat tzv. diskriminant. Podle jeho hodnoty pak určíme další směřování našeho programu. Pokud vyjde diskriminant záporný, program ukončíme s tím, že řešení v reálných číslech neexistuje (zájemci mohou program dokončit pro komplexní čísla). Když je diskriminant 0, provedeme jeden výpočet. Znamená to, že rovnice má jedno dvojnásobné řešení. A poslední případ je, pokud je diskriminant větší než 0, pak provedeme dva výpočty. Jeden pro každý kořen rovnice.

Výpočty

Vypočítat diskriminant je velmi snadné. Je to základní aritmetika a přiřazení do konstanty. Jak jsem psal v prvním díle, při programování ve Swiftu je lepší vždy začít s konstantou než s proměnnou. Pokud zjistíte, že ji potřebujete změnit, změníte konstantu na proměnnou. Náš diskriminant měnit nebudeme, je to tedy konstanta. A vypočítá se podle vzorce D = b2 – 4 * a * c. Máme dvě možnosti jak zapsat mocninu. Buď jednoduše jako b * b nebo můžeme použít funkci pow(), neboli power. Ta si bere dva argumenty, první je číslo, které chceme umocnit a druhé je číslo, kterým chceme umocnit. Pro nás tedy pow(b, 2).

Vývoj iOS

Máme první výpočet a teď nás čeká rozvětvení. Jak je zmíněno výše, vývoj programu se liší podle hodnoty diskriminantu. Nejjednodušší je, pokud je D < 0. V tom případě pouze vytiskneme hlášku, že výsledek řešení rovnice neexistuje. Pokud se D == 0, pak nás čeká jeden lehký výpočet. Vypadá následovně: x = -b / 2 * a. To je náš výsledek. Nyní ho stačí už jen vytisknout do konzole. 

Poslední případ je, pokud je D > 0. V tomto případě budeme muset udělat poslední dva výpočty. Až na jedno znaménko jsou totožné. První je x1 = (-b + sqrt(D)) / 2 * a a druhý je x2 = (-b – sqrt(D)) / 2 * a. Sqrt v tomto případě značí funkci druhé odmocniny (sqrt jako Square root of…). A to je všechno. To je celý program. Stačí pouze postupovat podle návodu a převádět ho do Swiftu.

Funkce

Nyní je na čase si představit koncept funkce. Už jste se s ním setkali, například sqrt() je funkce. Funkce je pojmenovaný blok kódu. Funkce řeší jeden konkrétní problém. Značí se klíčovým slovem func, následovaný jménem funkce a (). Například func foo() { … }

Pojďme si udělat první funkci. Ta nám bude řešit kvadratické rovnice. Pojmenujeme ji quadraticEquationSolver(). Všimněte si způsobu zápisu. První písmeno je vždy malé, a pokud je název složený z více slov, každé další slovo začíná velkým písmenem. Tento způsob zápisu se jmenuje camel-case. 

Mezi závorky { … } vložíme celý kód pro řešení kvadratických rovnic. Funkce se v kódu volá pomocí jejího názvu. Je možné volat funkci rekurzivně, to znamená v těle funkce volat tu samou funkci. Je možné to využít k elegantnímu řešení, ale je potřeba dávat pozor na to, aby rekurzivní volání někdy skončilo. V opačném případě bude smyčka běžet do nekonečna. Nebo do doby, než se ji iOS rozhodne násilně ukončit. Ve zdrojovém kódu k tomuto návodu najdete jednoduchou funkci, která rekurzivně řeší výpočet faktoriálu pro zadané číslo. 

Vývoj iOS

Tím, že jsme ohraničili naše řešení pro kvadratické rovnice jednou funkcí, jsme přišli o jednu důležitou vlastnost algoritmu. Není to obecné řešení. Na to potřebujeme funkci říct, že má očekávat vstupní argumenty. Vstupní argumenty se píšou do () a mají formát jméno: datový typ. Pro naši kvadratickou rovnici to tak bude func quadraticEquationSolver(a: Double, b: Double, c: Double) { … }. Od teď je možné mít obecné řešení pro řešení kvadratických rovnic. 

Funkce nás nyní budou provázet už na každém kroku. Je velmi důležité se je naučit používat. Díky nim je možné vytvořit přehledné stavební bloky kódu a pak s nimi dál pracovat a rozšiřovat danou aplikaci. Základ funkcí je velmi jednoduchý, ale v dalších dílech přijde velká porce teorie, je totiž potřeba pochopit, jak funkce fungují „uvnitř“ a jak modifikují nebo nemodifikují obsah, který je do nich vložen. Malou ukázku naleznete už nyní ve zdrojových kódech pro tento seriál.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.