Глава 1 Основы программирования
____________________________________________________________________
Подробный анализ отрезков пути.
Мы написали "вычисление отрезка xi". Но как все-таки вычислять эти от-
резки? Вот тут многие "застревают" не в силах придумать что-либо. Единого рецепта как дальше придумывать алгоритм не существует. Ответ один – надо
"просто" думать, искать, пробовать! Помните, что придумывать, разрабатывать алгоритмы это такой же творческий процесс, как, например, сочинять стихи,
музыку, писать картины и т.д. Многие быстро придумывают алгоритмы, другие
– с трудом и долго, ну а третьи вообще не могут придумать даже простейшие алгоритмы. Так что, уважаемый читатель, не всякий может стать программи-
стом! Для этого тоже нужны определенные способности к творчеству, если хо-
тите – талант! Программист – это творческая профессия! Разумеется, как и во всякой другой творческой профессии, знания тоже играют немаловажную роль!
Вернемся к нашей задаче. Нарисуем график для облегчения.
В
•
d y1
y3 •
y2
А 0 |
6 |
10 |
15 |
t |
|
Рис. 1.5. График движения поездов |
|
|
|
Будем рассуждать, используя элементарные законы физики о прямолиней-
ном равномерном движении тел, которые изучаются в школе.
Когда муха в первый раз полетит в направлении к поезду из пункта А, то до встречи с этим поездом пройдет время:
21
1.1 Понятие алгоритма.
____________________________________________________________________
t1 |
|
d |
|
; |
(1.1) |
|
|
|
|||
|
|
|
|||
|
(v |
|
v2 ) |
|
|
В момент встречи мухи и поезда В (будем для краткости называть поезд,
вышедший из пункта В поездом В, а поезд, вышедший из пункта А, поездом А)
расстояние между поездами составит:
y1 d t1 (v1 v2 ); |
(1.2) |
а муха пролетит расстояние:
x t1v; |
(1.3) |
И соответственно, при полете мухи в обратном направлении имеем:
|
|
t2 |
|
|
|
|
|
y1 |
|
, |
y2 y1 t2 (v1 v2 ), |
x t2v; |
(1.4) |
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
(v v1 ) |
|
|
|
|||||
Отсюда можно вывести общую формулу: |
|
|
|||||||||||
t |
|
|
y |
|
|
; |
x |
tv при полете мухи из А к В. |
|
(1.5) |
|||
|
|
|
|
|
|||||||||
|
|
|
|
|
|||||||||
|
v |
v2 |
|
|
|
|
|
|
|||||
t |
|
y |
|
|
|
; |
x |
|
tv при полете мухи из В к А. |
|
(1.6) |
||
|
|
|
|
|
|||||||||
|
|
|
|
|
|||||||||
|
|
v |
|
v1 |
|
|
|
|
|
|
|||
y y |
t(v1 |
v2 ) |
|
|
|
|
(1.7) |
||||||
Нарисуем блок-схему с учетом полученных формул:
22
Глава 1 Основы программирования
____________________________________________________________________
|
|
|
начало |
|
|
|
|
|
Ввод d,v,v1 ,v2 , n |
|
|||
|
|
|
Sстар=0 |
|
|
|
|
|
|
|
i=1 |
|
|
|
|
|
|
y=d |
|
|
t |
|
y |
|
t |
|
y |
v |
v2 |
|
v |
v1 |
||
|
|
|
||||
|
|
|
xi |
t v |
|
|
|
|
Sнов=Sстар+xi |
|
|
||
|
|
|
Sстар=Sнов |
|
|
|
|
|
y |
y |
t(v1 v2 ) |
|
|
|
|
|
Sнов, xi |
|
|
|
|
|
|
i=i+1 |
|
|
|
|
|
|
i≤n |
да |
|
|
|
|
|
|
|
||
|
|
|
|
нет |
|
|
|
|
|
конец |
|
|
|
|
Рис. 1.6. Четвертый вариант алгоритма |
|||||
Здесь мы видим, что алгоритм должен разветвляться на две ветви (когда муха летит к поезду В и когда летит к поезду А). Как компьютеру сообщить,
что нужно попеременно проходить через эти ветви? Используется прием, кото-
рый широко известен в программировании и называется метод "флажков" или
"семафора". Будем считать что, если флажок поднят, то нужно идти по левой веточке, если опущен, то по правой. В качестве флажка принято использовать либо целочисленную переменную, либо булевую переменную, которая может принимать только два значения:
0 – означает, что флажок опущен, 1 – означает, что флажок поднят, если
23
1.1 Понятие алгоритма.
____________________________________________________________________
это переменная целого типа и false – флажок опущен, true – флажок поднят,
если это булевая переменная.
Перерисуем блок-схему
|
|
|
|
|
|
|
|
|
|
|
|
|
начало |
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
Ввод d,v,v1 ,v2 , n |
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
Sстар=0, i=1, F=1,y=d |
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
да |
|
|
|
|
|
|
|
|
|
нет |
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
F=1 |
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F 0 |
|
|
|
|
|
|
|
|
|
|
|
F 1 |
|
|
|
|
|
||||||||||
|
t |
|
|
y |
|
|
|
|
|
|
|
|
|
|
|
|
t |
|
y |
|
||||||||
|
|
v v2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
v v |
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xi |
|
|
|
t v |
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
Sнов=Sстар+xi |
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
Sстар=Sнов |
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
y |
|
|
|
y t(v1 v2 ) |
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
Sнов, xi |
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
i=i+1 |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
да |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i≤n |
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
нет |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
конец |
|
|
|
|
|
|
|||||||||
|
|
Рис. 1.7. Пятый вариант алгоритма |
||||||||||||||||||||||||||
Построив один вариант блок-схемы, всегда нужно посмотреть, нельзя ли ее упростить?
Анализируя блок-схему, видим, что мы попеременно используем Sстар, Sнов, причем после вывода на экран Sнов, его значение нам не нужно, оно все равно изменяется. Отсюда можно использовать только одну переменную S.
S = S + xi
Далее: критерий окончания алгоритма мы определили не совсем хорошо.
24
Глава 1 Основы программирования
____________________________________________________________________
Действительно не ясно, чему равно n. Может 100, а может 1000. Допустим, мы приняли n=100, а на самом деле число отрезков оказалось равным 10, тогда 90
раз алгоритм будет работать «впустую», т.к. полученные результаты будут бес-
смысленными. Как быть? Не лучше ли определить конец алгоритма по y. Дей-
ствительно из рисунка видно, что y→0. Будем считать, что поезда встретились,
если y≤10-2. Кроме того, мы видим, что и значение очередного отрезка xi после вывода его на экран, нам не нужно, т.е. параметр i можно совсем убрать. Окон-
чательно получаем:
начало
|
|
Ввод d,v,v1 ,v2 |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y=d, S=0,F=1 |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
да |
|
|
|
нет |
|||||||
F=1 |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|||||
F=0 |
|
|
|
|
|
|
F=1 |
|||||
t=y/(v+v2) |
|
|
t=y/(v+v1) |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
x t
v
S=S+x
y y t(v1 v2 )
S, x
нет
y≤10-2
да
конец
Рис. 1.8. Окончательная блок-схема алгоритма
Будем считать, что алгоритм больше не упростить. В следующей главе,
когда будем изучать язык программирования Pascal, мы напишем программу для этого алгоритма (см. главу 2, раздел 2.2).
25