Nejprve si založím dvě proměnné s nějakými konstantami, do kterých se snad uživatel nikdy netrefí. min pro co nejvyšší nižší číslo jak je 100 a max pro co nejnižší vyšší číslo jak je to 100 (uznávám že to pojmenování proměnných je trochu matoucí ).
Poté v cyklu načítám vstupní hodnoty a podle těch pravidel jak jsem popsal v předchozím odstavci případně aktualizuji proměnnou min a max.
Samotný běh cyklu závisí na
scanf("%d", &tmp) == 1 && tmp
Funkce scanf má za úkol načíst nové číslo ze vstupu do proměnné tmp a jako návratovou hodnotu vrací počet úspěšně načtených proměnných. Proto pokud vrátí něco jiného než jedna, na vstupu je nějaký nesmysl a cyklus tak skončí. Dále se ještě ověří, že v samotné proměnné tmp je nenulová hodnota. Šlo by to napsat i jako tmp != 0. Tohle je zkratka.
Následně si ověřím, že bylo na vstupu alespoň jedno číslo a to tak, že v proměnné min nebo max je něco jiného než na začátku cyklu. Pokud na vstupu nic nebylo, vypíšu o tom hlášku na standardní chybový výstup a nenulovou návratovou hodnotou zahlásím, že je něco špatně.
Kód
tmp = 2 * limit - max - min;
je trochu šalamounský. Každopádně pokud vyjde tmp záporné, je blíže ke stovce to menší číslo uložené v proměnné min, pokud vyjde kladné, je blíže ke stovce větší číslo uložené v max a pokud je tmp rovno nule, jsou min i max od stovky stejně daleko (klidně se obě můžou rovnat 100). Když tak si to rozkresli proč to platí .
No a pak samotný výpis výsledku už je asi celkem jasný. Za zmínku stojí snad jen část
tmp > 0 ? max : min
v posledním printf. Je to taková zkratka pro podmínku if - else. Pokud výraz před otazníkem platí, vrátí se první část za otazníkem a pokud neplatí, vrátí se až ta druhá (ta za dvojtečkou). V situacích jako je tato se to docela hodí. Jinak samozřejmě dál používej blok if - else...
Jestli ještě něco není jasný, ptej se .