Компания ALT Linux
Опубликован: 07.03.2015 | Доступ: свободный | Студентов: 2136 / 487 | Длительность: 24:14:00
Лекция 3:

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

3.3.2 Оператор варианта

Оператор варианта switch необходим в тех случаях, когда в зависимости от значений какой-либо переменной надо выполнить те или иные операторы:

switch (выражение)
{
	case значение_1: Операторы_1; break;
	case значение_2: Операторы_2; break;
	case значение_3: Операторы_3; break;
	...
	case значение_n: Операторы_n; break;
	default : Операторы; break;
}
			

Оператор работает следующим образом. Вычисляется значение выражения (оно должно быть целочисленным). Если выражение принимает значение_1, то выполняются операторы_1. Если выражение принимает значение_2, то выполняется операторы_2 и так далее. Если выражение не принимает ни одно из значений, то выполняются операторы, расположенные после ключевого слова default.

Альтернативная ветвь default может отсутствовать, тогда оператор имеет вид:

switch (выражение)
{
	case значение_1: Операторы_1; break;
	case значение_2: Операторы_2; break;
	case значение_3: Операторы_3; break;
	...
	case значение_n: Операторы_n; break;
}
			

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

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

Задача 3.8. Вывести на печать название дня недели, соответствующее заданному числу D, при условии, что в месяце 31 день и 1-е число — понедельник.

Для решения задачи воспользуемся операцией %, позволяющей вычислить остаток от деления двух чисел, и условием, что 1-е число — понедельник. Если в результате остаток от деления (обозначим его R) заданного числа D на семь будет равен единице, то это понедельник, двойке — вторник, тройке — среда и так далее. Следовательно, при построении алгоритма необходимо использовать семь условных операторов, как показано рис. 3.19. Решение задачи станет значительно проще, если при написании программы воспользоваться оператором варианта switch:

#include <iostream>
using namespace std;
int main ( )
{ unsigned int D,R; //Описаны целые положительные числа.
	cout<<" D = "; cin>>D; //Ввод числа от 1 до 31.
	R=D%7;
	switch (R)
	{
	case 1 : cout<<" Понедельник \n "; break;
	case 2 : cout<<" Вторник \n "; break;
	case 3 : cout<<" Среда \n "; break;
	case 4 : cout<<" Четверг \n "; break;
	case 5 : cout<<" Пятница \n "; break;
	case 6 : cout<<" Суббота \n "; break;
	case 0 : cout<<" Воскресенье \n "; break;
	}
return 0;
}
			

В предложенной записи оператора варианта отсутствует ветвь default. Это объясняется тем, что переменная R может принимать только одно из указанных значений, т.е. 1, 2, 3, 4, 5, 6 или 0. Однако программа будет работать неправильно, если пользователь введёт значение D, превышающее 31. Чтобы избежать подобной ошибки лучше сделать дополнительную проверку входных данных:

#include <iostream>
using namespace std;
int main ( )
{
	unsigned int D,R;
	cout<<" \ n D = "; cin >>D;
	if (D<32) //Проверка введённого значения.
	{
		R=D%7;
		switch (R)
		{
			case 1 : cout<<" Понедельник \n "; break;
			case 2 : cout<<" Вторник \n "; break;
			case 3 : cout<<" Среда \n "; break;
			case 4 : cout<<" Четверг \n "; break;
			case 5 : cout<<" Пятница \n "; break;
			case 6 : cout<<" Суббота \n "; break;
			case 0 : cout<<" Воскресенье \n "; break;
		}
	}
	//Сообщение об ошибке в случае некорректного ввода.
	else cout<<" ОШИБКА! \n ";
	return 0;
}
			
Алгоритм решения задачи 3.8

увеличить изображение
Рис. 3.19. Алгоритм решения задачи 3.8

Задача 3.9. По заданному номеру месяца m вывести на экран его название.

Для решения данной задачи необходимо проверить выполнение двенадцати условий. Если m равно единице, то это январь, если двойке, то февраль, тройке — март и так далее. Понятно, что область возможных значений переменной m находится в диапазоне от 1 до 12 и если пользователь введёт число не входящее в этот интервал, то появится сообщение об ошибке.

#include <iostream>
using namespace std;
int main ( )
{
	unsigned int m; //Описано целое положительное число.
	cout<<" m = "; cin >>m;
	switch (m)
	{
		//В зависимости от значения m выводится название месяца.
		case 1 : cout<<" Январь \n "; break;
		case 2 : cout<<" Февраль \n "; break;
		case 3 : cout<<" Март \n "; break;
		case 4 : cout<<" Апрель \n "; break;
		case 5 : cout<<" Май \n "; break;
		case 6 : cout<<" Июнь \n "; break;
		case 7 : cout<<" Июль \n "; break;
		case 8 : cout<<" Август \n "; break;
		case 9 : cout<<" Сентябрь \n "; break;
		case 1 0 : cout<<" Октябрь \n "; break;
		case 1 1 : cout<<" Ноябрь \n "; break;
		case 1 2 : cout<<" Декабрь \n "; break;
		//Если значение переменной m выходит за пределы области
		//допустимых значений, то выдаётся сообщение.
		default : cout<<" ОШИБКА! \n "; break;
	}
return 0;
}
			
Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?