Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Примеры
5 > 2 истинно и принимает значение 1.
(2 + а) == а ложно и принимает значение 0.
Неопределенные циклы и циклы со счетчиком
Некоторые примеры цикла while представляли собой неопределенные циклы.. Это означает, что заранее нельзя сказать, сколько раз цикл выполнится до того, как выражение станет ложным. Например, когда в листинге 6.1 использовался интерактивный цикл для суммирования целых чисел, заранее не было известно, сколько чисел будет введено. Тем не менее, в других примерах применялись циклы со счетчиком. Такие циклы выполняют заранее известное количество итераций. В листинге 6.10 приведен пример оператора цикла while со счетчиком.
Листинг 6.10. Программа sweetie1.c
И хотя форма цикла, использованная в листинге 6.10, работает прекрасно, это не самый лучший выбор в подобной ситуации, поскольку действия, определяющие цикл, не собраны вместе. Давайте исследуем этот вопрос более глубоко.
216 Глава 6
Чтобы организовать цикл, который должен быть повторен фиксированное количество раз, необходимо выполнить три действия.
1. Инициализировать счетчик.
2. Сравнить показание счетчика с некоторой граничной величиной.
3. Инкрементировать значение счетчика на каждом проходе цикла.
О сравнении позаботится условие цикла while. Операция инкремента отвечает за увеличение значения счетчика. В листинге 6.10 инкрементирование делается в конце цикла. Такой подход устраняет возможность случайно пропустить действие инкрементирования. Следовательно, было бы лучше объединить действия по проверке и обновлению в одно выражение, применив конструкцию count++ <= NUMBER, но инициализация счетчика по-прежнему выполняется за пределами цикла, сохраняя вероятность забыть сделать это. Опыт нас учит: то, что может случиться, рано или поздно произойдет, поэтому давайте более подробно рассмотрим управляющий оператор, который позволяет избежать таких проблем.
Цикл for
Цикл for собирает все три указанных выше действия (инициализацию, проверку и обновление) в одном месте. Используя цикл for, предыдущую программу можно заменить кодом, приведенным в листинге 6.11.
Листинг 6.11. Программа sweetie2.c
В круглых скобках, следующих за ключевым словом for, содержатся три выражения, разделенные двумя точками с запятой. Первое выражение — это инициализация. Она осуществляется только один раз при первом запуске цикла for. Второе выражение представляет собой условие проверки; оно вычисляется перед каждым потенциальным проходом цикла. Когда выражение имеет значение false (когда значение счетчика count больше, чем NUMBER), цикл завершается. Третье выражение, которое выполняет изменение или обновление, вычисляется в конце каждой итерации. В листинге 6.10 оно применяется для инкрементирования значения count, но этим его использование не ограничивается. Оператор for завершается следующим за ним простым или составным оператором. Каждое из трех выражений является полным, так что любой побочный эффект в управляющем выражении, такой как инкремент значения переменной, происходит до вычисления другого выражения. Структура цикла for иллюстрируется на рис. 6.3.
В качестве еще одного примера в листинге 6.12 показана программа, в которой цикл for применяется для вывода таблицы кубов.
Управляющие операторы С: циклы 217
Рис. 6.3. Структура цикла for
Программа в листинге 6.12 выводит целые числа от 1 до 6 и результат их возведения в куб.
n n в кубе
1 1
2 8
3 27
4 64
5 125
6 216
Первая строка цикла for немедленно сообщает всю информацию о параметрах цикла: начальное значение num, конечное значение num и величину, на которую num увеличивается при каждом проходе цикла.
Использование цикла for для повышения гибкости
Хотя цикл for выглядит похожим па цикл DO в языке FORTRAN, цикл FOR в языке Pascal и цикл FOR... NEXT в языке BASIC, он обладает гораздо большей гибкостью, чем любой из них. Эта гибкость является результатом того, как могут применяться три выражения в спецификации оператора for. В примерах, приведенных до сих пор, первое выражение использовалось для инициализации счетчика, второе выражение — для установки предельного значения счетчика и третье выражение — для увеличения значения счетчика на 1. Применяемый подобным образом оператор for языка С во многом подобен упомянутым выше операторам. Тем не менее, он обладает и множеством других возможностей, девять из которых описаны далее.
218 Глава 6
• Вы можете применять операцию декремента для реализации обратного отсчета значений счетчика вместо прямого.
/* for_down.c */
#include int main(void)
{
int secs;
for (secs = 5; secs > 0; secs--) printf ("%d секунд(ы) !\n", secs);
printf("Ключ на зажигание!\n"); return 0;
}
Ниже показан вывод:
5 секунд(ы)!
4 секунд(ы)!
3 секунд(ы)!
2 секунд(ы)!
1 секунд(ы)!
Ключ на зажигание!
• При желании можно считать двойками, десятками и т.д.
/* for_13s.c */
#include int main(void)
{
int n; // счет с интервалом 13, начиная с 2
for (n=2;n<60;n=n+13) printf("%d \n", n); return 0;
}
Значение переменной n на каждой итерации увеличивается на 13, давая следующий вывод:
2
15
28
41
54
• Можно делать подсчет по символам, а не числам.
/* for_char.c */
#include int main(void)
{
char ch;
for (ch = 'a'; ch <= 'z'; ch++)
printf("Значение ASCII для %c равно %d.\n", ch, ch); return 0;
}
В программе предполагается, что для символов в системе используется кодировка ASCII. Ниже показан фрагмент выходных данных:
Значение ASCII для а равно 97.
Значение ASCII для b равно 98.
Управляющие операторы С: циклы 219
Значение ASCII для х равно 120.
Значение ASCII для у равно 121.
Значение ASCII для z равно 122.
Программа работает, т.к. символы хранятся в памяти в виде целых чисел, поэтому цикл в любом случае имеет дело с целыми числами.
• Можно выполнять проверку условия, отличного от количества итераций. В программе for cube.с строку
for (num = 1; num <= 6; num++)
можно заменить такой строкой:
for (num = 1; num*num*num <= 216; num++)
Такое условие проверки можно было бы применять, если вас больше заботит ограничение величины куба, а не количества итераций.
• Можно позволить некоторой величине расти не в арифметической, а в геометрической прогрессии; т.е. вместо добавления каждый раз фиксированного значения можно умножать на фиксированное значение.
/* for_geo. с * /
Читать дальшеИнтервал:
Закладка: