Предисловие дорогие друзья !
Вид материала | Документы |
- К. Бальмонт Дорогие друзья, сегодня мы в гостях у замечательного русского поэта Константина, 164.76kb.
- Медникова Надежда Александровна учитель начальных классов моу «Уинская сош» Пермский, 91.48kb.
- И в шутку и всерьез Ведущий Добрый день, дорогие друзья! Вот и пришла весна, вот, 339.91kb.
- Играют 2 команды. Вопросы викторины, 53.15kb.
- Летние каникулы в праге, 322.16kb.
- Мои дорогие литературные друзья, 136.81kb.
- Ведущий: Дорогие, друзья! Разрешите поздравить вас с большим и дорогим для всех праздником, 124.29kb.
- Отчет о конференции 17-18 апреля дорогие друзья!, 182.44kb.
- Дорогие друзья и единомышленники, 134.05kb.
- Сценарий для 7-8 классов «Старая сказка на новый лад», 52.44kb.
§18. Программирование алгоритмов с использованием условного оператора и оператора выбора.
Пример 29. В §13 мы рассмотрели работу нескольких программ с использованием оператора GOTO. Чтобы программа не зацикливалась, можно использовать условный оператор.
модифицируем программу Ех18.
Program Ex29;
Label 10;
Var x:integer;
c:Char;
k:Byte;
Begin
K:=1; {Начальное значение счётчика строк}
X:=1; {Начальное значение выводимого числа}
10: {Метка перехода}
Writeln(х); {Выводим число в отдельной строке}
Inc(х); {Увеличиваем число на 1}
Inc(k); {Увеличиваем счётчик строк на 1}
If k<23 Then GoTo 10 {Если экран ещё не заполнен, переходим на вывод числа}
Else {Иначе}
Begin {}
WriteLn(‘Продолжим? (Y/N):’); {Выдаём запрос о продолжении}
ReadLn(c); {Считываем ответ}
C:=Upcase(c); {Если введённая буква строчная, переведём её в прописную}
If c=’Y’ Then Begin k:=1; GoTo 10 End {Если есть желание продолжить, то устанавливаем счётчик строк равным 1, и переходим на вывод числа}
End;
ReadLn;
End.
Как только программа напечатает страницу чисел, на экране появится запрос:
Продолжим? (Y/N):
Если ввести с клавиатуры Y, то программа выведет следующую страницу чисел, иначе программа закончит работу. Таким образом мы избавились от зацикливания. Чаще всего оператор GOTO как раз и используется вместе с опрератором IF.
При решении задач 30-35 ввод и вывод данных осуществляется с помощью файлов.
Пример 30. Дано двузначное число. Определить, какая цифра в нём больше первая или вторая.
Решение. Исходным данным в задаче является целое число N. Чтобы найти первую цифру двузначного числа, нужно найти частное от деления этого числа на 10. А чтобы найти вторую цифру двузначного числа, нужно найти остаток от деления этого числа на 10. Обозначим их Р1 и Р2 соответственно.
Тогда Р1= N DIV 10, а P2=N MOD 10. Блок-схема и программа на языке Паскаль решения задачи могут быть представлены в виде:
| Program Ex30; Var N, P1, P2 : integer; F1, F2: text; Begin Assign(F1, ‘Input.txt’); Assign(F2, ‘Output.txt’); Reset(F1); Rewrite(f2); Readln(F1, N); Р1:= N DIV 10; P2:=N MOD 10; if P1 < P2 then Writeln(F2, P2,‘ — вторая цифра больше первой — ’, P1) else if P1 > P2 then Writeln(F2, P1,‘ — первая цифра больше второй — ’, P2) else Writeln(F2, P1,‘ — первая цифра равна второй — ’, P2); Close(F2); End. |
Пример 31. Найти a=b+c, если
Решение. Исходное данное нашей задачи — Х. Если Х меньше 0, то b=x, а с=х2. Если же Х больше или равно 0, то b=1, а с=х. Приведём условие задачи к следующему виду:
Если x<0, то а=х+х2, иначе а=1+х.
Блок-схема и программа на языке Паскаль решения задачи могут быть представлены в виде:
| Program Ex31; Var x, a, : real; F1, F2: text; Begin Assign(F1, ‘Input.txt’); Assign(F2, ‘Output.txt’); Reset(F1); Rewrite(f2); Readln(F1, x); if x < 0 then a:= x+sqr(x) else a:= 1+x; Writeln(F2, ‘a(x)=’, a); Close(F2); End. |
Пример 32. Даны вещественные числа x, y, z. Получить max(x,y,z)+min(x,y).
Решение. Исходными данными программы являются числа x, y и z. Под max(x,y,z) понимают нахождение максимального числа из x, y, z. Под min(x,y) понимают нахождение минимального числа из x, y.
Введём промежуточные величины max и min, для хранения максимального и минимального значения соответственно. Пусть результатом работы программы является переменная sum. Так как x, y, z — вещественные числа, то тип всех переменных — REAL.
Блок-схема решения задачи изображена на рисунке 21, а рядом приведена программа на языке Паскаль.
| Program Ex32; Var x, y, z, max, min, sum : real; F1, F2: text; Begin Assign(F1, ‘Input.txt’); Assign(F2, ‘Output.txt’); Reset(F1); Rewrite(f2); Readln(x, y, z); if x < y then begin max := y; min := x end else begin max := x; min := y end; if max < z then max := z; {Проверяем третье число} sum := max + min; {Вычисляем результат} Writeln(F2, ‘max(x,y,z)+min(x,y)=’, sum); {Выводим результат} Close(F2); End. |
Пример 33. Даны действительные числа a, b. Найти решение неравенства ax>b.
Решение. Из курса математики известно, что:
х>b/a, если a>0,
х
х — любое число, если а = 0 и b<0,
нет решения, если а = 0 и b≥0.
Исходные данные задачи — a, b. Результат — х. Программа решения задачи может иметь вид:
Program Ex33;
Var
a, b, х : real;
F1, F2: text;
Begin
Assign(F1, ‘Input.txt’);
Assign(F2, ‘Output.txt’);
Reset(F1); Rewrite(f2);
Readln(F1, a, b);
if a <> 0 then {Если а не ноль, то}
begin х := b/a; {вычисляем х}
if a > 0 then Writeln(F2, ‘x>’, х:5:2) {и выдаём результат для а>0,}
else Writeln(F2, ‘x<’, х:5:2); {или для а < 0}
end
else {Если же а=0, то сообщаем,}
if b < 0 then Writeln(F2, ‘x – любое число’) {если b<0, }
else Writeln(F2, ‘Решения нет!’); {если b>0}
Close(F2);
End.
Пример 34. Дано значение символьной переменной i. С помощью оператора case вычислить значение Z при следующем условии:
Решение задачи очевидно — оно приведено на рисунке 22. I — исходное данное. Z — результат.
| Program Ex34; Var Z : byte; i : char; F1, F2: text; Begin Assign(F1, ‘Input.txt’); Assign(F2, ‘Output.txt’); Reset(F1); Rewrite(f2); Read(F1, i); case i of {В зависимости от значения I} ‘a’ : Z := 1; {выбираем} ‘b’ : Z := 2 {нужный} else Z := 3 {вариант} end; Writeln(F2, ‘Z=’, Z); Close(F2); End. |
Пример 35. В киоске продается газета стоимостью 250 руб. и журнал стоимостью 900 руб. Составить программу, которая спрашивает о желании покупателя (журнал или газета?), принимает деньги (сумма денег вводится с клавиатуры) и выдает на экран причитающуюся сдачу.
Решение. Исходными данными задачи являются: желание покупателя купить нужное ему издание (для простоты обработки ответа определим, что 1 — это желание купить журнал, а 2 — газету); сумма уплаченных денег. Пусть величина N целого типа, определяет желание покупателя, а S — сумму денег.
В зависимости от значения N возможны три варианта:
1) покупатель желает купить журнал;
2) покупатель желает купить газету;
3) N задано неверно.
В первых двух случаях необходимо проверить хватает ли у покупателя денег, и выдать либо величину здачи, либо сообщение об ошибке. В третьем случае необходимо выдать сообщение об ошибке.
Воспользуемся при решении задачи и оператором CASE и оператором IF. Программа решения задачи может иметь вид:
Program Ex35;
Var
N, S : Integer;
Begin
Write(‘Введите через пробел, что желаете купить (1 — журнал, 2 — газету) и сумму’);
Readln(N, S);
case N of {В зависимости от значения N}
1 : if S>=900 then writeln(‘Возьмите сдачу: ’, S-900) {выбираем}
else writeln(‘К сожалению, у вас не хватает денег на журнал.’);
2 : if S>=250 then writeln(‘Возьмите сдачу: ’, S-250) {нужный}
else writeln(‘К сожалению, у вас не хватает денег даже на газету.’);
else writeln(‘К сожалению, вы неверно назвали издание.’); {вариант}
end;
Readln;
End.
Пример 36. Написать программу "Угадай число". Компьютер "загадывает" число, а пользователь его отгадывает, вводя ответы с клавиатуры.
Решение. В приведённом ниже решении этой задачи повторения организованы с помощью оператора GOTO. Задуманное число определяется с помощью генератора случайных чисел. Генератор случайных чисел – это стандартная функция. Для включения генератора случайных чисел необходимо выдать команду RANDOMIZE без параметров. А затем переменной А присвоить значение функции: А:=RANDOM; или А:=RANDOM(Х), где Х – целое число. В первом случае переменной А будет присвоено вещественное значение, выбранное случайным образом, из диапазона 0≤А<1. Во втором случае, опять же случайным образом, будет присвоено целое значение из диапазона 0≤А<Х. Так как мы работаем с целыми числами, то нам подходит второй вариант. Попробуйте усовершенствовать программу таким образом, чтобы компьютер не заканчивал работу после того, как число угадано, а спрашивал, хотите ли вы повторить игру. В случае положительного ответа игра начинается с начала (с новым числом), при отрицательном ответе — выход из программы.
| Program Ex36; Label 10; {Описываем метку перехода} Var a,x:integer; {а — загаданное число, х — вводимое с клавиатуры} Begin Randomize; {Включаем генератор случайных чисел} Writeln('Отгадай, какое число задумано!'); A:=Random(100);{«Загадываем» число из первой сотни} 10: Write('Введи число: '); Readln(х); {Вводим число с клавиатуры} If х>а Then {Если введённое число больше задуманного} Begin Writeln('Число слишком велико!'); {Выдаём сообщение} Goto 10; End;{и переходим на повторную попытку} If х<а Then {Если введённое число меньше задуманного} Begin Writeln('Число слишком мало!'); {Выдаём сообщение} Goto 10; End;{и переходим на повторную попытку} Writeln('Браво! Молодец!');{Угадали число - поздравляем} Readln; End. |
Задания для самостоятельной работы.
- Дано отверстие шириной а см и длиной b см и кирпич со сторонами x см, y см, z см. Пройдёт ли кирпич в отверстие?
- Произвольно выбраны три числа: а, b, с. Существует ли треугольник, длины сторон которого равны этим числам.
- Ñîñòàâüòå ïðîãðàììó íàõîæäåíèÿ ïðîèçâåäåíèÿ äâóõ íàèáîëüøèõ èç òðåõ ââåäåííûõ ñ êëàâèàòóðû ÷èñåë.
- Íàéòè êîëè÷åñòâî ïîëîæèòåëüíûõ (îòðèöàòåëüíûõ) ÷èñåë ñðåäè ÷åòûðåõ öåëûõ ÷èñåë A, B, C è D.
- ×åìó ðàâíû çíà÷åíèÿ ïåðåìåííûõ a è b ïîñëå âûïîëíåíèÿ ïîñëåäîâàòåëüíîñòè äåéñòâèé:
a) a:=15 div (16 mod 7); b:=34 mod a*5-29 mod 5*2;
b) a:=4*5 div 3 mod 2; b:=4*5 div (3 mod 2);
c) a:=a*b;b:=b*b;
- Ñîñòàâüòå ïðîãðàììó, êîòîðàÿ îïðåäåëÿåò âèä òðåóãîëüíèêà ïî äëèíàì åãî ñòîðîí (åñëè äàííûå äëèíû ïîçâîëÿþò ïîñòðîèòü òðåóãîëüíèê).
- Ñîñòàâüòå ïðîãðàììó, êîòîðàÿ óìåíüøàåò ïåðâîå ââåäåííîå ÷èñëî â ïÿòü ðàç, åñëè îíî áîëüøå âòîðîãî ââåäåííîãî ÷èñëà ïî àáñîëþòíîé âåëè÷èíå.
- Ñîñòàâüòå ïðîãðàììó äëÿ âû÷èñëåíèÿ âûðàæåíèÿ
a) max(x+y+z,xyz)+3;
b) min(x2+y2,y2+z2).
- Ñîñòàâüòå ïðîãðàììó, â êîòîðîé èç òðåõ ââåäåííûõ ñ êëàâèàòóðû ÷èñåë âîçâîäÿòñÿ â êâàäðàò ïîëîæèòåëüíûå, à îòðèöàòåëüíûå îñòàþòñÿ áåç èçìåíåíèÿ.
10. Компьютер спрашивает: "Что сегодня нужно всем?" и если получает ответ «ЭВМ», то пишет "Ну, конечно ЭВМ!", иначе "Это тоже нужно всем, но нужнее ЭВМ!"
11. Написать программу, по которой компьютер приветствовал бы только своего хозяина, а при попытке ввести какое-либо другое имя спрашивал бы: "А где (например) Вася?"
12. Написать программу, определяющую, есть ли во введенном числе дробная часть.
13. Запросить стороны треугольника и определить, является ли он разносторонним, равнобедренным или равносторонним.
14. Составьте программу для вычисления выражения
а) max (x+y+z,xyz)+3;
b) min (x2+y2,y2+z2)-4.
15. Найти минимальное из трёх чисел.
16. Предложите пользователю ввести число с клавиатуры. Если число равно нулю, то выведите слово “ноль”; если число положительное, выведите слово “положительное”; если число отрицательное, выведите слово “отрицательное”.
17. Напечатать программу вывода дней недели по номеру.
18. Модифицируйте программу "Угадай число" так, чтобы программа запрашивала у вас повторить игру или нет. И в случае, если вы ответите «Y» («да»), программа повторяла игру, а если «N» («нет»), то заканчивала работу.
19. Составьте программу для упорядочения трёх чисел a, b, c по возрастанию таким образом, чтобы имени а соответствовало наименьшее число, имени b - среднее, имени с - наибольшее.
20. Запрограммируйте шуточный тест "Проверь свои возможности". Пользователю предлагается ответить на 7 вопросов:
1) Профессор лёг спать в 8 часов, а встал в 9 часов. Сколько часов проспал профессор? (1)
2) На двух руках 10 пальцев. Сколько пальцев на 10?(50)
3) Сколько цифр в дюжине?(2)
4) Сколько нужно сделать запилов, чтобы распилить бревно на 12 частей? (11)
5) Врач сделал три укола в интервале 30 минут. Сколько времени он затратил? (30)
6) Сколько цифр 9 в интервале 1 100? (1)
7) У пастуха было 30 овец. Все кроме одной разбежались. Сколько овец осталось? (1)
Оценка ответов пользователя:
- если 7 правильных, то печатается "Гений";
- если 6 правильных, то печатается "Эрудит";
- если 5 правильных, то печатается "Нормальный";
- если 4 правильных, то печатается "Способности средние";
- если 3 правильных, то печатается "Способности ниже среднего";
- если <2 правильных, то печатается "Вам надо отдохнуть!".
21. Составить программу, которая запрашивает пароль и выводит сообщение правильно ли он введен.
22. Даны действительные положительные числа a, b, c, d. Выяснить, можно ли прямоугольник со сторонами a и b уместить внутри прямоугольника со сторонами c и d так, чтобы каждая из сторон одного прямоугольника была
а) параллельна каждой стороне второго прямоугольника;
б) перпендикулярна каждой стороне второго прямоугольника.
23. Работа светофора для водителей запрограммирована следующим образом: в начале каждого часа в течение трёх минут горит зелёный сигнал, затем в течение одной минуты — жёлтый, в течение двух минут — красный, в течение трёх минут — опять зелёный и т.д. Дано вещественное число t, означающее время в минутах, прошедшее с начала очередного часа. Определить, сигнал какого цвета горит для водителей в этот момент.
Для любознательных
Известно, что астрологи делят год на 12 периодов и каждому из них ставят в соответствие один из знаков Зодиака:
20.01 - 18.02 Водолей 23.07 - 22.08 Лев
19.02 - 20.03 Рыба 23.08 - 22.09 Дева
21.03 - 19.04 Овен 23.09 - 22.10 Весы
20.04 - 20.05 Телец 23.10 - 22.11 Скорпион
21.05 - 21.06 Близнецы 23.11 - 21.12 Стрелец
22.06 - 22.07 Рак 22.12 - 19.01 Козерог
Напишите программу, которая вводит дату (день и месяц) и определяет соответствующий знак Зодиака.
2>23>