Применение объектно-ориентированного подхода при проектировании информационной системы (принципы объектно–ориентированного программирования)
Содержание:
ВВЕДЕНИЕ
Одним из главных достижений современных технологий программирования явились объекты, которые позволяют создавать программы без написания для каждой новой программы множества сложных процедур и функций, а используя ранее созданные объекты, уже имеющие необходимые свойства. Основным плюсом для программиста в использовании объектов является то, что внутренняя структура компонента от него скрыта, позволяя использовать компонент единым блоком.
В настоящее время использование объектов в программировании очевидно для всех. Вначале многие программисты не воспринимали идеи объектно–ориентированного подхода. Прошло более 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; вычисление всех значений функции; обработка массивов.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
- Белов В.В. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное / Белов В.В., Чистяков В.И. – М.: Горячая Линия-Телеком, 2009. – 240 с.
- Галисеев Г.В. Программирование в среде Delphi 7. Самоучитель / Г.В.Галисеев. – М.: Диалектика, 2012. – 288 с.
- Дарахвелидзе П.Г. Программирование в Delphi 7 / П.Г.Дарахвелидзе, Е.П,Марков. – СПб.: BHV, 2011. – 784 с.
- Иванова Г.С. Объектно–ориентированное программирование / Г.С.Иванова. – М.: МГТУ им. Баумана, 2012. – 320 с.
- Культин Н.Б. Основы программирования в Delphi 7 / Н.Б.Культин. – СПб.: BHV, 2012. – 640 с.
- Лесневский А.С. Объектно–ориентированное программирование для начинающих / А.С.Лесневский. – СПб.: Бином. Лаборатория знаний, 2012. – 232 с.
- Нил Дж. Рубенкинг. Язык программирования Delphi для «чайников» / Нил Дж. Рубенкинг. – М.: Диалектика, 2012. – 336 с.
- Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. – 640 с.
- Фленов М.Е. Библия Delphi / М.Е.Фленов. – СПб.: BHV, 2009. – 800 с.
- Хорев П.Б. Объектно–ориентированное программирование: учебное пособие для студентов учреждений высшего профессионального образования / П.Б.Хорев. – М.: Академия, 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
-
Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. С.38 ↑
-
Белов В.В. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное / Белов В.В., Чистяков В.И. – М.: Горячая Линия-Телеком, 2009, С.71 ↑
-
Хорев П.Б. Объектно–ориентированное программирование: учебное пособие для студентов учреждений высшего профессионального образования. – М.: Академия, 2011, С.49 ↑
-
Лесневский А.С. Объектно–ориентированное программирование для начинающих / А.С.Лесневский. – СПб.: Бином. Лаборатория знаний, 2012, С.55 ↑
-
Иванова Г.С. Объектно–ориентированное программирование / Г.С.Иванова. – М.: МГТУ им. Баумана, 2012. С.77 ↑
-
Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ. – СПб.: Питер, 2012. С.224 ↑
-
Белов В.В. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное / Белов В.В., Чистяков В.И. – М.: Горячая Линия-Телеком, 2009. С.106 ↑
-
Галисеев Г.В. Программирование в среде Delphi 7. Самоучитель / Г.В.Галисеев. – М.: Диалектика, 2012. С.47 ↑
-
Нил Дж. Рубенкинг. Язык программирования Delphi для «чайников». – М.: Диалектика, 2012. С.117 ↑
-
Галисеев Г.В. Программирование в среде Delphi 7. Самоучитель / Г.В.Галисеев. – М.: Диалектика, 2012. С.48 ↑
-
Хорев П.Б. Объектно–ориентированное программирование: учебное пособие для студентов учреждений высшего профессионального образования / П.Б.Хорев. – М.: Академия, 2011. С.112 ↑
-
Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. С.304 ↑
-
Галисеев Г.В. Программирование в среде Delphi 7. Самоучитель. – М.: Диалектика, 2012. С.203 ↑
-
Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. С.301 ↑
-
Иванова Г.С. Объектно–ориентированное программирование. – М.: МГТУ им. Баумана, 2012. С.102 ↑
-
Белов В.В. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное / Белов В.В., Чистяков В.И. – М.: Горячая Линия-Телеком, 2009. С.95 ↑
-
Нил Дж. Рубенкинг. Язык программирования Delphi для «чайников» / Нил Дж. Рубенкинг. – М.: Диалектика, 2012. С.59 ↑
-
Лесневский А.С. Объектно–ориентированное программирование для начинающих / А.С.Лесневский. – СПб.: Бином. Лаборатория знаний, 2012. С.117 ↑
-
Иванова Г.С. Объектно–ориентированное программирование / Г.С.Иванова. – М.: МГТУ им. Баумана, 2012. С.55 ↑
-
Лесневский А.С. Объектно–ориентированное программирование для начинающих / А.С.Лесневский. – СПб.: Бином. Лаборатория знаний, 2012. С.133 ↑
-
Белов В.В., Чистяков В.И. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное.. – М.: Горячая Линия-Телеком, 2009. С.106 ↑
-
Хорев П.Б. Объектно–ориентированное программирование: учебное пособие для студентов учреждений высшего профессионального образования / П.Б.Хорев. – М.: Академия, 2011. С.77 ↑
-
Дарахвелидзе П.Г. Программирование в Delphi 7 / П.Г.Дарахвелидзе, Е.П,Марков. – СПб.: BHV, 2011. С.305 ↑
-
Лесневский А.С. Объектно–ориентированное программирование для начинающих / А.С.Лесневский. – СПб.: Бином. Лаборатория знаний, 2012. С.41 ↑
-
Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. С.61 ↑
-
Лесневский А.С. Объектно–ориентированное программирование для начинающих. – СПб.: Бином. Лаборатория знаний, 2012. С.92 ↑
-
Иванова Г.С. Объектно–ориентированное программирование / Г.С.Иванова. – М.: МГТУ им. Баумана, 2012. С.67 ↑
-
Иванова Г.С. Объектно–ориентированное программирование / Г.С.Иванова. – М.: МГТУ им. Баумана, 2012. С.15 ↑
-
Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. С.98 ↑
-
Культин Н.Б. Основы программирования в Delphi 7. – СПб.: BHV, 2012. С.102 ↑
-
Фаронов В.В. Программирование на языке высокого уровня. Гриф МО РФ / В.В.Фаронов. – СПб.: Питер, 2012. С.103 ↑
-
Фленов М.Е. Библия Delphi. – СПб.: BHV, 2009. С.97–98 ↑
-
Дарахвелидзе П.Г., Марков Е.П, Программирование в Delphi 7. – СПб.: BHV, 2011. С.122 ↑
- Страхование и его роль в развитии экономики (Стрхование в жизни россиян)
- Учетная политика организации: цель, задачи, формирование, применение
- Страхование и его роль в развитии экономики (оценка развития страхования в экономике РФ)
- Реклама как сигнал и как информация (значимость рекламы как рыночного сигнала)
- Факторы, влияющие на эффективность управленческих решений
- Менеджмент международных соревнований на примере чемпионата мира по футболу 2018 года
- Общие особенности кадровой стратегии малых предприятий (кадровая стратегия современной организации)
- Организационная культура и ее роль в современных организациях (факторы, влияющие на корпоративную культуру)
- Общие особенности кадровой стратегии малых предприятий (кадровые стратегии малого бизнеса)
- Интегрированные среды разработки программ (обзор IDE)
- Программные средства создания клиентских программ (применение программных средств создания клиентских программ)
- История развития программирования в России (основы развития программирования)