Предисловие дорогие друзья !

Вид материалаДокументы

Содержание


§18. Программирование алгоритмов с использованием условного оператора и оператора выбора.
Program Ex29; Label
Program Ex30; Var
Program Ex31; Var
Program Ex32; Var
Program Ex33; Var
End. Пример 34.
Program Ex34; Var
Program Ex35; Var
End. Пример 36.
Program Ex36; Label
End;{и переходим на повторную попытку} If
Оценка ответов пользователя
Подобный материал:
1   ...   7   8   9   10   11   12   13   14   ...   29

§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.

Задания для самостоятельной работы.
  1. Дано отверстие шириной а см и длиной b см и кирпич со сторонами x см, y см, z см. Пройдёт ли кирпич в отверстие?
  2. Произвольно выбраны три числа: а, b, с. Существует ли треугольник, длины сторон которого равны этим числам.
  3. Ñîñòàâüòå ïðîãðàììó íàõîæäåíèÿ ïðîèçâåäåíèÿ äâóõ íàèáîëü­øèõ èç òðåõ ââåäåííûõ ñ êëàâèàòóðû ÷èñåë.
  4. Íàéòè êîëè÷åñòâî ïîëîæèòåëüíûõ (îòðèöàòåëüíûõ) ÷èñåë ñðåäè ÷åòûðåõ öåëûõ ÷èñåë A, B, C è D.
  5. ×åìó ðàâíû çíà÷åíèÿ ïåðåìåííûõ 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;
  1. Ñîñòàâüòå ïðîãðàììó, êîòîðàÿ îïðåäåëÿåò âèä òðåóãîëüíèêà ïî äëèíàì åãî ñòîðîí (åñëè äàííûå äëèíû ïîçâîëÿþò ïîñòðîèòü òðåó­ãîëüíèê).
  2. Ñîñòàâüòå ïðîãðàììó, êîòîðàÿ óìåíüøàåò ïåðâîå ââåäåííîå ÷èñëî â ïÿòü ðàç, åñëè îíî áîëüøå âòîðîãî ââåäåííîãî ÷èñëà ïî àá­ñîëþòíîé âåëè÷èíå.
  3. Ñîñòàâüòå ïðîãðàììó äëÿ âû÷èñëåíèÿ âûðàæåíèÿ

a) max(x+y+z,xyz)+3;

b) min(x2+y2,y2+z2).
  1. Ñîñòàâüòå ïðîãðàììó, â êîòîðîé èç òðåõ ââåäåííûõ ñ êëàâèà­òóðû ÷èñåë âîçâîäÿòñÿ â êâàäðàò ïîëîæèòåëüíûå, à îòðèöàòåëüíûå îñ­òàþòñÿ áåç èçìåíåíèÿ.

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 Козерог

Напишите программу, которая вводит дату (день и месяц) и определяет соответствующий знак Зодиака.