Итак мы рассмотрели оператор с одиночным выбором if
и оператор с двойным выбором if else
, но в С++ еще имеется оператор множественного выбора switch
, который мы сейчас детально рассмотрим.
// форма записи оператора множественного выбора switch switch (/*переменная или выражение*/) { case /*константное выражение1/*: { /*группа операторов*/; break; } case /*константное выражение2*/: { /*группа операторов*/; break; } //. . . default: { /*группа операторов*/; } }
На начальном этапе анализируется выражение или переменная. После чего осуществляется переход к той ветви программы, для которой значение переменной или выражения совпадает с указанным константным выражением. Далее выполняется оператор или группа операторов пока не встретится зарезервированное слово break или закрывающая фигурная скобочка. Если значение переменной или выражения не совпадает ни с одним константным выражением, то передается управление ветви программы содержащей зарезервированное слово default
. После чего выполняется оператор или группа операторов данной ветви. Сейчас рассмотрим задачу с использованием оператора выбора switch
.
Условие задачи: написать программу, которая складывает, вычитает, умножает, делит два числа введенных с клавиатуры. Разработать пользовательский интерфейс.
// switch.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include <iostream> using namespace std; int main(int argc, char* argv[]) { int count; // переменная для выбора в switch double a,b; // переменные для хранения операндов cout << "Vvedite pervoe chislo: "; cin >> a; cout << "Vvedite vtoroe chislo: "; cin >> b; cout << "Vibirite deistvie: 1-clojenie; 2-vichitanie; 3-ymnojenie; 4-delenie: "; cin >> count; switch (count) // начало оператора switch { case 1: // если count = 1 { cout << a << " + " << b << " = " << a + b << endl; // выполнить сложение break; } case 2: // если count = 2 { cout << a << " - " << b << " = " << a - b << endl; // выполнить вычитание break; } case 3: // если count = 3 { cout << a << " * " << b << " = " << a * b << endl; // выполнить умножение break; } case 4: // если count = 4 { cout << a << " / " << b << " = " << a / b << endl; // выполнить деление break; } default: // если count равно любому другому значению cout << "Nepravilni vvod" << endl; } system("pause"); return 0; }
В 9-й строке мы объявили переменную count
целочисленного типа. Именно значение данной переменной программа будет сравнивать со значением константного выражения. В строке 10 объявлены две переменные вещественного типа данных, для хранения введённых чисел. Почему вещественного, объясню позже. С 17 по 41 строки записан условный оператор множественного выбора switch
. На начальном этапе анализируется переменная count
. Анализируется таким образом:
если переменная count
равна единице, значит, выполняется блок операторов с 20-й по 23-ю строки;
если переменная count
равна двойке, значит, выполняется блок операторов с 25-й по 28-ю строки;
если переменная count
равна тройке, значит, выполняется блок операторов с 30-й по 33-ю строки;
если переменная count
равна четырем, значит, выполняется блок операторов с 35-й по 38-ю строки;
Если же значение переменной count
не совпадает ни с одним константным выражением, то передается управление ветви программы содержащей зарезервированное слово default
. То есть будет выполнена следующая строка
cout << "Nepravilni vvod" << endl;
Оператор switch
может содержать, а может и не содержать зарезервированное слово default
. Если значение переменной не совпадет ни с одним константным выражением и не будет default
, то программное управление в этом случае просто перешло бы к первому оператору после switch
. В строках 19, 24, 29, 34 записаны константные выражения, с которыми программа сравнивает значение переменной count
.
В строках 22, 27, 32, 37, записан оператор break. Возникает вопрос: «Зачем он нужен?» Допустим, пользователь ввел 2, то есть переменная count
инициализировалась двойкой. Начинает работать условный оператор множественного выбора switch
. То есть выполняется поиск двойки в константных выражениях. Сначала проверяется строка 19, мы видим, что в строке 19 константное выражение равно единице, а нам нужна двойка. Проверяем дальше. А дальше по порядку строка 24. Мы видим, что в строке 24 константное выражение равно двойке, то, что нужно!!! Переменная count
равна константному выражению, выполняется блок операторов с 25 по 28 строки. И вот в 27-й строке записан оператор break
, который заставляет программу перейти к первому оператору после оператора switch
. В данном случае управление передается строке 42. А нужен этот переход только для того, чтобы не выполнялись заведомо ненужные действия. Если убрать оператор break
, то программа будет дальше сравнивать значение переменной с константными выражениями, пока они все не закончатся и потом все равно передаст управление строке 42. Результат работы программы показан ниже (см. Рисунок 1).
Рисунок 1 — Оператор множественного выбора в С++
Вернемся к строке 10, там объявляются две переменные типа double
. Наверное, возникает вопрос, «Почему вещественного типа, а не целочисленного?». Отвечаю: «Потому, что одно из действий, которые может выполнять программа является деление, а при делении результат имеет вещественный тип данных. Компилятор С++ при делении чисел обращает внимание на их типы данных. Если мы просто делим числа на калькуляторе, например 4/5=0.8 Компилятор С++ нам выдаст результат при таком делении 0. Так как оба числа являются целочисленными, значит, результат тоже будет целочисленный, то есть целая часть от обычного деления, а в нашем случае целая часть при таком делении – это 0, соответственно часть информации теряется, или как еще говорят, отсекается (восемь десятых, в нашем случае, отсекается). А если делимое и делитель поменять местами, на калькуляторе получим: 5/4=1.25; компилятор С++ покажет несколько иной результат, а именно 5/4=1 (0.25 отсекается). Такое явление в С++ называется неявным приведением типа.» Вещественный тип данных используется для более точного представления чисел, чем целочисленный (то есть отображает дробную часть).
В С++ существуют два вещественных типа данных:
1) double
– вещественный тип данных двойной точности, а значит занимает вдвое больше памяти, чем тип float
2) float
– вещественный тип данных одинарной точности
Урок является продолжением изучения темы множественного выбора на языке Pascal. Предназначен как для изучения на уроках, так и во время проведения элективных курсов.
Вид: урок-презентация с применением современных технологий.
Технология: информационная.
Время проведения: 40 минут.
Оборудование: компьютерный класс, мультимедийные устройства.
Цель урока:
Познакомить учащихся со способами организации в программах ветвления на три и более рукавов (ветвей).
Задачи:
- Обучающие – познакомить учеников с использованием команды множественного выбора CASE; привести примеры.
- Развивающие — развитие умения преодолевать трудности при выполнении заданий самостоятельной работы, развитие логического мышления, памяти, внимания, навыков коммуникативной работы в группах.
- Воспитательные — воспитание аккуратности, ответственности за свою работу в коллективе, уважительного отношения к мнению одноклассников, уметь работать самостоятельно, выделять главное, сравнивать, делать выводы, развитие познавательного интереса, логического мышления.
Подготовка к уроку:
- Подбор изображений для слайдов.
- Подбор и набор текста и задач.
- Составление и оформление презентации.
План урока:
- Организационный момент.
- Мотивационное начало урока.
- Изложение нового материала. Составление учащимися краткого конспекта нового материала.
- Закрепление изученного материала.
- Домашнее задание.
- Итог урока.
Ход урока
Организационный момент. Психологический настрой класса. Приветствие, выявление отсутствующих, проверка готовности учащихся к уроку. Проверка домашнего задания осуществляется по следующим вопросам:
- Какое минимальное количество разделов может быть в программе в Turbo Pascal? Назовите их. (Один — раздел операторов).
- Назовите основные типы данных и соответствующие им стандартные имена, которые мы использовали на прошлом уроке. (Целочисленный тип — INTEGER, вещественный тип — REAL, логический — BOOLEAN.)
- Укажите, какие операции деления возможны над данными целочисленного типа. Поясните их результат и назовите соответствующее стандартное имя, используемое в программе. (а. MOD; б. DIV.)
- Укажите типы данных, в которых нет возможности ввода данных с помощью оператора READ. (Логический тип данных — BOOLEAN.)
- Перечислите операторы, которые могут использоваться для организации линейных алгоритмов. (BEGIN, END, READ).
- Назовите операторы для программ с разветвляющейся конструкцией. (IF … THEN … ELSE.)
Сообщение о том, чем будем заниматься на уроке. Сообщение учащимся плана занятия и его цель для учащихся
Мотивационное начало урока. Достаточно часто при составлении программ необходимо сделать выбор из достаточно большого количества вариантов. Команду IF в данном случае использовать не рационально. И тут на помощь к программистам приходит команда множественного выбора CASE.
Изложение нового материала. Составление учащимися краткого конспекта нового материала.
До сих пор, изучая ветвление в алгоритмах, мы в основном рассматривали случаи ветвления на два рукава. Сегодня наша задача – познакомиться со способами организации в программах ветвления на три и более рукавов.
Один из способов реализации ветвления на несколько рукавов – проверка условий до тех пор, пока одно из них не окажется истинным, выполнение предусмотренных этим условием действий и выход из ветвления.
Структура оператора выбора такова:
case <переменная> of
<значение1>:<действия1>;
<значение2>:<действия2>;
<значение3>:<действия3>;
……………………………………………………………………;
else <действия 4>;
end;
Оператор выбора работает следующим образом. В зависимости от того, какое значение принимает переменная, выполняется тот или иной блок действий. В случае если переменная не принимает ни одно из перечисленных значений, “работает” ветвь “ELSE” Но эта ветвь может и отсутствовать, в этом случае просто ничего не выполняется.
У множественного ветвления есть ограничения; в роли переменной может выступать только переменная порядкового типа. Но есть и положительные стороны — в качестве значений можно указывать целый диапазон.
Давайте рассмотрим на примере преимущества оператора case на примере следующей программы.
Задача 1. Приведите введенное пользователем число от 0 до 9 к его словесному представлению.
Сначала рассмотрим данную задачу с использованием оператора if:
program chislo;
var n : shortint; {-128..127}
begin
write(‘Введи число: ‘);
readln(n);
if n=0 then write(‘Нуль’)
else if n=1 then write(‘Один’)
else if n=2 then write(‘Два’)
else if n=3 then write(‘Три’)
else if n=4 then write(‘Четыре’)
else if n=5 then write(‘Пять’)
else if n=6 then write(‘Шесть’)
else if n=7 then write(‘Семь’)
else if n=8 then write(‘Восемь’)
else if n=9 then write(‘Девять’)
else write(‘Это не цифра’);
end;
Теперь с помощью оператора case:
program chislo;
var n : shortint;
begin
write(‘Введи число: ‘);
readln(n);
case n of
0: write(‘Нуль’);
1: write(‘Один’);
2: write(‘Два’);
3: write(‘Три’);
4: write(‘Четыре’);
5: write(‘Пять’);
6: write(‘Шесть’);
7: write(‘Семь’);
8: write(‘Восемь’);
9: write(‘Девять’);
else write(‘Это не цифра’);
end;
end;
Сделаем выводы. (Как видно из приведённых примеров, использование оператора case очень эффективно. Он упрощает решение разветвляющихся задач, сокращает затраты на написание кода, и упрощает понимание его). Давайте разберем еще один пример.
Задача 2. Написать программу, которая запрашивает у пользователя номер месяца и выводит соответствующее название времени года. Предусмотреть ошибку ввода.
program nomermesaca;
var x:byte;
begin
writeln(‘ введите номер месяца ‘); readln(x); Case x of
1,2,12:writeln (‘зима’);
3,4,5:writeln (‘весна’);
6,7,8:writeln (‘лето’);
9,10,11:writeln (‘осень’)
else
writeln (‘ошибка’);
end;
end.
Я думаю до readln(x); всё понятно. Теперь разбираем непосредственно часть программы с оператором-”case”.
Допустим, мы ввели число 5. Так вот программа берет нашу переменную x, которая в нашем случае равняется пяти, и ищет нашу пятёрку среди тех данных, которые мы ввели между “Case x of… и … Else writeln (‘ошибка’);”.
Пройдя первую строку программа нужной пятёрки не нашла и, перейдя на вторую, нужная пятёрка была найдена и в соответствии с командой, которую мы задали в этом случае программа выводит на экран слово «Весна».
Если бы мы ввели число большее, чем 12,то программа бы выдала нам следующее: «Ошибка»
Закрепление изученного материала. Применение знаний на практике и формирование практических умений и навыков.
Учащимся предлагаются несколько задач, которые они должны составить на компьютере:
Задача 3. Составить программу, имитирующую работу своеобразного калькулятора.
program Calc;
var a, b, c: integer;
begin
writeln(‘Введите a’); Read(a);
writeln(‘Введите b’); Read(b);
writeln(‘Введите c‘); Read(c);
case c of
1: writeln(‘Сумма=‘, a+b);
2: writeln(‘Разность=‘, a-b);
3: writeln(‘Произведение=‘, a*b);
4: writeln(‘Целая часть от деления=‘, a div b);
5: writeln(‘Остаток от деления=‘, a mod b);
else writeln(‘Введен неизвестный номер операции’);
end;
end.
Задача 4. Написать программу, которая в зависимости от введённого числа выводила бы на экран: если 1, 2, 3, 4, 5 то ‘один’, если 6, 7, 10, 15 то ‘два’, если 8 то ‘три’, если 16, 17, 18, 19, 20, 22, 25 то ‘четыре’. Иначе вывести на экран ‘ошибка’.
program primer;
var n : integer;
begin
write(‘Введите число: ‘);
readln(n);
case n of
1..5: write(‘один’);
6, 7, 10, 15: write(‘два’);
8: write(‘три’);
16..20, 22, 25: write(‘четыре’);
else write(‘ошибка’);
end;
end.
Выявление пробелов в знаниях учащихся и их ликвидация. Беседа.
- С помощью каких операторов можно организовать многовариантное ветвление? (IF…THEN…ELSE, CASE…OF). Ставится ли перед ELSE ;? (Нет)
- Какой тип может иметь переменная, выступающая в роли параметра в операторе выбора CASE (Перечисляемый).
- Может ли отсутствовать ELSE в операторе выбора? (Да)
- Как “работает” оператор выбора? (Оператор выбора работает следующим образом. В зависимости от того, какое значение принимает переменная выполняется тот или иной блок действий. В случае если переменная не принимает ни одно из перечисленных значений, “работает” ветвь “else” Но эта ветвь может и отсутствовать, в этом случае просто ничего не выполняется.)
Домашнее задание.
Составить программу по следующему условию.
В некотором учебном заведении действуют следующие правила приема. Абитуриенты сдают три экзамена. Если они набирают не менее 13 баллов, то это дает право поступить на дневное отделение, от 10 до 12 — вечернее, от 8 до 9 — заочное и ниже 8 баллов — отказ в приеме на учебу. Записать программу, которая в зависимости от суммы набранных баллов сообщает абитуриенту его права на поступление.
Итог урока.
Сегодня на уроке мы повторили структуру программы, типы данных, инструкции ввода и вывода, логические выражения, условный оператор, познакомились с организацией многовариантного ветвления.
предыдущие:
- Операционная система Linux
- Управление компьютером
- Задания на компьютерный марафон по информатике в 8 классе
- История развития вычислительной техники
- Архитектура персонального компьютера
Прочитайте улучшенную версию этого урока “Оператор выбора switch”.
В новой версии:
- Ещё более доступное объяснение
- Дополнительные материалы
- Задачи с автоматической проверкой решения
Добрый
день друзья.
Вот и подошло
время очередного занятия. Оно будет посвящено инструкции switch. Это еще одна из инструкций управления
программой. В качестве вступления вспомним опять пример с дорогами.
Представьте, что у нас развилка не из двух, а из трех дорог. Тут уже одной
конструкцией if–else не отделаешься. Можно конечно
использовать несколько конструкций if–else, но представьте если у нас будет
10 вариантов, например, для каждой цифры от 0 до 9 нужно выполнять какое-то своё
действие? Тогда нам придется написать несколько вложенных конструкций if–else, но это не очень удобно. Для
этих целей и служит инструкция switch,
о которой мы и поговорим в сегодняшнем занятии.
Инструкция
switch.
Как уже
упоминалось выше, данная инструкция служит для выбора одного из многих путей.
Рассмотрим её формат.
Листинг
6.1
switch (выражение)
{
case
констное выражение: операторы
case
констное выражение: операторы
default:
операторы
}
Как видите,
инструкция switch
состоит из двух
частей: заголовок switch,
тело инструкции, записанное в составном операторе (фигурных скобках). В
заголовке нас интересует только выражение в скобках. Именно от значения этого
выражения зависит, какая из ветвей программы будет выполняться. Для этого
выражения существует одно ограничение.
- Там
может быть записана любое выражение, или переменная символьного или целочисленного
типа.
Ниже
приведены примеры правильного и неправильного заголовков.
Листинг
6.2.
int c,a;
char s;
double g;
switch (c) //Правильно
(целая переменная)
switch ((a+c)+2) //Правильно (выражение целого типа)
switch (g) //Неправильно
(вещественная переменная)
switch (s) //Правильно
(символьная переменная)
В фигурных скобках записаны несколько (не
обязательно две) ветвей case.
Каждая такая ветка соответствует одному из вариантов выбора. Каждая из таких
веток состоит из слова case,
после которого через пробел записано константное выражении, или другими словами
одно из значений выражения в заголовке. Именно с этим выражением сравнивается
выражение в заголовке оператора switch (инструкция и оператор это одно
и то же, поэтому не удивляйтесь, что иногда я пишу инструкция switch, а иногда оператор switch). Как только выражение в
заголовке совпадает с одним из константных выражений в какой-либо ветке case, начинает выполнять операторы
следующие в данной ветке после двоеточия.
- Тут тоже есть ограничение, константные выражения каждой из ветки case должны быть разными между собой.
Т.е.
следующий пример ошибочен (так как для двух веток (первой и третей) константные
выражения совпадают :
Листинг
6.3
{
case 10: a+10; break;
case 34: a+34; break;
case 10: a-23; break;
}
В теле оператора
switch
может быть еще одна
ветка default.
Она необязательна. Её операторы выполняются, если выражение в заголовке
оператора switch
не совпало ни с
одним из константных выражений в ветках case. Если же такой ветки не будет, а
ни одно из константных выражений не подходит, то просто ничего не будет
делаться. И программа продолжит свое выполнение.
Обобщим
вышесказанное. Оператор switch,
в первом приближении, работает следующим образом. Сначала вычисляется выражение
в заголовке, далее оно сравнивается с каждым из константных выражений внутри
тела оператора. Если оно совпадает с одним из них, то выполняются операторы
этой ветки, если совпадений нет, то выполняется ветка default, если она имеется, если ветки default нет, то выполнение оператора
заканчивается. И программа продолжает работать дальше.
Для
лучшего усвоения понимая работы оператора switch, и иллюстрации некоторых
особенностей, давайте напишем программу которая реализует управление в какой-то
гипотетической игре, потом при изучении циклов и функций мы переделаем это
меню. Оно будет оболочкой для всех остальных программ. А пока, что примем
следующие клавиши управления: W
– вперед, A – влево, S – вниз, D – вправо. Так как это символы для их хранения
потребуется переменная типа char.
Листинг
6.4
#include <stdio.h>
int main(void) {
char c;
printf(“Vvedite komandu: “);
c=getchar();
switch (c) {
case ‘w’: printf(“nVperedn”);
case ‘a’: printf(“nVlevon”);
case ‘s’: printf(“nVnizn”);
case ‘d’: printf(“nVpravon”);
default: printf(“nNeizvestnaya
komandan”);
}
return (0);
}
На
рисунке ниже вы видите, как работает программа при нажатии клавиши a.
Рис. 6.1 Иллюстрация сквозного выполнения инструкции switch. |
Как
видите, на экране появилось, не то, что предполагалось. Эта программа иллюстрирует
одну из особенностей инструкции switch – сквозное выполнение. Т.е. после
того, как нашлось совпадение в одном из case, если явно не указан выход из
оператора switch,
то программа выполняет последовательно все остальные ветки записанные ниже той,
с которой выполнено совпадение, пока не закончится оператор switch или пока не будет явно указан
выход из оператора. В нашем случае мы нажали клавишу a, программа выполнила ветку с
выражение a,
и продолжила выполнять последовательно все ветки, которые записаны в коде после
этой, т.е. ветки s,d,w и ветку default. Эта особенность может играть
как отрицательную роль, как в нашем
случае, так и положительную (мы применим её чуть позже).
Для выхода из
оператора switch
используется
оператор безусловного выхода break.
Он так же применяется и в других конструкциях, например, в циклах, но об этом
мы еще будем говорить. Как только программа встретит данный оператор, она
закончит выполнение инструкции switch.
Поэтому, нам нужно в каждую веточку дописать этот оператор выхода. Я
настоятельно рекомендую писать break
во все без исключения ветки. С учетом внесенных изменений программа
примет следующий вид:
Листинг
6.5
#include <stdio.h>
int main(void) {
char c;
printf(“Vvedite komandu: “);
c=getchar();
switch (c) {
case ‘w’: printf(“nVperedn”); break;
case ‘a’: printf(“nVlevon”); break;
case ‘s’: printf(“nVnizn”); break;
case ‘d’: printf(“nVpravon”); break;
default: printf(“nNeizvestnaya
komandan”); break;
}
return (0);
}
Теперь
если запустить программу она будет работать
так, как и предполагалось.
Сейчас
поговорим об еще одной особенности оператора switch. Внутри тела оператора, порядок написания
case
и default не важен. Т.е. Сначала можно
написать ветку default,
а затем ветки case.
Или же ветку default можно
пометить между других веток case.
Программа Листинг 6.6 работает так же
как и программа Листинг 6.5:
Листинг
6.5
#include <stdio.h>
int main(void) {
char c;
printf(“Vvedite komandu: “);
c=getchar();
switch (c) {
case ‘w’: printf(“nVperedn”); break;
case ‘a’: printf(“nVlevon”); break;
default: printf(“nNeizvestnaya
komandan”); break;
case ‘s’: printf(“nVnizn”); break;
case ‘d’: printf(“nVpravon”); break;
}
return (0);
}
Теперь
разберемся с ситуацией когда сквозное выполнение оператора switch играет полезную роль. Представим
ситуацию, что у пользователя нажата
клавиша Caps
Lock.
Поэтому все вводимы буквы будут в верхнем регистре. Но компьютер различает
буквы в верхнем и нижнем регистре, и поэтому если в нашей программе написать W, то мы увидим на экране надпись
о неизвестной команде. Для того чтобы
исправить эту оплошность, надо добавить еще 4 ветки case. Перепишем программу.
Листинг
6.7
#include <stdio.h>
int main(void) {
char c;
printf(“Vvedite komandu: “);
c=getchar();
switch (c) {
case ‘W’: printf(“nVperedn”); break;
case ‘w’: printf(“nVperedn”); break;
case ‘A’: printf(“nVlevon”); break;
case ‘a’: printf(“nVlevon”); break;
case ‘S’: printf(“nVnizn”); break;
case ‘s’: printf(“nVnizn”);
break;
case ‘D’: printf(“nVpravon”); break;
case ‘d’: printf(“nVpravon”); break;
default: printf(“nNeizvestnaya
komandan”); break;
}
return (0);
}
Сейчас
она будет работать так, как надо. А вот теперь вспомним о сквозном выполнении
оператора switch.
Рассмотрим на примере команды «Вперед».
Имеем^
Листинг
6.8
case ‘W’: printf(“nVperedn”);
break;
case ‘w’: printf(“nVperedn”);
break;
Если в
верхней строчке Листинг 6.8 убрать оператор break, то из-за свойства сквозного
выполнения, выполнится сначала одна функция printf, а затем вторая из ветки с
маленькой w.
Потом программа встретит break
и закончит выполнение оператора. Теперь уберем первую функцию printf.
Листинг
6.9
case ‘W‘:
case ‘w’: printf(“nVperedn”);
break;
Теперь
программа будет работать независимо от того в каком регистре введена буква.
Т.е. мы как бы для одной ветки сделали два условия. Если какое-либо из них
выполнится, то эта ветка выполнится. Т.е. если мы нажмем W то программа выполнит сначала
операторы ветки W.
Там их нет и оператор break
отсутствует, программа начнет выполнять следующую ветку w. И потом встретив оператор break выйдет из инструкции switch. Таким же образом поступим с
остальными ветками. Программа приобретет следующий вид:
Листинг
6.10
#include <stdio.h>
int main(void) {
char c;
printf(“Vvedite komandu: “);
c=getchar();
switch (c) {
case ‘W’:
case ‘w’: printf(“nVperedn”); break;
case ‘A’:
case ‘a’: printf(“nVlevon”); break;
case ‘S’:
case ‘s’: printf(“nVnizn”); break;
case ‘D’:
case ‘d’: printf(“nVpravon”); break;
default: printf(“nNeizvestnaya
komandan”); break;
}
return (0);
}
Теперь
немножко о преимуществах и недостатках
оператора switch.
Инструкция
switch
наглядно показывает
ветвление на несколько вариантов. Но она имеет один существенный недостаток.
Если в инструкции if
мы могли
использовать некоторые условия и логические операторы, то в операторе swith это невозможно. Нам необходимо заранее
для каждого значения написать конкретный набор действий. Т.е. выражение в заголовке
является критерием выбора, причем оно должно быть строго, либо целого типа,
либо символьного. И в зависимости от этого критерия выбирается ветка. Поэтому
не во всех случаях мы сможем использовать данную инструкцию. В таких случаях
приходится использовать несколько инструкций if-else.
На этом
мы завершим сегодняшнее занятие.
Резюме урока:
- Узнали об
операторе множественного выбора switch - Разобрались
с нюансами его работы. - Научились
использовать оператор безусловного выхода break. - Поговорили
о области применимости инструкций switch и if–else.
Задание
для практической работы:
Написать
программу простейший калькулятор для
следующих действий +,-,*,/. На вход
программе подается два числа и знак действия. Например: 4 23.5 *. Программа
должна вывести результат арифметического действия. При недопустимой арифметической
команде вывести ERROR.
Если Вам понравился этот урок, расскажите о нем вашим друзьям. В
этом Вам могут помочь кнопки основных социальных сетей, расположенные
ниже. Вам остается всего лишь кликнуть по любой из них.
На занятии будет рассмотрен оператор выбора в Паскале (Case). Узнаете как использовать символьный тип char
Оператор выбора в Паскале
- Оператор
case
в Паскале используется в тех случаях, когда в зависимости от значения какой-либо переменной нужно выполнить те или иные действия (простые или составные операторы). - Если вариантов всего два, то можно обойтись и условным оператором IF, с которым мы уже знакомы. Но если их, к примеру, десять, то использовать конструкцию
if then else
в pascal становится совсем нецелесообразно. В этом случае оптимален операторCASE
варианта.
Рассмотрим использование оператора выбора в языке Паскаль на конкретном примере.
Пример: Программа, спрашивающая у ученика его отметку по информатике и реагирующая на нее подходящим текстом
Особенность: Выбор не из двух, а из нескольких вариантов в зависимости от отметки.
Результат выполнения с использованием условного оператора if:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var otmetka:integer; begin writeln('Отметка?'); readln(otmetka); if (otmetka=1) or (otmetka=2) then writeln ('кошмар!') else if otmetka=3 then writeln('плохо') else if otmetka=4 then writeln('неплохо') else if otmetka=5 then writeln('отлично!') else writeln('таких отметок не бывает'); end. |
Данный пример демонстрирует нерациональную работу программиста и слишком запутанный код. Гораздо лаконичнее выглядит код при использовании оператора выбора.
Результат выполнения с использованием оператора выбора case:
1 2 3 4 5 6 7 8 9 10 11 12 |
var otmetka:integer; begin writeln('отметка?'); readln(otmetka); case otmetka of 1,2 : writeln ('кошмар!'); 3: writeln('плохо'); 4: writeln('неплохо'); 5: writeln('отлично!'); else writeln('таких отметок не бывает'); end end. |
Блок-схема, соответствующая оператору выбора:
Задача 9. В программе необходимо запросить время дня в часах. В зависимости от введенного времени, выводить сообщение с указанием на то, к какому времени суток относится введенный час (полночь, ночь, утро, день, вечер)
[Название файла: L2task9.pas
]
- Чтобы задать диапазон значений, используется один из двух вариантов:
- Перечисление через запятую:
... case x of: 1,2,3,4,5: writeln('от одного до пяти'); ...- Использование
..
:... case x of: 1..5: writeln('от одного до пяти'); ...
Перечисление или диапазон
- После служебного слова
case
может стоять имя переменной или арифметическое выражение целого типа: - или символьного типа (char):
Задача 10. Case7:
Единицы массы пронумерованы следующим образом: 1 — килограмм, 2 — миллиграмм, 3 — грамм, 4 — тонна, 5 — центнер. Дан номер единицы массы (целое число в диапазоне 1–5) и масса тела в этих единицах (вещественное число). Найти массу тела в килограммах.
[Название файла: L2task10.pas
]
Детально разобраться в том, как работает оператор выбора Case в Паскале, можно просмотрев видеоурок:
Для решения следующей задачи пригодится тип
char
— символьный.
Переменная данного типа объявляется так:
c: char;
и присваивает значения следующим образом:
c:='a';
Задача 11. Калькулятор на Паскале. Ученик вводит с клавиатуры число, символ арифметического действия (+, -, *, /) и еще одно число. Компьютер должен напечатать результат. Указание: Для чисел и арифметического действия используйте оператор ReadLn
в Паскаль
[Название файла: L2task11.pas
]
27 |
|
Программирование на языке Pascal |
В случае, если ветвление более сложное и зависит, например, от значения одного выражения (или переменной), то использование оператора If приведет к довольно громоздким конструкциям в исходном тексте программы.
Например, нам необходимо реализовать интерактивное меню, такое, как показано на рисунке ниже:
Рисунок 12
Приведем пример кода, использующий оператор If и реализующий управление ходом выполнения программой в виде такого меню. Т.е. нам нужно, в зависимости от того, какую цифру введет пользователь, выполнять либо сложение, либо вычитание, либо умножении, либо же деление. Предположим, что номер операции записывается в переменную operation : Byte.
Листинг 7
If operation=1 then
Begin
{Выполняется сложение}
End;
If operation=2 then
Begin
{Выполняется вычитание}
End;
If operation=3 then
Begin
{Выполняется умножение}
End;
If operation=4 then
Begin
{Выполняется деление}
End;
Если требуется еще реализовать ветвь программы, которая обрабатывает отличный от всех случай (т.е. операция не равна ни 1, ни 2, ни 3 и ни 4), то структура будет и того сложнее и запутанней.
Как раз для таких случаев был введен оператор множественного выбора – case. В общем виде его структура выглядит следующим образом:
27
28 |
|
Программирование на языке Pascal |
Case ВЫРАЖЕНИЕ Of value1 : Begin
БЛОК_ОПЕРАТОРОВ_1;
End; value1 : Begin
БЛОК_ОПЕРАТОРОВ_1;
End;
…
valueN : Begin
БЛОК_ОПЕРАТОРОВ_N;
End;
Else
Begin
БЛОК_ОПЕРАТОРОВ;
End;
End;
Здесь, в качестве ВЫРАЖЕНИЯ может быть использовано любое выражение, которое приводит либо к целочисленному результату, либо к символьному (т.е. результат – один символ9). Недопустимо использовать выражения или переменные, которые, например, возвращают целую строку или вещественное число.
value1, value2, …, valueN – это значения, которые может принимать
ВЫРАЖЕНИЕ;
БЛОК_ОПЕРАТОРОВ_1, БЛОК_ОПЕРАТОРОВ_2, …, БЛОК_ОПЕРАТОРОВ_N – это операторы, которые необходимо выполнять в зависимости от значения ВЫРАЖЕНИЯ. Блок Else здесь используется в том же самом смысле, что и в условном операторе. Он предваряет блок операторов, который необходимо выполнить, если среди перечисленных значений value1, …, valueN не нашлось такого, которому бы равнялось ВЫРАЖЕНИЕ. Используя оператор множественного выбора, программа, приведенная в Листинг 7, будет выглядеть компактнее и понятнее:
Case operation Of
1: Begin
{выполняется сложение}
End; 2: Begin
{выполняется вычитание}
End; 3: Begin
{выполняется умножение}
End; 4: Begin
{выполняется деление}
End; End;
Еще одно преимущество оператора множественного выбора заключается в том, что вместо одиночного значения ВЫРАЖЕНИЯ можно использовать несколько, а также целые диапазоны.
Пример 1
9 О символьном типе данных (char) мы поговорим позднее.
28
29 |
|
Программирование на языке Pascal |
В этом примере мы покажем, как можно указывать несколько значений ВЫРАЖЕНИЯ. Как видно, каждое из значений, для которого должен выполняться один и тот же блок операторов, записываются через запятую.
Case number Of
1,3,5,7,11,13,17,19: WriteLn(‘Число ‘, number, ‘ – простое’);
2,4,6,8,10,12,14,16,18,20: WriteLn(‘Число ‘, number, ‘ – четное’);
Else
WriteLn(‘Число ‘, number,
‘ – нечетное и не является простым’);
End;
Пример 2
В этом примере мы рассмотрим способ указания целого диапазона, в который может попадать значение ВЫРАЖЕНИЯ оператора множественного выбора. Диапазон значений указывается начальным и конечным значениями, разделенными двумя точками (без всяких пробелов):
Case age Of
0..6: WriteLn(‘Учащийся детского сада’); 7..16: WriteLn(‘Учащийся школы’);
17..22: WriteLn(‘Учащийся МГТУ им. Н. Э. Баумана’);
Else
WriteLn(‘Уже не учащийся’);
End;
Практикум: Разработка программы, проверяющей возможность существования треугольника с заданными сторонами
Как известно, у треугольника стороны могут быть не всякими. Например, не может быть треугольника со сторонами 1м. , 1м. и 100 м. Предположим, что пользователь вводит три числа, и наша задача выяснить может ли существовать треугольник с такими сторонами. Для этого воспользуемся неравенством, которое в школе получило название неравенства треугольника:
для всех сторона a, b, c треугольника должны одновременно выполняться неравенства:
a b cb c a .
a c b
Раз условия должны выполняться одновременно, то это сразу наводит на мысль об использовании логического оператора AND, который в данном случае будет связывать три условия, которые представляют запись каждого из этих неравенств.
Для того, чтобы пользователь мог ввести три стороны треугольника, объявим три переменные вещественного типа.
Код такой программы несложен и выглядит следующим образом:
Var a, b, c : Real;
29
30 |
|||
Программирование на языке Pascal |
|||
Begin |
|||
WriteLn(‘Введите три стороны’); |
|||
ReadLn(a, b, c); |
|||
If (a+b>c) and (b+c>a) and (a+c>b) then |
|||
WriteLn(‘Такой треугольник существовать может’) |
|||
Else |
|||
Writeln(‘Такого треугольника существовать не может!’); |
|||
End. |
Практикум: Вывод названия года в старояпонском календаре по номеру года
Известно, что в старояпонском календаре был принят двенадцатилетний цикл, при этом каждый год имел свое название. Началом цикла будем считать 1996 год – год крысы. Поскольку цикл регулярный, то для того, чтобы вывести его название достаточно анализировать остаток отделения номера года на 12. Осталось только выяснить правильный порядок названий, который опять-таки можно почерпнуть в Wikipedia: крыса, корова, тигр, заяц, дракон, змея, лошадь, овца, обезьяна, петух, собака и свинья.
В этом случае, исходный текст программы выглядит следующим образом:
Var Year : Integer;
Begin
WriteLn(‘Введите номер года ‘); ReadLn(Year);
Case (Year mod 12) Of
0:WriteLn(‘Год Обезьяны’);
1:WriteLn(‘Год Петуха’);
2:WriteLn(‘Год Собаки’);
3:WriteLn(‘Год Свиньи’);
4:WriteLn(‘Год Крысы’);
5:WriteLn(‘Год Коровы’);
6:WriteLn(‘Год Тигра’);
7:WriteLn(‘Год Зайца’);
8:WriteLn(‘Год Дракона’);
9:WriteLn(‘Год Змеи’);
10:WriteLn(‘Год Лошади’);
11:WriteLn(‘Год Овцы’)
End;
End.
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #