Мансуров. Основы программирования в среде Lazarus. 2010
.pdfГлава 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
1.1 Понятие алгоритма.
____________________________________________________________________
1.1.3 Вместо лирического отступления
Какие выводы можно сделать из анализа этой задачи с точки зрения разра-
ботки алгоритма или, как еще говорят, алгоритмизации данной задачи?
Во-первых, крайне редко и для очень простых задач удается сразу и без-
ошибочно записать алгоритм. В большинстве случаев приходится, как мы ви-
дели, начинать с самой общей и несколько "расплывчатой" формулировки ал-
горитма. В любом случае стоит даже этот алгоритм записать в виде блок схемы
(рис. 1.2). Потому что одно из несомненных достоинств записи алгоритма в ви-
де блок-схемы заключается в том, что это позволяет увидеть структуру алго-
ритма.
Постепенно мы детализировали алгоритм, с каждым шагом улучшая и со-
вершенствуя его. Кстати, метод, которым мы воспользовались, так и называется
метод пошаговой детализации.
Во-вторых, многие молодые, особенно начинающие, программисты часто вообще игнорируют этап составления алгоритма, и едва успев прочесть усло-
вие задачи, сразу садятся за компьютер и начинают писать программу. Встре-
чаются, конечно, сверходаренные люди, которые могут позволить себе это, и
то – не всегда. Но таких – единицы! Большинству "смертных" приходится по-
шагово разрабатывать алгоритмы и записывать их в том или ином виде.
В-третьих, автор многократно наблюдал такую картину – студент получает задание, записывает условие задачи себе в тетрадь и … застывает как сфинкс!
Проходит минут пять, десять, двадцать, … много проходит времени, а он даже не шелохнется, не в силах предложить что-нибудь путное! Потом, когда спра-
шиваешь у него – о чем ты думал в это время, ответы неопределенные, чаще всего типа "не знал с чего начать".
Помимо стандартного ответа – "если не знаешь с чего начать, начни с на-
чала", что еще можно посоветовать:
1. Еще более стандартно – больше читайте книг, скрупулезно разбирайте
26
Глава 1 Основы программирования
____________________________________________________________________
примеры, приведенные в них. "Горе тому, кто читает только одну книгу" (Джордж Герберт).
2. Одного чтения и "понимания" примеров в книгах недостаточно. Надо самостоятельно тренироваться в составлении алгоритмов для самых разных за-
дач. Если можно так выразиться – тренируйте "соображалку"! Лучший способ такой. Если вы видите в книге подробно разобранный пример, не спешите чи-
тать дальше. Попробуйте составить алгоритм самостоятельно! Это может от-
нять у вас довольно много времени. Не жалейте его! И только после полного завершения составления алгоритма можете свериться с книгой. На первых по-
рах у вас может ничего не получаться. Не отчаивайтесь, со временем придет умение и опыт.
3. Не стесняйтесь спрашивать, перенимайте опыт у других. В сети огром-
ное количество форумов по программированию. Зайдите в любой из них, по-
смотрите, какие вопросы там задаются и, опять, постарайтесь сначала сами от-
ветить на этот вопрос и лишь после этого можете смотреть, как на этот вопрос отвечают другие. В конце книги приведены адреса нескольких сайтов, в кото-
рых имеются форумы по программированию, в частности форум, посвященный программированию в среде Lazarus.
4. У вас должна быть создана (со временем, конечно!) своя коллекция ал-
горитмов, собственных наработок, типовых приемов и даже готовых кусков ко-
да, которые вы будете вставлять в будущие свои программы.
И, наконец, сплошь и рядом встречаются ситуации, когда не помогает ни опыт, ни знания. Как быть? Готовых рецептов не существует. И здесь снова хо-
чу подчеркнуть, что программирование это творчество. А в творчестве нет, и не может быть никаких готовых рецептов. Здесь, как говорится, дело в "искре божьей"! Уместно вспомнить и высказывание Остапа Бендера – "блондин игра-
ет в шахматы хорошо, брюнет играет плохо и никакие лекции не изменят этого соотношения сил"!
27
1.2 Этапы подготовки задачи для решения на компьютере
____________________________________________________________________
1.2. Этапы подготовки задачи для решения на компьютере
Процесс решения задачи на компьютере состоит из ряда этапов, включаю-
щих как подготовку задачи к решению, так и собственно решение.
Эти этапы включают:
1.постановку задачи;
2.построение модели изучаемого процесса или явления;
3.выбор метода решения;
4.разработка алгоритма решения задачи;
5.составление программы (кодирование);
6.отладка и тестирование программы;
7.собственно вычисления;
8.анализ полученных результатов.
Рассмотрим эти этапы.
Постановка задачи.
Под постановкой задачи подразумевается определение цели или целей, ко-
торых необходимо достичь в результате решения данной задачи. В постановку задачи входит определение необходимой информации (что дано), результата решения задачи (что требуется определить) и выработка общего подхода к ре-
шению задачи.
Построение соответствующей модели изучаемого процесса или явле-
ния.
На этом этапе производится выбор из всего множества зависимостей и свя-
зей основных, определяющих тот или иной реальный процесс, явление и фор-
мирование гипотез, позволяющих представить реальный, обычно достаточно сложный процесс, в виде уже известных процессов. Моделирование предусмат-
ривает некоторую разумную абстракцию, дающую возможность с достаточной точностью представить себе реальные физические, информационные или эко-
28
Глава 1 Основы программирования
____________________________________________________________________
номические процессы.
Для адекватного отражения сути изучаемого процесса или явления прихо-
дится разрабатывать различные модели. Чаще всего используются информаци-
онные и математические модели. В информационной модели указываются наиболее значимые характеристики объекта, имеющих существенное значение для данной задачи. Например, если создается база данных таксопарка, то наи-
более значимыми характеристиками такого объекта как автомобиль являются марка автомобиля, год выпуска, государственный номер и др.
Под математической формулировкой задачи или как ее иногда называют математической моделью, подразумевается любое математическое описание изучаемого процесса или явления в виде уравнений или неравенств. В качестве уравнений могут быть алгебраические и трансцендентные уравнения, системы линейных алгебраических уравнений, дифференциальные уравнения, инте-
гральные уравнения и т.д.
К математическому описанию предъявляются, в общем, противоречивые требования. С одной стороны математическое описание должно быть полным, с
другой стороны желательно, чтобы математические зависимости были проще.
Выбор метода решения.
Выбор метода решения зависит от вида модели, постановки задачи и воз-
можностей имеющихся средств вычислительной техники. Многие задачи мож-
но решить разными методами и способами, поэтому актуальным становится выбор оптимального метода. Причем критерии оптимальности даже для одной и той же задачи могут быть разными.
Например, разработать базу данных таксопарка с максимальным количест-
вом сервисных функций и процедур, причем руководство таксопарка готово за-
купить и установить столько компьютеров, сколько необходимо для успешного функционирования этой базы.
Или за неимением достаточных средств, руководство таксопарка согласно установить только один компьютер в планово-экономическом отделе. Ясно, что
29
1.2 Этапы подготовки задачи для решения на компьютере
____________________________________________________________________
базы данных в первом и втором случаях будут существенно разниться по своим функциональным возможностям и по методам, использованными разработчи-
ками для реализации этих баз данных.
Поскольку компьютеры оперируют с числами, то в качестве методов ре-
шения математических моделей обычно применяются численные методы. Пре-
образование математических выражений, характерное для классической мате-
матики, не является типичным при применении компьютеров. Хотя в последние годы появились мощные программные системы типа MAPLE, которые позво-
ляют производить и символьные вычисления. В то же время численные методы часто позволяют решать задачи, которые методами классической математики обычно неразрешимы.
Разработка алгоритма решения задачи.
Характер работы на этом этапе существенно зависит от предыдущих эта-
пов. Кроме того, имеет значение и размер задачи. Если это достаточно простая задача, с которой может справиться один человек, то работа может идти при-
мерно так, как в примере, рассмотренном в предыдущем разделе (задача о по-
ездах и мухе).
Для средних и крупных проектов, для реализации которых могут потребо-
ваться группа или даже целый коллектив программистов, возникают проблемы определения методологии проектирования, планирования и распределения ра-
бот между членами группы, их взаимодействия и пр.
Важное значение имеет выбор средств проектирования и разработки ПО. В
настоящее время широкое распространение получили так называемые RAD-
системы (Rapid Application Development – быстрая разработка приложений). В
качестве примера приведу такие системы так Microsoft Visual Studio 2008, Code Gear RAD Studio 2009, Embarcadero RAD Studio 2010 в которых имеются разви-
тые средства для разработки ПО в коллективе.
30