
- •220300 - Системы автоматизированного проектирования
- •Состав языка и принцип работы компилятора языка высокого уровня
- •Идентификаторы
- •Альтернативный ввод-вывод в стиле с
- •Константы
- •Манипуляторы
- •Преобразования типов
- •Арифметические операции
- •Функции стандартной библиотеки
- •Операции отношения и логические операции
- •Базовые конструкции структурного программирования
- •Цикл с параметром (for)
- •Цикл с предусловием (while)
- •Цикл с постусловием (do while)
- •Рекомендации по программированию циклов
- •Ветвления
- •Условный оператор if
- •Вложенные конструкции
- •Проблемы соответствия if и else во вложенных ветвлениях
- •Условная операция
- •Оператор switch
- •Операторы передачи управления
- •Контрольная работа
- •Массивы
- •Сортировка массива методом выбора
- •Сортировка массива методом пузырька
- •Многомерные массивы
- •Операции со строками
- •Функции
- •Void starline(); // объявление функции (прототип)
- •Передача аргументов в функцию по значению
- •Void charline(char sim, int n); // объявление функции (прототип)
- •Возвращение функцией значения
- •Передача аргументов по ссылке
- •Возвращение значения по ссылке
- •Перегруженные функции
- •Переменные и функции
- •Передача массивов в функции
- •Указатели
- •Указатели и массивы
- •Указатели и функции
- •Указатели и строки
- •Динамический массив и динамическое выделение памяти
- •Ввод/вывод
- •Форматированный ввод/вывод
- •Конструкторы и методы
- •Двоичный ввод/вывод. Бинарные файлы
- •Двунаправленный ввод/вывод
- •Функции стандартной библиотеки для работы с файлами или ввод/вывод в стиле с
Операции отношения и логические операции
Прежде чем перейти к рассмотрению циклов и ветвлений, необходимо охарактеризовать операции отношения и логические операции. Количество выполнений цикла, а также выполнение или невыполнение определённой части программы зависит от истинности или ложности вычисляемого выражения. Как правило, такие выражения содержат особый тип операций, называемых операциями отношения (>, <, ==, !=, >=, <=), сравнивающими два значения. Результатом сравнения является значение Истина (true) или Ложь (false).
Помимо операций отношения в конструкциях ветвления очень часто применяются логические операции:
&& - логическое И. Результат этой операции имеет значение true только если оба операнда имеют значение true.
|| - логическое ИЛИ. Результат этой операции имеет значение true, если хотя бы один из операндов имеет значение true.
Базовые конструкции структурного программирования
В теории программирования доказано, что программу для решения задачи любой сложности можно составить только из трёх структур, называемых следованием, ветвлением и циклом. Следованием называется конструкция, представляющая собой последовательное выполнение двух или более операторов. Ветвление задаёт выполнение либо одного, либо другого оператора в зависимости от выполнения какого-либо условия. Цикл задаёт многократное выполнение оператора (см. рис.).
Следование
Цикл
Ветвление
|
Эти конструкции могут вкладываться друг в друга произвольным образом, например, цикл может содержать следование из двух ветвлений, каждое из которых включает вложенные циклы.
Циклы
Действие циклов заключается в последовательном повторении определённой части программы некоторое количество раз. Повторение продолжается до тех пор, пока выполняется соответствующее условие. Когда значение выражения, задающего условие, становится ложным, выполнение цикла прекращается, а управление передаётся оператору, следующему непосредственно за циклом. В С++ имеется три типа циклов: for, while и do while.
Цикл с параметром (for)
Цикл for организует выполнение программы фиксированное число раз. Как правило (хотя и не всегда), этот тип цикла используется тогда, когда число раз, за которое должно повториться исполнение кода, известно заранее. Рассмотрим пример программы, которая выводит на экран квадраты целых чисел.
int main() {
int j; // определение счетчика цикла
for (j=0; j<5; j++) // счетчик меняется от 0 до 4
cout << j * j << " "; // квадрат значения j выводится на экран (0 1 4 9 16)
cout << endl;
getch(); return 0;
}
Таким образом, цикл for имеет следующий формат:
for (инициализирующее выражение; условие выполнения; модифицирующее выражение)
оператор; // тело цикла состоит из одного оператора, который можно заключить в { }
или
for (инициализирующее выражение; условие выполнения; модифицирующее выражение) {
оператор; // тело цикла состоит из нескольких операторов - блок
оператор;
оператор;
}
Обратите внимание на то, что после оператора for отсутствует точка с запятой (;). Это объясняется тем, что оператор for вместе с телом цикла представляют из себя одну конструкцию (или один большой оператор).
Как видно из данного примера инициализирующее выражение выполняется только один раз – в начале выполнения цикла. В данном примере оно инициализирует счетчик цикла нулём. Как правило, условие выполнения цикла содержит в себе операции отношения. Условие проверяется каждый раз перед исполнением тела цикла и определяет, нужно ли исполнять цикл ещё раз или нет. Модифицирующее выражение предназначено для изменения значения счётчика цикла. Часто такое изменение сводится к инкрементированию или декрементированию счётчика (хотя совсем необязательно увеличение или уменьшение на 1). Модификация счётчика происходит после того, как тело цикла полностью выполнилось.
Рассмотрим следующий пример, который демонстрирует использование нескольких операторов в теле одного цикла.
#include <iostream>
#include <iomanip> //для setw
#include <conio>
using namespace std;
int main() {
int n; // счетчик цикла
for(n=1; n<=5; n++) { // цикл от 1 до 5
cout << setw(4) << n; // вывод первого столбца
int cub = n * n * n; // вычисление куба
cout << setw(6) << cub << endl; // вывод второго столбца
}
getch(); return 0;
}
Результат работы программы выглядит следующим образом:
1
8
27
64
125
В этой программе хорошо прослеживается момент, связанный с блоками и областью видимости переменных. Важной особенностью блока является то, что определённые внутри него переменные невидимы за его пределами. Здесь мы определили переменную cub внутри блока. Получить доступ к этой переменной вне блока невозможно – она видима лишь внутри фигурных скобок.
Рассмотрим пример, демонстрирующий, что модифицирующий оператор не обязательно должен производить операцию инкрементирования, а может выполнять любую другую операцию. Программа подсчитывает факториал введённого пользователем числа, а в операторе цикла используется декрементирование счётчика цикла.
#include <iostream>
#include <conio>
using namespace std;
int main() {
unsigned int n;
unsigned long fact = 1; // тип long для результата
cout << "Vvedite celoe chislo: ";
cin >> n; // ввод числа
for(int j=n; j>0; j--) // умножение 1 на
fact = fact * j; // или fact *= j
cout << "Faktorial chisla raven " << fact << endl;
getch(); return 0;
}
Д/З |
Напишите программу, которая подсчитывает факториал введённого пользователем числа, а в операторе цикла используется инкрементирование счётчика цикла. |
Ответ |
int main() { unsigned int n; unsigned long fact=1; // тип long для результата cout << "Vvedite celoe chislo: "; cin >> n; // ввод числа for(unsigned int j=1; j<=n; j++) // умножение 1 на fact = fact * j; // или fact *= j cout << "Faktorial chisla raven " << fact << endl; getch(); return 0; } |