
- •220300 - Системы автоматизированного проектирования
- •Состав языка и принцип работы компилятора языка высокого уровня
- •Идентификаторы
- •Альтернативный ввод-вывод в стиле с
- •Константы
- •Манипуляторы
- •Преобразования типов
- •Арифметические операции
- •Функции стандартной библиотеки
- •Операции отношения и логические операции
- •Базовые конструкции структурного программирования
- •Цикл с параметром (for)
- •Цикл с предусловием (while)
- •Цикл с постусловием (do while)
- •Рекомендации по программированию циклов
- •Ветвления
- •Условный оператор if
- •Вложенные конструкции
- •Проблемы соответствия if и else во вложенных ветвлениях
- •Условная операция
- •Оператор switch
- •Операторы передачи управления
- •Контрольная работа
- •Массивы
- •Сортировка массива методом выбора
- •Сортировка массива методом пузырька
- •Многомерные массивы
- •Операции со строками
- •Функции
- •Void starline(); // объявление функции (прототип)
- •Передача аргументов в функцию по значению
- •Void charline(char sim, int n); // объявление функции (прототип)
- •Возвращение функцией значения
- •Передача аргументов по ссылке
- •Возвращение значения по ссылке
- •Перегруженные функции
- •Переменные и функции
- •Передача массивов в функции
- •Указатели
- •Указатели и массивы
- •Указатели и функции
- •Указатели и строки
- •Динамический массив и динамическое выделение памяти
- •Ввод/вывод
- •Форматированный ввод/вывод
- •Конструкторы и методы
- •Двоичный ввод/вывод. Бинарные файлы
- •Двунаправленный ввод/вывод
- •Функции стандартной библиотеки для работы с файлами или ввод/вывод в стиле с
Вложенные конструкции
Как уже упоминалось, циклы и ветвления можно использовать совместно. Можно помещать ветвления внутрь цикла и наоборот, использовать вложенные ветвления и вложенные циклы. Рассмотрим пример программы, которая определяет, является ли вводимое число простым или нет (простым называется число, которое делится без остатка только на единицу и на само себя, например 3, 5, 7, 11, 13, 17 и т.д.).
int main() {
int n, j, a=0, b=0; // а - счётчик безостаточного деления, b - остаточного
cout << "Vvedite pol. celoe chislo: "; cin >> n;
for(j=2; j<n; j++) {
if (n%j == 0) a++; // если деление без остатка, перем. а увеличивается на 1
else b++; // если деление с остатком, перем. b увеличивается на 1
}
if (a > 0) { // могли бы написать if (a > 0 && b>0), но это избыточное условие
cout << "Chislo ne prostoe!" << endl;
cout << n << " delitsya bez ostatka na: ";
for(j=1; j<=n; j++) {
if (n%j == 0) cout << j << " ";
}
}
if (a == 0 && b > 0) cout << "Chislo prostoe !" << endl;
getch(); return 0;
}
Результат работы программы:
Vvedite pol. celoe chislo: 8
Chislo ne prostoe!
8 delitsya bez ostatka na: 1 2 4 8
Обратите внимание, что здесь тело цикла for заключено в фигурные скобки просто для улучшения читаемости кода, хотя делать это было вовсе не обязательно, так как операторы ветвления являются одним оператором.
Рассмотрим внутреннюю работу программы. Допустим мы ввели число 7.
7/2 – остаток есть => а=0; b=1
7/3 – остаток есть => a=0; b=2
…
7/6 – остаток есть => a=0; b=5
Таким образом число не делится без остатка ни на одно число в диапазоне [2;6]. Полученные в результате выполнения цикла значения а и b полностью удовлетворяют условию: if (a == 0 && b > 0) cout << "Chislo prostoe !" << endl;.
Рассмотрим ещё один пример, демонстрирующий использование ветвления внутри цикла while. Программа подсчитывает количество слов и символов в строке, вводимой пользователем с клавиатуры.
#include <iostream>
#include <conio.h> // для getche()
using namespace std;
int main() {
int kol_np = 0; // число непробельных символов
int kol_pr = 1; // число пробелов
char ch;
cout << "Vvedite stroku: ";
while(ch != '\r') { // цикл, пока не будет нажата клавиша Enter
ch = getche(); // считывание символа
if ( ch == ' ') kol_pr++; // если символ является пробелом, то инкрементируем число пробелов => слов
else kol_np++; // в противном случае инкрементируем число символов
}
cout << "\nSlov: " << kol_pr << endl;
cout << "Bukv: " << (kol_np-1)<< endl; //вычитаем Enter
getch(); return 0;
}
В данном случае программе необходимо обрабатывать каждый введённый символ сразу после его появления, и, в отличие от cin, не дожидаясь нажатия клавиши Enter. Такую возможность обеспечивает библиотечная функция getche(). Эта функция, в отличие от getch(), кроме возвращения значения, печатает его значение на экране.
Программа считает за букву любой символ, не являющийся пробелом. Этот алгоритм облегчён и даёт ошибочный результат уже при вводе нескольких пробелов между словами.