Оператор цикла с предусловием

Поставим перед собой задачу, получить на экране следующую картину: два шарика радиусами R1 и R2 и цветами с1 и с2 движутся навстречу друг другу. В точке соприкосновения на их месте вырастает шар радиусом R1 + R2 и цветом шарика большего радиуса.

Начальное положение:

Результат:


Сложно подсчитать количество шагов до столкновения, поэтому затруднительно будет использовать цикл с параметром для решения данной задачи.
Из условий задачи можно определить, что координата по вертикали остается неизменной. Пусть (X1, Y) и (X2, Y) – координаты центров заданных шариков.
Координаты по горизонтальной оси будут изменяться в противоположных направлениях (X1 от R1, X2 от 639 - R2 до столкновения). В какой точке произойдет встреча трудно подсчитать, но можно определить условие, при котором они встретятся.

Из рисунка видно, что разница между центрами шариков должна быть равна сумме радиусов (X2 - X1 = R1 + R2). Значит, шарики будут двигаться, пока выполняется условие X2 - X1 > R1 + R2.
Когда известно условие, при котором необходимо повторять определенную серию действий, используют цикл с предусловием.
Формат:    WHILE <условие работы цикла>
                   <тело цикла>
                   WEND
Дословно конструкцию можно прочитать так: «Пока условие истинно, выполняй тело цикла».
WHILE, WEND – служебные слова;
Условие – строится по тому же принципу, что и в условном операторе, оно будет проверяться перед каждым шагом работы цикла. Если оно заведомо ложно, то и цикл не выполнится ни разу.
Тело цикла – серия операторов, которая будет повторяться, пока условие работы не будет нарушено. В теле цикла обязательно должны быть операторы, выполнение которых влияет на изменение истинности условия, иначе цикл не остановится (произойдет зацикливание).
Вернемся к заданию. 
Данные величины:
R1 – радиус первого шарика; с1 – цвет первого шарика;
R2 – радиус второго шарика; с2 – цвет второго шарика;
Y – высота движения шариков.
Решение:
Х1 = R1 – начало движения первого шарика;
X2 = 639 - R2 – начало движения второго шарика;
X2 - X1 > R1 + R2 – условие движения;
С каждым шагом цикла при истинном условии, выполняются следующие действия:
1. рисуем шарики с центрами (X1, Y) и (X2, Y), радиусами R1 и R2, соответственно, и цветами с1 и с2, соответственно;
2. задерживаем изображение;
3. стираем;
4. Х1 увеличиваем на шаг (возьмем шаг равный 1 пикселю);
5. Х2 уменьшаем на аналогичный шаг.
После выхода из цикла, координаты центра нового шара (X1 + R1, Y). Цвет определим с помощью условного оператора, сравнив с1 и с2.
Программа:
CLS
PRINT "введите высоту движения, радиусы шариков и их цвета"
INPUT Y, R1, R2, C1, C2
X1 = R1
X2 = 639 - R2
SCREEN 12
WHILE  X2 - X1 > R2 + R1
CIRCLE (X1, Y), R1, C1
PAINT (X1, Y), C1, C1
CIRCLE (X2, Y), R2, C2
PAINT (X2, Y), C2, C2
FOR W = 1 TO 1000
NEXT W
LINE (X1 - R1, Y - R1) - (X1 + R1, Y + R1), 0, BF
LINE (X2 - R2, Y - R2) - (X2 + R2, Y + R2), 0, BF
X1 = X1 + 1
X2 = X2 - 1
WEND
X = X1 + R
R = R1 + R2
IF R1 > R2 THEN C = C1 ELSE C = C2
CIRCLE (X, Y), R, C
PAINT (X, Y), C, C
END


Применение цикла с предусловием в решении математических задач

Задание:  Дано целое число A. Вводить числа с клавиатуры, пока их сумма не превысит заданное число.
Решение:
Пусть X – переменная, в которой будет храниться число, введенное с клавиатуры в текущий момент. Пусть S – сумма введенных чисел. Вначале работы программы S равна 0. Переменная X будет вводиться до тех пор, пока S < A, поэтому операторы INPUT X и S = S + X , будут телом цикла с предусловием.
Итак, в программе необходимо реализовать следующий алгоритм:
1. ввести число A;
2. S = 0;
3. в цикле с предусловием S < A
               a) ввести X;
               б) S = S + X;
4. сообщить о нарушении условия.
Программа:
CLS
PRINT "введите заданное число"
INPUT A
S = 0
WHILE S < A
  INPUT X
  S = S + X
WEND
PRINT "сумма введенных чисел превысила заданное число"
END


Задание: Дано целое число n. Найти произведение цифр этого числа.
Решение:
Для того чтобы найти произведение цифр числа, необходимо знать эти цифры. Алгоритм нахождения цифр уже обсуждался ранее (последнюю цифру находим с помощью остатка от деления на 10 и укорачиваем число на эту цифру делением числа на 10 нацело, затем процесс повторяется, пока не будут найдены все цифры числа). Но в ранее рассмотренных задачах, заранее оговаривалось количество цифр заданного числа. В этой задаче количество цифр может быть произвольным.
Пусть X – переменная, в которой будет храниться цифра числа, найденная в текущий момент. Пусть P – произведение цифр. Вначале работы программы P равно 1, т.к. при поиске произведения, переменную нельзя обнулять (сколько 0 не умножай – результатом будет 0).
Если повторять операторы
X = n mod 10
n = n \ 10
P = P * X , то постепенно в переменной P будет получаться произведение цифр числа n.
Убедимся в этом на конкретном примере. Допустим n = 2584.

X   

n

P

До выполнения операторов

X = n mod 10

n = n \ 10

P = P * X

0

2584

1

После первого выполнения операторов

4

258

4

После второго выполнения операторов

8

25

32

После третьего выполнения операторов

5

2

160

После четветого выполнения операторов

2

0

320


В этом примере операторы повторялись 4 раза, так как число было четырехзначным, но по условию задачи количество цифр может быть любым, поэтому количество повторений не известно. Чтобы применить для решения задачи оператор цикла с предусловием, нужно выяснить условие, при котором следует выполнять данную серию операторов. Рассмотрим на примере еще одного числа. Допустим n = 319.

X   

n

P

До выполнения операторов

X = n mod 10

n = n \ 10

P = P * X

0

319

1

После первого выполнения операторов

9

31

9

После второго выполнения операторов

1

3

9

После третьего выполнения операторов

3

0

27


Сопоставляя примеры, можно сделать вывод, что операторы повторяются до тех пор, пока число n не станет равным 0. Условие работы цикла n <> 0.
Итак, в программе необходимо реализовать следующий алгоритм:
1. ввести число n;
2. P = 1;
3. в цикле с предусловием n <> 0
               a) вычислить цифру X;
               б) оторвать цифру от исходного числа;
               в) увеличить произведение;
4. вывести результат.
Программа:
CLS
PRINT "введите заданное число"
INPUT n
P = 1
WHILE n <> 0
  X = n mod 10
  n = n \ 10
  P = P * X
WEND
PRINT "произведение цифр числа равно  ", P
END


Задание:  Дано целое число n. Является ли число перевертышем? Например, 56465 – перевертыш, т.к. читается одинаково в ту и другую сторону.
Решение:
Для того, чтобы определить, является ли число перевертышем, необходимо перевернуть это число и проверить, равно ли оно исходному.  Пусть Y – перевернутое число. Чтобы его получить, нужно собрать по разрядам цифры исходного числа, но в обратном порядке.
В этой задаче количество цифр может быть произвольным, поэтому цифры будем находить так же, как и в предыдущей задаче. Пусть X – переменная, в которой будет храниться цифра числа, найденная в текущий момент.
Рассмотрим, на конкретном примере: допустим n = 2584.

X   

n

Y

Получение числа Y

До выполнения операторов

X = n mod 10

n = n \ 10

Y = ???

0

2584

0

После первого выполнения операторов

4

258

4

0 * 10 + 4

После второго выполнения операторов

8

25

48

4 * 10 + 8

После третьего выполнения операторов

5

2

48

485

После четветого выполнения операторов

2

0

4852

484 * 10 + 2


Выясним, каким должен быть оператор нахождения числа Y. Из последнего столбца таблицы видно, что содержимое переменной Y на каждом шаге работы цикла увеличивается в 10 раз и к нему прибавляется цифра, найденная на соответствующем шаге работы цикла (Y = Y * 10 + X).
Если повторять операторы
X = n mod 10
n = n \ 10
Y = Y * 10 + X , то в итоге в переменной Y будет перевернутое число. Останется сравнить его с данным. Но, в процессе работы цикла, число n превратилось в ноль. Поэтому необходимо перед циклом сохранить данное число в дополнительной переменной. Пусть это будет переменная K.
Итак, в программе необходимо реализовать следующий алгоритм:
1. ввести число n;
2. сохранить данное число в переменной K;
3. в цикле с предусловием n <> 0
               a) вычислить цифру X;
               б) оторвать цифру от исходного числа;
               в) увеличить число Y;
4. сравнить числа K и Y и вывести результат.
Программа:
CLS
PRINT "введите заданное число"
INPUT n
K = n
WHILE n <> 0
  X = n MOD 10
  n = n \ 10
  Y = Y * 10 + X
WEND
IF K = Y THEN PRINT "число является перевертышем"  ELSE PRINT "число не является перевертышем"
END

 


Задания для самостоятельного выполнения
1. Вводить числа с клавиатуры  до тех пор, пока сумма четных из них не совпадет с суммой нечетных.
2. Написать программу перевода числа n в систему с основанием k (1 < k < 10).

Адрес: 614039, г. Пермь, ул. Комсомольский проспект, 45
Телефон: +7 (342) 212-80-71
E-Mail: school9-perm@ya.ru
Вопрос администратору сайта