Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
80
В языке Паскаль выделяются два класса операторов: простые и управляющие (структурные). Простой оператор не содержит в своей записи других операторов, а его выполнение не связано с анализом некоторых условий (программа выполняется последовательно: от первого оператора ко второму, от второго к третьему и т.д.). Структурный оператор содержит в своем составе другие операторы, порядок выполнения которых определяется некоторыми условиями. К первому классу относятся оператор присваивания и операторы обращения к процедурам. К управляющим операторам относятся условный оператор (оператор ветвления), операторы выбора, цикла (if, case, while, for). Несколько операторов с помощью операторных скобок Begin и End объединяются в составной оператор.
С помощью простых операторов можно реализовать линейные алгоритмы, условного оператора и оператора выбора разветвляющиеся алгоритмы, операторов цикла циклические алгоритмы.
Настоящий раздел посвящен изучению управляющих конструкций языка программирования Паскаль.
Довольно часто на поставленный вопрос Вы получаете ответ «да» или «нет». Величины, которые могут принимать одно из двух значений «истина» (TRUE) или «ложь» (FALSE), называют логическими. Им соответствует логический тип данных, который в Паскале описывается как Boolean. Значение логического типа занимает в памяти 1 байт: FALSE 0, TRUE 1.
Найдите ответ на вопрос, с чем связано название логического типа Boolean.
Допустимые операции для логического типа данных: операции сравнения (отношения) и логические операции.
Арифметические выражения можно сравнивать между собой с помощью операций сравнения. Эти операции известны Вам из курса математики. В Паскале им соответствуют операции сравнения: = (равно), <> (не равно), > (больше), >= (больше или равно, то есть, не меньше), < (меньше), <= (не больше).
С помощью операций сравнения можно построить выражения сравнения, например, х=5; a>b; a*x+3<=0; 7-x<>5*c; a>=b*c; omega < pi/2; 4=3.
Эти выражения можно присваивать логическим переменным или использовать в условных операторах.
Пример 1. Пусть имеется описание Var Q, W, E : Boolean ; R : Real ; Тогда возможны присваивания: R:=3; Q:=R<7; W:=True; E:=False; В результате выполнения операторов переменные Q, W, E получат соответственно значения True (так как выражение 3<7 истинно), True, False.
Пример 2 (использование операций сравнения). Программа проверки утверждения: верно ли, что A>B (числовые значения величин A и B вводятся с клавиатуры):
Протокол работы программы:
A=5
В=3
True
A=0
В=4.8
False
A=10
В=10
False
Program TRU_FA1;
Var A, B: Real ;
Z : Boolean ;
Begin
Write ('A=') ;
Readln (A) ;
Write ('В=') ;
Readln (В) ;
Z :=A>B ;
Writeln (Z) ;
End.
После запуска программы введем числа 5 (оно будет передано переменной A) и 3 (передается переменной B). Результат работы программы: True (действительно, 5>3 истинное неравенство).
Пример 3. Программа проверки: правильно ли пользователь даст ответ на вопрос: «Когда был основан город Минск?».
Program TRU_FA2 ;
Var G : Integer ;
Z : Boolean ;
Begin
Writeln ('Когда был основан город Минск? ') ;
Readln (G) ;
Z :=G=1065 ;
Writeln (Z) ;
End.
Выражение называется логическим, если результатом его вычисления является логическое значение: TRUE или FALSE.
Логические выражения строятся с помощью допустимых операндов и логических операций AND (И), OR (ИЛИ), NOT (НЕ). Примеры логических выражений: (a>b) and (a>c); (Х<=1) or (Y>5) and (a>2); (4*Х-1>0) and (Х+2<3); not (a=b). Операции сравнения имеют низший приоритет по сравнению с другими операциями, поэтому отношения в логических выражениях заключают в скобки.
Ниже записаны логические операции от высшего приоритета к низшему (операции высшего приоритета выполняются в первую очередь):
Операция |
Действие |
NOT |
Отрицание или логическое НЕ |
AND |
Логическое умножение или логическое И |
OR |
Логическое сложение или логическое ИЛИ |
Результаты выполнения логических операций (T истина, F ложь):
X |
Y |
Логическая операция |
||
NOT X |
X AND Y |
X OR Y |
||
T |
T |
F |
T |
T |
T |
F |
F |
F |
T |
F |
T |
T |
F |
T |
F |
F |
T |
F |
F |
Приведем порядок вычисления значения логического выражения
(4*Х-1>0) and (Х+2<3): вычисляется значение выражения 4*Х-1, затем оно сравнивается с числом 0 и определяется истинность условия 4*Х-1>0; аналогично для логического выражения Х+2<3; затем вычисляется значение всего выражения в зависимости от значений каждого выражения:
Х |
4*Х-1>0 |
X+2<3 |
(4*X-1>0) and (x+2<3) |
5 |
19>0 True |
7<3 False |
True and False False |
0.5 |
1>0 True |
2.5<3 True |
True and True True |
Будьте внимательны: для проверки принадлежности значения X числовому промежутку [-3 ; 10) на Паскале следует записать такое выражение: (Х >= -3) and (X < 10).
Пример 4 (использование логических выражений). Проверим справедливость утверждения: верно ли, что человек, возраст которого x задан, является школьником. Задача сводится к проверке условия: 6 ≤ х ≤19.
Program LOGIST ;
Var x : Byte ;
L, P, Z : Boolean ;
Begin
Write ('Возраст=') ;
Readln (x) ;
Z := (x>=6) and (x<=19) ;
L := x>=6 ;
P := x<=19 ;
Z := L and P ;
Протокол работы программы:
х=34
False
x=15
True
Writeln (Z) ;
End.
1. Определите порядок вычисления значений выражений и найдите их результаты:
1) 3 + sqr (2) <10 2) abs (a-b) <= abs (a) + abs (b)
3) sqr (sin (x)) + sqr (cos (x)) > 1.5 4) sqrt (x*x+y*y)=2
2. Определите, справедливы ли следующие условия (если да, то при каких значениях х):
1) round (x) = trunc (x) 2) trunc (x) ≥ x 3) х div 5 = x mod 5
4) 15 div x = 15 mod x * 5) х div 5 = 7 * 6) 55 div x = 7
3. Определите порядок вычисления значений логических выражений:
1) (a*X+5>X1) and (-2*X-1<X2) 2) ((a+3)*x<=2.5) or (x<>y)
* 4. Определите, что будет выведено на экран компьютера, если a=true, b=false, c=true:
1) c:=a and b and c ; Writeln (c) ; 2) c:=a or b or c; Writeln (c) ;
3) c:=a and b or c ; Writeln (c) ; 4) c:=a and (b or c) ; Writeln (c);
5) c:=(a and b) or c; Writeln (c) ; 6) c:=a and b or not c ; Writeln (c) ;
5. Определите тип выражения:
1) 4+(x+y)*z+sqrt(x*x+y) 2) 6 < C+B*A 3) 89Е-3*Н/5 = 12
4) X=2 5) sqr (sin (pi/3)) 6) frac(cos(x) + sin(x))
6. Запишите следующие выражения средствами языка программирования Паскаль:
1) a < 1 2) 3) 4) 0 < a < 1
5) 0,1 ≤ X-a ≤ 0,9 6) X [-5; 0) (2; 10) * 7)
7. Запишите следующие высказывания в виде логических выражений:
1) температура воздуха находится в диапазоне [22; 30] градусов Цельсия;
2) среднемесячный доход Вашей семьи составляет …;
3) суммарная стоимость покупки (карандаша и пенала) не превышает 7000 р.;
* 4) значения длин сторон прямоугольника не превышают соответственно 10 и 17.
8. Напишите программы решения задач: проверить утверждение:
1) запрошенный с клавиатуры год относится к XXI веку;
* 2) введенное число является решением неравенства x2 -4>0;
3) Федор может купить на заданную денежную сумму нужное количество тетрадей (стоимость тетради, их количество и имеющаяся сумма вводятся с клавиатуры);
4) текстовый файл поместится на дискету 3,5 дюйма (такая дискета вмещает 1,44 Мбайт), если известно, что в файл записывают рукопись, объем которой (в страницах) вводится с клавиатуры; каждая страница рукописи содержит 56 строк по 80 символов в каждой;
5) сумма цифр заданного двузначного натурального числа является четным числом;
* 6) каждая цифра заданного двузначного натурального числа четная;
* 7) поля шахматной доски (a1, b1) и (a2, b2) одинакового цвета, где поле (a, b) задается номером строки и столбца.
* 9. Напишите программу для определения:
1) можно ли образовать треугольник с длинами сторон, равными заданным трем действительным числам;
2) корректности входных данных к задаче 1 (п. 9.1).
3) принадлежности точки (x, y) заданной области:
3
-4
y -3 3 x a) |
2
-4
y x -3 3 б) |
y
2
-4
-3 3 x в) |
Если в процессе вычислительной работы появляется более одного направления хода дальнейших вычислений, такой процесс уже не является линейным: в зависимости от выполнения некоторого условия производятся различные варианты расчета. Ветвление в Паскале реализуется с помощью условного оператора IF, который позволяет выбрать для выполнения один из предлагаемых вариантов вычислений или не выбрать ни одного.
При решении задач в системе ИнтАл Вы использовали две формы записи команды ветвления: сокращенную и полную. Аналогично обстоит дело в Паскале:
Неполная команда ветвления |
Полная команда ветвления |
IF P THEN S ; |
IF P THEN S1 ELSE S2 ; |
Да Нет S P |
P S1 S2 Да Нет |
Да IF P THEN S ; Нет Да IF P THEN S1 ELSE S2 ;
Нет Рис.3.4.
|
Здесь P условие разветвления (логическое выражение или выражение отношения), S, S1, S2 выполняемые операторы.
* Условие Р бывает простым (если оно содержит единственное выражение сравнения) и составным (если оно составлено из нескольких выражений сравнения, соединенных логическими операциями). В составных условиях выражения сравнения заключаются в круглые скобки. Примеры простых выражений: a>b, 5+x=3, sqrt (x)<=25. Примеры сложных выражений:
(x+y=5) and (2*x*sin(x)<5.5)
(x<y) or not (y<z)
Порядок выполнения операторов приводится на рис. 3.4. Так, в неполной конструкции, если условие Р истинно, выполняется оператор S, а затем оператор, следующий за оператором if.
Если по одной из ветвей после служебных слов THEN и(ли) ELSE требуется выполнение более одного оператора, их ограничивают операторными скобками BEGIN … END и рассматривают как составной оператор.
Примеры:
Запись на ИнтАле |
Запись на Паскале |
Если a>b То x:=a Иначе x:=b Конец_Если |
IF a>b THEN x:=a ELSE x:=b ; |
Если a>b То x:=a k:=1 Иначе x:=b k:=2 Конец_Если |
IF a>b THEN BEGIN x:=a ; k:=1 END ELSE BEGIN x:=b ; k:=2 END ; |
Если a>b То Если a>c То x:=a Конец_Если Конец_Если |
IF a>b THEN IF a>c THEN x:=a ; |
* IF (a>b) and (a>c) THEN x:=a ; |
Примеры решения задач:
Пример 1. Моделирование работы пожарного датчика в помещении: программа должна выводить сообщение «Пожароопасная ситуация», если температура в комнате превысит 60° C; если температура не более 60° C, датчик «молчит». |
Program OGON; Var T: Real; Begin Write ('T='); Readln (T); If T>60 then Writeln ('Пожароопасная ситуация') End. |
|
Пример 2. Реализуем на Паскале полностью алгоритм решения задачи 1 (§ 9): «Определить, на какой высоте и на каком расстоянии от места броска окажется через время t (с) мяч, брошенный под углом α к горизонту с начальной скоростью υ0 (м/с)» (с учетом проверки корректности исходных данных). Напомним, что математическая постановка задачи и описание алгоритма ее решения приводятся в § 9, линейная часть алгоритма реализована на Паскале в § 15. Будем использовать неполную команду ветвления: если требуемые условия не выполняются, программа не совершает никаких действий. Можно предусмотреть вывод сообщения о некорректных данных: If (alfa>0) and (…) … then Begin … End Else Writeln ('Некорректные данные'); |
Program BROSOK ; Const g = 9.8 ; Var V0, t, alfa, x, y : Real ; Begin Write ('введите скорость ') ; Readln (V0) ; Write ('введите время ') ; Readln (t) ; Write ('введите угол ') ; Readln (alfa) ; alfa:=alfa*pi/180; If (alfa>0) and (alfa<=pi/2) and (V0>0) and (V0<=20) and (t>0) Then Begin x:=V0*cos(alfa)*t ; y:=V0*sin(alfa)*t-g*t*t/2 ; Writeln ('x=',x) ; Writeln (' y=',y) End ; End . |
|
Пример 3. Требуется определить, является ли человек, возраст которого x задан, школьником. Задача сводится к проверке условия: 6 ≤ х ≤19 (сравните с решением примера 4 п. 19.1) |
Program School_1; Var X : Byte ; Begin Write ('Возраст='); Readln (X) ; If X>=6 then if X<=19 then Writeln ('школьник') End . |
Program School_2; Var X : Byte ; Begin Write ('Возраст='); Readln (X) ; If (X>=6) and (X<=19) then Writeln ('школьник') End . |
* Пример 4. Требуется написать программу для решения неравенства ax > b (a, b действительные числа).
Возможны следующие варианты ответа: 1) x>b/a (при a > 0); 2) x<b/a (при a < 0); 3) нет решений (при a = 0, b ≥ 0); 4) x любое число (при a=0, b<0). Program Neravenstvo ; Var a, b : Real ; Begin Write ('a=') ; Readln (a) ; Write ('b=') ; Readln (b) ; If a>0 Then Writeln ('x>',b/a) Else If a<0 Then Writeln ('x<',b/a) Else If b>=0 Then Writeln ('нет решений') Else Writeln ('x-любое число') End .
If a >0 Then Writeln ('x>',b/a) ; If a <0 Then Writeln ('x<',b/a) ; If a=0 then If b>=0 Then Writeln ('нет решений') Else Writeln ('x-любое число') |
Да Нет a > 0 Начало Ввод a, b Вывод x>b/a a < 0 Да Вывод x<b/a Да Вывод “нет решений” b ≥ 0 Нет Нет Вывод “x любое число” решений” Конец |
* В случае вложенных ветвлений каждое новое ключевое слово Else следует считать относящимся к ближайшему неиспользованному If. Например,
If x>-5 Then If x<=6 Then y:=x*x Else y:=x*x*x Else y:=x ; |
Этот фрагмент позволяет вычислить значение y по формуле: |
1. Какие значения могут принимать переменные типа Boolean?
2. Какие операции сравнения и логические операции допустимы в языке Паскаль?
3. Что может быть операндом выражений сравнения? логических выражений?
4. Что такое «условный оператор» и когда он применяется?
5. Что может использоваться в качестве условия в условном операторе?
1. Определите, какие значения будут принимать переменные Х и Y после выполнения следующих операторов при:
1) A=5, B=3; 2) A=7, B=7; 3) A=-3, B=-10; 4) A=3, B=0; 5) A=5, B=2:
а) if A=B then X := A+1; Y:=B+1 ; |
б) if A>B then X:=B+1 else Y:=A+1; X:=0; |
в) if A=B then Begin X := A+1 ; Y := B+1 End ; |
г) if A>B then Y:=A-1 else Begin X:=B-2; Y:=0 End ; |
* д) if (A>B) and (A*B>0) then Begin X:=SQRT (A*B); Y:=100 End Else Begin X:=B-A; Y:=A*B End ; |
2. Определите, какие значения будут иметь переменные a и b после выполнения условного оператора if a>=b then a:=b else b:=a;
если: 1) a=0.9; b=0.7; 2) a=-7.3; b=7.3; 3) b=17; a=17; 4) a=5; b=5;
* 3. Определите, какие из следующих операторов задают вычисления по формуле:
a) if x>=-1 then y:=0 else if x<1 then y:=x+1 else y:=2;
б) if x<-1 then y:=0 else if x>=-1 then y:=2 else y:=x+1;
в) if x>=1 then y:=2 else if x<=-1 then y:=0 else y:=x+1.
4. Напишите программы решения задач:
1) Найти лучший результат в забеге на 100 м трех спортсменов.
2) Участники забега на 100 м имеют номера 1, 2, 3. Найти номер победителя, если результаты забега известны.
3) Определить длительность звучания музыкальной композиции, если известно время начала и окончания звучания. На экран компьютера требуется вывести только значения времени (часов, минут, секунд), отличные от нуля (например, если время начала 16 ч 57 м 30 с, а время окончания 17 ч 14 м 30 с, то длительность звучания составит 17 м ).
4) Определить по номеру года, является ли он високосным (год високосный, если его номер делится на 4, кроме тех, которые делятся на 100 и не делятся на 400). Например, 1900 год не високосный, 2000 год високосный.
5) Для старшеклассника определены нормальные значения границ кровяного давления: верхняя не более 100, нижняя не менее 60 и разница верхней и нижней границ не менее 30. Определить, является ли давление старшеклассника нормальным, если заданы значения нижней и верхней границ кровяного давления.
* 6) Используя метод Ленуара, определить название дня недели для некоторой даты, которая задается номерами года (g), месяца (m), дня (d):
вначале следует вычислить значение С = [365,25g] + [30,56m] + d +N, где N=1, если месяц январь или февраль високосного года, N=2, если месяц январь или февраль невисокосного года, N=0 для остальных месяцев;
затем нужно найти остаток от деления С на 7; если он равен 0, то в качестве ответа выведите «среда», 1 «четверг», …, 6 «вторник».
* 7) В финале конкурса «Лучший по профессии» приняли участие два конкурсанта: Петров и Сидоров. Финал предусматривает проведение трех конкурсов, по каждому из которых выставляется число баллов каждому участнику. Победитель должен быть определен по сумме баллов. С клавиатуры вводятся количество баллов, которое набрал каждый участник в каждом конкурсе. Требуется вывести наибольшую сумму баллов и фамилию победителя.
8) Найти решение уравнения ax=b.
9) Решить квадратное уравнение ax2 +bx + c =0 (а ≠ 0).
* 10) Решить уравнение ax2 +bx + c =0.
11) Заданы три действительных числа. Выяснить, могут ли они оказаться длинами сторон некоторого треугольника.
* 12) Получить решение системы уравнений:
* 13) На экскурсию в крепость-герой Брест отправляется N человек. Для их перевозки выделены автобусы вместимостью K и M человек. Определить, сколько необходимо автобусов для перевозки всех экскурсантов (не забудьте, что одно место в каждом автобусе занято гидом). Попытайтесь определить вариант с минимальным количеством автобусов.
* 14) При исследовании поверхности планеты Зета обнаружена популяция, развитие которой с момента ее возникновения подчиняется закону, описываемому следующим образом:
где k = 1, 2, 3, … (аi численность популяции в i-м году). По заданному номеру n года найти численное значение популяции.
Оператор CASE представляет собой частный случай структуры ВЕТВЛЕНИЕ, когда возникает необходимость выбора одного из нескольких возможных вариантов вычислений в зависимости от значений некоторого выражения (ключа, селектора).
Порядок выполнения оператора Case следующий: вычисляется значение выражения K; полученное значение сравнивается с K1, K2, …, KN; если оно совпадает с одним из этих значений, то управление передается соответствующему оператору и выполнение оператора CASE завершается. Если значение выражения K не совпадает ни с одним из возможных значений, далее все зависит от типа оператора CASE: если он полный (в нем присутствует служебное слово ELSE), то управление передается команде S; в противном случае выполнение оператора завершается.
Конструкция |
ИнтАл |
Паскаль |
К=K1 S1 К=K2 К=KN S2 SN S Да Да Да Нет Нет Нет Нет . . . . . . . . . |
Выбрать_По K K1: S1 K2: S2 . . . KN: SN Иначе S Конец_Выбора K переменная целого типа; K1, K2, …, KN возможные значения переменной К; S1, S2, …, SN, S выполняемые команды |
CASE K OF K1 : S1 ; K2 : S2 ; . . . KN : SN ELSE S END ; K выражение, определяющее значение ключа; K1, K2, …, KN возможные значения ключа; S1, S2, …, SN, S выполняемые операторы (простые или составные) |
Вариант записи, полученный после зачеркивания блока и строк в приведенных выше схемах, соответствует оператору выбора (или, как его еще называют, оператору варианта) в неполной (сокращенной) форме.
Селектор K представляет собой выражение порядкового типа. К порядковому типу относятся целочисленные типы, логический тип и символьный, с которым Вы познакомитесь в разделе 4.
В Паскале допускается использование нескольких возможных значений ключей, разделенных запятой (перечисление значений) или двумя точками “..” (диапазон значений).
Var I : Integer ;
…
If I=1 then A := X + Y ;
If I=2 then A :=X-Y ;
If (I>=3) and (I<=5) then A :=X*Y ;
If (I>5) and (I <8) then A :=X/Y ;
Case I of
1 : A := X+Y ;
2 : A := X-Y ;
3..5 : A :=X*Y ;
6, 7 : A :=X/Y
End ;
Пример 1. По номеру дня недели требуется определить его название.
Program Day ;
Var Num : Byte ;
Begin
Writeln ('Введите номер дня недели') ;
If Num = 1 then Writeln
('Понедельник')
Else if Num=2 then Writeln ('Вторник')
Else if Num=3 then Writeln ('Среда')
Else if Num=4 then
Writeln ('Четверг')
Else if Num=5 then
Writeln ('Пятница')
Else if Num=6 then
Writeln ('Суббота')
Else if Num=7 then
Writeln ('Воскресенье')
Else Writeln ('Это не номер дня …') ;
Readln (Num);
Case Num of
1: Writeln ('Понедельник') ;
2: Writeln ('Вторник') ;
3: Writeln ('Среда') ;
4: Writeln ('Четверг') ;
5: Writeln ('Пятница') ;
6: Writeln ('Суббота') ;
7: Writeln ('Воскресенье')
Else
Writeln ('Это не номер дня недели')
End;
End.
Пример 2. Составить программу, которая для заданных номеров месяца и года позволит определить количество дней в этом месяце.
Дано: month, year номера месяца и года.
Найти: kol_days количество дней в этом месяце.
Связь:
year високосный, если year делится без остатка на 4, кроме тех, которые делятся на 100 и не делятся на 400. Например, 1900 год не високосный, 2000 год високосный.
Будем считать, что данные корректны.
Program Days ;
Var Year : Integer ;
month, kol_days : Byte ;
Sto : Boolean;
Begin
Write ('Введите номер месяца ') ;
Readln (month) ;
Case month of
1, 3, 5, 7, 8, 10, 12 : kol_days := 31 ;
4, 6, 9, 11 : kol_days := 30 ;
2 : Begin {февраль}
Write ('Введите номер года ') ;
Readln (Year) ;
Sto:=(Year mod 100)=0;
if ((Sto=True) and (Year mod 400 =0)) or
((Sto=False) and (Year mod 4=0)) Then
kol_days := 29
Else kol_days := 28
End;
End ;
Writeln (kol_days);
End .
Пример 3. Составить программу проверки, делится ли заданное натуральное число на 7.
Пусть х заданное натуральное число. Составим выражение сравнения: x mod 7 =0. Используем это выражение в качестве селектора; его возможные значения: True, False. Ниже приводятся два варианта использования оператора выбора (в полной и неполной формах):
Program PRIM_3 ; Var x : LongInt ; Begin Write ('Введите натуральное число ') ; Readln (x) ; |
|
Case x mod 7 = 0 of True : Writeln ('делится на 7') ; False : Writeln ('не делится на 7') |
Case x mod 7 = 0 of True : Writeln ('делится на 7') Else Writeln ('не делится на 7') |
End ; End . |
1) На экран компьютера выводится текст:
Вывод знака препинания в зависимости от типа предложения:
Выберите номер типа предложения G
После того как пользователь сделает выбор, необходимо вывести знак препинания, каким должно заканчиваться предложение данного типа.
2) По номеру класса, в котором учится школьник, требуется определить, в школе какого типа он обучается (подготовительная, начальная, базовая, средняя).
3) На экран компьютера выводится текст:
Вычисление площади треугольника по следующим элементам:
Выберите номер G
После того как пользователь сделает выбор, необходимо ввести значения требуемых элементов, вычислить площадь и вывести полученный результат.
4) Таблица К. Купера позволяет определить степень физической подготовленности человека в зависимости от суммы очков, набранных им на занятиях по физической культуре за неделю:
Сумма очков, набранных за неделю |
Степень физической подготовленности |
|
Юноша |
Девушка |
|
Не менее 75 |
Не менее 65 |
Превосходно |
51-74 |
41-64 |
Отлично |
32-50 |
27-40 |
Хорошо |
21-31 |
16-26 |
Удовлетворительно |
10-20 |
8-15 |
Плохо |
Меньшее 10 |
Меньше 8 |
Очень плохо |
Программа должна предложить ввести сумму набранных очков, уточнить, кто их набрал (юноша или девушка) и вывести на экран компьютера оценку физической подготовленности.
5) Программа предлагает ввести возраст человека (если необходимо, также его пол) и выводит, к какой группе он относится: дошкольник, ученик, работник, пенсионер.
6) В пятиэтажном доме на каждом этаже по 4 квартиры. Программа должна предложить ввести номер этажа и вывести номера квартир на этом этаже.
7) Программа предлагает ввести число k полных лет человека (от 1 до 120) и вывести фразу: «Вам k лет». Например, при k=3 «Вам три года», k=18 «Вам 18 лет», k=101 «Вам 101 год».
8) Определить наиболее подходящий возраст партнера для вступления в брак. Программа должна запросить данные пользователя: возраст, признак пола (из выведенного на экран меню: 1 юноша, 2 девушка) и вывести подходящий возраст партнера, который вычисляется так: возраст девушки равен увеличенной на 7 половине возраста юноши, возраст юноши определяется как удвоенный возраст девушки минус 14.
9) Вывести в римской системе нумерации век, к которому относится заданный год (номер года вводится с клавиатуры).
10) Программа должна предложить выбрать способ вычисления площади круга (по заданному радиусу, или диаметру, или длине окружности), запросить требуемые данные, произвести вычисления и вывести результат на экран.
11) Программа должна предложить ввести текущее время и вывести период суток (день, ночь, утро, вечер, обед).
В системе программирования ИнтАл Вы познакомились с командами повторения, которые мы выделим в такие алгоритмические структуры:
Повторять_Пока P
. . .
Завершить
While P do
S ;
Тело цикла
Заголовок цикла
Использование цикла WHILE оправдано, когда количество повторений операторов тела цикла заранее неизвестно и зависит от истинности условия Р, которое проверяется в начале тела цикла. Это количество может быть равно нулю (если еще до первого попадания в цикл условие Р оказалось ложным).
Р
S
Нет
Да
While оператор цикла. Его принято называть «цикл с предусловием», так как проверка условия выполнения цикла осуществляется до выполнения операторов, входящих в состав тела цикла.
P логическое выражение (условие выполнения цикла);
S оператор (простой или составной), который выполняется, если Р истинно; тело цикла.
Readln (K) ;
While K<=5 do
Begin
Writeln ('Делай ', K) ;
K := K+1
End ;
Например, согласно фрагменту, на экран компьютера при K=3 будет выведено:
Делай 3
Делай 4
Тело цикла
Делай 5
При K=5 тело цикла будет выполняться один раз, а при K=10 (K>5) ни одного раза.
Примеры:
Пример 1. Программа вычисления значений функции y=1/x при x=1; 1,1; 1,2; 1,3; …; 2. |
|
Нет Да Конец x :=1 x ≤ 2 y:=1/x x := x+0,1 Вывод y
Начало Переменной х присваивается значение 1. Так как условие 1 ≤ 2 истинно, выполняется тело цикла: вычисляется и выводится на экран значение y, значение переменной x увеличивается на 0,1. Условие 1,1 ≤ 2 истинно, поэтому выполняется тело цикла для значения x = 1,1; x становится равным 1,2; и т. д. Последний раз тело цикла выполнится при x=2. Затем значение переменной x становится равным 2,1; условие 2,1 ≤ 2 ложно, выполнение цикла завершается. |
Найти: y значения функции y=1/x при x = 1; 1,1; 1,2; 1,3; …; 2. Метод: Будем последовательно подставлять в формулу y=1/x вместо х значения 1; 1,1; …; 2, вычислять соответствующие значения y; каждое полученное значение y выводить на экран. |
Программа Функция Описание x, y : вещественный Конец_Описания x:=1 Повторять_Пока x<=2 y:=1/x Вывод(y, '; ') x:=x+0.1 Завершить Конец_Программы |
|
Program FUNCT_1 ; Var x, y : Real ; Begin x:=1; While x<=2 do Begin y:=1/x ; Writeln (y : 0: 5); x:=x+0.1 End End. |
|
После запуска программы обратите внимание на то, что на экран не выводится значение функции в последней точке x=2. Это связано с особенностью представления числовой информации (в частности, вещественных чисел) в памяти компьютера. Рекомендуется для получения требуемого вывода записать в заголовке цикла условие в виде: While x<=b+h/2 do … , где h дробный шаг изменения значения x (в данном случае, x<=2.05). |
|
Пример 2. Программа нахождения первой (старшей) цифры заданного натурального числа n. Идея алгоритма основана на последовательном делении на 10 числа n и получаемых частных от деления; процесс деления закончится, когда будет получен остаток, меньший 10. |
|
32395 10 5 3239 10 9 323 10 3 32 10 2 3 |
Program ONE ; Var n : LongInt ; {заданное число} C : LongInt ; {искомая цифра} Begin Write ('n=') ; Readln (n); C:=n; While C>9 do C:=C div 10 ; Writeln ('Первая цифра=',C) End. |
Анализируя программу, можно заметить, что тело цикла может выполняться различное количество раз: ни одного (например, при вводе чисел 2, 8 или другого, не большего 9), 1 раз (для двузначных чисел), 2 (трехзначных) и т.д. Использование цикла While в данном случае вполне уместно. |
|
Пример 3. Петя купил в магазине определенное количество конфет и хочет разделить их поровну между своими тремя друзьями. Написать программу проверки, возможен ли такой дележ. Задача осложняется тем, что Петя учится в подготовительном классе и пока еще не умеет ни делить, ни умножать. |
|
Дано: n количество купленных конфет Надо: можно ли разделить n на 3 Связь: можно, если остаток от деления n на 3 равен нулю, и нельзя в противном случае При: n>0 (считать, что данные корректны) Метод: Так как Петя не умеет выполнять операцию деления, предложим ему раскладывать конфеты на три кучки, добавляя в каждую по очереди по одной конфете (количество конфет при этом будет уменьшаться на 3). Если после очередного прохода по кучкам не останется ни одной конфеты, значит, дележ возможен. Если кому-то не хватило конфеты, невозможен. Здесь тело цикла содержит единственную команду n:=n-3. |
Program VKUSNO; Var n : Integer ; Begin Write ('Число конфет= '); Readln (n); While n>0 do n:=n-3 ; if n=0 then Write ('можно ') Else Write ('нельзя '); Writeln ('разделить') End. |
S := 0; n :=1; While n<=10 do S := S + k ; Writeln (S) ; * Пример 4. Имеется фрагмент программы суммирования квадратов двадцати последовательных натуральных чисел, в котором Женя допустил ошибки. При запуске программа зависает, и Евгений вынужден прерывать ее работу принудительно (Ctrl+Break). Поможем автору разобраться в причинах зависания. |
S := 0; n :=1;
While n<=10 do
Begin
S := S + k ;
n:=n+1
End;
Writeln (S) ;
Анализ 1. Зависание программы свидетельствует о наличии так называемого “зацикливания”: мы имеем дело с бесконечным циклом, в котором условие выхода из цикла, в данном случае, n>10, не наступает, пока не будет выполнено принудительное завершение работы программы. Проследим изменение значений переменной n в заголовке цикла. Первоначально n=1. Условие 1<=10 истинно, поэтому происходит вхождение в цикл, и выполняется команда присваивания S:=S+k; Значение n не изменяется, и компьютер постоянно проверяет справедливость истинного условия 1<=10. Итак, первая ошибка связана с неправильной организацией работы счетчика n: автор задал начальное и конечное значения, а значение шага не определил.
Устранение ошибки 1. Добавим в тело цикла команду присваивания для увеличения значения n на 1: n:=n+1. Это приведет к необходимости организации составного оператора Begin .. End. После внесения изменений и запуска программы зацикливание не наблюдается, однако на экран выводится неверный результат (число 0).
Анализ 2. Обратим внимание, как осуществляется суммирование. Вначале S=0 и затем в цикле должна накапливаться сумма путем добавления квадратов чисел 1, 2, …, 20. Запись команды S := S + k ; говорит о том, что в переменной S накапливаются значения переменной k, которая ни задается, ни изменяется. Сами суммируемые числа обозначены в программе переменной n, которую и следует записать в теле цикла вместо k.
S := 0; n :=1;
While n<=10 do
Begin
S := S + n ;
n:=n+1
End;
Writeln (S) ;
Устранение ошибки 2. Заменим команду S := S + k; на S := S + n;
S := 0; n :=1;
While n<=20 do
Begin
S := S + n*n ;
n:=n+1
End;
Writeln (S) ;
Анализ 3. Вы, пожалуй, уже заметили другие ошибки, допущенные автором программы, которые возникли по причине несоответствия алгоритма условию задачи: программа вычисляет сумму десяти последовательных чисел (сравните с условием). Эти ошибки можно обнаружить, если подобрать более простое условие. Подсчитайте, например, устно сумму пяти чисел (12 +22 +32 +42 +52 =55), измените в программе условие n<=10 на n<=5, запустите программу на выполнение и сравните полученные результаты.
Устранение ошибки 3. Окончательный вариант фрагмента программы примет такой вид.
Такую конструкцию удобно использовать, например, для контроля ввода исходных данных. |
P:=False; {присвоим логической переменной Р значение False: нужное условие не выполнено} While P=False do {пока не выполнено нужное условие} Begin {будем повторять ввод} Writeln ('Введите число 0<A<pi/2'); Readln (A); If (A>0) and (A<pi/2) Then P:=True {условие выполнено} End; |
1. Определите, сколько раз будет выполняться тело цикла:
1) i:=1; While i<=50 do Begin Writeln (i); i:=i+2 End ; |
2) k:=12; While k<=356 do Begin H:=k/5; k:=k+3 End; |
3) N:=100; While N>=0 do Begin N:=N-3; s:=s+1 End; |
* 2. При каких начальных значениях переменной р завершится выполнение оператора цикла:
1) while p>2.5 do p:=sqrt (p) ; 2) while abs (p)>0 do p:=p+1 ;
3) while sqr (p) >=0 then p:=sin (p) ; 4) while p>p/2 do p:=p-0.5 ;
* 3. Найдите ошибки, содержащиеся в приведенном фрагменте программы, предназначенной для получения числа, цифры которого записаны в обратном порядке по отношению к данному натуральному числу (например, если заданное число n=739, то программа должна получить число a=937). После обнаружения ошибок их следует исправить. |
x:=n ; a:=0 ; while x>=0 do Begin a:=a+x mod 10 x:=x div 10 End ; |
Напишите программы решения следующих задач:
1) найти сумму цифр заданного натурального числа;
2) определить количество цифр заданного натурального числа;
3) проверить, равна ли пяти старшая цифра заданного натурального числа;
4) проверить, равна ли старшая цифра заданного натурального числа младшей;
5) найти сумму чисел, заключенных на отрезке [a, b] и отличающихся друг от друга на величину h (a, b, h вводятся с клавиатуры);
6) найти среди чисел 1, 1+1/2, 1+1/2+1/3, … первое, большее а;
7) вычислить сумму 1+1/2+1/3+ … + 1/n (значение n вводится с клавиатуры);
* 8) найти наибольший делитель заданного натурального числа, отличный от самого числа;
9) Незнайке поручили разделить яблоки, собранные на субботнике по уборке урожая, поровну между участниками субботника. Требуется определить, сколько яблок достанется каждому и сколько яблок останется (количество яблок и участников субботника вводятся с клавиатуры). Получить решение двумя способами: по методу Знайки и Незнайки, который не умеет ни делить, ни умножать;
* 10) вычислить значение π с заданной точностью ε с использованием бесконечного разложения:. Вычисления продолжать до тех пор, пока очередной член ряда не окажется меньше заданной погрешности ε (этот член ряда в сумму уже не включать);
11) вычислить значения функций y=sin x и y=cos x на отрезке [-1; 1] c шагом 0,1. Результат вывести в таблицу |
---------------------------- ! x ! sin x ! cos x ! ---------------------------- |
12) помогите Незнайке подсчитать количество ковриков квадратной формы, которое понадобится, чтобы покрыть ими пол комнаты прямоугольной формы (размеры комнаты вводятся с клавиатуры). План расположения ковриков см. на рисунке. Например, если размеры комнаты 300(см)х 450(см), то понадобится 3 коврика. |
* 13) последовательность чисел формируется путем i-кратного дублирования i-го числа из ряда натуральных чисел: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, … Определить, какое число N находится на k-м месте этой интересной последовательности (k задано, 1≤k≤2000000000).
Повторять_Для
От
До
…
Завершить
FOR I := Iнач TO Iкон do
S ;
Тело цикла
Заголовок цикла
FOR I := Iнач DOWNTO Iкон do
S ;
Использование цикла FOR оправдано, когда количество повторений цикла заранее (то есть еще до начало выполнения цикла) известно:
I идентификатор (параметр цикла), счетчик количества повторений цикла;
Iнач выражение, позволяющее определить начальное (первое) значение I;
Iкон выражение для определения последнего (конечного) значения I;
ТО служебное слово, определяющее шаг изменения параметра цикла I (в данном случае, шаг считается равным 1);
DOWNTO определяет шаг изменения параметра цикла I равным -1;
S оператор (простой или составной); тело цикла;
“:=” составной символ (имеет смысл “от”).
S
I:=Iнач;Iкон
Переменная I должна быть порядкового типа; Iнач, Iкон выражения, совместимые с переменной I.
FOR оператор цикла с параметром (шагом). Здесь тело цикла повторяется для всех значений параметра I, определенного в границах [Iнач ; Iкон] (отсюда и название цикла). Порядок его выполнения: вычисляются значения выражений Iнач и Iкон; параметр цикла принимает последовательно все значения от начального до конечного; для каждого из них выполняется тело цикла.
Служебное слово TO в записи оператора цикла предполагает, что Iнач≤Iкон, при этом значение параметра цикла на каждом шаге увеличивается на 1. Служебное слово DOWNTO предполагает, что Iнач ≥ Iкон, и значение параметра уменьшается на 1. При нарушении этих условий цикл выполняться не будет. После выхода из цикла значение параметра цикла не всегда определено, что следует учитывать при разработке циклических программ.
Пример 1 (экологическая модель). В результате сброса в реку промышленных стоков произошло ее загрязнение свинцом. Какой окажется концентрация свинца в реке через заданное время (n суток), если известны его начальная концентрация и коэффициент суточного уменьшения. Скорректируйте математическую постановку задачи и алгоритм ее решения в соответствии с изменениями в формулировке задачи (задача 2 п. 9.1). Анализ алгоритма свидетельствует о возможности его реализации с помощью цикла FOR (в алгоритме присутствует целочисленная переменная i, для которой известны начальное значение 1, конечное n, шаг изменения 1). |
Ввод Сo, K, n i:=1; n; 1 Cn:=Cn/K Вывод Cn
Начало Cn:=Co Конец |
Программа СБРОС Описание C0, K, Cn : вещественный i, n : целый Конец_Описания Ввод(C0, 'Начальная концентрация=') Ввод(K, 'Коэффициент=') Ввод(n, 'Сколько суток прошло=') Cn:=C0 Повторять_Для i От 1 До n Cn:=Cn/K Завершить Вывод (Cn, 'Cn=') Конец_Программы |
Program Sbros ; Var C0, K, Cn : Real ; i, n : Integer ; Begin Write ('Начальная концентрация=') ; Readln (С0) ; Write ('Коэффициент =') ; Readln (K) ; Write ('Сколько суток прошло = ') ; Readln (n) ; {здесь опущен контроль входных данных} Cn:=C0 ; For i:=1 To n do Cn:=Cn/K ; Writeln ('Cn= ', Cn: 0: 4) End. |
Пример 2. Смоделировать работу сберегательного банка: написать программу начисления ежегодной денежной суммы вклада, положенной в банк под P% с капитализацией вклада (первоначальная сумма и число лет вводятся с клавиатуры). Считать, что данные корректны. |
|
Дано: S первоначальная сумма, K - количество лет, P годовая процентная ставка. Найти: S1, S2, …, Sk сумма на счете в конце 1-го, 2-го, …, K-го года. Связь: , где n=1, 2, 3, …, K При: K ≥ 1; S > 0; 3 < Р < 50 Метод: Первоначально подставим в правую часть формулы значение S и найдем S1 (новую сумму по истечении одного года). При подстановке S1 в правую часть формулы найдем значение S2 по истечении двух лет и т. д. Такие манипуляции проделаем K раз. Для подсчета количества прошедших лет введем переменную g. |
Program Pribyl ; Var S : Real ; P, K, g : Integer ; Begin Write ('Начальная сумма=') ; Readln (S) ; Write ('Ставка P (%)=') ; Readln (P) ; Write ('Количество лет=') ; Readln (K) ; For g := 1 To K do Begin S := S*(1+P/100) ; Writeln (g, ': ', S : 0 : 2) End End. |
Пример 3. Составить программу отсчета времени, оставшегося до начала спектакля: программа должна предложить ввести оставшееся время (в с) и выводить на экран отсчет времени в обратном порядке. Когда отсчет окажется равным нулю, требуется вывести текст “Начало спектакля. Вход запрещен!”. Испытайте программу, подберите подходящие цвета фона, выводимого текста, параметр для процедуры Delay, позволяющий выводить на экран посекундное время, близкое к реальному. |
Program Nachalo; Uses CRT; Var T, S : Integer; Begin Write ('Время до начала (с)= '); Readln (T); For S:=T downto 0 do Begin ClrScr; GotoXY (40, 10) ; Write (S); Delay (1000) End ; GotoXY (35, 15); TextColor (4); Writeln ('Начало спектакля !!!'); Writeln ('Вход воспрещен !!!'); End. |
* Пример 4. Буратино нашел записку, где указан маршрут к кладу. Маршрут задается в виде инструкций, указывающих код направления движения (в соответствии с приведенной схемой) и число шагов в этом направлении. Требуется найти координаты клада, если известно число инструкций и для каждой из них код направления и число шагов. Первоначально Буратино находится в начале координат, откуда и начинается поиск клада. Длина шага всегда постоянна и равна 1. Заметим, что при перемещении в соответствии с данной схемой происходит смещение относительно предыдущей точки вдоль оси OX и OY соответственно на и единиц, где К код направления. Таким образом, новые координаты Буратино при перемещении на S шагов в направлении К могут быть вычислены по формулам: где первоначально Х = Y = 0. |
1 8 2 7 3 6 4 5
Program KLAD; Var i, N, K, S : Longint; X, Y : Real; Begin Write ('N=') ; Readln (N); {N - общее число инструкций} X:=0; Y:=0; {Маршрут начинается в начале координат} For i:=1 to N do {Для каждой} Begin {инструкции} Readln (K, S); {вводим код направления и число шагов,} X:=X+S*sin (pi/4*(K-1)); {вычисляем (X,Y) новые координаты точки} Y:=Y+S*cos (pi/4*(K-1)) End; Writeln (X:0:3,' ',Y:0:3) End. |
Пример 5. Известен возраст каждого конкурсанта фестиваля «Славянский базар». Определить средний возраст конкурсантов. Пусть возраст конкурсантов задается как число полных лет. Введем обозначения: K общее количество конкурсантов, V возраст очередного конкурсанта, S суммарный возраст, SV средний возраст конкурсантов. Тогда SV = S/K. Найдем вначале суммарный возраст, выполняя постепенное суммирование с переменной S значения возраста V очередного конкурсанта. Первоначально S=0. Переменная S играет роль сумматора, куда по очереди добавляются значения V. |
Program FEST ; Var K, V, i : Integer; S : LongInt; SV : Real; Begin Write ('Сколько конкурсантов='); Readln (K); S:=0; {Пока S=0} For i:=1 to K do {Для каждого} Begin {конкурсанта} Readln (V);{вводим возраст,} S:=S+V {и суммируем его} End; SV:=S/K; Writeln ('SV= ', SV : 0 : 1); End. |
1. Тело цикла может содержать любые операторы (как простые, так и управляющие). При программировании таких алгоритмов следует следить за сохранением вложенности алгоритмических структур (в примерах 6-7 вложенные структуры изображены пунктирными линиями). 2. При программировании порой можно выбрать различные варианты алгоритмических структур. Например, обратите внимание, что вычисление значений функции y=sin x на отрезке [0; 2] с шагом 0,1 можно задать такими вариантами записи операторов: 1) x:=0; while x<=2 do begin y:=sin(x); writeln (x:0:1,y:5:1); x:=x+0.1 end; 2) x:=0; for k:=1 to 21 do begin y:=sin(x); writeln (x:0:1,y:5:1); x:=x+0.1 end; 3) a:=0.1; for k:=0 to 20 do begin x:=a*k; y:=sin(x); writeln (x:0:1,y:5:1) end; Какая запись Вам представляется наиболее подходящей и почему? |
|
Пример 6. Настя выбрала в магазине открытки двух типов: первого по цене M р. для поздравления мальчикам, второго D р. для поздравления девочкам. Всего у Насти R р. Требуется получить все возможные варианты покупок, где будут истрачены все имеющиеся у Насти деньги. Дано: R (р.) общая денежная сумма; M (р.), D (р.) стоимости открыток для мальчиков и девочек. Найти: KM, KD количество открыток для мальчиков и девочек соответственно. Связь: KM*M+KD*D=R Метод: Будем перебирать значения KM от 0 (наименьшее количество открыток; все деньги тратятся на открытки для девочек) до [R/M] (наибольшее количество открыток; все деньги тратятся на покупку открыток мальчикам). Тогда KD=(R-KM*M)/D. Если KD целое число, получен вариант покупки. Так как Настя на сумму R может не купить ни одной открытки, введем логическую переменную Yes, которой присвоим значение True, если покупка возможна. |
Program New_Year ; Var M, D, R, KM : Integer ; KD : Real ; Yes : Boolean ; Begin Write ('Всего денег=') ; Readln (R) ; Writeln ('Стоимости открыток:') ; Write ('мальчикам ') ; Readln (M) ; Write ('девочкам ') ; Readln (D) ; Yes := False ; For KM := 0 To R div M do Begin KD := (R-KM*M)/D ; If KD=Trunc (KD) Then Begin Yes := True ; Writeln (KM, ', ', Trunc (KD)) End End ; If Yes=False Then Writeln ('Покупка невозможна') End . |
Пример 7. Среди трехзначных чисел требуется найти числа, сумма старшей и младшей цифры каждого из которых равна заданному числу, которое вводится с клавиатуры. Пусть X заданное число. Трехзначное число С удовлетворяет условию 100 ≤ C ≤ 999. Будем перебирать все числа, удовлетворяющие этому условию, искать сумму m+s, где m младшая цифра, равная остатку от деления C на 10, s старшая цифра, равная целой части от деления С на 100. Если m+s=X, выведем число С на экран. Логическая переменная Yes предназначена для отслеживания случая отсутствия искомых чисел. |
Program _3 ; Var C, X, m, s : Integer ; Yes : Boolean ; Begin Write ('Заданное число = ') ; Readln (X) ; Yes := False ; For C:=100 To 999 do Begin m := C mod 10 ; s := C div 100 ; If m+s = X Then Begin Yes := True ; Writeln (C) End End ; If Yes = False Then Writeln ('Таких чисел нет') End. |
1. Какие данные необходимы для организации цикла?
3. Какие типы операторов цикла Вам известны? Каковы их форматы?
4. Что такое параметр цикла? шаг? тело цикла?
По заданному фрагменту программы определите условие задачи:
1) y:=2; for k:=1 to 10 do y:=y*x ; 2) P:=1; for n:=15 downto 1 do P:=P+1/n ;
3) S:=0; For p:=1 to 10 do S:=S+p/(p+1) ;
* 4) For k:=1 to 20 do Begin a:=k*k; b:=sqr ((k+1)); Writeln ('a=', a , ', b=', b) end;
* 5) a:=1; S:=0; For n:=1 to 15 do Begin S:=S+a/n; a:=a*х ; End ;
Напишите программы решения следующих задач:
1. Требуется занумеровать партию лекарств, выводя на экран в столбик текст в виде: Партия № 1
Партия № 2
…
Партия № 20
2. Решить задачу 1) в предположении, что наименьший и наибольший номера партии лекарств вводятся с клавиатуры.
3. Вывести на экран квадраты натуральных чисел от 1 до 50.
9800 |
700 |
0 |
40 |
1 |
26 |
2 |
12 |
4. В качестве призов на новогодний утренник предполагают купить подарки двух видов (их стоимости известны). Получить все варианты покупок на заданную денежную сумму (например, для покупки подарков стоимостью 700 р и 9800 р на общую сумму 28000 р возможны варианты покупок, приведенные в таблице.
5. На соревнованиях по пятиборью принимают участие K спортсменов. Итоги соревнований подводятся по суммарному числу баллов, полученных каждым спортсменом в каждом виде соревнований. Напишите программу, которая для каждого спортсмена вводит баллы по каждому виду соревнований и выводит суммарный балл.
6. Среди двузначных чисел требуется найти все числа, делящиеся на заданное число, которое вводится с клавиатуры.
7. Среди трехзначных чисел требуется найти все числа, средняя цифра которых:
1) равна сумме крайних цифр;
2) делится без остатка на сумму крайних цифр;
3) отличается от суммы крайних цифр не более чем на единицу.
8. Среди четырехзначных чисел найти все числа, для которых:
1) сумма первых двух цифр равна сумме двух последних цифр;
2) сумма первой и последней цифры равна сумме двух средних цифр.
9. Будем считать, что натуральное число является «счастливым», если оно делится на 7. Получить на заданном числовом промежутке [A; B] все «счастливые» натуральные числа (значения A и B вводятся с клавиатуры).
10. Вывести на экран степени двойки 2n, где n=1, 2, 3, 4, …, 17.
11. Получить на заданном числовом промежутке в порядке убывания все натуральные числа, сумма цифр которых равна заданному числу, вводимому с клавиатуры.
12. В баскетбольную команду могут принять учеников, рост которых превышает 175 см. Подсчитать количество школьников кандидатов в баскетбольную команду.
1. Север
2. Юг
3. Запад
4. Восток
* 13. Смоделируйте работу датчика, фиксирующего координаты судна при его перемещении в соответствии с передаваемыми ему командами: судно перемещается в указанном направлении и ожидает новой команды. Программа должна предложить ввести количество команд; вывести меню для выбора направления; предложить ввести число, соответствующее выбранному направлению; вывести координаты акватории, где окажется судно после выполнения команды. Считать, что судно отправляется в рейс из условного пункта с координатами (0; 0); по одном команде оно перемещается на расстояние в 1 милю. Например, если судно находилось в точке (0, 0) и получена команда 1 (Север), координаты судна окажутся равными (0, 1).
* 14. Известны результаты соревнования по прыжкам в высоту n учеников. Найдите самый лучший результат.
* 15. Итальянский математик Леонардо Фибоначчи (1180-1250) обнаружил интересную числовую последовательность: 1, 1, 2, 3, 5, 8, 13, 21, … Напишите программу определения n-го члена Фибоначчи (значение n вводится с клавиатуры). Программа должна также произвести вычисления по формуле общего члена Фибоначчи. Сравните полученные результаты вычислений по двум методам.
Познакомьтесь с информацией о том, какую роль играют ряды Фибоначчи в математике.
Для решения задач часто бывает необходимо организовать перебор нескольких значений переменных, что приводит к, так называемым, вложенным циклам. При этом каждый внутренний цикл
. . . . .
. . . . .
i:=1; 5; 1
j:=1; 9; 1
k:=1;12;1
. . . . .
должен быть полностью вложен во все внешние по отношению к нему циклы (см., например, рис. 3.5).
For i:=1 to 5 do Begin ...
For j:=1 to 9 do Begin ...
For k:=1 to 12 do Begin ...
End; …
End; …
End;
Рис. 3.5
Примеры:
Пример 1. Требуется получить таблицу умножения каждого натурального числа от 1 до 9 на 2, 3, 4, …, 9 (таблица Пифагора):
|
Program Tablica ; Var x, y : byte ; Begin For x:=1 to 9 do {1-й сомножитель} Begin For y:=1 to 9 do {2-й сомножитель} Write (x*y:3);{вывод x*y } Writeln {переход на новую строку} End ; End. |
Пример 2. Требуется найти количество двузначных чисел, которые делятся на сумму своих цифр.
Будем рассматривать искомые числа в виде совокупности цифр и, перебирая их различные возможные значения, формировать число х=10а+b и сумму цифр S = a + b. Пусть K количество искомых чисел.
Конец a=1; 9; 1 Вывод х
Начало К := 0 b=0; 9; 1 x:=10a+b S := a+b Остаток (х/S)=0 Да К := К+1 Нет Вывод К
|
Program Liki; Var a, b, x, S : Byte; K : Integer; Begin K := 0; {a - старшая цифра, b - младшая цифра} For a:=1 to 9 do For b:=0 to 9 do Begin x := 10*a+b; {x - двузначное число} S :=a+b; {S - сумма цифр числа} If x mod S =0 then Begin {если число x делится на сумму цифр, считаем его} K := K+1; {и выводим на экран} Write (x, ' ') End End ; {перевод курсора на новую строку} Writeln ; {вывод общего количества чисел} Writeln ('Всего чисел: ', K) End . |
* Пример 3. Хозяйство должно разлить весь собранный березовый сок в банки емкостью 3 л, 5 л, 10 л. Требуется определить, можно ли это сделать и сколько банок каждого вида понадобится (считать, что количество банок неограниченно). Получить вариант разлива с наименьшим количеством использованных банок.
Дано: L (л) объем собранного сока
Найти: a, b, c количество банок соответственно емкостью 3 л, 5 л, 10 л.
Связь:
Разлить весь сок в банки полностью нельзя, если данное уравнение не имеет решений в целых неотрицательных числах.
При: L целое число
Метод:
1. Для получения варианта разлива в десятилитровые банки будем перебирать значения переменной z от минимально возможного (0) до максимального ([L/10]). Останется не разлитым Р=L-10z (л) сока, которые будем пытаться разлить в банки емкостью 5 л; для этого будем перебирать значения переменной y от 0 до [Р/5]. Для разлива в трехлитровые банки останется х=Р-5y (л) сока. Пусть t = х/3. Если t целое число, одно из решений задачи получено; его можно вывести на экран компьютера. Факт получения решения будем фиксировать логической переменной Yes, которой присвоим значение True. По значению Yes при завершении работы программы будем судить, требуется ли вывести сообщение «Разлив невозможен».
2. Для получения наилучшего варианта разлива будем сравнивать общее количество использованных банок K=t+y+z со значением некоторой переменной min. Эту переменную будем использовать для хранения наименьшего значения суммы: min= K, если справедливо неравенство: K < min. Одновременно запомним в переменных a, b, c соответствующие значения t, y, z. Первоначально будем полагать значение min равным достаточно большому целому числу (MaxInt).
Программа Разлив Описание L,y,b,c,z,P,min,K,a,x:Целый Х3 : Вещественный Yes: Логический Конец_описания Ввод(L, 'Всего сока=') Yes:=Ложь min:=32000 Повторять_Для z От 0 До Целая_часть(L/10) P:=L-10*z Повторять_Для y От 0 До Целая_часть(P/5) x:=P-5*y x3:=x/3 Если х3=Целая_часть(x3) То Yes:=Истина Вывод(Целая_часть(x3), ', ' , y, ', ' ,z) Новая_строка K:=Целая_часть(x3)+y+z Если K<min То Min:=K a:=Целая_часть(x3) b:=y c:=z Конец_Если Конец_Если Завершить Завершить Если Yes=Ложь То Вывод ('Разлив невозможен') Иначе Вывод (a, ', ',b, ', ',c) Конец_Если Конец_Программы |
Ввод L z=0;[L/10];1 Yes:=Ложь min:=MaxInt y=0;[P/5];1 P:=L-10z x:=P-5y x3:=x/3 x3-целое? K<min Yes:=Истина K:=x3+y+z Вывод x3,y,z Да min:=K;a:=x3 b:=y; c:=z Да Нет Нет Начало |
Program Rasliv ; Var L, y, z, P, min, K, t, a, b, c, x : Integer ; x3: Real ; Yes: Boolean ; Begin Write ('Всего сока='); Readln (L); Yes:=False; min:=MaxInt; For z:=0 To L div 10 do Begin P:=L -10*z ; For y:=0 To P div 5 do Begin x:=P-5*y; x3:=x/3 ; t:=Trunc(x3); If x3=t Then Begin Yes:=True; Writeln(t, ',',y,',',z); K:=t+y+z; If K<min Then Begin min:=K; a:=t; b:=y; c:=z End End End End; Writeln; If Yes=False Then Writeln ('невозможно') Else Writeln (a,',',b,',',c) Yes=Ложь Да Нет Вывод a,b,c Конец Вывод «невозможно» End .
|
* Пример 4. Расшифровать ребус: ГОД * 4 = ВЕК, где каждая буква соответствует некоторой цифре (разные буквы разным цифрам). Смоделируем алгоритм умножения столбиком, начиная умножение с младшего разряда (справа налево). Так как Д ≠ К, то Д не равно нулю. Пусть Pr =Д*4, тогда К остаток от деления Pr на 10, р1 перенос в следующий разряд (разряд десятков). В следующем разряде О ≠ Д, О ≠ К, Pr1=О*4+р1; Е остаток от деления Pr1 на 10, Е цифра, не равная другим, уже использованным в алгоритме: Е ≠ О, Е ≠ Д, Е ≠ К; р2 перенос в следующий разряд (разряд сотен), Цифра, соответствующая букве Г, может быть равна 1 или 2, так как слово ВЕК состоит из трех букв; Г ≠ О, Г ≠ Д, Г ≠ Е, Г ≠ К. В=Г*4+р2. Следует проверить справедливость выполнения условий: В < 10, В цифра, не равная использованным ранее цифрам. В программе переменным Г, О, Д, В, Е, К соответствуют переменные g, o, d, v, e, k. |
Program SHIFR; Var d, o, g, v, e, k, Pr, Pr1, p1, p2 : Byte; Begin For d:=1 To 9 do Begin Pr:=d*4; k:= Pr mod 10; p1:=Pr div 10; For o:=0 To 9 do If (o<>d) and (o<>k) Then Begin Pr1:=o*4+p1; e:=pr1 mod 10; If (e<>o) and (e<>d) and (e<>k) Then Begin p2:=pr1 div 10; For g:=1 To 2 do If (g<>o) and (g<>d) and (g<>k) and (g<>e) Then Begin v:=g*4+p2; if (v<10) and (v<>o) and (v<>d) and (v<>k) and (v<>e) Then Writeln (g,o,d,'*4=',v,e,k) End End End End End. |
|
Сущность метода заключается в случайном размещении точек в квадрате с вписанной окружностью единичного радиуса. Для подсчета количества испытаний (генерируемых точек) в алгоритме используется переменная i, для которой известны начальное значение (1), конечное значение (n) и величина шага (1). Значит, в Паскале уместно использование цикла с параметром. |
Program PI_; Var n, i, k: LongInt; SF, a, x, y : Real; Begin Randomize; Write ('всего точек='); Readln (n); a:=2; k:=0; For i:=1 to n do Begin x:=2*Random-1; y:=2*Random-1; if x*x+y*y<=1 then k:=k+1 End; SF:=a*a*k/n; Writeln ('Число ПИ=', SF) End. |
|
* Пример 6. («Умножить на 3 и сложить с 1»). Задано некоторое натуральное число. Подвергнем его следующему испытанию: если это число четное, разделим его на 2, если нечетное умножим на 3 и прибавим 1. С полученным числом проделаем аналогичные действия. Например, для числа 7 получается последовательность чисел: 7, 22, 11, 34, 17, 52, 26, … Замечено, что какое бы натуральное число ни было введено, через некоторое количество шагов будет получено число 1; затем наблюдается циклическое повторение некоторых чисел. Определите число шагов, требуемых для получения первой единицы в такой последовательности чисел. Один шаг это одно действие над числом: деление на 2, или умножение на 3 и прибавление 1. |
Program Experiment ; Var n, k : LongInt ; Begin Write ('n=') ; Readln (n) ; k := 0 ; While n<>1 do Begin If n mod 2 =0 then n := n div 2 else n := n*3 + 1 ; Write (', ', n) ; k := k +1 ; End ; Writeln ; Writeln ('K=', k) ; End . |
|
В данном случае количество повторений цикла заранее не известно. Кроме того, цикл может не выполняться ни разу (если n=1), поэтому из известных нам циклических конструкций выбрана именно структура цикл While. Проведите испытание программы, присмотритесь к получаемым последовательностям при различных значениях n: возможно, Вам удастся получить формулу зависимости k от n. |
* 1. Определите, что будет выведено на экран компьютера после выполнения последовательности операторов:
Readln (k); For n:=1 to k do Begin
For m:=1 to k do if n>=m then Write ('1') else Write ('2'); Writeln End;
* 2. Определите, какое значение следует ввести при запуске программы, фрагмент которой записан ниже, чтобы при выводе было напечатано число 2:
Readln (n); k:=0; for i:=n to 5 do if i>0 then k:=k-1 else k:=k+1; Writeln (k);
* 3. Сколько раз выполняются внешний и внутренний циклы в следующих фрагментах:
1) x:=0; While x<=7 do While x=0 do x:=x+1; |
2) x:=0; While x<=10 do While x<=17 do x:=x+1; |
3) x:=0; While x<=17 do While x<=10 do x:=x+1; |
1. Решите задачу о разливе сока в банки для случая, когда емкости банок заранее не известны и вводятся с клавиатуры.
2. Решите задачу В (п. 11.3) о покупке тетрадей и ручек в предположении, что их стоимости заранее не известны и вводятся с клавиатуры; можно покупать и ручки и тетради одновременно. Получите вариант покупки с наибольшим количеством приобретенных товаров.
3. Напишите программы решения следующих задач:
1) вычислить произведение всех цифр (кроме 0) заданного натурального числа;
2) проверить, является ли четной первая цифра заданного натурального числа;
3) подсчитать количество четных цифр заданного натурального числа;
* 4) подсчитать, сколько в записи заданного натурального числа содержится нулей, четных и нечетных цифр отдельно;
* 5) Расшифровать ребусы:
а) БИТ х 8 = БАЙТ б) ЗНОЙ х 3 = ЛЕТО в) ТРИ х 6 = ДЫРА
г) ВАНЯ х 4 = ИВАНЫ д) ГРАЧ х 4 = СТАЯ е) ЛЮДИ х 4 = ТОЛПА
ж) ШЛАК х 3 = БЛОК з) ТРУД х 5 = УСПЕХ и) ОГОНЬ х 8 = ПОЖАР
к) ЛУНА х 4 = НОЧИ л) ДУБ х 7 = РОЩА м) ИГРАЛ х 6 = УСТАЛ
н) ЛОБ + ТРИ = САМ о) ДО х РЕ + МИ = НОТЫ
* 6) Определить числа, являющиеся длинами сторон прямоугольного треугольника и зашифрованные в виде слов: а) КУ, КА, РЕ; б) ОН, НО, НА; в) СОН, ОНИ, НИЗ (здесь одинаковым буквам соответствуют одинаковые цифры);
7) найти наибольшее значение функции y=sinx+cos2x на отрезке [0; 1];
8) числа a, b, c называют пифагоровыми, если a2+ b2= c2. Составьте программу вывода на экран всех пифагоровых троек из числового промежутка [1; 100] (тройки 3, 4, 5 и 5, 3, 4 считаются одинаковыми; нужно вывести только одну из них);
9) требуется подсчитать количество натуральных пятизначных чисел, делящихся на 23 и на свою последнюю цифру.
4. Известны длины трех секций ограды на каждом из двух земельных участков. Определить, какой из них имеет большую площадь. Если площади равны, вывести соответствующее сообщение.
* 5. Напишите программу для реализации игры Баше: имеется определенное количество предметов (это количество можно вводить с клавиатуры или получить случайным образом); двое игроков (ученик и компьютер) ходят по очереди; за один ход игрок может взять от одного до трех предметов; проигрывает тот, кто возьмет последний предмет.
Продумайте и реализуйте в программе стратегию выигрыша.
6. Напишите программу игры «Угадай число»: компьютер случайным образом загадывает число в некотором диапазоне (например, от 1 до 100) и предлагает угадать его. Задача пользователя: за возможно меньшее количество попыток угадать это число.
* 7. Напишите программу «Загадка жрецов бога РА». Известна глубина воды в некотором колодце цилиндрической формы. В него опущены две тростинки так, как изображено на рисунке. Длины тростинок известны. Требуется помочь кандидату на замещение вакантной должности жреца определить диаметр колодца.
* 8. Реализуйте на языке программирования Паскаль модель замкнутой биосистемы, известной Вам из 10 класса.
* 9. Реализуйте алгоритм экологической модели, осуществляя контроль исходных данных в соответствии с алгоритмом п. 9.3.
* 10. Напишите программу для контроля усвоения устного счета пользователем. Программа должна запросить два числа (слагаемых), вывести их на экран, предложить ввести сумму этих чисел; проверить, правильна ли эта сумма, и вывести на экран компьютера соответствующее сообщение («Правильно», «Неправильно»). Таким образом предложить для решения 10 примеров. Затем вывести количество правильных и неправильных ответов.
* 11. Напишите программу решения задачи о размещении железнодорожного вокзала (§ 11, 10 класс).
При построении графических изображений Вы использовали только одну из известных Вам алгоритмических структур (СЛЕДОВАНИЕ). Освоение других структур позволяет использовать их для получения сложных графических изображений.
Рассматривая некоторое изображение в виде совокупности одноименных объектов (точек, отрезков и т.д.), можно прийти к пониманию возможности использования для получения всего изображения алгоритмической структуры ПОВТОРЕНИЕ.
Примеры программ:
Пример 1. Получение изображения отрезка прямой. Пусть требуется получить изображение горизонтального отрезка с началом в точке (0, 240). Будем рассматривать отрезок как совокупность точек, и использовать для получения изображения отрезка процедуру PutPixel. Поместим ее в тело цикла с параметром For. Таким образом получим изображение 640 точек с координатами (k, 240) при k=0, 1, 2, 3, …, 639; в результате соседние пиксели сольются в горизонтальный отрезок. |
Program PUT_LINE; Uses Graph ; Var a, b, k : Integer ; Begin a:=Detect ; InitGraph (a, b, '') ; {горизонтальная прямая} For k:=0 To 639 do PutPixel (k, 240, 14) ; {14 желтый цвет} Readln ; CloseGraph End. |
Пример 2. Получение изображения семи параллельных отрезков равной длины.
0 100 500 639 50 90
290
479 Требуемое изображение можно рассматривать как совокупность отрезков. Концы отрезков: (100, y), (500, y), где y=50; 90; …; 290; значение y изменяется с шагом 40. Таким образом, можно организовать цикл While с условием выполнения цикла y ≤ 290. В цикле будем использовать процедуру вывода отрезка прямой и изменение значения y на 40 (величину шага). Эта идея реализована в программе LINE7_1 (метод 1). Возможно также использование цикла с параметром For, где параметр цикла (например, переменная k) указывает количество полученных изображений отрезка: k = 1, 2, …, 7. Тело цикла имеет такой же вид, как и в методе 1. Данная идея реализована в программе LINE7_2. |
Program LINE7_1; {метод 1} Uses Graph ; Var a, b, y: Integer ; Begin a:=Detect; InitGraph (a, b, ''); y:=50; While y<=290 Do Begin Line (100, y, 500, y); y:=y+40 End; Readln; CloseGraph End. |
Program LINE7_2; {метод 2} Uses Graph ; Var a, b, k, y: Integer ; Begin a:=Detect; InitGraph (a, b, ''); y:=50; For k:=1 to 7 do Begin Line (100, y, 500, y); y:=y+40 End; Readln; CloseGraph End. |
|
Пример 3. Использование счетчика случайных чисел позволяет получать случайно расположенные на экране изображения. Покажем это на примере программы вывода на экран заданного количества случайно расположенных точек: 1) программа предлагает ввести количество требуемых точек (N); 2) случайным образом формирует координаты точки 0 ≤ x ≤ 639, 0 ≤ y ≤ 479 и цвет точки 1 ≤ C ≤ 15; 3) изображает точку на экране, замедляя на миллисекунды процесс перехода к получению изображения следующей точки (регулирует скорость рисования). Переменная k параметр цикла (счетчик), целочисленная переменная, которая используется для подсчета количества выводимых точек. |
Program STARS; {Звездное небо} Uses Crt, Graph ; Var a, b, N, k, x, y, C: Integer ; Begin ClrScr; Write ('Количество точек='); Readln (N); Randomize; a:=Detect; InitGraph (a, b, ''); For k:=1 To N do Begin x:= Random (640); y:= Random (480); C:= Random (15)+1; PutPixel (x, y, C); Delay (1000) End; Readln; CloseGraph End. |
Пример 4. Программа закраски прямоугольника различными цветами: смена цвета должна осуществляться после нажатия на клавишу “Enter”. Пример основан на выполнении многократных действий: получение изображения прямоугольника, заполненного некоторым цветом. Пусть i номер цвета заполнения; i = 0, 1, 2, …, 15. Таким образом, уместно использование цикла For. В цикле следует задать стиль заполнения области (1 сплошной текущий цвет) и изобразить закрашенный прямоугольник, например, с диагональными точками (220, 200), (450, 300). |
Program BAR_16; Uses Graph ; Var a, b, i : Integer ; Begin a:=Detect ; InitGraph (a, b, '') ; For i:=0 To 15 do Begin SetFillStyle (1, i); Bar (220, 200, 450, 300); Readln End; CloseGraph End. |
Возможность выбора построения того или иного изображения, представленная в алгоритме (и соответственно, в программе) в виде некоторой вариативности, обеспечивается использованием алгоритмической структуры ВЕТВЛЕНИЕ.
Примеры программ:
Пример 5. Написать программу, которая по желанию пользователя выведет на экран изображение треугольника или прямоугольника. |
|
Пусть Р переменная, по значению которой пользователь будет принимать решение о выводе требуемого изображения: треугольника (при Р = 1) или прямоугольника (при Р ≠ 1). 0 180 240 320 400 480 639
70 300 370 479 Будем получать изображение треугольника с вершинами в точках (240, 70), (400, 370), (180, 300), а прямоугольника в диагональных точках (240, 70) и (480, 300). |
Program TRE_PR; Uses Graph ; Var a, b : Integer ; P : Byte ; Begin Writeln ('Сделайте выбор:') ; Writeln ('1 - треугольник') ; Writeln ('не 1 - прямоугольник'); Readln (P); a:=Detect; InitGraph (a, b, ''); If P=1 Then Begin Line (240, 70, 400, 370); Line (400, 370, 180, 300); Line (180, 300, 240, 70) End Else Rectangle (240,70,480,300); Readln; CloseGraph End. |
1. Напишите программы получения изображений:
1) десяти параллельных вертикальных отрезков равной длины; 2) шахматной доски;
3) пешеходного перехода; 4) случайного количества случайно расположенных окружностей (треугольников, отрезков).
2. С клавиатуры задаются значения двух переменных. Если они равны, выведите на экран изображение равнобедренного, иначе разностороннего треугольника.
3. С клавиатуры задаются значения длин сторон параллелограмма. Если они равны, выведите на экран изображение квадрата, иначе прямоугольника.
4. Напишите программу закраски произвольного треугольника различными цветами (смена цвета должна осуществляться после нажатия на клавишу “Enter”).
* 5. Напишите программу, которая по желанию пользователя выведет на экран изображение равнобедренного, равностороннего или разностороннего треугольника, квадрата, прямоугольника, параллелограмма или ромба.
Выделим два подхода к решению задач моделирования движений средствами языка программирования:
1. «Нарисуй сотри и нарисуй в новом месте». Этот способ реализовать легко: нужно организовать цикл, задав координаты для перемещения объекта в требуемом направлении; в теле цикла предусмотреть: очистку экрана, изображение объекта в новом месте и приостановку выполнения программы.
2. «Нарисуй закрась цветом фона и нарисуй в новом месте». Здесь объект прорисовывается на старом месте дважды: вначале требуемым цветом, а затем цветом фона.
Примеры:
Пример 1. Перемещение красного объекта квадратной формы вдоль черного экрана слева направо. |
|
Метод 1 |
Метод 2 |
Program DVIG_1; Uses Crt, Graph ; Var a, b, x : Integer ; Begin a:=detect; InitGraph (a, b, ''); For x:=0 to 639 do Begin SetFillStyle (1, Red);{красный} Bar (x, 200, x+10, 210); Delay (1000); ClearDevice {очистка экрана} End; Readln; CloseGraph End. |
Program DVIG_2; Uses Crt, Graph ; Var a, b, x : Integer ; Begin a:=Detect; InitGraph (a, b, ''); For x:=0 to 639 do Begin SetFillStyle (1,Red); {красный} Bar (x, 200, x+10, 210); Delay (1000); SetFillStyle (1, Black); {черный} Bar(x, 200, x+10, 210); End; Readln; CloseGraph End. |
* Если завершение перемещения объекта нужно связать с действиями пользователя (например, с нажатием на клавишу), удобно использовать функцию KeyPressed модуля CRT. Функция возвращает значение TRUE, если нажата какая-либо клавиша: While not KeyPressed Do …; (пока не нажата клавиша, делать …).
* Пример 2. Вертикальное перемещение шарика (от верхней границы экрана к нижней и обратно; и т. д.). Пока не нажата какая-либо клавиша (not KeyPressed) будем многократно выполнять следующие действия: рисуем красный круг, который закрашиваем его на старом месте цветом фона (черным), ординату y (центра круга) увеличиваем на dy = 1, рисуем новый круг и т.д. Когда круг коснется нижней или верхней границы экрана, значение dy изменим на противоположное и круг изменит направление движения. |
Program PADENIE; Uses Crt, Graph ; Const R=10; x=320; Var a, b, y, dy : Integer ; Begin a:=Detect; InitGraph (a, b, ''); y:=R; dy:=1; While not KeyPressed do Begin SetFillStyle (1, Red); {красный} PieSlice (x, y, 0, 360, R) ; Delay (100); SetFillStyle (1,Black); {черный} PieSlice (x, y, 0, 360, R) ; y:=y + dy; if (y=640-R) or (y=R) then dy:=-dy End; CloseGraph End. |
1. Испытайте эти программы; выберите подходящие цвета, скорости перемещения. Обратите внимание, что программа PADENIE моделирует движение шарика в туннеле белого цвета. Измените программу для перемещения шарика в однородной среде (например, на синем фоне).
2. Примените наиболее понятный Вам метод для моделирования движения:
1) вертикального падения теннисного мячика; * 2) автомобиля;
3) неопознанного летающего объекта; 4) парусной лодки;
5) солнца по небу; 6) лопающегося воздушного шарика.
Выполните творческое задание после просмотра изображений на диске.