Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб2_С++.doc
Скачиваний:
5
Добавлен:
21.11.2019
Размер:
112.64 Кб
Скачать

Приднестровский государственный университет им. Т.Г. Шевченко

физико-математический факультет

кафедра информатики и вычислительной техники

Л А Б О Р А Т О Р Н А Я Р А Б О Т А № 2

по дисциплине:

«Программирование»

Тема:

«Операторы ветвления»

РАЗРАБОТАЛА:

ст. преподаватель кафедры ИВТ

Калинкова Е.В.

г. Тирасполь

Цель работы:

Формирование умений и навыков решения задач на составление разветвляющихся алгоритмов и программ на языке С++.

Теоретическая часть

Условный оператор if

Условный оператор if используется для разветвления процесса вычислений на два направления. Блок-схема ветвления выглядит следующим образом:

Общий вид условного оператора:

if (выражение)

оператор1;

else

оператор2;

а также его сокращенная форма:

if (выражение) оператор1;

Вначале вычисляется значение выражения, которое может иметь арифметический тип или тип указателя. Если его значение отлично от нуля, то выполняется оператор1. Если его значение равно нулю, и если есть else-часть, то выполняется оператор2. Если значение выражения равно нулю, но конструкция else отсутствует (имеется в наличии сокращенная форма условного оператора), то никаких действий в этом операторе не выполняется, а осуществляется переход к следующему оператору.

Примеры:

if (a>b) //Полная условная конструкция

max=a;

else

max=b;

if (a<0) a=-a; //Сокращенная условная конструкция

Условие помещается в скобки обязательно.

Обратите внимание, что перед else ставится точка с запятой.

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

Пример.

if (х > 0)

{ x = -x; a =2*b;} //Полная условная конструкция

else

{ int i = 2; x *=i; a=b/x;}

При использовании блоков (то есть составных операторов с определениями и описаниями) нельзя забывать о локализации определяемых в блоке объектов. Например, следующая конструкция будет ошибочной:

if (j>0) {int i; i=2*j;} else i=-j;

так как переменная i локализована в блоке и не существует вне его.

Если требуется проверить несколько условий, их объединяют знаками логических операций.

Мы можем вкладывать условные операторы друг в друга. Например:

if (выражение1)

if (выражение2)

оператор1;

else // это else относится ко второму if

оператор2;

else // а это else - к первому if

оператор3;

или

if (выражение1)

оператор1;

else // это else относится к первому if

if (выражение2)

оператор2;

else // а это else - ко второму if

оператор3;

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

if (n>0)

if (a>b)

z=a;

else

z=b;

else-часть относится к внутреннему if.

Если требуется отнести else к внешнему if, то необходимо использовать фигурные скобки:

if (n>0)

{

if (a>b)

z=a;

}

else

z=b;

Часто нам приходится осуществлять выбор более, чем из двух вариантов. Чтобы учесть это, мы можем расширить конструкцию if...else конструкцией else if. Приведем весьма распространенный способ выбора по значению из нескольких вариантов:

if (выражение1)

оператор1;

else

if (выражение2)

оператор2;

else

if (выражение3)

оператор3;

... ... ...

else операторN;

Выражения просматриваются последовательно слева направо; как только какое-то выражение становится истинным, выполняется следующий за ним оператор, и на этом вся цепочка заканчивается. Последняя else-часть, как и раньше, может быть опущена.

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

Оператор switch

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

switch (переключающее выражение)

{

case константное_выражение_1:

операторы_1;

case константное_выражение_2:

операторы 2;

. . . . . . . .

case константное_выражение_n:

операторы n;

default: операторы;

}

Управляющая конструкция switch передает управление к тому из помеченных с помощью case операторов, для которого значение константного выражения совпадает со значением переключающего выражения. Переключающее выражение должно быть целочисленным или его значение приводится к целому. Значения константных выражений, помещаемых за служебными словами case, приводятся к типу переключающего выражения. В одном переключателе все константные выражения должны иметь различные значения, но быть одного типа. Любой из операторов, помещенных в фигурных скобках после конструкции switch (...), может быть помечен одной или несколькими метками case. Если значение переключающего выражения не совпадает ни с одним из константных выражений, то выполняется переход к оператору, отмеченному меткой default. В каждом переключателе должно быть не больше одной метки default, однако эта метка может и отсутствовать. В этом случае при несовпадении переключающего выражения ни с одним из константных выражений, помещаемых вслед за case, в переключателе не выполняется ни один из операторов.

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

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

#include <stdio.h>

void main()

{

int cif;

printf ("Введите любую десятичную цифру:\n");

scanf("%d",&cif);

switch (cif)

{

case 0: case 1: printf ("один, ");

case 2: case 3: printf ("три, ");

case 4: case 5: printf ("пять, ");

case 6: case 7: printf ("семь, ");

case 8: case 9: printf ("девять\n");

break; //Выход из переключателя

default: printf ("Ошибка! Это не цифра!\n");

}

}

Пусть, например, была введена цифра 6. Компьютер "найдет" метку case 6 и выполнит все операторы, идущие за этой меткой:

case 7: printf ("семь, ");

case 8:

case 9: printf ("девять\n"); break;

Таким образом, на экран будет выведено: семь, девять.

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

Практическая часть

Рассмотрим несколько примеров.

Пример 1. Составить программу, определяющую, является ли год високосным.

Високосным является год, номер которого делится без остатка на 4. При этом если он делится на 100, то год невисокосный, однако если он делится на 400, то он все равно високосный. Например, високосными являются годы 1980 (делится на 4, но не делится на 100) и 2000 (делится на 400), а год 1900 не является високосным.

#include <stdio.h>

void main()

{

int year;

printf("Введите год: ");

scanf("%d", &year);

printf("Год %d - ", year);

if (year%400==0 || (year%4==0 && year%100!=0))

printf("високосный\n");

else

printf("невисокосный\n");

}

Зачастую одно и то же логическое выражение можно построить "с двух сторон" – с отрицанием и без него. Мы использовали условие високосности:

(year%400==0 || (year%4==0 && year%100!=0))

А могли бы взять противоположный вариант – условие невисокосности:

(year%4!=0 || (year%100==0 && year%400!=0))

Пример 2. Составить программу нахождения наибольшего из двух целых чисел a и b.

#include <stdio.h>

void main()

{

int a,b;

printf ("Введите первое число\n");

scanf("%d",&a);

printf ("Введите второе число\n");

scanf("%d",&b);

if (a==b) //"Внешняя" условная конструкция

printf ("Заданные числа равны\n");

else

if (a>b) //"Внутреняя" условная конструкция

printf ("Первое число больше второго\n");

else

printf ("Второе число больше первого\n");

}

Пример 3. Составить программу, которая в зависимости от номера дня недели выводит его название.

#include <stdio.h>

void main()

{

int c;

printf ("Введите цифру от 1 до 7:\n");

scanf("%d",&c);

printf ("Соответствующий день недели:\n");

switch (c)

{

case 1: printf ("Понедельник - день тяжелый!\n"); break;

case 2: printf ("Вторник!\n"); break;

case 3: printf ("Среда!\n"); break;

case 4: printf ("Четверг!\n"); break;

case 5: printf ("Пятница!\n"); break;

case 6: printf ("Суббота!\n"); break;

case 7: printf ("Воскресенье! Ура!\n"); break;

default: printf ("Это не цифра от 1 до 7\n");

}

}

Обратите внимание, что если после метки с двоеточием идет несколько операторов, то их необязательно помещать в блок с помощью скобок { и }.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]