netlib.narod.ru< Назад | Оглавление | Далее >

3.6. Цикл do-while

Как мы говорили в главе 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< Назад | Оглавление | Далее >

Сайт управляется системой uCoz