§ 3. Основные алгоритмические конструкции

Алгоритмические конструкции

Как вам уже известно из курса информатики, любой алгоритм может быть записан с использованием трех базовых алгоритмических конструкций: следование, цикл и ветвление (пример 3.1).

Команды, составляющие алгоритмическую конструкцию следование, выполняются последовательно, друг за другом, в том порядке, в котором они записаны. Команды цикла и ветвления управляют порядком выполнения других команд в программе и относятся к командам управления (управляющим конструкциями).

Алгоритмическая конструкция ветвления обеспечивает выполнение одной или другой последовательности команд в зависимости от истинности или ложности некоторого условия. Оператор ветвления — команда, реализующая алгоритмическую конструкцию ветвления на языке программирования.

Алгоритмическая конструкция повторение (цикл) представляет собой последовательность действий, выполняемых многократно. Саму последовательность называют телом цикла. Оператор цикла — это команда, реализующая алгоритмическую конструкцию повторения на языке программирования.

Существуют разные возможности управлять тем, сколько раз будет повторяться тело цикла. Может быть задано условие продолжения или окончания работы цикла, а также число повторений тела цикла. В зависимости от этого выделяют цикл с предусловием, цикл с постусловием и цикл с параметром.

Существуют разные возможности управлять тем, сколько раз будет повторяться тело цикла. Может быть задано условие продолжения или окончания работы цикла, а также число повторений тела цикла. Выделяют следующие циклы: цикл с предусловием, цикл с постусловием и цикл с параметром. Выбор цикла зависит от задачи. Во многих случаях циклы взаимозаменяемы. При выборе цикла можно ориентироваться на следующее:

  • цикл с параметром используется тогда, когда известно количество повторений;
  • цикл с предусловием используется в том случае, когда известно условие продолжения работы;
  • цикл с постусловием используется тогда, когда тело цикла должно быть выполнено хотя бы один раз.

Пример 3.1 Блок-схемы алгоритмических конструкций.

Следование

Ветвление

Цикл

  • Цикл с параметром (значение параметра изменяется от 1 до N):

  • Цикл с предусловием:

  • Цикл с постусловием:

Кроме блок-схем, для графического представления алгоритмов используют структурограммы (NS-диаграммы, диаграммы Насси — Шнейдермана).

Примеры структурограмм

Команда ветвления:

Команда цикла с предусловием:

3.3. Составные условия

 

Для логических переменных в С++ определены логические операции !, &&, ||, соответствующие операциям НЕ, И, ИЛИ, выполняемым над высказываниями.

Логические выражения, в которых наряду с простыми условиями (сравнениями) используются логические операции, называют составными условиями.

Приведем таблицу истинности для  логических операций.

Логическая переменная

Результат операции

A B !(A) A && B A || B
true true false true true
false true true false true
true false false false true
false false true false false

В логических выражениях могут встречаться как арифметические, так и логические операции. Порядок выполнения операций определяется их приоритетом [1]:

1. !;

2. *, /, %;

3/ +, –;

4. <, >, <=, >=

5. ==, !=;

6. &&;

7. ||.

Операции с одинаковым приоритетом выполняются по порядку, слева направо. Для изменения порядка выполнения операций применяют скобки (примеры 3.3 и 3.4).

При составлении программ часто нужно строить отрицания сложным логическим выражениям. Для этого полезно использовать тождества, известные из алгебры логики (пример 3.5) и следующую таблицу:

Условие

Противоположное условие (отрицание условия)

a < b

a >= b

a > b

a <= b

a == b

a != b

Пример 3.6. Написать программу, которая выдаст на экран значение true или false в зависимости от того, находится ли число B между числами A и C.

Этапы выполнения задания

I. Исходные данные: переменные a, b, c (вводимые числа).

II. Результат: rez (true или false).

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. 
Вычисление значения логической переменной. Рассмотрим два случая:

2.1. Верно неравенство: а < b < c. Этому неравенству соответствует логическое выражение: а < b && b < с. Присвоим переменной r1 значение этого выражения.
2.2. Верно неравенство: а > b > c. Этому неравенству соответствует логическое выражение: а > b && b > с. Присвоим переменной r2 значение этого выражения.
2.3. Ответом на задачу будет значение логического выражения r1 or r2.

3. Вывод результата.

IV. Описание переменных: a, b, c – int, r1, r2, rez – bool.


[1] Обратите внимание, что приоритет операций отличается от того, который принят в Pascal (http://informatika8.adu.by/#fif2-2).

Пример 3.3. Определение порядка действий для выражения:

    || c < b && d    

Первым выполняется сравнение c и b, затем логическая операция &&, потом — ||.

Пример 3.4. Рассмотрим выражение:

    (< b) && (< d)    

Здесь скобки определяют приоритет выполнения операций: т. е. сначала должны выполниться сравнения, а затем —логическая операция &&. Однако в С++ операции сравнения обладают более высоким приоритетом, чем логические операции (в отличие от Pascal), поэтому приведенная выше запись эквивалентна:

    < b && c < d    

Пример 3.5. Построение отрицаний:

!!Û a;

!(&& b) Û !|| !b;

!(|| b) Û !&& !b.

Рассмотрим выражение  !a >  с переменными а и b типа int. Здесь операция ! относится к переменной a. Поскольку целые могут рассматриваться как логические, то отрицанием любого числа, кроме нуля, будет 0, отрицанием нуля будет 1. Затем полученный результат (0 или 1) сравнится с числом b. Для отрицания сравнения выражение нужно записать так:  !(a > b).

В языке С++ используются значки «&» и «|». Этими значками обозначаются битовые операции над целыми числами. Значок «&» соответствует операции and (И), проводимой над двоичными разрядами числа, а значок «|» — операции or (ИЛИ). Кроме этих операций, над битами числа можно выполнять операции «~» not (инверсия) и «^» xor (исключающее ИЛИ, сложение по модулю 2).

Пример 3.6.

V. Программа:

#include <iostream>

 

using namespace std;

 

int main()

{

  int a, b, c;

  cout << "vvedi 3 chisla" << endl;

  cin >> a >> b >> c;

  bool r1 = a < b && b < c;

  bool r2 = a > b && b > c;

  bool rez = r1 || r2;

  cout << boolalpha;

  cout << "b mezdu a i c - ";

  cout << rez << endl;

  return 0;

}

VI. Тестирование.

Запустить программу и ввести значения а = 5, b = 0, c = –5. Результат:

Запустить программу и ввести значения a = –2, b = –7, с = 5. Результат:

VII. Анализ результатов. Для полного тестирования программы нужно проверить все 6 возможных случаев взаимного расположения a, b, c.

В программировании на С++ могут использоваться диграфы (англ. digraphs) — последовательности из двух или более символов, которые компилятор воспринимает как один (или более символов). Они созданы и используются для ввода символов, отсутствующих на клавиатуре или в кодировке. К диграфам относят слова and и or, которые эквивалентны && и ||.