Введение в теорию программирования
Вид материала | Программа |
- К. Е. Карасёв Введение в теорию конечных автоматов, 593.28kb.
- Джон Р. Хикс. "Стоимость и капитал", 4314.44kb.
- А. В. Корицкий введение в теорию человеческого капитала учебное пособие, 1340.03kb.
- Лекция 1 Введение в современные технологии программирования, 526.22kb.
- Г. В. Мелихов миф. Идентичность. Знание: введение в теорию социально-антропологических, 741.74kb.
- Введение Предмет "Программирование", 19.2kb.
- Анализ и планирование трудовых показателей Аудит и контроллинг персонала Введение, 12.45kb.
- Государственный университет высшая школа экономики л. Л. Любимов введение в экономическую, 3625.38kb.
- Дополнительный материал к курсу лекций Введение в теорию межкультурной коммуникации, 753.88kb.
- Лекция 3 Инструментальное по. Классификация языков программирования, 90.16kb.
РАСЧЕТНО-ГРАФИЧЕСКАЯ РАБОТА (Delphi-проект)
Теоретические вопросы для выполнения РГР
I. ВВЕДЕНИЕ В ТЕОРИЮ ПРОГРАММИРОВАНИЯ
Компьютерная программа представляет собой набор инструкций (команд) по обработке информации, которые выполняются основным вычислительным устройством компьютера - процессором. Процесс написания программы называется программированием.
В программировании выделяют языки различных уровней: машинные (низкоуровневые), Ассемблер и языки высокого уровня (алгоритмические языки) [Pascal, Basic, Fortran, Java и т.д.].
Машинный язык (язык низкого уровня) представляет собой систему команд компьютера и реализуется им непосредственно. Программа на машинном языке представляет собой последовательность машинных команд и фиксированных областей памяти, выделенных под переменные и константы. При разработке программы на машинном языке необходимо, прежде всего, распределить память под переменные и константы, т. е. для каждой переменной или константы выделить некоторое количество ячеек памяти. Для задания, например, константы в выделенную область памяти записывается соответствующее значение. Структура машинной программы не фиксирована, так как переменные и константы могут чередоваться с командами в любом порядке. При этом никакой разницы между элементами памяти, в которых содержатся команды, константы или переменные, нет. Так, элемент памяти, отведенный под команду, может быть использован как переменная или константа. Контроль за правильностью их использования осуществляет только программист. Это приводит к большому числу ошибок, которые иногда очень трудно обнаружить.
Действия, выполняемые машинными командами, элементарны: например, переслать содержимое одной ячейки памяти в другую, сложить содержимое двух ячеек и т. д. Между тем запись программы с помощью таких действий требует больших трудозатрат. На машинном языке очень неудобна отладка программы, так как, например, добавление всего лишь одной команды в программу может вызывать изменение большого количества адресов (например, если память компьютера составляет 1 Мбайт, то программист должен помнить обо всем, что записано примерно в 1000000 ячеек памяти).
Машинный язык позволяет использовать все возможности аппаратуры персонального компьютера. С его помощью можно создавать достаточно эффективные программы. Но достичь высоких характеристик надежности программы и производительности труда программистов, работая на нем, очень сложно.
Языки уровня Ассемблера являются машинно-ориентированными, соответствуют системам команд компьютера, но позволяют составлять программы в форме, более удобной для человека. Преимуществом языка Ассемблера является символическая адресация (мнемонический язык - для упрощения запоминания одни коды заменяются другими), когда командам, константам и переменным присваиваются некоторые имена, по которым к ним можно обращаться. Предусматриваются также средства соединения нескольких программ в единый программный модуль и средства контроля ошибок. К недостаткам относятся излишняя детализация записи программ, отсутствие контроля за обращением к элементам памяти.
Рассмотрим пример записи в процессорный регистр ax числа 100 (регистр – внутренняя ячейка памяти самого процессора – 32 разряда).
Машинная команда:
102/184/100/0 (в десятичной сист. счисления)
01100110 10111000 01100100 00000000 (то же в двоичной сист. счисления)
Ассемблер: MOV ax,100.
Язык высокого уровня Pascal: Result := 100 .
Программирование в таких системах весьма трудоемко. Решение – использование транслятора, который позволяет записать адреса ячеек памяти в виде буквенных обозначений, понятных человеку, а затем преобразовать эти обозначения в реальные числа. Для этого транслятор должен "знать" все ячейки памяти, требуемые алгоритму, назначить им адреса из доступной памяти и заменить символьные адреса (определенные программистом) на числовые адреса по всей программе.
Резюмируя вышесказанное, транслятор – есть программа-переводчик с языка программирования с использованием слов и выражений, понятных человеку, на язык машинных команд.
Язык программирования высокого уровня и транслятор этого языка в машинные коды называют системой программирования.
Различают два вида трансляторов: интерпретаторы и компиляторы. Программа-интерпретатор переводит текст программы, составленный программистом, в машинные коды пооператорно без выхода из системы программирования, и при этом не создается исполнимый файл.
Программа-компилятор позволяет транслировать текст программы на язык машинных команд, которые записываются в виде исполнимого файла (и других служебных файлов, необходимых для работы программы в автономном режиме). Исполнимый файл можно запускать на любом другом компьютере, независимо от того, установлена там система программирования или нет.
Языки программирования, которые позволяют писать программы на языках, понятных человеку (например, английский), а затем с помощью программы-транслятора переводить их в машинные коды, называются языками высокого уровня или алгоритмическими языками.
Имена ячеек памяти называются символическими именами, названия которых придумывает человек с некоторой смысловой нагрузкой.
Алгоритмические языки, которые позволяют фрагментировать программу на подпрограммы, каждая из которых имеет собственное имя, а затем обращаться к этим подпрограммам по их именам, еще называют процедурными языками.
Подпрограммы могут быть представлены в виде процедур и функций (а также процедур-функций, например, в Бейсике). Процедура (функция) – некоторая последовательность операторов, имеющая собственное имя. Указание этого имени в тексте программы приводит к активизации процедуры (функции) и называется ее вызовом. Сразу после активизации начинают выполняться входящие в нее операторы, после выполнения последнего из них управление возвращается обратно в основную программу, и выполняются операторы, стоящие непосредственно за оператором вызова процедуры.
Функция отличается от процедуры тем, что результат ее работы возвращается в виде значения этой функции, следовательно, в теле функции должен обязательно присутствовать оператор присвоения вычислений в функции имени этой функции.
Развитием процедурного программирования является объектно-ориентированное программирование, суть которого: сначала создаются объекты («каркас» - программы) в виде формы с кнопками, различными переключателями, полями, а затем каждому объекту формы приписывает отклик (набор операторов) на определенное событие, например, нажатие кнопки (Delphi, Visual Basic, Visual C++, Visual Java).
Сущность объектно-ориентированного подхода к программированию
Основные идеи объектно-ориентированного подхода опираются на следующие положения:
- Программа представляет собой модель некоторого реального процесса и может быть описана как совокупность взаимодействующих между собой объектов.
- Объект - это абстрактная сущность, наделенная характеристиками объектов окружающего нас реального мира. Объекты можно классифицировать по разным категориям. Например, цифровые наручные часы Cassio принадлежат к классу часов. Каждый класс занимает определенное место в иерархии классов, например, все часы принадлежат классу приборов измерения времени (более высокому в иерархии), а класс часов сам включает множество производных вариаций на ту же тему. Таким образом, любой класс определяет некоторую категорию объектов, а всякий объект есть экземпляр некоторого класса.
Объект описывается набором параметров, значения которых определяют состояние объекта, и набором операций (действий), которые может выполнять объект.
- Взаимодействие между объектами осуществляется посылкой специальных сообщений от одного объекта к другому. Сообщение, полученное объектом, может потребовать выполнения определенных действий, например, изменения состояния объекта.
- Объекты, описанные одним и тем же набором параметров и способные выполнять один и тот же набор действий представляют собой класс однотипных объектов. Допускается определение программистом собственных классов объектов для решения конкретного набора задач.
Таким образом, объектно-ориентированный подход предполагает, что при разработке программы должны быть определены классы используемых в программе объектов и построены их описания, затем созданы экземпляры необходимых объектов и определено взаимодействие между ними.
Классы объектов часто удобно строить так, чтобы они образовывали иерархическую структуру. Например, класс “Студент”, описывающий абстрактного студента города Москвы (студент – учащийся вуза), может служить основой для построения классов “Студент МГУ”, “Студент РГУФК”, “Студент МИФИ” и т.д. Для всех классов наследуется общий признак – учащийся вуза.
Для каждого класса второго уровня есть отличительные черты, присущие только этому классу, например, представители класса “Студент РГУФК” изучают дисциплину “Теория и методика физической культуры”. Студенты МГУ этой дисциплины не изучают. В терминах объектно-ориентированного программирования это определяется как инкапсуляция. При этом указанная дисциплина может изучаться очно, заочно, экстерном (формы обучения). В терминах объектно-ориентированного программирования это определяется как полиморфизм.
Резюмируя, можно дать три определяющие понятия объектно-ориентированного программирования: наследование, инкапсуляция, полиморфизм.
При разработке интерфейса с пользователем программы могут использовать объекты общего класса “Окно” и объекты классов специальных окон, например, окон информационных сообщений, окон ввода данных и т.п. В таких иерархических структурах один класс может рассматриваться как базовый для других, производных от него классов. Объект производного класса обладает всеми свойствами базового класса (наследует их) и некоторыми собственными свойствами (инкапсулирует их), которые напрямую недоступны из вне; он может реагировать на те же типы сообщений от других объектов, что и объект базового класса и на сообщения, имеющие смысл только для производного класса. Например, во время движения объекта-автомобиля объект-водитель может воздействовать только на ограниченный набор органов управления (рулевое колесо, педали газа, сцепления и тормоза, рычаг переключения передач) и ему недоступен целый ряд параметров, характеризующих состояние двигателя и автомобиля в целом. Очевидно, для того, чтобы продуктивно применять объектный подход для разработки программ, необходимы языки программирования, поддерживающие этот подход. Одним из первых таких языков стал язык SmallTalk, в котором все данные являются объектами некоторых классов, а общая система классов строится как иерархическая структура на основе предопределенных базовых классов.
Практически все объектно-ориентированные языки программирования являются развивающимися языками, их стандарты регулярно уточняются и расширяются.
I I. ОБЪЕКТНО-ОРИЕНТИРОВАННАЯ СРЕДА DELPHI
Delphi — это среда быстрой разработки, в которой в качестве языка программирования используется объектно-ориентированный язык Object Pascal. В основе систем быстрой разработки (RAD-систем, Rapid Application Development — среда быстрой разработки приложений) лежит технология визуального проектирования и событийного программирования, суть которой заключается в том, что среда разработки берет на себя большую часть рутинной работы, оставляя программисту работу по конструированию диалоговых окон и функций обработки событий.
Разработчик Delphi Borland Software Corporation (корпорация основана в 1983 г.) выпустила большое количество версий. Предметом нашего изложения будет одна из последних на момент написания учебного пособия - седьмая.
Borland Delphi 7 может работать в среде операционных систем от Windows 98 до Windows XP. Требования к компьютеру: процессор Pentium II 400 МГц и более выше, оперативная память - 128 Мбайт (рекомендуется 256 Мбайт), достаточное количество свободного дискового пространства - приблизительно 500 Мбайт.
Интерфейс (вид экрана монитора) после запуска среды Delphi 7 по-умолчанию представлен следующими окнами (рис. А1):
1. Главное окно — Delphi 7 (№ 1);
2. окно просмотра списка объектов (дерево объектов) — Object TreeView (№ 4);
3. окно редактора свойств объектов (инспектор объектов) — Object Inspector (№ 5);
4. окно формы — Form 1 (№ 6);
5. окно редактора кода — Unitl.pas (№ 7);.
Функциональное объединение всех окон еще называют интегрированной средой.
Рис. A1. Интегрированная среда разработки приложений Delphi после запуска: 1 –главное меню главного окна ( File, Edit, Search, View, Project, Run, Component, Database, Tools, Window, Help); 2- закладка Standard библиотеки компонентов главного окна, 3- закладка System библиотеки компонентов главного окна, 4- окно просмотра списка объектов (дерево объектов) - Object TreeView, 5- окно редактора свойств объектов (инспектор объектов) - Object Inspector, 6- окно формы — Form 1, 7- окно редактора кода — Unitl.pas (№ 7)
Библиотека компонентов Delphi содержит набор (палитру) визуальных компонентов, объединенных в страницы. Каждая страница компонентов представлена закладкой (Standard, Additional, Win32,System и т.д.).
Окно просмотра списка объектов Object TreeView (дерево объектов) отображает иерархическую связь объектов составляемой программы. Объекты размещаются на форме, поэтому форма (Form1) является вершиной иерархии.
Окно редактора свойств объектов Object Inspector (инспектор объектов) состоит из двух разделов: Properties (свойства) и Events (события), представленные одноименными закладками. Инспектор объектов позволяет задавать свойства компонентов и обработчики событий. В терминологии визуального программирования объекты — это диалоговые окна и элементы управления (поля ввода и вывода, командные кнопки, переключатели и др.). Свойства объекта — это характеристики, определяющие вид, положение и поведение объекта. Например, свойства width и Height задают размер (ширину и высоту) формы, свойства тор и Left — положение формы на экране, свойство caption — текст заголовка.
Окно формы — Form 1 является основой всех программ Delphi. Это стандартное окно Windows. Открывается оно при запуске Delphi. На форме размещаются другие объекты: кнопки, переключатели, поля ввода/вывода и др. Во время проектирования форма покрыта сеткой из точек. Во время выполнения эта сетка не видна.
Окно редактора кода — Unitl.pas скрыто окном формы. Доступно через закладку Code. Также можно переключаться через меню View Toggle From/Unit или через клавишу F12. Окно редактора кода состоит из двух частей: Code Exploring (рис. А2, № 1) и собственно редактор кода (рис. А2, № 2). Первое окно позволяет делать быстрый переход между записями второго окна. Если программа небольшая (как в нашем случае), его можно закрыть. Собственно окно редактора кода содержит две страницы: Code и Diagram (рис. А2, № 3). Страница Code предназначена непосредственно для написания программы. В начале работы над новым проектом это окно редактора кода содержит сформированный Delphi шаблон программы. Окно редактора кодов содержит помощника написания кодов Code Insight, который автоматически предлагает написание доступных команд кода программы. Вызывается нажатием клавишей Ctrl+Пробел.
Рис. А2. Окно редактора кода
При сохранении проекта Delphi на диск записывается около десятка файлов с расширениями cfg, dof, res, ddp, dfm и др. Файл проекта будет иметь расширение dpr, а файл c текстом программы – pas. Программа, транслированная в машинные коды, будет иметь расширение exe.
Операторы Delphi
1. Оператор присвоения состоит из двух символов “двоеточие” и ”равно” (:=). Например A1:=123456 (пример блок-схемы оператора присвоения представлен на рисунке А3).
Рис. А3. Блок-схема оператора присвоения
2. Оператор условия If (пример блок-схемы условного оператора представлен на рисунке А4):
Рис. А4. Блок-схема оператора условия
if условие then
begin
{Оператор 1}
{Оператор (операторы) выполняется, если условие истинно}
end
else
begin
{Оператор 2}
{Оператор (операторы) выполняется, если условие ложно}
end;
Перед else (после end) точка с запятой не ставится.
Выполняется инструкция if следующим образом:
2.1. Вычисляется значение условия (условие — выражение логического типа, значение которого может быть равно истина - true или ложь - false).
2.2. Если условие истинно (значение выражения условие равно true), то выполняются инструкции, следующие за словом then (между begin и end). На этом выполнение операции if заканчивается, то есть инструкции, следующие за else, не будут выполнены.
Если условие ложно (значение выражения условие равно false), то выполняются инструкции, следующие за словом else (между begin и end).
По представленной блок-схема на рисунке А4 фрагмент программы будет выглядеть следующим образом:
If a > b Then
c := 1
ELSE
c := 0;
3. Оператор цикла for – цикл со счетчиком (пример блок-схемы цикла со счетчиком на рисунке А5).
Рис. А5. Пример блок-схемы цикла со счетчиком
for счетчик := нач_знач to кон_знач do
begin
{ Оператор (операторы), который выполнится несколько раз }
end
где:
- счетчик — переменная-счетчик числа повторений инструкций цикла;
- нач_знач-- выражение, определяющее начальное значение счетчика циклов;
- кон_знач — выражение, определяющее конечное значение счетчика циклов.
Переменная счетчик, выражения нач_знач и кон_знач должны быть целого типа.
Количество повторений операторов в цикле можно вычислить по формуле
(кон_знач — нач_знач + l).
По представленной блок-схема на рисунке А5 фрагмент программы будет выглядеть следующим образом:
Summa := 0;
FOR i := 1 TO 10 DO
BEGIN
Summa := Summa + i;
END;
Используя данный фрагмент программы, можно рассчитать сумму всех чисел от 1 до 10.
4. Оператор цикла с предусловием While (пример блок-схемы цикла с предусловием представлен на рисунке А6).
Инструкция (цикл) while используется в том случае, если некоторую последовательность действий (инструкций программы) надо выполнить несколько раз, причем необходимое число повторений во время разработки программы неизвестно и может быть определено только во время работы программы.
Типичными примерами использования цикла while являются вычисления с заданной точностью, поиск в массиве или в файле.
Рис. А6. Пример блок-схемы цикла с предусловием
В общем виде инструкция while записывается следующим образом:
while условие do
begin
{здесь инструкции, которые надо выполнить несколько раз}
end
где условие — выражение логического типа, определяющее условие выполнения инструкций цикла.
4.1. Инструкция while выполняется следующим образом:
4.2. Сначала вычисляется значение выражения условие.
4.3. Если значение выражения условие равно False (условие не выполняется), то на этом выполнение инструкции while завершается.
4.4. Если значение выражения условие равно True (условие выполняется), то выполняются расположенные между begin и end инструкции тела цикла. После этого снова проверяется выполнение условия. Если условие выполняется, то инструкции цикла выполняются еще раз. И так до тех пор, пока условие не станет ложным (False).
По представленной блок-схема на рисунке А6 фрагмент программы будет выглядеть следующим образом:
i := 1;
Summa := 0;
WHILE i <= 10 DO
BEGIN
Summa := Summa + i;
i := i + 1;
END;
Используя данный фрагмент программы, можно рассчитать сумму всех чисел от 1 до 10.
5. Оператор цикла с постусловием Repeat (пример блок-схемы цикла с постусловием представлен на рисунке А7)
Инструкция repeat, как и инструкция while, используется в программе в том случае, если необходимо выполнить повторные вычисления (организовать цикл), но число повторений во время разработки программы неизвестно и может быть определено только во время работы программы, т. е. определяется ходом вычислений.
Рис. А7. Пример блок-схемы цикла с постусловием
В общем виде инструкция repeat записывается следующим образом: