У вас вопросы?
У нас ответы:) SamZan.net

ОСНОВНЫЕ АЛГОРИТМИЧЕСКИЕ СТРУКТУРЫ 19

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 29.12.2024

80

3. ОСНОВНЫЕ АЛГОРИТМИЧЕСКИЕ СТРУКТУРЫ

§ 19. Алгоритмическая структура ВЕТВЛЕНИЕ

В языке Паскаль выделяются два класса операторов: простые и управляющие (структурные). Простой оператор не содержит в своей записи других операторов, а его выполнение не связано с анализом некоторых условий (программа выполняется последовательно: от первого оператора ко второму, от второго – к третьему и т.д.). Структурный оператор содержит в своем составе другие операторы, порядок выполнения которых определяется некоторыми условиями. К первому классу относятся оператор присваивания и операторы обращения к процедурам. К управляющим операторам относятся условный оператор (оператор ветвления), операторы выбора, цикла (if, case, while, for). Несколько операторов с помощью операторных скобок Begin и End объединяются в составной оператор.

С помощью простых операторов можно реализовать линейные алгоритмы, условного оператора и оператора выбора – разветвляющиеся алгоритмы,  операторов цикла – циклические алгоритмы.

Настоящий раздел посвящен изучению управляющих конструкций языка программирования Паскаль.

19.1. Логические величины и выражения

Довольно часто на поставленный вопрос Вы получаете ответ «да» или «нет». Величины, которые могут принимать одно из двух значений «истина» (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

в)

19.2. Условный оператор

Если в процессе вычислительной работы появляется более одного направления хода дальнейших вычислений, такой процесс уже не является линейным: в зависимости от выполнения некоторого условия производятся различные варианты расчета. Ветвление в Паскале реализуется с помощью условного оператора 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 требуется выполнение более одного оператора, их ограничивают операторными скобками BEGINEND и рассматривают как составной оператор.

Примеры:

Запись на ИнтАле

Запись на Паскале

Если 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 года найти численное значение популяции.

* 19.3. Оператор выбора CASE

Оператор 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. Какова структура условного оператора? * оператора выбора?
  2. Каков порядок выполнения условного оператора? * оператора выбора?

  1. Напишите программы решения следующих задач:

1) На экран компьютера выводится текст:

Вывод знака препинания в зависимости от типа предложения:

  1.  Повествовательное
  2.  Вопросительное
  3.  Восклицательное

Выберите номер типа предложения  G

После того как пользователь сделает выбор, необходимо вывести знак препинания, каким должно заканчиваться предложение данного типа.

2) По номеру класса, в котором учится школьник, требуется определить, в школе какого типа он обучается (подготовительная, начальная, базовая, средняя).

3) На экран компьютера выводится текст:

Вычисление площади треугольника по следующим элементам:

  1.  Основанию и высоте
  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) Программа должна предложить ввести текущее время и вывести период суток (день, ночь, утро, вечер, обед).


§ 20. Алгоритмическая структура ПОВТОРЕНИЕ

В системе программирования ИнтАл Вы познакомились с командами повторения, которые мы выделим в такие алгоритмические структуры:

20.1. ПОКА – цикл с предусловием (WHILE)

Повторять_Пока  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. Окончательный вариант фрагмента программы примет такой вид.



* Пример 5. Фрагмент программы, который выполняется до тех пор, пока не будет введено нужное число: например, А, удовлетворяющее условию 0<A<pi/2:

Такую конструкцию удобно использовать, например, для контроля ввода исходных данных.

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

20.2. ДЛЯ – цикл с параметром (FOR)

Повторять_Для

 От

 До

Завершить

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 вводится с клавиатуры). Программа должна также произвести вычисления по формуле общего члена Фибоначчи. Сравните полученные результаты вычислений по двум методам.

Познакомьтесь с информацией о том, какую роль играют ряды Фибоначчи в математике.


20.3. Смешанные алгоритмы

Для решения задач часто бывает необходимо организовать перебор нескольких значений переменных, что приводит к, так называемым, вложенным циклам. При этом каждый внутренний цикл

 . . . . .

. . . . .

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 (таблица Пифагора):

1

2

3

4

5

6

7

8

9

2

4

6

8

10

12

14

16

18

3

6

9

12

15

18

21

24

27

9

18

27

36

45

54

63

72

81

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.


Пример 5.
Методом Монте-Карло вычислить значение числа π. Напомним, что модель и ее реализация на ИнтАле изучалась Вами в 10-м классе. Здесь приведем реализацию модели на языке программирования Паскаль.

Сущность метода заключается в случайном размещении точек в квадрате с вписанной окружностью единичного радиуса. Для подсчета количества испытаний (генерируемых точек) в алгоритме используется переменная 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. Какие управляющие конструкции используются в Паскале?
  2. Что такое «условный оператор» и как он применяется?
  3. Какие операторы цикла Вы знаете?
  4. Когда и как применяется оператор цикла for? while?

* 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 класс).

§ 21. Алгоритмические структуры и графические построения

21.1. Графические построения

При построении графических изображений Вы использовали только одну из известных Вам алгоритмических структур (СЛЕДОВАНИЕ). Освоение других структур позволяет использовать их для получения сложных графических изображений.

Рассматривая некоторое изображение в виде совокупности одноименных объектов (точек, отрезков и т.д.), можно прийти к пониманию возможности использования для получения всего изображения алгоритмической структуры ПОВТОРЕНИЕ.

Примеры программ:

Пример 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. Напишите программу, которая по желанию пользователя выведет на экран изображение равнобедренного, равностороннего или разностороннего треугольника, квадрата, прямоугольника, параллелограмма или ромба.

21.2. Программирование движущихся объектов

Выделим два подхода к решению задач моделирования движений средствами языка программирования:

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) лопающегося воздушного шарика.

Выполните творческое задание после просмотра изображений на диске.  




1. Контрольная работа по философии Контрольная работа ~ одна из основных форм проверки знаний студентазаоч
2. Пояснительная записка Руководитель Студент группы Ек
3. тематики РЕФЕРАТ по Концепції сучасного природознавства Ядерна загроза
4. суцільну колективізацію
5. Заботе Снегурочкаведущая Снегурочка- Здравствуйте ребята Какие вы весёлые нарядные А посмотрите з
6. Контрольная работа Выполнил студент- 3ЗФ18 Бакова Е
7. ТЕМА- Бухгалтерский учёт и бухгалтерский баланс.
8. Виды проверок состояния лесного хозяйства
9. на тему- Функции слухового анализатораВступ3 Структур
10. полупроводник МС перехода является более известный как барьера Шоттки диод
11. что понимается под архитектурой- Материальная пространственная среда созданная искусственным путём для ра
12. тема кровообращения digestive пищеварительный respirtory дыхательный reproductive репродуктивная связанная с разм
13. Учебное пособие- Диагностика кризисов процедуры управления
14. ДОНСКОЙ БАНКОВСКИЙ ТЕХНИКУМ Программа преддипломной практики и методические указан
15. рефератов к олимпиаде По дисциплине судоустройство Судебноправовая реформа- значение и способ
16. Средняя общеобразовательная школа с
17. Психологопедагогические особенности общения ребенка с матерью в разные возрастные периоды
18. типа со статическим управлением
19. культа личности и его последствий оказывали огромное влияние на советскую политическую систему и обществе
20. ВАРИАНТЫ- кардиологическом отделении терапевтическом И Т