netlib.narod.ru | < Назад | Оглавление | Далее > |
Как мы говорили в главе 1, в циклах while и for проверка условия окончания цикла выполняется в начале. В Си имеется еще один вид цикла, do-while, в котором эта проверка в отличие от while и for делается в конце после прохождения тела цикла, т.е. после того, как тело выполнится хотя бы один раз. Цикл do-while имеет следующий синтаксис:
do инструкция while (выражение)
Сначала выполняется инструкция, затем вычисляется выражение. Если оно истинно, то инструкция выполняется снова и т.д. Когда выражение становится ложным, цикл заканчивает свою работу. Цикл do-while эквивалентен циклу REPEAT-UNTIL в Паскале с той лишь разницей, что в первом случае указывается условие продолжения цикла, а во втором — условие его окончания.
Опыт показывает, что цикл do-while используется гораздо реже, чем while и for. Тем не менее потребность в нем иногда возникает, как, например, в функции itoa (обратной по отношению к atoi), преобразующей число в строку символов. Выполнить такое преобразование оказалось несколько более сложным делом, чем ожидалось, поскольку простые алгоритмы генерируют цифры в обратном порядке. Мы остановились на варианте, в котором сначала формируется обратная последовательность цифр, а затем порядок символов меняется на противоположный.
/* itoa: преобразование n в строку s */ void itoa(int n, char s[]) { int i, sign; if ((sign = n) < 0) /* сохраняем знак */ n = -n; /* делаем n положительным */ i = 0; do { /* генерируем цифры в обратном порядке */ s[i++] = n % 10 + '0'; /* следующая цифра */ } while ((n /= 10) > 0); /* исключить ее */ if (sign < 0) s[i++] = '-'; s[i] = '\0'; reverse(s); }
Конструкция do-while здесь необходима или по крайней мере удобна, поскольку в s посылается хотя бы один символ, даже если n равно нулю. Единственную инструкцию, составляющую тело цикла, мы выделили фигурными скобками (хотя они и избыточны), чтобы неискушенный читатель не принял по ошибке слово while за начало цикла while.
Упражнение 3-4 |
При условии, что для представления чисел используется дополнительный код, наша версия функции itoa не справляется с самым большим по модулю отрицательным числом, значение которого равняется -(2n-1), где n — размер слова. Объясните, чем это вызвано. Модифицируйте программу таким образом, чтобы она давала правильное значение указанного числа независимо от машины на которой выполняется. |
Упражнение 3-5 |
Напишите функцию itob(n, s, b), которая переводит целое число n в строку s, представляющую число по основанию b. В частности, itob(n, s, 16) поместит в строку s текстовое представление числа n в шестнадцатиричном виде. |
Упражнение 3-6 |
Напишите версию itoa с дополнительным третьим аргументом, задающим минимальную ширину поля. При необходимости преобразованное число должно слева дополняться пробелами. |
netlib.narod.ru | < Назад | Оглавление | Далее > |