Слайд 1ОПЕРАТОР ВЫБОРА CASE
Долгих Н. 10 «з»
Слайд 2 Для начала решим одну задачу уже известным способом
Условие: по введенному
8-мизначному числу определить является ли это датой (в формате дд.мм.гггг), если такой даты не существует сообщить на экран
Слайд 3Вводится восьмизначное число в формате ДДММГГГГ. Необходимо выяснить, существует ли такая
дата.
В решении необходимо учитывать число месяцев, количество дней в каждом месяце, а также високосные года.
Слайд 4Вводится восьмизначное число в формате ДДММГГГГ. Необходимо выяснить, существует ли такая
дата.
Нам понадобятся переменные для самого числа (а), для дня(d), месяца(m), года(g).
Сначала определим, високосный ли год. Восьмизначное число записано в формате ДДММГГГГ, то есть последние 4 цифры – год (g).
Уберем из числа ДДММ, для этого воспользуемся
MOD – делением с выводом на экран остатка.
Разделим на 10 000. Запись в Паскале будет следующей: g:=m mod 10000;
Если остаток равен нулю – год високосный, во втором месяце года 29 дней, а не 28. Это нужно четко отразить в задаче.
vis:=g mod 4;
if (vis=0) and (m=2) and (d<30) then …
Слайд 5Вводится восьмизначное число в формате ДДММГГГГ. Необходимо выяснить, существует ли такая
дата.
Итак, если год високосный, месяц второй, и число,
обозначающее день<30, можем вывести на экран дату:
if (vis=0) and (c1=2) and(d<30) then writeln(d,'.', m,'.', g,'.')
else …
Слайд 6Вводится восьмизначное число в формате ДДММГГГГ. Необходимо выяснить, существует ли такая
дата.
if (vis=0) and (m=2) and (d<30) then writeln(d,'.', m,'.', g,'.')
else …
Рассуждаем дальше. Если год не високосный, то есть какой то остаток от деления месяца(m),
число дней в феврале = 28, а остальные числа можно объединить группами, так, например,
31 день содержат 1, 3, 5, 7, 8, 10, 12 месяцы,
30 дней – 4, 6, 9, 11. В остальных случаях дата не существует. Используем IF:
if ((m=1) or (m=3) or (m=5) or (m=7) or (m=8) or (m=10) or (m=12)) and (d<32)
or (m=2) and (d<29)
or ((m=4) or (m=6) or (m=9) or (m=11)) and (d<31)
then writeln (d,'.', m,'.', g,'.')
else writeln ( ' такой даты не существует ' );
Слайд 7 РЕШЕНИЕ
var a, d, m,o1, vis,o2:integer;
BEGIN
read (a);
d:=a div 1000000; {день}
m:=a
mod 1000000; {ммгггг}
g:=m mod 10000; {гггг}
m:=m div 10000; {мм}
vis:=g mod 4;
if (vis=0) and (m=2) and(d<30) then writeln(d,'.', m,'.', g,'.')
else
if ((m=1) or (m=3) or (m=5) or (m=7) or (m=8) or (m=10) or (m=12)) and (d>0) and (d<32)
or (m=2) and (d>0) and (d<29)
or ((m=4) or (m=6) or (m=9) or (m=11)) and (d>0) and (d<31)
then writeln (d,'.', m,'.', g,'.')
else writeln ( 'такой даты не существует ' );
END.
Слайд 8Тестируем программу:
Программа работает вполне корректно.
Задача решена.
Слайд 9СЛОЖНО!!!
Можно проще!!!
Для этого сначала разберем
Оператор выбора case
Слайд 10СУТЬ ОПЕРАТОРА
Оператор выбора case является обобщением оператора if и позволяет сделать
выбор из произвольного числа имеющихся вариантов.
Как и в операторе if здесь может присутствовать слово else, имеющее тот же смысл
Слайд 11Оператор выбора выполняет одно действие из нескольких в зависимости от значения
некоторого выражения, называемого переключателем.
Он имеет следующий вид:
case переключатель of
список выбора 1: оператор 1;
список выбора 2: оператор 2;
...
список выбора N: оператор N;
else оператор 0
end;
Слайд 12 Переключатель представляет собой выражение целого, символьного типа или логического типа,
а
списки выбора содержат константы того же типа, что и переключатель.
Как и в операторе if, ветка else может отсутствовать.
Слайд 13 Если при выполнении условия действий больше одного, то вид оператора выбора
будет таким:
case переключатель of
список выбора 1: begin группа действий 1; end;
...
список выбора N: begin группа действий N; end;
else begin группа действий 0; end
end;
группа действий перечисляется через ;
Слайд 14 ПРАВИЛО РАБОТЫ ОПЕРАТОРА:
1.Вычисляется значение выражения.
2.Это значение сравнивается с константами, стоящими после
слова of
3.Если значение выражения равно какой-либо константе, то выполняется оператор, стоящий после этой константы.
4.Если значение выражения не совпадает ни с какой константой, то управление передается оператору, следующему после слова End;
5.Если используется 2-ой формат записи оператора, то управление передается оператору, следующему после слова Else.
Если вместо одного оператора в строке нужно использовать несколько, то используют операторные скобки Begin … End;
Слайд 15
Оператор case работает следующим образом.
Если в одном из списков
выбора найдено текущее значение переключателя, то выполняется оператор, соответствующий данному списку.
Если же значение переключателя не найдено ни в одном списке, то выполняется оператор по ветке else или, если ветка else отсутствует, оператор case не выполняет никаких действий.
Слайд 17
Список выбора состоит
либо из одной константы,
либо из диапазона
значений вида a..b (константа a должна быть меньше константы b);
можно также перечислить несколько констант или диапазонов через запятую.
Например: 1..5 или 1,2,3,4,5 или 1, 2..5
Или так: ‘a’, ’b’, ’c’, ’d’ или ‘a’ .. ’d’
или ‘d’, ’a’ .. ’c’
Слайд 18Списки выбора не должны пересекаться. Например, следующий фрагмент приведет к ошибке
компиляции "Пересечение диапазонов меток в операторе case".
case i of
2,5: write(1);
4..6: write(2);
end;
Здесь в обоих списках выбора содержится число 5
Слайд 19Задача
Нарисовать блок-схему и составить
программу, позволяющую получить
словесное описание школьных отметок
(1-плохо, 2-неудовлетворительно,
3-удовлитворительно,4-хорошо,5-отлично)
Если
число не находится в диапазоне , то вывести строку «ошибка».
Слайд 20Блок-схема
начало
Ввод N
N=1
N=2
N=3
N=4
N=5
ДА
ДА
ДА
ДА
ДА
НЕТ
НЕТ
НЕТ
НЕТ
ПЛОХО
НЕУДОВЛЕТВОРИТЕЛЬНО
УДОВЛЕТВОРИТЕЛЬНО
ХОРОШО
ОТЛИЧНО
НЕПР. ВВОД
конец
Слайд 21На Паскале
Program Zadacha;
var n:integer;
begin
writeln (‘Введите номер оценки’);
readln(n);
case n of
1:writeln (‘Плохо’);
2:writeln (‘Неудовлетворительно’);
3:writeln (‘Удовлетворительно’);
4:writeln (‘Хорошо’);
5:writeln (‘Отлично’);
else writeln (‘ошибка’);
end;
readln;
end.
Слайд 22 Вводиться число от 1 до 4, определяющее пору года. Дать название
этой поры года
(1 - зима, 2 - весна,
3 - лето, 4 - осень).
Слайд 23 Вводиться число от 1 до 4, определяющее пору года. Дать название
этой поры года (1 - зима, 2 - весна, 3 - лето, 4 - осень).
program zadacha2;
var n:byte;
BEGIN
writeln('Введите номер поры года');
readln(n);
case n of
1: writeln('зима');
2: writeln('весна');
3: writeln('лето');
4: writeln('осень');
Else writeln('неправильно ввели номер поры года');
end;
END.
Слайд 24
По номеру дня недели вывести соответствующее
ему название
Слайд 25program prim1;
var z: integer;
begin
writeln('введи номер дня недели');
readln(z);
case z of
1:writeln('понедельник');
2: writeln('вторник');
3: writeln('среда');
4:
writeln('четверг');
5: writeln('пятница');
6: writeln('суббота');
7: writeln('воскресенье');
else writeln('нет такого дня недели');
end;
readln;
end.
Слайд 26по введенному номеру дня недели определить рабочий день или будний, в
случае ошибки ввода сообщить на экран
Слайд 27ПРИМЕРЫ
Решение:
var n: integer;
BEGIN
Read(n);
case n of
1..5: writeln('Будний день');
6,7: writeln('Выходной день'); else: writeln('Нет такого
дня');
end;
END.
Условие: по введенному номеру дня недели определить рабочий день или будний, в случае ошибки ввода сообщить на экран
Слайд 28Составить программу, которая после введенного с клавиатуры числа (в диапазоне от
1 до 99), обозначающего денежную единицу, дописывает слово «Копейка» в правильной форме.
Например, 5 копеек, 41 копейка и т. д.
Слайд 29program c;
var a: integer;
begin
writeln ('количество копеек = ');
readln (a);
case (a) of
1,21,31,41,51,61,71,81,91:
writeln ('копейка');
2..4,22..24,32..34,42..44,52..54,62..64,72..74,
82..84,92..94: writeln ('копейки');
else writeln ('копеек');
end;
end.
Программа:
Слайд 30В одной компьютерной игре не существует числительных. Потому фраза «у вас
семь чёрных драконов, а у вашего врага — сорок» будет выглядеть так: «у вас немного чёрных драконов, а у вашего врага — толпа». Необходима программа заменяющая число (вводится число от 1 до 2000) на существительное по следующей закономерности:
1 до 4 = несколько; от 5 до 9 = немного; от 10 до 19 = отряд; от 20 до 49 = толпа; от 50 до 99 = орда; от 100 до 249 = множество; от 250 до 499 = сонмище; от 500 до 999 = полчище; от 1000 = легион
Слайд 31var a:integer;
BEGIN
readln(a);
case a of
1..4 :writeln(‘несколько’);
5..9
:writeln(‘немного’);
10..19 :writeln(‘отряд’);
20..49 :writeln(‘толпа’);
50..99 :writeln(‘орда’);
100..249:writeln(‘множество’);
250..499:writeln(‘сонмище’);
500..999:writeln(‘полчище’);
else writeln(‘легион’);
end; END.
Слайд 32Найти наибольшее из двух действительных чисел, используя оператор выбора.
Слайд 33Program Usl1;
Var A, F : Real;
Begin
WriteLn('Введите действительное число:
'); ReadLn(A);
IF A <= 0 THEN
F = 0
ELSE
IF A <= 1 THEN
F = Sqr(A) - A
ELSE
F = Sqr(A) - SIN(Pi * Sqr(A));
WriteLn ('Значение функции F(x) при x = ', A:10:6, ' равно ', F:10:6);
END.
Где A:10:6 и F:10:6 это изменение формата числа
Найти наибольшее из двух действительных чисел, используя оператор выбора.
I способ
Слайд 34Найти наибольшее из двух действительных чисел, используя оператор выбора.
II способ
Var Max,
X, Y : Real;
BEGIN
Write('Введите два числа:');
ReadLn(X, Y);
Case X > Y Of
TRUE : Max := X;
FALSE : Max := Y;
End;
WriteLn(‘большее из двух:',Max)
END.
Слайд 35Дано действительное число a. Вычислить f(a), если
Слайд 36Program Usl1;
Var A, F : Real;
Begin
WriteLn('Введите действительное число:
'); ReadLn(A);
IF A <= 0 THEN
F = 0
ELSE
IF A <= 1 THEN
F = Sqr(A) - A
ELSE
F = Sqr(A) - SIN(Pi * Sqr(A));
WriteLn('Значение функции F(x) при x = ', A:10:6, ' равно ', F:10:6);
END.
Где A:10:6 и F:10:6 это изменение формата числа
Слайд 37Написать программу которая показывает чётное число или нет, если оно меньше
10. В случае, если 9
Слайд 38Примеры:
Программы показывает чётное число или нет, если оно меньше 10. В
случае, если 9 case Operator of plus: X := X+Y;
minus: X := X-Y;
times: X := X*Y;
end;
case I of 0, 2, 4, 6, 8: Writeln('Четная цифра');
1, 3, 5, 7, 9: Writeln('Нечетная цифра');
10..100: Writeln('Между 10 и 100');
end;
Слайд 39 В старояпонском календаре был принят двенадцатилетний цикл. Годы внутри цикла носили
названия животных: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, петуха, собаки и свиньи. Написать программу, которая позволяет ввести номер года и печатает его название по старояпонскому календарю. Справка: 1996 г. — год крысы — начало очередного цикла.
Слайд 40Поскольку цикл является двенадцатилетним, поставим название года в соответствие остатку от
деления номера этого года на 12.
Слайд 41Program Goroskop;
Var Year : Integer;
Begin
Write('Введите год '); 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.
Слайд 42Пример программы, которая по введённому числу вида nn.nn.nnnn выводит название месяца
и год по китайскому календарю
program mesyac;
var a:longint;
var b,c:integer;
begin
writeln (‘введите число');
readln(a);
b:=(a div 10000)mod 100 ;
write (‘число ', a div 1000000);
case b of
1 : write (' январь');
2 : write (' февраль');
3 : write (' март');
4 : write (' апрель');
5 : write (' май');
6 : write (' июнь');
7 : write (' июль);
8 : write (' август');
9 : write (' сентябрь');
10 : write (' октябрь');
11 : write (' ноябрь');
12 : write (' декабрь');
end;
c:= (a mod 10000) mod 12;
case c of
0 : write (‘обезьяна ');
1 : write (' петух');
2 : write (' собака');
3 : write (' свинья');
4 : write (' крыса ');
5 : write (' бык');
6 : write (' тигр');
7 : write (' кролик');
8 : write (' дракон');
9 : write (' змея');
10 : write (' лошадь');
11 : write ( ‘овца ');
end;
end.
Слайд 43САМОСТОЯТЕЛЬНО!
Составить программу, которая по номеру месяца, введенного с клавиатуры, выводит количество
дней в нем. В программе учесть количество дней в феврале для високосного и не високосного годов.
Слайд 44Program first;
var n:integer;
begin
writeln('введите номер месяца');
readln(n);
case n of
1:writeln('январь');
2:writeln('Февраль');
3:writeln('март');
4:writeln('апрель');
5:writeln('май');
6:writeln('июнь');
7:writeln('июль');
8:writeln('август');
9:writeln('сентябрь');
10:writeln('октябрь');
11:writeln('ноябрь');
12:writeln('декабрь');
end;
case n of
1,3,5,7,8,10,12:writeln('31 день');
4,6,9,11:writeln('30 день');
2:write('в
невисокосном году 28, в високосном 29');
else writeln('нет такого месяца')
end;
end.
Слайд 45Теперь решим другим способом задачу решенную в самом начале
Условие: по введенному
8-мизначному числу определить является ли это датой (в формате дд.мм.гггг), если такой даты не существует сообщить на экран
Слайд 46var a,d,m,g,vis:integer;
BEGIN
read (a);
d:=a div 1000000;
m:=a mod 1000000;
g:=m mod 10000;
m:=m div 10000;
vis:=g
mod 4;
case vis of
0 : if ((m=2) and (d<30)) then writeln(d,'.',m,'.',g)
else writeln('error');
1..3: case m of
1,3,5,7,8,10,12: if d<32 then writeln(d,'.',m,'.',g)
else writeln('error');
4,6,9,11: if d<31 then writeln(d,'.',m,'.',g)
else writeln('error');
2: if d<29 then writeln(d,'.',m,'.',g)
else writeln('error');
else writeln('error');
end; end; END.
РЕШЕНИЕ
Слайд 47Эти задачи решите сами:
Дана точка (x;y) и круг радиуса R с
центром в точке (0;0). Определить, где находится точка: внутри, на границе, или за пределами круга.
Составить программу, которая по номеру месяца, введенного с клавиатуры, выводит количество дней в нем. В программе учесть количество дней в феврале для високосного и не високосного годов.
Даны два целых числа: D(день) и M(месяц),определяющую правильную дату.
Вывести знак Зодиака, соответствующий этой дате:"Водолей(20,1-18,2) "Рыбы"(19,2-20,3) "Овен"(21,3-19,4) "Телец" (20,4 - 20,5) "Близнецы" (21,5 -21,6) "Рак"(22,6-22,7 ) "Лев" (23,7-22,8) "Дева"(23,8-22,9) "весы" (23,9-22,10) "Скорпион"(23,10,-22,11) "стрелец"(23,11-21,12) "козерог"(22,12,-19,1).
По введенной дате выдать все данные разных гороскопов
Китайский,
Друидов
…