
- •Оглавление
- •Лекция 1 Тема: Процесс построения программы.
- •Директивы #include
- •Комментарии
- •Лекция 2 Тема: Представление данных в с. Литералы
- •Встроенные типы данных
- •Типизированные константы
- •Операции и выражения
- •Семантика операций
- •Операции присваивания сама возвращает значение, что позволяет, например, написать:
- •Приведение типа
- •Смешанные выражения.
- •Поразрядные операции и сдвиги.
- •Инкремент и декремент
- •Запятая
- •Лекция 3 Управляющие конструкции с.
- •Условный оператор if... Else
- •Оператор выбора switch
- •1. Цикл while
- •2. Цикл do—while
- •3. Цикл for
- •Операторы прерывания блока
- •Escape-последовательности.
- •Лекция5 Функции
- •Задание
- •Лекция 6 Массивы и указатели
- •Последнее эквивалентно
- •Указатель на функцию
- •Лекция 7 Строки.
- •Лекция 8 Типы, определяемые пользователем.
- •Переименование типов.
- •Перечислимые типы
- •Структуры.
- •Объединения.
- •Лекция 9 Файлы.
- •Лекция 10 Связанные структуры.
- •Лекция 11 Директивы препроцессора
- •Условная компиляция
- •Директива #error
- •Директива # linе
- •Директива # pragma
- •Типичное применение препроцессорных директив Предотвращение включения файлов
- •Переключение разделов кода
- •Отладочные диагностические сообщения
- •Лекция 12 Тема: Состав проекта.
- •Лекция 13 Тема: Объектно-ориентированное программирование.
- •Лекция 14 Тема: Создание классов и их потомков. Перегрузка функций.
- •Лекция 15 Тема: Создание новых компонентов.
1. Цикл while
while (условие продолжения) оператор
Когда условие оказывается ложным, управление передается следующему после цикла оператору.
Используя этот оператор, можно было бы переписать предыдущий пример (со структурой switch) следующим образом:
{
int key, done = 0;
while (!done) {
printf("\nEnter command (F, M or Q): ");
key = getche(); // Прочитать клавишу.
switch (key) ( // Определение команды... case 'f':
case 'F':
printf("\n\"File\" command selected.\n");
break;
case 'm':
case 'M':
printf("\n\"Message\" command selected.\n");
break;
case 'q':
case 'Q':
printf("\n\"Quit\" command selected.\n");
done = 1; // Завершить цикл.
break;
default: printf("\nlnvalid command!\n") ;
}
} printf("\nPress a key to Exit...");
getch() ;
return 0; // Возврат в Windows.
}
Это более “грамотная” версия цикла обработки команд. Пока done равняется нулю, цикл продолжает выполняться. Когда нажимают клавишу 'Q', done присваивается единица и при очередной оценке условия оно оказывается ложным; цикл завершается.
В цикле while проверка условия делается перед выполнением тела цикла. Если условие изначально ложно, то тело цикла не исполняется вообще, ни одного раза.
2. Цикл do—while
do оператор while (условие продолжения);
Здесь сначала выполняется оператор, а затем производится проверка условия продолжения. Если условие истинно, управление возвращается в начало цикла; если ложно, цикл завершается и управление переходит к оператору, следующему за циклом.
3. Цикл for
for ([инициализация]; [условие]; [модификация]) оператор
Секция модификации может содержать любое выражение; обычно в ней изменяют значения управляющих переменных цикла.
Любую секцию заголовка цикла for можно опустить, но разделители — точки с запятой — все равно должны присутствовать. Если опущено условие, цикл будет выполняться бесконечно.
int i;
for (i =0; i < REPEAT; i++)
DoSomething (i);
У структур повторения в ряде ситуаций есть альтернатива. Это рекурсия, заключающаяся в том, что функция вызывает саму себя. Естественно, такой вызов должен быть условным, т. е. обязательно должен наступить такой момент, когда на очередном шаге рекурсивного вызова не происходит. Есть классический пример рекурсии — вычисление факториала:
unsigned Fac(unsigned n)
{
if (n)
return n * Fac(n - 1);
else
return 1;
}
Когда аргумент в очередном вызове оказывается равен 0, рекурсия завершается — функция возвращает 1. До этого момента не происходило, по существу, реальных вычислений (умножений). На стеке накапливались вызовы Fac () с последовательно уменьшающимися аргументами. Теперь стек начинает “разматываться”, и возвращаемые на каждом шаге значения умножаются на последовательно увеличивающиеся n. Глубина рекурсии ограничивается только размером стека программы. Факториал, конечно, вообще никто никогда не вычисляет, во всяком случае, подобным образом. Однако существуют задачи, для которых метод рекурсии оказывается естественным решением и реализуется намного проще, чем это можно было бы сделать с помощью циклов. Таковы, прежде всего/ различные операции над древовидными структурами данных.