Написання простого конвертера температури здається тривіальним завданням, доки ви не усвідомите, наскільки легко може зламатися базова логіка. Ви починаєте з циклу while, виводьте таблицю перекладу Фаренгейта до Цельсія, і все здається правильним. Але потім вам потрібна конкретна точка даних – наприклад, температура людського тіла – і раптово ваш чистий код перетворюється на жах налагодження.
Тут ми розглянемо реальні аспекти роботи циклів у C, чому важлива точність і як запобігти зависанню ваших програм.
Основи: Цілочисленні цикли
Розглянемо найпростішу версію. Ви хочете вивести таблицю від 0 до 100 градусів Фаренгейта з кроком в 10. Ви використовуєте цілий лічильник int з ім’ям a.
`
Запустіть цей код, і ви отримаєте акуратну сітку:
`
Код функціональний. Він швидкий. Але він негарний. Чому? Тому що цілий поділ зсікає дробову частину. Вираз (a - 32)*5/9 відкидає дробову частину перед виведенням. Якщо вам потрібна точність, вам потрібні числа з точкою, що плаває.
Точність чисел з плаваючою точкою
Перемикання на ‘float’ змінює математику. Вам також потрібно замінити специфікатор формату з ‘%d’ на ‘%f’. Наведений нижче код використовує %6.2f, що вказує висновку зарезервувати шість позицій, зберігаючи дві цифри після десяткової точки.
`
Тепер висновок має реальні десяткові розряди. Це виглядає професійно. Але що, якщо вам потрібне конкретне значення, яке не вписується в патерн?
Помилка з температурою тіла
Уявіть, що потрібно вставити значення 98.6°F (нормальна температура людського тіла) в цю таблицю. Воно не потрапляє на кратне значення 10. Тому ви додаєте умову if.
`
Це працює для межі 100. Але змініть межу циклу на 200, і логіка впаде. Умова if (a> 98.6) залишиться істинною для кожної наступної ітерації. Ви будете безкінечно виводити 98.6°F.
Чому це відбувається? Тому що умова перевіряє, чи є поточне число більшим, ніж 98.6. Як тільки a досягає 100, воно завжди буде більшим за 98.6. Ви не перевіряєте, лише що перейшли ви це значення. Ви перевіряєте, чи перебуваєте ви за ним.
Виправлення: Відстеження стану
Щоб виправити це, потрібно запам’ятати попереднє значення. Ви вводите другу змінну b, ініціалізовану значенням -1.
`
Тепер логіка коректна. Додатковий рядок виводиться тільки в тому випадку, якщо a зараз більше 98.6, І b раніше було менше 98





























