Psaní jednoduchého převodníku teploty se zdá jako triviální úkol, dokud si neuvědomíte, jak snadno se může základní logika rozbít. Začnete smyčkou while, vytisknete převodní tabulku Fahrenheita na stupně Celsia a vše se zdá být v pořádku. Pak ale potřebujete konkrétní datový bod – například teplotu lidského těla – a váš čistý kód se najednou změní v noční můru ladění.
Zde se podíváme na realitu toho, jak fungují smyčky v C, proč je důležitá přesnost a jak zabránit zamrznutí vašich programů.
Základy: Integer Loops
Podívejme se na nejjednodušší verzi. Chcete vytisknout tabulku od 0 do 100 stupňů Fahrenheita v krocích po 10. Použijete celočíselný čítač int s názvem a.
Spusťte tento kód a získáte úhlednou mřížku:
Kód je funkční. Je rychlý. Ale je ošklivý. Proč? Protože celočíselné dělení ořezává zlomkovou část. Výraz (a - 32) * 5 / 9 vyřadí zlomkovou část před výstupem. Pokud potřebujete přesnost, potřebujete čísla s plovoucí desetinnou čárkou.
Přesnost s plovoucí desetinnou čárkou
Přepnutí na float změní matematiku. Musíte také změnit specifikátor formátu z %d na %f. Níže uvedený kód používá %6.2f, který říká výstupu, aby rezervoval šest pozic, přičemž za desetinnou čárkou zůstaly dvě číslice.
Výstup má nyní reálná desetinná místa. Vypadá to profesionálně. Ale co když potřebujete konkrétní hodnotu, která nezapadá do vzoru?
Chyba s tělesnou teplotou
Představte si, že chcete do této tabulky vložit hodnotu 98,6°F (normální teplota lidského těla). Nespadá do násobku 10. Proto přidáte podmínku if.
Toto funguje pro limit 100. Ale změňte limit smyčky na 200 a logika se zhroutí. Podmínka „if (a > 98,6)“ zůstane pravdivá pro každou následující iteraci. Budete mít na výstupu 98,6 °F neomezeně dlouho.
Proč se to děje? Protože podmínka kontroluje, zda je aktuální číslo větší než 98,6. Jakmile „a“ dosáhne 100, bude vždy větší než 98,6. Nekontrolujete, zda jste právě přešli tuto hodnotu. Zkontroluješ, jestli jsi za ním.
Oprava: Sledování stavu
Chcete-li to opravit, musíte si zapamatovat předchozí hodnotu. Zavedete druhou proměnnou, b, inicializovanou na -1.
Nyní je logika správná. Další řádek se vytiskne pouze v případě, že „a“ je nyní větší než 98,6 A „b“ bylo dříve menší než 98



















