logo search
Программа ГЭ_спец_2012 ответы light

Раздел 1. Программирование на языке высокого уровня

  1. Цели и принципы структурного и объектно-ориентированного программирования. Модульное программирование. Восходящий и нисходящий подход. Основные этапы разработки программ. Классификация языков программирования, сравнительная характеристика. Алфавит, синтаксис, семантика языков программирования.

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

Цели структурного программирования:

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

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

3) уменьшить время и стоимость программной разработки. Достижимо при повышении производительности труда программиста;

4) улучшить читабельность программ; это значит, что необходимо избегать использования языковых конструкций с неочевидной семантикой, стремиться к локализации действия управляющих конструкций и использования структур данных, разрабатывать программу так, чтобы ее можно было бы читать от начала до конца без управляющих переходов на другую страницу;

Основные принципы структурной методологии:

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

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

3. Принцип "разделяй и властвуй". Определяет способ решения трудных задач путем разделения этой задачи на множество мелких, легко решаемых. Этот принцип реализуется путем создания подпрограмм.

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

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

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

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

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

Основные принципы объектно-ориентированного программирования:

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

2. Инкапсуляция есть объединение в едином объекте данных и кодов, оперирующих с этими данными. В терминологии объектно-ориентированного программирования данные называются членами данных (data members) объекта, а коды - объектными методами иди функциями-членами (methods, member functions)

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

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

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

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

Для тестирования и отладки компонентов проектируют и реализуют специальные тестирующие программы.

Подход имеет следующие недостатки:

- увеличение вероятности несогласованности компонентов вследствие неполноты спецификаций;

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

- позднее проектирование интерфейса, а соответственно невозможность продемонстрировать его заказчику для уточнения спецификаций и т.д.

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

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

Нисходящий подход обеспечивает:

- максимально полное определение спецификаций проектируемого компонента и согласованность компонентов между собой;

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

- возможность нисходящего тестирования и комплексной отладки.

Основные этапы разработки программ:

-Постановка задачи – техническое задание

-Анализ требований и разработка спецификаций – Эскизный проект

-Проектирование – Технический проект

-Реализация – Рабочий проект

-Внедрение

-Сопровождение

Языки программирования:

- процедурные

- функциональные

- логические

- объектно-ориентированные

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

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

Примером функционального языка является язык LISP (List Processing-обработка списков) Разработан и реализован в Массачусетском технологическом институте в 1959 г. Рассматривается специалистами как основной язык программирования систем искусственного интеллекта.

Логическое программирование. Логика и программирование долгое время были непересекающимися областями исследований. Только в 1973 впервые было опубликовано описание языка PROLOG (PROgramming in LOGic- программирование в терминах логики) Центральным понятием в логическом программировании является отношение. Программа представляет собой совокупность определений отношений между объектами и цели. В логическом программировании нужно только специфицировать факты, на которых алгоритм основывается, а не определять последовательность шагов, которые требуется выполнить. Логические программы отличаются принципиально низким быстродействием. Так как вычисления осуществляются методом проб и ошибок (посредством поиска с возвратами). В настоящее время для ПК существует около двух десятков реализации PROLOG’а, некоторые из которых оформлены в виде интегрированных сред.

Объектно-ориентированное программирование. Корни объектно - ориентирования уходят в одну из ветвей логики, в которой первичной является не отношение, а объект. Прототипом объектно-ориентированного программирования явился язык SIMULA-67. Но оформилось оно в самостоятельный стиль программ ирония с появлением языка (SMALLTALK-1972 г.), первоначально предназначенного для реализаций функций машинной графики. Этот стиль программирования характеризуется богатыми графическими возможностями и средой программирования, развитой модульной структурой программ. Именно модульность упрощает разработку сложных программных продуктов. Как пример объектно-ориентированного языка можно назвать Visual Basic и Delphi.

Алфавит – фиксированный для данного языка набор символов (букв, цифр, специальных знаков и т.д.), которые могут быть использованы при написании программы.

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

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

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

Тип данных – характеристика множества значений, которые могут принимать переменные этого типа.

Традиционно, типы данных подразделяются на несколько подвидов:

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

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

в) вещественный – (real). Данный тип применяется, если вычисления не могут быть выполнены без использования дробных значений. Значения вещественного типа возвращаются многими стандартными математическими функциями и операцией деления. Вещественные значения разделяются на разновидности согласно их точности и диапазону принимаемых значений. В памяти ЭВМ такие значения представлены в форме с плавающей точкой.

г) символьный – (char, string). Переменные строковых типов используются для хранения и обработки текстовой информации. Переменная типа char содержит одиночный символ, типа string – последовательность символов. Константы символьного типа бывают двух разновидностей, первая из которых подразумевает использование символа, вторая – кода символа.

Тождественность и совместимость типов:

Два типа, скажем T1 и T2, являются тождественными, если является истинным одно из следующих утверждений: T1 и T2 представляют собой один и тот же идентификатор типа; T1 описан как эквивалентный типу, тождественному T2.

Совместимость типов имеет место, если выполняется, по крайней мере, одно из следующих условий:

• Оба типа являются одинаковыми.

• Оба типа являются вещественными типами.

• Оба типа являются целочисленными.

• Один тип является поддиапазоном другого.

• Оба типа являются отрезками одного и того же основного типа.

• Оба типа являются множественными типами с совместимыми базовыми типами.

• Один тип является строковым типом, а другой - строковым типом, упакованным строковым типом или типом PChar;

• Один тип - это тип Pointer, а другой - любой ссылочный тип.

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

Пользовательские типы данных:

перечисляемый тип (перем1, перем2, .. , перемN), диапазон (конс1 .. конс2)

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

<порядковый тип>: array [<порядковый тип>, ..] of Integer;

Часто при передаче большого объёма разнородной (разнотипной) информации бывает удобно создавать группы значений. Такие группы называются структурами или записями (Record). Запись включает в себя одно или несколько полей, каждое из которых может иметь свой тип. В отличие от массивов, поля записи различаются не индексами, а идентификаторами.

Общий синтаксис объявления переменной типа запись:

Record

<ид_поля1>:<тип_поля1>;

<ид_поля2>:<тип_поля2>;

<ид_поляn>:<тип_поляn>;

Case [имя параметра]: <тип> of

<конст1> : (<список полей>);

<констN> : (<список полей>);

End;

Диапазон значений множественного типа представляет собой мощность множества для определенного порядкового типа (базового типа). Синтаксис: Set of <порядковый тип>. Для множеств применимы операции пересечение (*), объединение (+), разность (-).

Файлы:

Файловая переменная в Паскале - это любая переменная файлового типа. В Паскале имеются три класса файлов: типизированный файл (file of тип), текстовый файл (text) и нетипизированный файл (file). Основные операции по работе с файлами приведены в таблице.

По способу доступа к компонентам различают файлы последовательного и прямого доступа.

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

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