Написание простого конвертера температуры кажется тривиальной задачей, пока вы не осознаете, насколько легко может сломаться базовая логика. Вы начинаете с цикла 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



















