Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по Программированию на С++.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
795.65 Кб
Скачать

Вложенные конструкции

Как уже упоминалось, циклы и ветвления можно использовать совместно. Можно помещать ветвления внутрь цикла и наоборот, использовать вложенные ветвления и вложенные циклы. Рассмотрим пример программы, которая определяет, является ли вводимое число простым или нет (простым называется число, которое делится без остатка только на единицу и на само себя, например 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(), кроме возвращения значения, печатает его значение на экране.

Программа считает за букву любой символ, не являющийся пробелом. Этот алгоритм облегчён и даёт ошибочный результат уже при вводе нескольких пробелов между словами.