Up

8 класс. Оператор ветвления

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

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

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

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

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

В жизни неоднократно встречаются такие ситуации, когда нужно сделать выбор. В зависимости от него вы будете делать определённые действия. Например, дорога, по которой вы шли, разошлась: направо — на озеро, налево — в лес за ягодами-грибами. Одновременно искупаться и собрать грибы не получится. Нужен ваш выбор. Если выбрали искупаться, останетесь без грибов. И наоборот, собирая грибы-ягоды, про купание придётся забыть.

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

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

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

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

if  (условие)
{
Команды 1;
}

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

Пример 16.1. 

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

#include <iostream>
using namespace std;
int main() {
    int x;
    cout << "x = ";
    cin >> x;
    if (x > 0)
        cout << "Polozhitel'noe";
    else cout << "Ne polozhitel'noe";
    return 0;
}

Обратите внимание на расположение с отступом строк в структуре оператора ветвления. Ответьте на вопрос: почему второй ответ нельзя написать "отрицательное", почему именно ответ "не отрицательное"?

При 5 получим ответ: Polozhitel'noe
При -1 получим ответ: Ne polozhitel'noe
При 0 получим ответ: Ne polozhitel'noe

0 не является ни положительным, ни отрицательным числом.

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

Пример 16.2. 

В момент времени 00:00 на светофоре для пешеходов включили зеленый сигнал. Далее сигнал светофора сменяется каждую минуту: 1 минуту горит зеленый сигнал, 1 минуту — красный. Известно, что с момента включения светофора прошло m минут. Требуется нарисовать светофор с включенным сигналом в соответствии с введенным значением времени.

Будем использовать графический режим. Рисование светофора (прямоугольник и 2 круга) с выключенными сигналами.

Дальше в программе цвет сигнала будет зависеть от того, четным или нечетным будет значение m. Если m четное — сигнал зелёный (закрашиваем нижний круг), если нечетное — красный (закрашиваем верхний круг).

#include<graphics.h>
#include <bits/stdc++.h>
#include <conio.h> 
using namespace std;
int main()
{   
int m;
cout<<"time = ";
cin >> m;
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
rectangle(250,50,390,250);
circle(320,100,30);
circle(320,200,30);
if (m % 2 == 1)
{setfillstyle (1, RED);
floodfill(320,100,WHITE);
}
else 
{setfillstyle (1, GREEN);
          floodfill(320,200,WHITE);
}
getch();
closegraph();
}

Результаты тестирования при m = 5 и m = 12:

Пример 16.3. 

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

Для решения задачи нам требуется:


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

VI. Запустить программу и ввести значения: Танин дом — x1 = 2.3, y1 = = 4.5, Катин дом — x2 = –2.1, y2 = 4.9.


Пример 16.4. 

Вася начал заниматься стрельбой из лука. Для тренировки он решил создать модель мишени, которая будет реагировать на лазер. Мишень представляет собой два круга (стреляет Вася пока не очень хорошо) разного радиуса с общим центром. Если Вася попал в маленький круг, то круг загорается зеленым. Большой круг при попадании в него загорается желтым. Если Вася не попал ни в один из кругов, то область вне кругов загорается красным. Необходимо реализовать компьютерную модель Васиной мишени (при попадании на границу круга ничего не должно происходить).

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

1. Рисование мишени: 2 круга радиусов R_b = 150 и R_m = 75 с центром в точке (x0 ; y0 ), x0 = 320, y0 = 240. Сначала рисуем круг большего радиуса.

2. Ввод данных: координаты точки выстрела.

3. Цвет рисунка будет зависеть от того, в какую область относительно кругов попала точка. Возможны 3 случая:

1) точка внутри маленького круга. Длина отрезка между точкой и центром круга меньше радиуса. По теореме Пифагора:

(x − x0)2 + (y − y0)2 < R_m2 ;

2) если условие а) не выполняется, проверяем, принадлежит ли точка большому кругу:

(x − x0)2 + (y − y0)2 < R_b2 ;

3) если условия а) и б) не выполняются, то Вася не попал в мишень.

4. Для сокращения записи определим переменную z = (x − x0)2 + (y − y0)2.

5. Закрасим нужную область цветом в зависимости от проверки условий.

IV. Описание переменных: x, y, x0, y0 , R_b, R_m, z имеют тип int.

#include<graphics.h>
#include <bits/stdc++.h>
#include <conio.h> 
using namespace std;
int main()
{   
int x,y, x0, y0, R_b, R_m, z;
cout<<"Shoot ";
cin>>x>>y;
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
x0 = 320; y0 = 240;
R_b = 150; R_m = 75;
circle(x0,y0,R_b);
circle(x0,y0,R_m);
z = (x-x0)*(x-x0)+(y-y0)*(y-y0);
if (z < R_m*R_m) 
{setfillstyle (1, 10);
floodfill(x,y,15); 
}
else if (z > R_b*R_b) 
{setfillstyle (1, 4);
floodfill(x,y,15);  
}
else
{setfillstyle (1, 14);
floodfill(x,y,15);   
}
getch();
closegraph();
}

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

Запустить программу и ввести координаты выстрела (240; 240).


Запустить программу еще раз и ввести координаты выстрела (300; 240).


Запустить программу еще раз и ввести координаты выстрела (450; 140).


Пример 16.5. 

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

Нам дано трёхзначное число. В ответ должны получить переменные a1, a2, a3 (цифры числа) или сообщение «не трехзначное».

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

1. Ввод исходного числа.

2. Проверка числа. Число a является трехзначным, если 99 < a < 1000.

3. Если число трехзначное, выделяем его цифры:

1) для выделения первой цифры a1 находим целую часть от деления числа a на 100;

2) для выделения второй цифры a2 числа a находим остаток от его деления на 100, а затем целую часть oт деления полученного остатка на 10;

3) последняя цифра числа a3 является остатком от деления числа a на 10.

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

Все переменные имеют тип int.

#include <iostream>
using namespace std;
int main()
{
int a, a1, a2, a3;
cout << "a = ";
cin >> a;
if (a > 99 && a < 1000)
{
    a1 = a / 100;          //Первая цифра
    a2 = a / 10 % 10;  //Вторая цифра
    a3 = a % 10;         //Третья цифра
    cout << a1 << endl;
    cout << a2 << endl;
    cout << a3 << endl;
}
else cout << "Chislo ne trehznachnoe";
    return 0;
}

Протестируем составленную программу:


Ответьте на вопросы:

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

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

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

Упражнения

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

2) Какие изменения нужно внести в программу примера 16.1, чтобы для числа рассматривались три случая: "положительное", "отрицательное", "равно нулю"?

3) Подключите графический режим в программе примера 16.1. Измените программу так, чтобы сообщение "положительное" выводилось красным цветом, а сообщение "не положительное" — синим.

5) Напишите программу. Задано число x. Если число четное, то нарисовать на экране зеленый прямоугольник, а если нечетное, то красный круг (см. пример 16.2).

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

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

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

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

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

10) Программу из примера 16.5 изменили. Сформулируйте условие задачи, которая решается с помощью этой программы.

#include <iostream>
using namespace std;
int main()
{
int a, a1, a2, a3;
cout << "a = ";
cin >> a;
if (a > 99 && a < 1000)
{
    a1 = a / 100;          //Первая цифра
    a2 = a / 10 % 10;  //Вторая цифра
    a3 = a % 10;         //Третья цифра

if (a1 % 2 == 0) 
    cout << a1 << "— chetnoe";
if (a2 % 2 == 0) 
    cout << a2 << "— chetnoe";
if (a3 % 2 == 0) 
    cout << a3 << "— chetnoe";
if (a1 % 2 ==1 && a2 % 2 ==1 && a3% 2 ==1) 
    cout << "net chetnyh cifr";
}
else cout << "Chislo ne trehznachnoe";
    return 0;
}

11) Программу из задания 10 проверили для некоторых случаев. Все ли возможные ситуации рассмотрели? Что нужно добавить?

а) При вводе а = 246 получен результат, что 2 - чётное, 4 - чётное, 6 - чётное;
б) При вводе а = 103 получили, что 0 - чётное;
в) При вводе а = 537, получили сообщение, что нет чётных цифр;
г) При вводе а = 26, получили сообщение, что не трёхзначное число.

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

if (a1 % 2 == 0) 
    cout << a1 << "— chetnoe";
else if (a2 % 2 == 0) 
        cout << a2 << "— chetnoe";
        else if (a3 % 2 == 0) 
                cout << a3 << "— chetnoe";
                else if (a1 % 2 ==1 && a2 % 2 ==1 && a3% 2 ==1) 
                        cout << "net chetnyh cifr";

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

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

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

15) Вася научился попадать в центр мишени из примера 16.4 и решил перейти к более сложным тренировкам. Теперь его мишень представляет собой три вложенных круга с радиусами R1, R2, R3 (известно, что R1 < R2 < R3). Реализуйте компьютерную модель этой мишени. Цвета выберите самостоятельно.

Комментариев нет:

Отправить комментарий