Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
osnovy_programmirovanija_v_srede_lazarus.pdf
Скачиваний:
185
Добавлен:
18.03.2015
Размер:
6.53 Mб
Скачать

Глава 1 Основы программирования

____________________________________________________________________

В силу своей природы, компьютеры стали наиболее распространенными ис-

полнителями алгоритмов. Собственно они и были придуманы для того, чтобы с их помощью исполнять алгоритмы.

Назначение компьютеров, таким образом, состоит в фактическом испол-

нении алгоритмов, разработанных человеком.

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

"как бы самостоятельно", это неверно!

Это человек придумывает алгоритм, т.е. способ управления станками, ра-

кетами, сочинения музыки, игры в шахматы, а компьютер лишь исполняет этот алгоритм. Таким образом, компьютер это помощник, инструмент чело-

века для решения различных задач, но инструмент очень мощный, разно-

плановый. С помощью компьютера человек может решать самые разнооб-

разные задачи.

Рассмотрим пример разработки алгоритма.

1.1.2 Задача о поездах и мухе

Рассмотрим задачу, которую мы позаимствовали из [11] и рассмотрим на этом примере основные приемы и способы составления алгоритмов. Пусть два города A и B удалены на расстояние d=600 км. Одновременно из каждого горо-

да отходят поезда в направлении друг другу. Поезд вышедший из города А имеет скорость v1=40 км/ч, а из В – имеет скорость v2=60 км/ч. Одновременно из пункта А вылетает исключительно быстрая муха со скоростью v=200 км/ч и летит на встречу поезду вышедшего из пункта В. При встрече с ним муха дела-

ет поворот и летит обратно навстречу с поездом, идущему из А. Когда она его встретит, муха снова делает поворот и летит в обратном направлении. Так про-

должается до тех пор, пока поезда не встретятся.

17

1.1 Понятие алгоритма.

____________________________________________________________________

Задание.

1)определить длину различных отрезков пути, которые пролетит муха

2)определить общее расстояние, которое пролетит муха

На второй вопрос легко ответить: поезда встретятся через 600/(40+60)=6

часов, а муха за это же время пролетит расстояние 200*6=1200 км. Но оставим в стороне эту хитрость, и будем решать задачу в «лоб».

Прежде всего, нужно составить алгоритм, т.е. придумать, как решить зада-

чу с помощью элементарных шагов. Алгоритм будем записывать в виде блок-

схемы. С чего нужно составлять блок-схему? Как правило, блок-схема начина-

ется с ввода исходных данных и начальных установок, т.е. определение началь-

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

тральную часть блок-схемы (ядро), в которой определены те действия, которые решают задачу, причем сначала рисуют укрупненную блок-схему, чтобы как можно яснее представить себе весь процесс решения.

Какие идеи сразу приходят в голову?

Самая простая идея заключается в том, чтобы производить действия сле-

дующим образом:

1)вычислить длину первого отрезка пути, который пролетит муха

2)вычислить длину второго отрезка и прибавить к предыдущему

3)вычислить длину третьего отрезка и сложить с ранее полученной суммой

и т.д.

Мы можем этот процесс представить в виде

18

Глава 1 Основы программирования

____________________________________________________________________

Sстар=0

Вычисление 1-го отрезка x1

Sнов. = Sстар. + x1

Sстар. = Sнов.

Вычисление 2-го отрезка x2

Sнов. = Sстар. + x2

Sстар. = Sнов.

и т.д.

Рис. 1.2. Первый вариант алгоритма

Тут же возникает вопрос: т.к. схема должна иметь конечную длину, то нужно средствами рисунка выразить понятие повторения, кроме того, надо ука-

зать какие величины нужно вывести на экран. Отсюда схему перечерчиваем в виде:

Sстар=0

i=1

Вычисление i-го отрезка xi

Sнов. = Sстар. + xi

Sстар. = Sнов.

xi, Sнов

i=i+1

Рис. 1.3. Второй вариант алгоритма

19

1.1 Понятие алгоритма.

____________________________________________________________________

Случается, что когда некоторая последовательность операций закончена,

необходимо бывает вернуться и повторить эти операции. Это называется цик-

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

вторений n, а также заданы все исходные данные, тогда блок-схема примет вид:

начало

Ввод d,v1,v2,n,v

Sстар=0

i=1

Вычисление i-го отрезка xi

Sнов. = Sстар. + xi

Sстар. = Sнов.

xi, Sнов.

i=i+1

да

i≤n

нет

конец

Рис. 1.4. Третий вариант алгоритма

20

Глава 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]