Печатать книгуПечатать книгу

§ 4. Оператор ветвления

Сайт: Профильное обучение
Курс: Информатика. 10 класс (Повышенный уровень)
Книга: § 4. Оператор ветвления
Напечатано:: Гость
Дата: Вторник, 7 Май 2024, 01:22

4.1. Запись оператора ветвления

 

Для записи оператора ветвления используется команда if. Формат команды:

  if ( <условие> ) {
   команды 1
 }
 else {
   команды 2
 }

Оператор ветвления может быть в полной или сокращенной формах. В сокращенной форме отсутствует блок  else:

 if ( <условие> ) {
  команды 1
}

Условие в записи оператора ветвления может быть простым и составным. Фигурные скобки могут быть опущены, если внутри них находится одна команда.

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

Пример 4.1. Задано число x. Определить, является оно положительным или нет. Вывести соответствующее сообщение.

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

I.     Исходные данные: x (введенное число).

II.     Результат: соответствующее сообщение.

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

1. Ввод исходных данных.
2. Проверка значения выражения (x > 0).
3. Вывод результата.

IV. Описание переменных: x – int.

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

На практике чаще всего пользуются одним из двух правил расстановки фигурных скобок в управляющих конструкциях:

if (условие){

  команды 1

}

else {

  команды 2

}

if (условие)

{

  команды 1

}

else 

{

  команды 2

}

Пример 4.1.

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

#include <iostream>

 

using namespace std;

 

int main()

{

  int x;

  cout << "vvedite x=";

  cin >> x;

  if (> 0)

    cout << "pologitelnoe" << endl;

  else

    cout << "ne pologitelnoe" << endl;

  return 0;

}

VI. Тестирование. Для x = 5:

Для x = –1:

VII. Анализ результатов. Для полной проверки программы требуется еще проверить значение x = 0.

4.2. Решение задач с использованием оператора ветвления

 

Пример 4.2. Таня и Катя живут в разных домах. Им стало интересно, кто из них живет ближе к школе. Они разместили на карте прямоугольную систему координат так, чтобы школа имела координаты (0, 0). Известно, что Танин дом имеет координаты (x1; y1), а Катин — (x2; y2). Девочки ходят в школу по прямой и проходят разные расстояния. Написать программу, которая определит, чей дом ближе к школе.

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

 I. Исходные данные: координаты домов девочек x1, y1, x2, y2.

II. Результат: сообщение о том, чей дом ближе.

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

1. Ввод координат домов.
2. Вычисление расстояний r_T  — от Таниного дома и r_K  —  от Катиного дома до школы. Для вычисления расстояния воспользуемся теоремой Пифагора:

r subscript T space equals square root of x subscript 1 superscript 2 space plus space y subscript 1 superscript 2 end root space     и     r subscript K space equals square root of x subscript 2 superscript 2 space plus space y subscript 2 superscript 2 end root space.

3. Сравнение расстояний и вывод ответа

IV. Описание переменных: x1, y1, x2, y2, r_T, r_K  —  тип double.

Пример 4.3. Проверить является ли введенное число трехзначным, и если да, то вывести четные цифры этого числа.

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

 I. Исходные данные: a (трехзначное число).

II. Результат: переменные a1, a2, a3 (цифры числа) или сообщения: «не трехзначное», «нет четных цифр».

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

1. Ввод исходного числа. 
2. Проверка числа. Число a является трехзначным, если 99 < a < 1000. 
3. Если число трехзначное — выделяем его цифры.

3.1. Для выделения первой цифры a1 находим целую часть от деления числа a на 100. 
3.2. Для выделения второй цифры a2 числа a находим остаток от его деления на 100, а затем целую часть oт деления полученного остатка на 10. 
3.3. Последняя цифра числа a3 является остатком от деления числа a на 10. 
3.4. Для проверки цифры на четность нужно проверить, равен ли нулю остаток от деления цифры на 2. 
3.5. Если ни одна из цифр числа не является четной, то вывести соответствующее сообщение.

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

IV. Описание переменных: a, a1, a2, a3 – int.

Пример 4.4. Вычислить значение функции для заданного x.

f left parenthesis x right parenthesis space equals space open curly brackets table attributes columnalign left end attributes row cell x space long dash space 2 comma space если space x space less than negative 2 end cell row cell x comma space если space long dash space 2 space less or equal than space х space less or equal than 2 end cell row cell 2 square root of х space plus space 2 end root comma space если space х space greater than 2 end cell end table close

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

I. Исходные данные: переменная x  (значение переменной).

II. Результат: переменная f (значение функции).

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

1. Ввод исходных данных. 
2. Проверка значения x и вычисление значения функции в зависимости от значения аргумента.

2.1. Сначала проверим истинность условия x < –2.  Если оно истинно, то вычислим значение функции по формуле f = x – 2. Иначе (это значения, для которых x ≥ –2) проверим следующее условие.
2.2. Проверяем условие x ≤ –2. Если оно верно, то значение функции вычислим по формуле f = x3, иначе (остаются значения, для которых x > 2) значение функции вычисляется по формуле begin mathsize 16px style f space equals space 2 square root of x space plus space 2 end root. end style

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

IV. Описание переменных: x, f — double.

Пример 4.5. Определить, принадлежит ли точка a(x, у) данной области.

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

I. Исходные данные: переменные x и y (координаты точки).

II. Результат: слово «да» или «нет» в зависимости от принадлежности точки закрашенной области.

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

1. Ввод исходных данных.
2. Область ограничена тремя прямыми:  y = x , y = –x, y = a. Точка принадлежит области, если одновременно выполняются три условия:  y ≥ x, y ≥ –x, y ≤ a. Чтобы определить, какой из знаков («≤», «≥») поставить в уравнение вместо знака «=», достаточно взять произвольную точку, принадлежащую области, и посмотреть, как будут выполняться условия для этой точки. Например, при a = 5 точка с координатами (1; 3) принадлежит области и выполняются следующие условия: 3 ≥ 1, 3 ≥ –1 ,  3 ≤ 5.

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

IV. Описание переменных: x, y – double.

Пример 4.2.

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

#include <iostream>

#include <cmath>

 

using namespace std;

 

int main()

{

  setlocale(0,"");

  double x1, y1, x2, y2;

  cout << "Танин дом" << endl;

  cin >> x1 >> y1;

  cout << "Катин дом" << endl;

  cin >> x2 >> y2;

  double r_T = sqrt(x1 * x1 + y1 * y1);

  double r_K = sqrt(x2 * x2 + y2 * y2);

  if (r_T < r_K)

    cout << "Танин дом ближе" << endl;

  else

    cout << "Катин дом ближе" << endl;

  return 0;

}

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

Танин дом — x1 = 2.3, y1 =  4.5, Катин дом — x2 = −2.1, y2 = 4.9.

Результат:

Танин дом — x1 = 6.1, y1 = 4.5, Катин дом — x2 = 1.71, y2 = 3.2.

Результат:

Пример 4.3.

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

#include <iostream>

 

using namespace std;

 

int main()

{

  int a;

  cout << "vvedite a=";

  cin >> a;

  if (> 99 && a < 1000)

  {

    int a1 = a / 100;

    int a2 = a / 10 % 10;

    int a3 = a % 10;

    cout << "chetnye cifry:" << endl;

    if ( a1 % 2 == 0)

      cout << a1 << endl;

    if (a2 % 2 == 0)

      cout << a2 << endl;

    if (a3 % 2 == 0)

      cout << a3 << endl;

    if (a1 % 2 && a2 % 2 && a3 % 2 )

      cout << "net takih" << endl;

  }

  else

    cout<<"chislo ne trehznachoe"<<endl;

  return 0;

}

VI. Тестирование. Результат для значения 345:

Другие варианты исходных данных

VII. Анализ результатов. Для полной проверки программы требуется еще проверить значения, в которых цифр меньше трех, содержащие 1 четную цифру (на разных позициях), две четные цифры.

Пример 4.4.

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

#include <iostream>

#include <cmath>

 

using namespace std;

 

int main()

{

  double x,f;

  cout << "x = ";

  cin >> x;

  if (< -2)

    f = x - 2;

  else

    if (<= 2)

      f = x * x * x;

    else

      f = 2 * sqrt(+ 2);

  cout << "f = " << f << endl;

  return 0;

}

V. Тестирование:

VI. Анализ результатов. Число 5 больше 2, поэтому вычисление значения функции происходит по формуле f space equals space 2 square root of x plus 2 end root space equals 2 square root of 7. Для числа 0.3 вычисления происходят по формуле f space equals space x to the power of 3 space end exponent equals space left parenthesis negative 0.3 right parenthesis cubed. Полная проверка программы требует ввести значения, принадлежащие каждому из указанных в условии промежутков.

Пример 4.5.

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

#include <iostream>

 

using namespace std;

 

int main()

{

  setlocale(0, "");

  double a, x, y;

  cout << "a=";

  cin >> a;

  cout << "x, y" << endl;

  cin >> x >> y;

  if (>= x && y >= -&& y <= a)

    cout << "да" << endl;

  else

    cout << "нет" << endl;

  return 0;

}

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

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

4.3. Оператор множественного выбора

 

Оператор if позволяет выбирать один из двух альтернативных вариантов. Если требуется выбор из трех и более вариантов, то использование нескольких операторов if может ухудшать читаемость кода программы.

В С++ еще имеется оператор множественного выбора switch, который позволяет выбрать один вариант из нескольких в зависимости от значения выражения и обеспечивает множественное разветвление в программе. Часто использование оператора switch более эффективно, чем использование нескольких операторов if. Формат команды:

switch ( <переменная> ) 

{

  case константа1: {

    команда(ы)1

break;

  }

  case константа2: {

    команда(ы)2

break;

  }

...

  default: {

команда(ы)n

break;

  }

}

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

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

Фигурные скобки могут быть опущены, если в блоке выполняется только одна команда.

Пример 4.6. Дано значение n (1 ≤ n ≤ 7), являющееся номером дня недели. Написать программу, которая определит по значению n, выходной этот день или рабочий.

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

I.  Исходные данные: n (номер дня недели).

II. Результат: сообщения — «рабочий», «выходной» или «ошибочный номер».

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

1. Ввод исходного числа.
2. 
Выбор значения n из 7 возможных:

2.1. Если значения n — 1, 2, 3, 4, 5 — выводится сообщение «рабочий».
2.2. Если значения n — 6, 7 выводится сообщение «выходной».
2.3. Для любого другого числа — выводит сообщение «ошибочный номер».

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

VI. Описание переменных: n – int.

Нужно помнить о некоторых особенностях оператора switch:

  • switch отличается от if тем, что он может выполнять только операции проверки строгого равенства, в то время как if может вычислять логические выражения и отношения;
  • в одном операторе switch не может быть двух констант, имеющих одинаковые значения;
  • оператор switch, включающий в себя другой оператор switch, может содержать одинаковые константы;
  • одно и то же действие может быть выполнено для разных значений констант. Команды записываются после последнего выбора. Для всех предыдущих список команд пуст:
  • С технической точки зрения операторы break являются необязательными в операторе switch. Они используются для окончания работы последовательности команд, относящихся к одному блоку, в котором произошло совпадение значения переменной со значением константы. Если оператор break отсутствует, то после того, как было обнаружено совпадение, будут выполнены все остальные команды для каждого выбора, описанного после совпадения. Сравнения не происходят, а команды выполняются последовательно.

case константа1:

case константа2:{

  команда(ы)1

  break;

}

С технической точки зрения операторы break являются необязательными в операторе switch. Они используются для окончания работы последовательности команд, относящихся к одному блоку, в котором произошло совпадение значения переменной со значением константы. Если оператор break отсутствует, то после того, как было обнаружено совпадение, будут выполнены все остальные команды для каждого выбора, описанного после совпадения. Сравнения не происходят, а команды выполняются последовательно.

Пример 4.6.

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

#include <iostream>

 

using namespace std;

 

int main()

{

  setlocale(0,"");

  int n;

  cout << "Номер дня n=";

  cin >> n;

  switch (n)

  {

    case 1:

    case 2:

    case 3:

    case 4:

    case 5:

  {

      cout << "рабочий" << endl;

      break;

  }

    case 6:

    case 7:

  {

      cout << "выходной" << endl;

      break;

  }

    default:

    cout << "ошибочный номер" << endl;

  }

  return 0;

}

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

Пример работы программы, в которой убрали оператор break:

Вопросы к параграфу

1. Что такое оператор ветвления?

2. Чем отличается полная запись оператора ветвления от сокращенной?

3. Можно ли использовать составные условия в операторе ветвления?

4. Как записывается оператор множественного выбора?

Упражнения

   

1. Можно ли изменить логическое выражение в операторе ветвления в примере 4.1 так, чтобы сообщения "pologitelnoe" и "ne pologitelnoe" пришлось поменять местами? Если да, то как это сделать?

2*. Какие изменения нужно внести в программу примера 4.1, чтобы рассматривались три случая: "pologitelnoe", "otricatelnoe", "ravno 0"?

3. Добавьте в программу примера 4.2 проверку корректности исходных данных: координаты домов должны быть такими, чтобы расстояния до школы были различными. Если расстояния одинаковы, то вывести сообщение 'Координаты введены неверно', а если разные, то вывести ответ.

4. Какие изменения понадобится внести в программу примера 4.2, если допустить, что девочки могут проходить одинаковые расстояния? Внесите изменения в программу и проверьте правильность ее работы.

5. Как известно, многие задачи имеют не единственное решение. Так, Юля нашла другой способ вычисления второй цифры трехзначного числа для примера 4.3. Какую из команд использовала Юля? Объясните, что получится при выполнении каждой из приведенных команд.

1. a2 = a %     2. 10 / 10;  a2 = a / 100 % 10;        3. a2 = a % 100 / 10;

6. Петя решил усовершенствовать программу примера 4.3 и проверку цифр в числе записал следующим образом:

if ( a1 % 2 == 0)

  cout << a1 << endl;

else    

  if (a2 % 2 == 0)

    cout << a2 << endl;

  else    

    if (a3 % 2 == 0)

      cout << a3 << endl;

    else    

      cout << "net takih" << endl;

Почему Петина отметка оказалась невысокой? Приведите примеры, для которых программа выдает неправильный ответ. Если такое возможно, то приведите примеры, когда программа выдает правильный ответ.

7. Дано натуральное число. Напишите программу, которая проверит, является ли оно трехзначным и кратна ли 7 сумма его цифр.

8. Дано натуральное число. Напишите программу, которая проверит, является ли оно четырехзначным и расположены ли его цифры в порядке убывания.

9. Дано натуральное число. Напишите программу, которая проверит, является ли число шестизначным «счастливым» (т. е. сумма первых трех цифр числа равна сумме последних трех).

10. Запишите функцию, значение которой вычисляется с помощью предложенного фрагмента программы:

if (< –3) 

  y = -x;

else

  if (< 0) 

    = 0;

  else

    y = x * x;

11. Напишите программу для вычисления значения функций.

1. begin mathsize 16px style f space left parenthesis x right parenthesis equals space open curly brackets table attributes columnalign left end attributes row cell x squared comma space если space – 1 less or equal than space space х space less or equal than space 1 end cell row cell – sin space x space straight в space остальных space случаях end cell end table close end style               2. space f space left parenthesis x right parenthesis equals space open curly brackets table attributes columnalign left end attributes row cell x minus 7 comma space если space space х space less than negative 7 end cell row cell square root of 49 space minus space x squared end root comma space space если space minus 7 space less or equal than space х space less or equal than 7 end cell row cell negative х space plus space 7 space straight в space остальных space случаях end cell end table close

3. begin mathsize 16px style f space left parenthesis x right parenthesis equals space open curly brackets table attributes columnalign left end attributes row cell square root of x squared space plus space 9 end root comma space если space space х space less than negative 3 end cell row cell sin space x comma space space если space minus 3 space less or equal than space х space less than 0 end cell row cell cos squared space x comma space если space space х space greater or equal than space 0 end cell end table close end style                     4. f space left parenthesis x right parenthesis equals space open curly brackets table attributes columnalign left end attributes row cell open vertical bar x close vertical bar comma space если space space х space less than space 0 end cell row cell cos space x comma space если space 0 space less or equal than space x space less than space pi end cell row cell square root of x space plus space open square brackets x close square brackets end root comma space space если space pi space less or equal than space х space less than 100 end cell row cell bevelled fraction numerator 1 over denominator sin space x end fraction comma space если space space х space greater or equal than space 100 end cell end table close

12. Напишете программу, которая проверит, принадлежит ли точка а(x, у) области.

1.      

2.    

3.      

4.      

5.     

6.      

13. Напишите программу, которая определит, имеется ли среди чисел a, b, c хотя бы одна пара равных между собой чисел. Указать, какие числа равны.

14. Напишите программу, которая определит является ли треугольник со сторонами a, b, c равнобедренным. Если да, то программа должна указать, какая из сторон является основанием, а какие — боковыми сторонами.

15. Дан номер года. Напишите программу, которая определит — является ли он високосным (год является високосным, если его номер делится на 4, за исключением тех, которые делятся на 100 и не делятся на 400).

16. Напишите программу, которая найдет количество точек пересечения прямой
y = kx + b и окружности x2 + y2 = r2. Значения k, b, r вводятся.

17*. Даны действительные числа x1, y1, x2, y2, x3, y3, являющиеся координатами вершин треугольника. Напишите программу, которая определит, лежит ли начало координат внутри этого треугольника.

18. Вводится число от 1 до 4, определяющее пору года. Напишите программу, которая выведет название этой поры года (1 — зима, 2 — весна, 3 — лето, 4 — осень). Использовать оператор switch.

19. Дано натуральное число N (N < 20), определяющее сумму денег в рублях. Напишите программу, которая выведет для этого числа наименование: «рубль», «рубля», «рублей».

20*. Вводится число от 1 до 100. Напишите программу, которая выведет название этого числа (1 — один, 2 — два, ..., 100 — сто).