Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Chast_1-Osnovy_informatiki

.pdf
Скачиваний:
15
Добавлен:
09.06.2015
Размер:
967.67 Кб
Скачать

2 . Методы и средства разработки программ

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

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

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

2.2.3. Модульное программирование

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

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

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

76

2 . Методы и средства разработки программ

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

Перечислим основные рекомендации при модульном подходе к написанию программы:

модуль как отдельный программный объект должен реализовывать одну функцию (одно назначение), быть простой программой и предваряться комментарием;

модуль должен иметь один вход и один выход, и возвращать управление в то место, откуда он вызывался; на него можно ссылаться только по имени;

модуль должен быть невелик: он ограничивается либо числом операторов (обычно менее 200), либо размером занимаемой памяти, либо временем выполнения.

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

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

2.2.4. Структурное программирование

Структурное программирование определяет общий подход, реализуемый на всех стадиях решения задачи: проектирования, собственно программирования (кодирования) и тестирования. Это – метод программирования, основывающийся на ряде правил, облегчающих восприятие и сопровождение программы. Структурный подход позволяет создавать большие программы практически без ошибок и при этом укладываться в запланированные сроки. Целью его являются программы, которые можно без участия авторов понимать, сопровождать и модифицировать (а стоимость сопровождения и модификации, как показывает практика, в несколько раз превышает стоимость написания программы). Структурное программирование объединяет несколько приемов создания структурированной программы: это так называемая нисхо-

77

2 . Методы и средства разработки программ

дящая разработка программы, применение базовых структур и сквозной структурный контроль.

Обычно при проектировании программа разбивается на отдельные функциональные модули-блоки, которые соединяются в блок-схему на нескольких уровнях. Традиционно проектирование прикладных программ ведется «сверху вниз», а программирование – «снизу вверх», т. е. при восходящем подходе («снизу вверх») вначале кодируются модули самого низкого уровня. Основная трудность при этом заключается в том, что каждый модуль по отдельности может правильно работать, но при совместном выполнении всех модулей они могут не заработать. Таким образом, поиск ошибок и их исправление на заключительной стадии затягиваются, а обнаруженные недочеты могут привести к перепроектированию задачи, т. е. возвращению на начальную стадию создания программы.

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

Логическая структура программы в структурном программировании строится на трех базовых структурах: «следования», «развилки», «цикла». Каждая из них имеет один вход и один выход, как того требует понятие модуля, и выражается соответствующим оператором в языках программирования. Структура «следование» означает, что два действия (два модуля) должны выполняться одно за другим. Структура «развилка» (ЕСЛИ-ТО-ИНАЧЕ) обеспечивает выбор между двумя альтернативами: проводится проверка условия и затем выбирается один из путей. Структура «цикл» предусматривает многократное исполнение модулей до тех пор, пока логическое выражение остается истинным. Все три структуры могут разными способами сочетаться друг с другом в зависимости от того, как это предусматривает программа. Их применение организует поток управления «сверху вниз», что облегчает чтение и модификацию программы.

Под сквозным структурным контролем понимается серия проверок,

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

78

2 . Методы и средства разработки программ

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

Один из основных приемов структурного программирования сводится к пошаговой детализации, при которой наиболее важные элементы рассматриваются в первую очередь, т. е. первоначально программа составляется и отлаживается на уровне крупных модулей (модулей верхнего уровня), без конкретизации некоторых из них. Можно, например, в модуле вывода информации сначала не заниматься сервисной формой выдачи результатов в виде таблиц и графиков. После же отладки алгоритмов и логических связей модулей одного уровня выполняется функциональное разложение того или иного модуля на подфункции – модули следующего, нижнего уровня. Иными словами, метод пошаговой детализации – это итеративный процесс, в котором при каждом прохождении программы рассматриваются все более подробные детали.

2.2.5. Объектно-ориентированное программирование

Объектно-ориентированное программирование (ООП) – это подход в технологии программирования, основанный на более высоком уровне абстрагирования и модульности при составлении программ.

Ключевым понятием объектно-ориентированного программирования является объект. Объект – это совокупность свойств (параметров) определенных сущностей и методов их обработки (программных средств). Объект содержит инструкции (программный код), определяющие действия, которые может выполнять объект, и обрабатываемые данные. Свойства объекта в совокупности выделяют объект из множества других объектов. Методы обработки объекта, либо созданные пользователем, либо заимствованные в стандартных библиотеках, обычно связываются с наступлением определенных событий (изменений состояний объекта). Объект рассматривается как единое целое, в неразрывной связи всех его свойств и поведения. Именно это обеспечивает простоту и универсальность ООП, так как описание объекта функционально завершено. В основе технологии объектно-ориентированного программирования лежат три принципа.

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

79

2 . Методы и средства разработки программ

Другим важным принципом является наследование, которое заключается в распространении свойств данного объекта на другие объекты и помогает снизить затраты на введение объекта с новым качеством, что существенно при построении иерархии производных объектов («потомков»). При этом наследуется доступ к данным и методам работы от предшествующих объектов, так называемых «прародителей». Важно, что главным выступает механизм наследования методов, а не данных. Благодаря этому принципу при доступе к любому объекту из заданной иерархии можно пользоваться некоторыми методами, не заботясь об их конкретной реализации.

Третий принцип ООП, называемый полиморфизмом, позволяет употреблять одинаковые имена методов на разных уровнях иерархии порожденных объектов. Это означает, что одинаковому логическому действию (процедуре или функции) на разных уровнях можно давать одно имя, в то время как само действие может иметь различные программные реализации с учетом собственных конкретных условий задачи на том или ином уровне. Аналогией может служить, например, термин «структура», отражающий логическое понятие административных связей учебного учреждения и имеющий различные реальные представления в зависимости от уровня подразделений: кафедры, факультета, ректората.

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

2.3.Основные элементы языков программирования высокого уровня

2.3.1.Краткая характеристика языков программирования высокого уровня

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

80

2 . Методы и средства разработки программ

машинные языки и языки программирования высокого уровня. Это противопоставление относительно и неформально, но обычно предполагается, что для программирования на языке программирования высокого уровня не требуется знание машинных команд. В принципе возможен перенос написанных на таком языке программ с одной вычислительной системы на другую. Предлагаемая таким языком нотация «человечнее» (ближе к языку формулирования задачи), чем допускаемая машинным языком.

В информатике нередко используются как синонимы термины «алгоритмический язык» и «язык программирования». Но иногда они противопоставляются по двум признакам: не всякий алгоритмический язык, т. е. язык для записи алгоритмов, подкреплен реализацией на ЭВМ в рамках некоторой системы программирования; не всякий язык программирования – алгоритмический, бывают и непроцедурные, описательные языки программирования.

Алгоритмические языки определяются заданием алфавита, синтаксиса и семантики. Алфавит языка – это словарь исходных символов, применяемых для записи любых символьных последовательностей, образующих конструкции и предложения языка. Синтаксис – это набор правил, определяющих допустимые конструкции языка (грамматика языка). Семантика – это система правил и соглашений, определяющая толкование и придание смысла конструкциям языка. Благодаря ограниченному набору изобразительных средств и однозначному пониманию текста алгоритмические языки позволяют сжато и наглядно описать вычислительный процесс.

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

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

81

2 . Методы и средства разработки программ

По степени зависимости от ЭВМ языки программирования классифицируются на машинно-ориентированные (машинно-зависимые) и проблемноориентированные (машинно-независимые). Машинно-ориентированные языки – их также называют языками символического кодирования – универсальны в той же степени, что и машинный язык: при переводе каждая команда мнемокода заменяется одной машинной командой. Однако они довольно трудны для изучения и сложны для программирования. Одним из самых распространенных языков этого типа является Ассемблер – язык системного программирования; он уменьшает трудности использования машинного языка, сохраняя все его возможности, благодаря замене числового представления машинной команды символическим значением – мнемокодом. Ассемблер применяют также при написании прикладных программ, требующих эффективного использования ресурсов машины. Расширение Ассемблера путем введения макрокоманд (эквивалентных нескольким машинным командам) упрощает написание на нем программ.

Машинно-независимые языки по структуре значительно ближе к обычному языку, чем к машинному. Они создаются для описания алгоритмов профессиональной направленности: задач вычислительной математики, экономических задач, задач преобразования символьной информации и других. Поэтому изучение таких языков легче, а программирование на них проще. Одно предложение-инструкция таких языков развертывается в несколько машинных команд, в результате исходные программы становятся короче, яснее, уменьшается вероятность появления ошибок и снижаются трудозатраты на написание программ.

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

Приведем краткую характеристику некоторых из известных языков программирования.

Алгол-60 (ALGOL) – алгоритмический язык, ориентированный на решение задач вычислительной математики. Он характеризуется практически полной независимостью от машины, строго формальным описанием синтаксиса, блочной структурой программ, позволяющей разделить работу по составлению больших программ на независимые части. Основные понятия это-

82

2 . Методы и средства разработки программ

го языка используются во многих других языках программирования (Паскаль, ПЛ/1).

Фортран (FORTRAN) – язык программирования для решения научных и инженерных задач. Он отличается высоким качеством получаемых программ, развитыми средствами описания форматов вводимых и выводимых данных, имеет обширную библиотеку стандартных программ.

Кобол (COBOL) – язык программирования для обработки данных, близкий к языку, на котором формулируются и решаются, главным образом, экономические задачи. Он предусматривает однотипную обработку больших по объему совокупностей данных, которые могут представляться в виде таблиц; на нем возможно также составление разных документов, отчетов в заданной форме.

ПЛ/1 (PL/1) – многоцелевой язык программирования, в котором собраны средства для решения различных задач: экономических, информационных, научно-технических, управления в реальном масштабе времени, системного программирования. В нем объединены фундаментальные понятия языков Алгол-60, Фортран, Кобол.

Бэйсик (BASIC) – язык программирования, ориентированный на составление так называемых интерактивных программ, при реализации которых возможен диалог человека с ЭВМ. Он используется, в частности, для решения различных вычислительных задач. При создании Бэйсик предназначался для начинающих и вводного курса по информатике.

Паскаль (PASCAL) – язык программирования широкого назначения, является преемником языка Алгол-60, но расширен средствами эффективной работы с различными типами и структурами данных. В нем использованы понятия записи и файла, введены элементы абстракции данных – задание типа данных указанием множества допустимых значений и операций над ними.

Лисп (LISP) – язык программирования для обработки списков данных. Основу его составляет набор функций, значением которых может быть другая функция и с помощью которых можно конструировать функции более высокого уровня. Лисп имеет механизмы для обработки символьных текстов, обладает единым подходом к обработке программ и данных, обеспечивает автоматическое управление памятью. Он используется при решении прикладных задач в области создания искусственного интеллекта.

Си (С) – эффективный, позволяющий работать и на низком уровне язык системного программирования; на нем почти полностью написана, например, операционная система UNIX. В отличие от других языков высокого

83

2 . Методы и средства разработки программ

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

Охарактеризованные языки называют процедурными (или предписывающими). Программы на них реализуют конкретный алгоритм действия: они определяют, как достичь результата, указывают порядок всех действий от начала до конца. Также приобрели большое значение непроцедурные (или описательные) языки программирования. На таком языке в программе формулируются отношения, а не последовательность действий: при написании программы упор делается на то, какой результат желателен, каков искомый объект (описание его свойств), а не как его получить, тем самым отпадает необходимость разрабатывать шаги алгоритма и определять их порядок. К непроцедурным языкам относится, например, Пролог. Он ориентирован на реализацию методов логического программирования.

Пролог (PROLOG) – язык программирования, предназначенный для приложений, использующих средства и методы искусственного интеллекта: создания экспертных систем, управления сложнейшими производственными процессами, доказательства математических теорем, переводов с одного языка на другой и т. п. В Прологе имеются средства взаимоотношения с внешним источником информации и изменения своей базы данных, сопоставления с эталоном представления знаний. Программа на Прологе состоит из фактов и правил, с их помощью получают другие факты и ответы.

Сейчас широко используются языки программирования, реализующие технологию объектно-ориентированного программирования. Идеи ООП получили конкретную реализацию при создании языков программирования С++, OBJECT PASCAL, VISUAL BASIC.

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

2.3.2.Элементарные конструкции символы, константы, идентификаторы, переменные

Общий набор изобразительных средств языков программирования высокого уровня включает следующие символы (литеры):

1)26 букв латинского алфавита – от а до z;

2)10 десятичных цифр – от 0 до 9;

84

2 . Методы и средства разработки программ

3)знаки арифметических операций: сложения {+}, вычитания {–}, умножения {*}, деления {/};

4)другие символы – круглые скобки {( )}, запятую {,}, десятичную точку {.}. Пробел { } не имеет символического изображения, он используется для удобства чтения и написания программы.

Каждый язык содержит 6 знаков операций отношения («больше», «не меньше», «меньше», «не больше», «равно», «не равно»), но их представления различны. Алфавит отечественных версий языков дополняется русскими буквами.

Кроме указанных общих литер языки содержат индивидуальные изобразительные средства.

Константы – это первичные конструкции языка, которые не изменяются в процессе выполнения программы. Существуют три вида констант: текстовые (строки), логические (ДА, НЕТ), арифметические (числа). Тип константы определяется ее записью.

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

Логические константы принимают одно из двух логических значений: утвердительное – TRUE (ИСТИНА или ДА) и отрицательное – FALSE (ЛОЖЬ или НЕТ).

Числа могут представляться как целые и вещественные. Целое число изображается конечной последовательностью десятичных цифр и при необходимости снабжается знаком (например, 32 или –51). Вещественное число содержит в записи десятичную точку вместо запятой (например, –235.01).

При представлении числа в форме N = m 10n целый показатель степени n со знаком или без него следует в строке цифр числа после буквы Е, заме-

няющей основание показателя. Например, запись числа 2,25 103 имеет вид

2.25E − 3.

Число, строка и логическая константа являются значениями. В общем случае значение – это упорядоченное множество чисел, вектор строк или логических значений.

Идентификатор – это символическое имя (наименование), которое дается объекту программы (переменным, массивам, функциям, процедурам)

85

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