Лабораторная работа 5.
Оператор switch (переключатель) предназначен для разветвления процесса вычислений на несколько направлений. Оператор имеет следующий формат:
switch (выражение) {
case константное выражение 1:
оператор 1;
break;
case константное выражение 2:
оператор 2;
break;
…………………………………
case константное выражение n:
оператор n;
break;
default:
оператор n+1;
break;
}
Выполнение оператора начинается с вычисления выражения оператора switch (оно должно быть целочисленным). Результат вычисления последовательно сравнивается с константными выражениями операторов case. Если сравнение в одном из операторов case дает значение «истина», то будет выполнен оператор (или блок операторов), следующий за строкой case. Если совпадения не произошло, выполняются операторы, расположенные после слова default, а при его отсутствии управление передается следующему за switch оператору. Все константные выражения должны иметь разные значения, но быть одного и того же целочисленного типа.
Оператор break в каждом блоке выбора осуществляет немедленный выход из оператора switch. Оператор break может отсутствовать. В этом случае, первый же случай сравнения, давший в результате «истину», приведет к выполнению всех последующих операторов, вплоть до конца оператора switch.
Рассмотрим программу «калькулятор», которая производит арифметические действия с двумя числами в зависимости от введенного с клавиатуры символа операции. В строке symbol=getch(); вызывается описанная в файле conio.h библиотечная функция getch() для чтения символа с клавиатуры. Функция ожидает, пока вы не нажмете клавишу на клавиатуре и возвращает код символа, при этом код символа не попадает в системный буфер и не отображается на экране. Значение символа присваивается переменной symbol. Строка printf("\n%c\n",symbol); отображает введенный символ на экране. Для ввода символа с клавиатуры мы могли бы использовать и функцию getchar заголовочного файла <stdio.h>, которая считывает символ с системного буфера клавиатуры. Но в программе перед функцией getchar мы используем функцию scanf, которая считывает символы до первого пробела, табуляции или возврата каретки (клавиша Enter). Поэтому после применения функции scanf в нашем случае в буфере останется символ возврата каретки. Теперь getchar считает не символ, который мы хотели бы ввести, а символ возврата каретки. Поэтому нам пришлось бы использовать дополнительный вызов функции getchar. Попробуйте.
Обратите внимание на строку:
if(f) printf("Result =%d",c);.
В начале программы мы выполнили присваивание: int f=1; Оператор if рассматривает 0 как «ложь», а любое ненулевое значение как «истину» и так как f=1, выполняется рrintf и печатается результат выполнения арифметических операций. В случае неверного ввода символа выполняется оператор default: printf("Unknown operation\n ");f=0; f присваивается значение 0 и результат не печатается.
pragma argsused
#include <stdio.h>
#include<conio.h>
int main()
{
int a,b,c;
char symbol;
int f=1;
printf("Introduce the first number \n ");
scanf ("%d",&a);
printf("Introduce the second number \n ");
scanf ("%d",&b);
printf("Introduce the operation symbol \n");
symbol=getch();
printf("\n%c\n",symbol);
switch(symbol)
{
case '+':c=a+b; break;
case '-':c=a-b; break;
case '*':c=a*b; break;
case '/':c=a/b; break;
default: printf("Unknown operation\n ");f=0;
}
if(f) printf("Result =%d",c);
getch();
return 0;
}
С использованием функции getchar:
printf("Introduce the first number \n ");
scanf ("%d",&a);
printf("Introduce the second number \n ");
scanf ("%d",&b);
getchar(); // освобождаем буфер
printf("Introduce the operation symbol \n");
symbol=getchar();
switch(symbol){…}
К операторам передачи управления относятся операторы break, goto, continue и return.
Оператор break используется внутри операторов цикла или switch для обеспечения перехода в точку программы, находящуюся непосредственно за оператором, внутри которого находится break. Мы вернемся к нему позднее.
Оператор безусловного перехода goto позволяет перейти в указанное место программы, и, начиная с этой позиции, продолжить выполнение операторов программы. Оператор goto имеет формат:
goto метка;
В теле той же функции должна присутствовать ровно одна конструкция вида:
метка: оператор;
Оператор goto передает управление на помеченный оператор. Метка – это обычный идентификатор, стоящий в начале строки и заканчивающийся двоеточием. Областью видимости идентификатор, является функция, в теле которой он задан. Рассмотрим модификацию нашей программы с оператором goto.
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
#include <stdio.h>
#include<conio.h>
int main()
{
int a,b,c;
char symbol;
printf("Introduce the first number \n ");
scanf ("%d",&a);
printf("Introduce the second number \n ");
scanf ("%d",&b);
label: printf("Introduce the operation symbol \n");
symbol=getch();
printf("\n%c\n",symbol);
switch(symbol)
{
case '+':c=a+b; break;
case '-':c=a-b; break;
case '*':c=a*b; break;
case '/':c=a/b; break;
default: printf("Unknown operation\n ");goto label;
}
printf("Result =%d",c);
getch();
return 0;
}
//---------------------------------------------------------------------------
Задание:
1. Написать программу решения задачи согласно варианту с использованием оператора switch. Варианты заданий находятся на диске:\U\iit\1-kurs\ii\OAiP\Lab06. Закомментировать операторы break, описать результат работы программы.
2. Добавить в программу оператор goto.