Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Применение объектно-ориентированного подхода при проектировании информационной системы (принципы объектно–ориентированного программирования)

Содержание:

ВВЕДЕНИЕ

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

В настоящее время использование объектов в программировании очевидно для всех. Вначале многие программисты не воспринимали идеи объектно–ориентированного подхода. Прошло более 20 лет, пока объектно–ориентированное программирование получило уровень современного развития. Первым языком, в котором стали применятся объектно–ориентированные методы, был Simula 67. Затем объектно–ориентированные подходы стали использоваться и в более мощных языках программирования, таких как Delphi, C++ и другие. Одной из первых сред для создания пользовательского интерфейса в среде MS–DOS была библиотека Turbo Vision.

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

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

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

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

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

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

Объектом исследования в настоящей работе выступает объектно–ориентированное программирование.

Предметом исследования в работы являются возможности современных языков программирования, поддерживающих объектно–ориентированный подход.

Цель настоящей работы состоит в рассмотрении возможностей применения объектно–ориентированного подхода при проектировании информационных систем.

Вопросы объектно–ориентированного программирования рассматриваются такими авторами, как Г.С.Иванова, А.С.Лесневский, М.Е.Фленов, П.Б.Хорев. Данная литература была отобрана в связи с тем, что содержит фундаментальные основы использования объектно–ориентированного программирования.

1. Принципы объектно–ориентированного программирования

1.1. Понятие класса

Основными понятиями объектно–ориентированного программирования является класс и объект. Объект является физической реализацией класса.

Под классом понимается сложная структура, которая аналогична типу. В класс входит ни только описание данных, процедур и функций, выполняемых над объектом, но и характеристики используемых данных, а также подпрограмм[1].

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

Принято классы задавать в разделе объявления некоторого модулями. Для возможности их использования другими модулями, они должны быть объявлены в интерфейсной части модуля[2].

К объявлению класса в Object Pascal применяются те же правила, что и для объявления каждого типа. Описание каждого класса начинается словом class, затем идет указание родительского класса, которое заключается в круглые скобки. Если конкретное указание класса опускается, под родительским классом подразумевается TObject. Класс TObject в объектно–ориентированной модели Object Pascal считается предком для всех остальных классов. Затем следует описание данных, методов и свойств, каждое из которых располагается в отдельной строке. Для завершения описания класса используется ключевое слово End[3].

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

Рассмотрим пример описания некоторого простого класса[4]:

TTAddress=class

Private

country:string[20];

town:string[20];

street:strring[30];

flat:integer;

public

procedure pokaz;

end;

В данном примере TTAddress является именем класса, country, town, street, flat – именами полей, а pokaz – именем метода.

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

Может возникнуть ситуация, когда двумя классами используются характеристики друг друга. При такой ситуации необходимо использовать для одного из классов объявление, до объявления другого класса, это выполняется аналогично, как для подпрограмм, используя директиву Forward. В случае использования опережающего объявления, вначале указывается только имя самого класса, а далее, после знака равенства, слово class[5], как показано ниже:

TObject = class;

Затем в тексте программы, класс, который был предварительно объявлен, должен быть описан в соответствующем месте программы. Данное описание производится аналогично, как было описано для случая, без использования предварительного объявления[6].

Некоторые составляющие класса могут различным образом использоваться за пределами своего класса. Данное свойство именуется областью видимости. В языке объектно–ориентированного программирования Borland Delphi, область видимости может задаваться несколькими способами, с помощью размещения в одном из разделов private, public, protected, published, automated. Перечисленные средства задания видимости могут идти в программе в любой последовательности[7].

Структура описания класса в общем виде можно представит следующим образом:

Type

Имя_нового_класса = class(Имя_класса_родителя)

Описание опубликованных полей, методов и свойств

Private

Описание скрытых полей, методов и свойств

Public

Описание общедоступных полей, методов и свойств

Protected

Описание защищенных полей, методов и свойств

Published

Описание опубликованных полей, методов, свойств;

Automated

Описание полей, методов и свойств OLE-объектов;

end;

1.2. Понятие объекта

Объекты каждого класса должны быть объявлены в разделе var, например, следующим образом[8]:

var

address1: TTAddress;

address2: TTAddress;

Необходимо учитывать тот факт, что под объектом в Object Pascal понимается некоторая динамическая структура. Переменная содержит не сам объект, а ссылку на него. В связи с этим, программисту необходимо ни только выделить память под эти объекты, но также присвоить им некоторые начальные значения[9].

Чтобы выделить память, а также выполнить инициализацию объекта применяется специальный метод, называемый конструктором. Обычно конструктору дается имя create, что означает «создать». Для отличия конструктора от процедуры, он обозначается ключевым словом constructor.

Далее приведем пример класса TTAddress с использованием конструктора[10]:

TTAddress=class

Private

country:string[20];

town:string[20];

street:strring[30];

flat:integer;

constructor create; // инициализация конструктора

public

procedure pokaz; // объявление метода

end;

При выполнении присваивания результата метода–конструктора к классу объекта происходит выделение памяти. Рассмотрим пример[11]:

kvartira:=TTAddress.create;

при этом будет выделена необходимая память для объекта kvartira.

Кроме выделения памяти, конструктор выполняет задачу задания всем полям объекта некоторых начальных значений. Рассмотрим пример использования конструктора для объекта TTAddress[12].

Constructor TTAddress.create;

begin

country:=’’;

town:=’’;

street:=’’;

flat:=0;

end;

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

После того, как объект объявлен и проинициализирован, он становится доступен для использования. К примеру, становится возможным установление значения для некоторого поле данного объекта. Для осуществления доступа к некоторому полю объекта, указывается имя объекта и имя поля, разделенные точкой. Независимо от того, что объект представляет собой ссылку, для объектов не используется знак ^[13].

Так, чтобы получить доступ к полю street объекта Address, следует использовать запись Address.street, а не Address^.street.

В случае, если далее в программе использование объекта не требуется, имеется возможность освободить память, которую занимает объект. Освобождение памяти происходит с помощью использования метода–деструктора free[14].

К примеру, для освобождения памяти, которую занимают поля объекта kvartira, следует использовать команду

Kvartira.free;

1.3. Методы и их использование

Под методами понимаются процедуры и функции, которые объявлены при описании класса и выполняют некоторые действия над его объектами. Объявление и описание методов аналогично описанию подпрограмм в модуле. Это означает, что в интерфейсной части модуля внутри класса дается только заголовок подпрограммы, а само описание метода дается уже в исполнительной части. Для вызова метода на выполнение, следует через точку указать имя объекта и метода[15]. К примеру, следующий оператор

Address.pokaz

осуществляет вызов метода pokaz применительно к объекту Address.

Методы в тексте программы описываются аналогично обычным процедурам и функциям. Отличие состоит в том, что процедура и функция, если является методом, имеет имя, включающее имя класса и имя самого метода, разделенные точкой[16].

Рассмотрим объявление метода pokaz для класса TTAddress, который был описан выше.

// описание метода pokaz для класса TTAddress;

Procedure TTAddress.pokaz;

Begin

ShowMessage(‘Страна: ’+country+#13+’ Город: ’+town+#13+’ Улица: ’+street+’ Квартира ’+flat);

End;

Нужно учитывать, что при доступе к полям объекта в операторах можно не указывать имя объекта[17].

Чаще всего методы применяются к объектам программы, которые были созданы ранее. Указанные методы считаются методами объекта. Delphi поддерживает создание и использование методов, которые могут использоваться до создания объектов класса. Примером таких методов являются конструкторы, вызываемые, чтобы создать объект. Такие методы являются методами класса с соответствующим оформлением.

Такие методы объявляются, начиная со слова class, за которым следует стандартное описание метода. Рассмотрим пример[18]:

TPersonalForm=class(TForm)

Class procedure SozdanieSoobsheniy;

End;

Class procedure TPersonalForm. SozdanieSoobsheniya;

begin

end;

1.4. Понятие инкапсуляции и ее влияние на свойства объекта

Инкапсуляция – это скрытие полей некоторого объекта, так чтобы к ним можно было обращаться только через методы данного класса. Для разграничения прав доступа к полям некоторого объекта реализуется через его свойства[19]. Свойство некоторого объекта характеризуется полем, в котором хранится свойство, а также двумя методами, которые обеспечивают доступ к свойствам поля[20].

Метод write, называемый методом записи, устанавливает значение некоторого поля, а метод read – выполняет чтение значения поля.

Перед описанием свойства в классе используется ключевое слово property, означаемое свойство. Сначала записывается имя свойства, затем тип свойства, после чего перечисляются имена всех методов, которые обеспечиваю доступ к значению некоторого свойства. За словом read идет имя метода, которое обеспечивает чтение свойства, за словом write следует имя метода, который записывает значение свойства[21].

Рассмотрим пример описание класса

Type

Tcountry:string[20];

Ttown:string[20];

Tstreet:strring[30];

Tflat:integer;

TTAddress=class

Private

FCountry: Tcountry; // значение свойства Country

Ftown: Ttown; // значение свойства Town

FStreet: Tstreet; // значение свойства Street

FFlat: Tflat; // значение свойства Flat

Constructor.Create(Address: TAddress);

Procedure Pokaz;

Function GetCountry: TCountry;

Function GetTown: TTown;

Procedure SetStreet(NerStreet: TStreet);

Public

Property Street: TStreet;

read GetStreet;

write SetStreet;

end;

При выполнении программы, чтобы установить значение некоторого свойства, нет необходимости использовать оператор установки свойств для объекта, достаточно применение оператора присваивания свойству некоторого значения[22]. К примеру, для присвоения значения свойству town объекта Address можно записать[23]

Address.town:=’Москва’;

Этот оператор будет перетранслирован в вызов метода:

Address.town(’Москва’);

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

Методы свойства в программе также могут выполнять дополнительные задачи. Так, применяя метод, можно проверять правильность присваиваемых значений, устанавливать значение связанных полей, вызвать другую процедуру[24].

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

Если попытаться присвоить новое значение свойству, которое предназначено только для чтения, приведет к ошибке при выполнении компиляции программы[25].

Изменение значения свойства, которое защищено от записи, возможно при инициализации объекта[26].

Рассмотрим методы класса TTAddress, которые позволяют создать объект класса TTAddress и получить доступ к его свойствам.

// Конструктор объекта TTAddress

Construcror TTAddress.Create(Address: TAddress);

Begin

FAddress:=Address;

End;

// Метод получения значения свойства Address

Function TTAddress.GetAddress;

Begin

Result:=FAddress;

End;

// метод изменения значения свойства Town

Procedure TTAddress.SetTown(NewTown:TTown);

Begin

if FTown =’’ then FTown:=NewTown;

end;

Описанный выше конструктор выполняет создание объекта и установление значения поля FAddress, которое определяет значение свойства Address.

Для создания объекта класса TTAddress и задания его свойств, могут быть, например, следующими[27]:

people:=TTAddress.create(‘Петров’);

people.Town:=’ Москва’;

1.5. Понятие наследования

Объектно–ориентированное программирование дает возможность создавать новые классы при помощи добавления полей, свойств и методов, для уже существующих классов[28].

Указанный процесс получения новых классов получил название порождения. При этом новый класс получает (наследует) свойства и методы от своего родительского (базового) класса[29].

При объявлении некоторого класса–потомка указывается класс его родителя.

1.6. Понятие области видимости

Кроме объявления таких элементов класса, как поля, методы и свойства, в описание класса обычно входят директивы, которые устанавливают видимость элементов, принадлежащих определенному классу, в теле программы[30].

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

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

2) Public. Описанные в данном разделе элементы являются доступными из всех процедур и могут использоваться в любом месте программы.

3) Protected. Те элементы класса, которые объявляются в защищенном (protected), которые доступны только в классах, которые порождены от исходного класса. В данном разделе помещаются элементы, которые важны только для определенного класса, а также его потомков. В секции protected помещаются методы класса.

4) Published. Все поля, свойства, а также методы, которые описаны в разделе Published носят название опубликованных. Область видимости, расположенных в данном разделе совпадает с областью видимости общедоступных описаний. Отличие от общедоступных описаний состоит в том, что информация о них становится видна через Инспектор объектов. Если включена директива {$M+}, то все описания, идущие после заголовка класса, становятся опубликованными[31].

5) Automated. Те элементы класса, которые объявлены в данном разделе носят название автоматических. Они имеют видимость, аналогичную общедоступным операциям. Но в отличии от общедоступных, для автоматических генерируется дополнительная информация, используемая при реализации механизма OLE. Применение данной директивы целесообразно при объявлении класса TAutoObject[32].

1.7. Понятие полиморфизма и виртуальных методов

Под полиморфизмом понимается возможность применения одинаковых имен методов, которые входят в разные классы. При полиморфизме обеспечивается использование именно метода, соответствующего классу объекта[33].

ВЫВОД. Рассмотренное в первой главе позволяет получить представление об основах объектно–ориентированного подхода, применяемого при проектировании информационных систем.

2. Примеры применения объектно–ориентированного программирования

2.1. Пример 1 Тестирующая программа, реализованная на Borland Delphi

2.1.1. Постановка задачи

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

2.1.2. Главная форма (Form1)

Вид главной формы в режиме конструктора показан на рисунке 1.

Рисунок 1 – Вид главной формы приложения (Form1)

Описание элементов главной формы приложения приведено в таблице 1.

Таблица 1 – Описание элементов главной формы

Имя элемента

Тип

Назначение в программе

Image1

TImage

Для вывода картинки к вопросу

Label1

TLabel

Вывод пояснения требуемого действия

MainMenu

TMainMenu

Главное меню приложения

Next

TButton

Кнопка для перехода к следующему вопросу

RadioOtvet1

TRadioButton

Выбор первого варианта ответа

RadioOtvet2

TRadioButton

Выбор второго варианта ответа

RadioOtvet3

TRadioButton

Выбор третьего варианта ответа

Vopros

TRichEdit

Вывод текста вопроса

2.1.3. Форма результатов теста (result)

Вид формы результатов теста приведен на рисунке 2.

Рисунок 2 – Вид формы результатов теста

Описание элементов главной формы приложения приведено в таблице 2.

Таблица 2 – Описание элементов формы результатов теста

Имя элемента

Тип

Назначение в программе

Button1

TButton

Кнопка для завершения работы

ItogoA

TLabel

Вывод количества ответов типа А

ItogoB

TLabel

Вывод количества ответов типа Б

ItogoV

TLabel

Вывод количества ответов типа В

Label1

TLabel

Вывод текста «Итого»

RichEdit1

TRichEdit

Многострочное поле для вывода пояснений

StringGrid1

TStringGrid

Таблица для вывода ответов на каждый вопрос

2.1.4. Модуль обработчиков главной формы

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

2.1.5. Модуль обработчиков формы результатов

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

2.1.6. Результаты работы программы

При запуске приложения, открывается главное окно, показанное на рисунке 3.

Для начала теста необходимо выбрать пункт меню Тест → Начать тест.

Вид вопроса без графического пояснения показан на рисунке 4.

Рисунок 3 – Начальное окно приложения

Рисунок 4 – Вид вопроса без графического пояснения

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

Рисунок 5 – Вид вопроса с графическим пояснением

После окончания теста, будет выдано окно со статистикой, как показано на рисунке 6.

Рисунок 6 – Результаты тестирования

По полученному результату можно сделать вывод, что у тестируемого недостаточно развит тип А, гармонично развит тип Б и в «избытке» тип В.

2.2 Пример 2 Вычисление значения функции

2.2.1. Постановка задачи

Вычислить и напечатать значение функции Y = f1 + f2 + f3 + f4. Значение аргумента x задать с клавиатуры. Значения A, B, C, D задать с клавиатуры при помощи оператора присваивания. Значения α, β, γ задать в разделе констант.

Таблица 3 – Исходные данные к примеру 2

f1

f2

f3

f4

=

2.2.2. Алгоритм решения задачи

На рисунке 7 показан алгоритм вычисления функции.

Рисунок 7 – Алгоритм решения задачи

2.2.3. Модуль обработчика вычисления функции на Visual Basic

На форме разместим кнопку, для которой напишем обработчик, приведенный в Приложении 3.

2.2.4. Результат выполнения программы

Результат ввода исходных данных и расчета Y показан на рисунке 8.

Рисунок 8 – Результат выполнения программы

2.3 Пример 3 Вычисление всех значений функции

2.3.1 Постановка задачи

Вычислить и напечатать все значения функции:

Таблица 4 – Заданные функции

f1

f2

f3

f4

=

Таблица 5 – Заданные условия

Усло-вие_1

Усло-вие_2

Усло-вие_3

Усло-вие_4

Начальное значение аргумента Хи

Конечное значение аргумента Хк

Шаг изменения аргумента dx

x<0

0≤x<4

4≤x≤6

x>6

-4

10

0.7

2.3.2 Алгоритм решения задачи

Алгоритм решения задачи показан на рисунке 9.

Рисунок 9 – Алгоритм решения задачи

2.3.3 Модуль вычисления значений функции на интервале на Visual Basic

На форме разместим кнопку, для которой напишем обработчик, приведенный в Приложении 4.

2.3.4. Результат выполнения программы

Результат вычисления всех значений функции на интервале показан на рисунке 10.

Рисунок 10 – Результат выполнения программы

2.4 Пример 4 Обработка массивов

2.4.1 Постановка задачи

Для элементов, стоящих на четных местах, двух одномерных массивов одинаковой длины определить среднее арифметическое среди элементов, попадающих в интервал (-10,10).

2.4.2 Алгоритм решения задачи

Алгоритм решения задачи показан на рисунке 11.

Рисунок 11 – Алгоритм решения задачи

2.4.4. Программа обработки массивов на Visual Basic

На форме разместим кнопку, для которой напишем обработчик, приведенный в Приложении 5.

2.4.5. Результат выполнения программы

Для ввода каждого элемента массивов выдается окно, показанное на рисунке 12.

Рисунок 12 – Окно ввода элементов массивов

Результат обработки массивов показан на рисунке 13.

Рисунок 13 – Результат выполнения программы

ВЫВОД. Во второй были рассмотрены примеры объектно–ориентированного программирования в Borland Delphi и Visual Basic.

ЗАКЛЮЧЕНИЕ

На основании проделанной работы можно сделать следующие выводы:

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

2) под объектом в Object Pascal понимается некоторая динамическая структура;

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

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

5) объектно–ориентированное программирование дает возможность создавать новые классы при помощи добавления полей, свойств и методов, для уже существующих классов;

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

7) под полиморфизмом понимается возможность применения одинаковых имен методов, которые входят в разные классы;

8) были разработаны и реализованы 4 примера объектно-ориентированного программирования: тестирующая программа, реализованная на Borland Delphi; вычисления функции на Visual Basic; вычисление всех значений функции; обработка массивов.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Белов В.В. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное / Белов В.В., Чистяков В.И. – М.: Горячая Линия-Телеком, 2009. – 240 с.
  2. Галисеев Г.В. Программирование в среде Delphi 7. Самоучитель / Г.В.Галисеев. – М.: Диалектика, 2012. – 288 с.
  3. Дарахвелидзе П.Г. Программирование в Delphi 7 / П.Г.Дарахвелидзе, Е.П,Марков. – СПб.: BHV, 2011. – 784 с.
  4. Иванова Г.С. Объектно–ориентированное программирование / Г.С.Иванова. – М.: МГТУ им. Баумана, 2012. – 320 с.
  5. Культин Н.Б. Основы программирования в Delphi 7 / Н.Б.Культин. – СПб.: BHV, 2012. – 640 с.
  6. Лесневский А.С. Объектно–ориентированное программирование для начинающих / А.С.Лесневский. – СПб.: Бином. Лаборатория знаний, 2012. – 232 с.
  7. Нил Дж. Рубенкинг. Язык программирования Delphi для «чайников» / Нил Дж. Рубенкинг. – М.: Диалектика, 2012. – 336 с.
  8. Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. – 640 с.
  9. Фленов М.Е. Библия Delphi / М.Е.Фленов. – СПб.: BHV, 2009. – 800 с.
  10. Хорев П.Б. Объектно–ориентированное программирование: учебное пособие для студентов учреждений высшего профессионального образования / П.Б.Хорев. – М.: Академия, 2011. – 448 с.

Приложения

Приложение 1

КОД ОБРАБОТЧИКОВ ГЛАВНОЙ ФОРМЫ

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs,IniFiles, Menus, StdCtrls, ComCtrls, ExtCtrls;

type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

Label1: TLabel;

RadioOtvet1: TRadioButton;

RadioOtvet2: TRadioButton;

RadioOtvet3: TRadioButton;

Next: TButton;

vopros: TRichEdit;

Image1: TImage;

procedure FormCreate(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure NextClick(Sender: TObject);

procedure N4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type

TTest= Record {Запись для хранения вопросов и ответов}

vopros: string[255];{Вопрос теста}

kolotv: integer;{Количество вариантов ответов}

otvet1: string[255];{Текст первого ответа}

otvet2: string[255];{Текст второго ответа}

otvet3: string[255];{Текст третьего ответа}

picture: string[20];{Имя файла картинки}

end;

var

Form1: TForm1;{Главная форма приложения}

IniFile: TIniFile; {Переменная для связи с INI-файлом}

Test: array [1..20] of TTest;{Массив записей вопросов и ответов}

exename: string;{Имя файла теста}

exepath: string;{Путь к файлу теста}

lenpath: integer;{Длина пути к файлу теста}

k: integer;{Позиция последнего / в полном имени файла}

i: integer;{Переменная цикла}

ini: TIniFile;{Переменная связи с INI-файлом}

vsegovoprosov: integer; {Количество вопросов в тесте}

nomervoprosa: integer; {Номер текущего вопроса}

section: string; {Секция INI-файла}

picturefilename: string; {Путь к файлу картинки}

otvet: array[1..20] of char; {Выбранные ответы на каждый вопрос}

vsegoA: integer; {Количество выбранных ответов А}

vsegoB: integer; {Количество выбранных ответов Б}

vsegoV: integer; {Количество выбранных ответов В}

implementation

uses unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

exename:=Application.ExeName; {Определение полного имени файла}

lenpath:=length(exename); {Определение длины полного имени файла}

k:=0; {Положение / }

for i:=lenpath downto 1 do {Цикл по длине полного имени файла}

if ((copy(exename,i,1)='\') and (k=0)) then begin {Если текущий символ = /}

{Выделить имя файла из пути}

exepath:=copy(exename,1,i);

k:=i; {Запомнить положение /}

end;

ini:=TIniFile.Create(exepath+'TEST.INI'); {Связать переменную с INI-файлом}

vsegovoprosov:=Ini.ReadInteger('всеговопросов','всего',0); {Прочитать количество вопросов}

for nomervoprosa:=1 to vsegovoprosov do {Цикл по количеству вопросов}

begin

section:='вопрос'+inttostr(nomervoprosa); {Определение имени секции INI-файла}

test[nomervoprosa].vopros:=ini.ReadString(section,'вопрос',''); {Чтение вопроса}

test[nomervoprosa].otvet1:=ini.ReadString(section,'ответ1',''); {Чтение 1-го ответа}

test[nomervoprosa].otvet2:=ini.ReadString(section,'ответ2',''); {Чтение 2-го ответа}

test[nomervoprosa].otvet3:=ini.ReadString(section,'ответ3',''); {Чтение 3-го ответа}

test[nomervoprosa].picture:=ini.ReadString(section,'картинка',''); {Чтение имени файла картинки}

end;

end;

procedure TForm1.N2Click(Sender: TObject);

begin

// Начать тест

nomervoprosa:=1; {Начать с 1-го вопроса}

vsegoA:=0;vsegoB:=0;vsegoV:=0; {Обнулить количество ответов каждого вида}

vopros.Clear; {Очистка поля для вывода вопроса}

vopros.Lines.Add(test[nomervoprosa].vopros); {Вывод текста вопроса}

RadioOtvet1.Caption:=test[nomervoprosa].otvet1; {Вывод 1-го ответа}

RadioOtvet2.Caption:=test[nomervoprosa].otvet2; {Вывод 2-го ответа}

RadioOtvet3.Caption:=test[nomervoprosa].otvet3; {Вывод 3-го ответа}

RadioOtvet1.Checked:=true; {Выбор 1-го ответа}

Label1.Caption:='Выберите один из вариантов отбетов на следующий вопрос:'; {Вывод пояснения}

vopros.Visible:=true; {Сделать вопрос видимым}

RadioOtvet1.Visible:=true; {Сделать 1-й ответ видимым}

RadioOtvet2.Visible:=true; {Сделать 2-й ответ видимым}

RadioOtvet3.Visible:=true; {Сделать 3-й ответ видимым}

Next.Visible:=true; {Сделать кнопку перехода к следующему вопросу видимой}

end;

procedure TForm1.NextClick(Sender: TObject);

// Кнопка перехода к следующему вопросу

begin

if (nomervoprosa<vsegovoprosov) then {Пока номер вопроса менььше наибольшего}

begin

if (RadioOtvet1.Checked=true) then otvet[nomervoprosa]:='А'; {Увеличение счетчика ответов А}

if (RadioOtvet2.Checked=true) then otvet[nomervoprosa]:='Б'; {Увеличение счетчика ответов Б}

if (RadioOtvet3.Checked=true) then otvet[nomervoprosa]:='В'; {Увеличение счетчика ответов В}

nomervoprosa:=nomervoprosa+1; {Увеличение номера вопроса}

label1.Caption:='Выберите наиболее подходящий для Вас вариант ответа на вопрос'; {Вывод пояснения}

vopros.Clear; {Очистка поля вопроса}

vopros.Lines.Add(test[nomervoprosa].vopros); {Вывод вопроса}

RadioOtvet1.Caption:=test[nomervoprosa].otvet1; {Вывод 1-го ответа}

RadioOtvet2.Caption:=test[nomervoprosa].otvet2; {Вывод 2-го ответа}

RadioOtvet3.Caption:=test[nomervoprosa].otvet3; {Вывод 3-го ответа}

if (test[nomervoprosa].picture<>'') then begin {Если в вопросе есть картинка}

{Получить имя файла картинки}

picturefilename:=exepath+'vopros'+inttostr(nomervoprosa)+'.bmp';

{Загрузка картинки из файла}

image1.Picture.LoadFromFile(picturefilename);

{Показать картинку}

image1.Visible:=true;

end

else

{Скрыть картинку}

image1.Visible:=false;

RadioOtvet1.Checked:=true; {Выбрать 1-й варинт ответа}

end

else

begin

{Если выбран 1-й ответ, увеличить счетчик ответов А}

if (RadioOtvet1.Checked=true) then otvet[nomervoprosa]:='А';

{Если выбран 2-й ответ, увеличить счетчик ответов Б}

if (RadioOtvet2.Checked=true) then otvet[nomervoprosa]:='Б';

{Если выбран 3-й ответ, увеличить счетчик ответов В}

if (RadioOtvet3.Checked=true) then otvet[nomervoprosa]:='В';

result.StringGrid1.Cells[0,0]:='Номер вопроса'; {Вывод заголовка столбца таблицы результатов теста}

result.StringGrid1.Cells[1,0]:='Ответ'; {Вывод заголовка столбца таблицы результатов теста}

for i:=1 to vsegovoprosov do {Цикл по количеству вопросов}

begin

result.StringGrid1.Cells[0,i]:=inttostr(i); {Вывод в таблицу номер вопроса}

result.StringGrid1.Cells[1,i]:=otvet[i]; {Вывод в таблицу выбранного варианта ответа}

if (otvet[i]='А') then vsegoA:=vsegoA+1; {Увеличение счетчика ответов А}

if (otvet[i]='Б') then vsegoB:=vsegoB+1; {Увеличение счетчика ответов Б}

if (otvet[i]='В') then vsegoV:=vsegoV+1; {Увеличение счетчика ответов В}

end;

result.ItogoA.Caption:='A='+inttostr(vsegoA); {Вывод количества ответов А}

result.ItogoB.Caption:='Б='+inttostr(vsegoB); {Вывод количества ответов Б}

result.ItogoV.Caption:='В='+inttostr(vsegoV); {Вывод количества ответов В}

result.ShowModal; {Показать форму результатов}

close; {Закрыть приложение}

end;

end;

procedure TForm1.N4Click(Sender: TObject);

begin

close; {Закрыть приложение}

end;

end.

Приложение 2

КОД ОБРАБОТЧИКОВ ФОРМЫ ВЫВОДА РЕЗУЛЬТАТОВ ТЕСТИРОВАНИЯ

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, StdCtrls, ComCtrls;

type

Tresult = class(TForm)

StringGrid1: TStringGrid;

Label1: TLabel;

ItogoA: TLabel;

ItogoB: TLabel;

ItogoV: TLabel;

RichEdit1: TRichEdit;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

result: Tresult;

implementation

{$R *.dfm}

procedure Tresult.Button1Click(Sender: TObject);

begin

close; {Закрыть приложение}

end;

end.

Приложение 3

КОД ОБРАБОТЧИКА ВЫЧИСЛЕНИЯ ЗНАЧЕНИЯ ФУНКЦИИ

Private Sub Vichislit_Click()

Dim B, C, X As Double: Rem Исходные переменные

Dim f1, f2, f3, f4: Rem Промежуточные переменные

Const alpha = 2: Rem Константа Альфа

Const bets = 3: Rem Константа Бета

B = Val(TextB.Text): Rem Перевод B в числовой формат

C = Val(TextC.Text): Rem Перевод C в числовой формат

X = Val(TextX.Text): Rem Перевод X в числовой формат

f1 = Cos(Abs(X / B - alpha)): Rem вычисление f1

f2 = 1.3 * Exp(A * Cos(B * X)): Rem вычисление f2

f3 = 1.1 * Log(Abs(beta * X + C)) / Log(3): Rem вычисление f3

f4 = (X ^ 2 + X + C) / Abs(beta + alpha * X): Rem вычисление f4

y = f1 + f2 + f3 + f4: Rem вычисление Y

f1value.Caption = Mid$(f1, 1, 12): Rem вывод значения f1

f2value.Caption = Mid$(f2, 1, 12): Rem вывод значения f2

f3value.Caption = Mid$(f3, 1, 12): Rem вывод значения f3

f4value.Caption = Mid$(f4, 1, 12): Rem вывод значения f4

Yvalue.Caption = y: Rem вывод значения Y

End Sub

Приложение 4

КОД ОБРАБОТЧИКА ВЫЧИСЛЕНИЯ ФУНКЦИИ

Private Sub Zadan2_Click()

Dim alpha, beta, A, B, C As Double: Rem Исходные переменные

Dim X As Double: Rem Переменная цикла

Text2.Text = "": Rem Очистка поля вывода

alpha = Val(TextAlpha.Text): Rem Перевод переменной Альфа в числовой

формат

beta = Val(TextBeta.Text): Rem Перевод переменной Бета в числовой

формат

A = Val(TextA.Text): Rem Перевод переменной A в числовой формат

B = Val(TextB.Text): Rem Перевод переменной B в числовой формат

C = Val(TextC.Text): Rem Перевод переменной C в числовой формат

Text2.Text = Text2.Text & " x y" & vbCrLf: Rem Вывод заголовков

столбцов

For X = -4 To 10 Step 0.7: Rem Изменение аргумента в цикле

If (X < 0) Then y = Cos(Abs(X / B - alpha)): Rem Проверка 1-го условия

If ((X >= 0) And (X < 4)) Then y = 1.3 * Exp(A * Cos(B * X)): Rem

Проверка 2-го условия

If ((X >= 4) And (X <= 6)) Then y = 1.1 * Log(Abs(beta * X + C)) / Log(3):

Rem Проверка 3-го условия

If (X > 6) Then y = (X ^ 2 + X + C) / Abs(beta + alpha * X):

Rem Проверка 4-го условия

Text2.Text = Text2.Text & " " & Str(X) & " " & Str(y) & vbCrLf:

Rem Вывод через пробел всех элементов массива

Next X

End Sub

Приложение 5

КОД ОБРАБОТЧИКА МАССИВА

Private Sub Zadan3_Click()

Dim N As Integer: Rem Размерности массивов

Dim i As Integer: Rem Переменная циклов

Dim SredA As Variant: Rem Среднее массива A

Dim SredB As Variant: Rem Среднее массива B

Dim KolvoA As Integer: Rem Количество подходящих элементов

массива A

Dim KolvoB As Integer: Rem Количество подходящих элементов

массива B

N = Val(TextRazmer.Text): Rem Перевод размерности

массивов в числовой вид

Dim A(100) As Variant: Rem Массив A

Dim B(100) As Variant: Rem Массив B

Text3.Text = "": Rem Очистка поля вывода

SredA = 0: Rem Обнуление суммы подходящих элементов массива A

SredB = 0: Rem Обнуление суммы подходящих элементов массива B

KolvoA = 0: Rem Обнуление количества подходящих элементов

массива A

KolvoB = 0: Rem Обнуление количества подходящих элементов

массива B

Text3.Text = Text3.Text & " Массив А: ": Rem Вывод имени массива

For i = 1 To N: Rem Ввод и обработка массива A

A(i) = InputBox("Введите элемент массива A=")

If (((i / 2) = Int(i / 2)) And (A(i) > -10) And (A(i) < 10)) Then

SredA = SredA + A(i): KolvoA = KolvoA + 1

Next i

For i = 1 To N: Rem Ввод и обработка массива B

B(i) = InputBox("Введите элемент массива B=")

If (((i / 2) = Int(i / 2)) And (B(i) > -10) And (B(i) < 10)) Then

SredB = SredB + B(i): KolvoB = KolvoB + 1

Next i

Text3.Text = Text3.Text & "Массив A: "

For i = 1 To N: Rem Вывод массива A

Text3.Text = Text3.Text & A(i) & " "

Next i

SredA = SredA / KolvoA: Rem Вычисление среднего массива A

Rem Вывод среднего массива A

Text3.Text = Text3.Text & vbCrLf & " Среднее элементов массива A в

интервале (-10,10) = " & SredA & vbCrLf & vbCrLf

Text3.Text = Text3.Text & "Массив B: "

For i = 1 To N: Rem Вывод массива B

Text3.Text = Text3.Text & B(i) & " "

Next i

SredB = SredB / KolvoB: Rem Вычисление среднего массива B

Rem Вывод среднего массива A

Text3.Text = Text3.Text & vbCrLf & " Среднее элементов массива B в

интервале (-10,10) = " & SredB & vbCrLf & vbCrLf

End Sub

  1. Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. С.38

  2. Белов В.В. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное / Белов В.В., Чистяков В.И. – М.: Горячая Линия-Телеком, 2009, С.71

  3. Хорев П.Б. Объектно–ориентированное программирование: учебное пособие для студентов учреждений высшего профессионального образования. – М.: Академия, 2011, С.49

  4. Лесневский А.С. Объектно–ориентированное программирование для начинающих / А.С.Лесневский. – СПб.: Бином. Лаборатория знаний, 2012, С.55

  5. Иванова Г.С. Объектно–ориентированное программирование / Г.С.Иванова. – М.: МГТУ им. Баумана, 2012. С.77

  6. Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ. – СПб.: Питер, 2012. С.224

  7. Белов В.В. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное / Белов В.В., Чистяков В.И. – М.: Горячая Линия-Телеком, 2009. С.106

  8. Галисеев Г.В. Программирование в среде Delphi 7. Самоучитель / Г.В.Галисеев. – М.: Диалектика, 2012. С.47

  9. Нил Дж. Рубенкинг. Язык программирования Delphi для «чайников». – М.: Диалектика, 2012. С.117

  10. Галисеев Г.В. Программирование в среде Delphi 7. Самоучитель / Г.В.Галисеев. – М.: Диалектика, 2012. С.48

  11. Хорев П.Б. Объектно–ориентированное программирование: учебное пособие для студентов учреждений высшего профессионального образования / П.Б.Хорев. – М.: Академия, 2011. С.112

  12. Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. С.304

  13. Галисеев Г.В. Программирование в среде Delphi 7. Самоучитель. – М.: Диалектика, 2012. С.203

  14. Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. С.301

  15. Иванова Г.С. Объектно–ориентированное программирование. – М.: МГТУ им. Баумана, 2012. С.102

  16. Белов В.В. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное / Белов В.В., Чистяков В.И. – М.: Горячая Линия-Телеком, 2009. С.95

  17. Нил Дж. Рубенкинг. Язык программирования Delphi для «чайников» / Нил Дж. Рубенкинг. – М.: Диалектика, 2012. С.59

  18. Лесневский А.С. Объектно–ориентированное программирование для начинающих / А.С.Лесневский. – СПб.: Бином. Лаборатория знаний, 2012. С.117

  19. Иванова Г.С. Объектно–ориентированное программирование / Г.С.Иванова. – М.: МГТУ им. Баумана, 2012. С.55

  20. Лесневский А.С. Объектно–ориентированное программирование для начинающих / А.С.Лесневский. – СПб.: Бином. Лаборатория знаний, 2012. С.133

  21. Белов В.В., Чистяков В.И. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное.. – М.: Горячая Линия-Телеком, 2009. С.106

  22. Хорев П.Б. Объектно–ориентированное программирование: учебное пособие для студентов учреждений высшего профессионального образования / П.Б.Хорев. – М.: Академия, 2011. С.77

  23. Дарахвелидзе П.Г. Программирование в Delphi 7 / П.Г.Дарахвелидзе, Е.П,Марков. – СПб.: BHV, 2011. С.305

  24. Лесневский А.С. Объектно–ориентированное программирование для начинающих / А.С.Лесневский. – СПб.: Бином. Лаборатория знаний, 2012. С.41

  25. Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. С.61

  26. Лесневский А.С. Объектно–ориентированное программирование для начинающих. – СПб.: Бином. Лаборатория знаний, 2012. С.92

  27. Иванова Г.С. Объектно–ориентированное программирование / Г.С.Иванова. – М.: МГТУ им. Баумана, 2012. С.67

  28. Иванова Г.С. Объектно–ориентированное программирование / Г.С.Иванова. – М.: МГТУ им. Баумана, 2012. С.15

  29. Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. С.98

  30. Культин Н.Б. Основы программирования в Delphi 7. – СПб.: BHV, 2012. С.102

  31. Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. С.103

  32. Фленов М.Е. Библия Delphi. – СПб.: BHV, 2009. С.97–98

  33. Дарахвелидзе П.Г., Марков Е.П, Программирование в Delphi 7. – СПб.: BHV, 2011. С.122