3.6. Цикл DO - WHILE
Как уже отмечалось в главе 1, циклы WHILE и FOR обладают тем приятным свойством, что в них проверка окончания осуществляется в начале, а не в конце цикла. Третий оператор цикла языка "C", DO-WHILE, проверяет условие окончания в конце, после каждого прохода через тело цикла; тело цикла всегда выполняется по крайней мере один раз. Синтаксис этого оператора имеет вид:
DO оператор WHILE (выражение)
Сначала выполняется оператор, затем вычисляется выражение. Если оно истинно, то оператор выполняется снова и т.д. Если выражение становится ложным, цикл заканчивается.
Как и можно было ожидать, цикл DO-WHILE используется значительно реже, чем WHILE и FOR, составляя примерно пять процентов от всех циклов. Тем не менее, иногда он оказывается полезным, как, например, в следующей функции ITOA, которая преобразует число в символьную строку (обратная функции ATOI). Эта задача оказывается несколько более сложной, чем может показаться сначала. Дело в том, что простые методы выделения цифр генерируют их в неправильном порядке. Мы предпочли получить строку в обратном порядке, а затем обратить ее.
ITOA(N,S) /*CONVERT N TO CHARACTERS IN S */ CHAR S[]; INT N; { INT I, SIGN; IF ((SIGN = N) < 0) /* RECORD SIGN */ N = -N; /* MAKE N POSITIVE */ I = 0; DO { /* GENERATE DIGITS IN REVERSE ORDER */ S[I++] = N % 10 + '0';/* GET NEXT DIGIT */ } WHILE ((N /=10) > 0); /* DELETE IT */ IF (SIGN < 0) S[I++] = '-' S[I] = '\0'; REVERSE(S); }
Цикл DO-WHILE здесь необходим, или по крайней мере удобен, поскольку, каково бы ни было значение N, массив S должен содержать хотя бы один символ. Мы заключили в фигурные скобки один оператор, составляющий тело DO-WHILE, хотя это и не обязательно, для того, чтобы торопливый читатель не принял часть WHILE за начало оператора цикла WHILE.
Упражнение 3-3.
--------------
При представлении чисел в двоичном дополнительном коде наш вариант ITOA не справляется с наибольшим отрицательным числом, т.е. Со значением N равным -2 в степени м-1, где м -- размер слова. Объясните почему. Измените программу так, чтобы она правильно печатала это значение на любой машине.
Упражнение 3-4.
--------------
Напишите аналогичную функцию ITOB(N,S), которая преобразует целое без знака N в его двоичное символьное представление в S. Запрограммируйте функцию ITOH, которая преобразует целое в шестнадцатеричное представление.
Упражнение 3-5.
---------------
Напишите вариант ITOA, который имеет три, а не два аргумента. Третий аргумент -- минимальная ширина поля; преобразованное число должно, если это необходимо, дополняться слева пробелами, так чтобы оно имело достаточную ширину.
ПРЕДЫДУЩАЯ ЧАСТЬ 3.5. Циклы -- WHILE и FOR |
СОДЕРЖАНИЕ | СЛЕДУЮЩАЯ ЧАСТЬ 3.7. Оператор BREAK |