Элементы технологии программирования
в примерах и упражнениях
Уче6ное пособие
А.П.Гагарин
2010г.
СОДЕРЖАНИЕ
Введение
1. Элементы объектно-ориентированного программирования
1.1. Определение класса и пользование его экземплярами
1.2. Наследование
1.3. Полиморфизм
1.4. Свойства и события (методы объекта, делегаты)
1.5. Класс классов
2. Организация типовых оконных приложений
2.1. Оконные приложения в IDE Delphi c библиотекой VCL
2.2. Приложение Windows Forms в Microsoft Visual Studio 2008 для среды CLR на языке C#
2.3. Приложение Windows Forms в Microsoft Visual Studio 2008 для среды CLR на языке C++
2.4. Приложение Windows Forms в Microsoft Visual Studio 2008 для среды Win32
3. Списки и таблицы
3.1. Прото-СУБД на основе класса TStringList и TStringGrid (библиотека VCL Delphi)
4. Разработка и верификация расчётных приложений
4.1. Спецификация программы uWert
4.2. Текст программы uWert
4.3. Доказательство корректности программы uWert
5. Организация многооконного интерфейса и диалога в приложениях
5.1. Многооконный интерфейс на основе сохраняемых форм
5.2. Диалог на основе динамически создаваемых форм
5.2.1. Проект диалоговой функции в Delphi
5.2.2. Проект диалоговой функции в Microsoft Visual Studio 2008 (CLR, язык C#)
5.2.3. Проект диалоговой функции в Microsoft Visual Studio 2008 (CLR, язык C++)
6. Проектирование классов
6.1. Основы модельно-ориентированного проектирования
6.2. Проект разработки компьютерной поддержки библиотеки
Приложения.
1. Синтаксис и семантика класса в языках Object Pascal, C#, C++, Java
2. Основы языка UML
Введение
Данное учебное пособие сложилось в ходе преподавания технологий программирования студентам 2-го курса, то есть студентам, заведомо не имеющим заметного опыта и широкого кругозора в области программирования. Поэтому пособие преследует до известной степени разнородные цели: ознакомить со сквозным процессом разработки программ в духе современного Software Engineering, ввести в использование современных интегральных сред программирования и просто поучить разработке программ, уровень сложности алгоритмизации в которых превышает уровень обычных, преимущественно тривиальных примеров.
Первый раздел содержит примеры простейших приёмов объектно-ориентированного программирования, которые нужны для дальнейшего, но, как показывает опыт преподавания, усваиваются бывшими школьниками далеко не сразу.
Второй раздел «Организация типовых оконных приложений» позволяет с полным пониманием приступить к использованию интегральных сред программирования Borland Delphi и Microsoft Visual Studio и служит иллюстрацией масштабного применения объектно-ориентированного стиля программирования.
Третий раздел «Списки и таблицы» по замыслу должен помочь освоить важнейшие типы данных. В данной редакции пособия в этом разделе приведён пример использования класса TStrings. Этот пример позволяет подвести студентов к проблемам реализации реляционной модели данных в СУБД. Материал на ту же тему содержится и в пункте 6.2.4 раздела 6.
Четвёртый раздел «Разработка и верификация расчётных приложений» содержит программу вычисления значения регулярного арифметического выражения и верификацию её путём формального доказательства.
Пятый раздел «Организация многооконного интерфейса и диалога в приложениях» по содержанию и целям является развитием второго раздела.
Шестой раздел демонстрирует проектирование АСУ библиотеки по методике, в целом соответствующей методике Rational Unified Process (RUP). Для документирования проекта используется язык UML, разрабатываемый силами Object Management Group (OMG). Полный исходный текст проектируемой программы вряд ли когда-нибудь войдёт в пособие из-за своего объёма. Приведён лишь его фрагмент, иллюстрирующий одно из ключевых проектных решений.
Во всех разделах сформулированы упражнения, позволяющие практиковаться в проектировании, разработке и исследовании программ, отталкиваясь от приведённых примеров, то есть – на достаточно объёмном и сложном материале.
Школьные и вузовские образовательные программы по информатике в настоящее время устроены в своём большинстве так, что студенты вначале знакомятся с языком Pascal в версии Turbo, а затем – в объектной (Object) версии. Поэтому вполне актуально проводить обучение современным представителям семейства C-подобных языков, соотнося учебный материал по этим языкам со знаниями языка Pascal, которые, с большой вероятностью, имеются у учащихся. Соответственно, пособие содержит тексты на языках Object Pascal (Delphi), C++ и С# и побуждает упражняться в понимании, переработке и доработке этих текстов.
Характер изложения материала в каждом из разделов умышленно усложняется от начала к концу. Начальные части разделов легко доступны всем читателям, в том числе тем, кто знакомится с темой. Уровень изложения в конце разделов позволит быстро освоить их продвинутым читателям и составит полезную нагрузку для остальных.
1. ЭЛЕМЕНТЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
1.1. Определение класса и пользование его экземплярами
Пример консольного приложения IDE Delphi, в котором определён класс A как наследник класса TComponent:
program ClassTest01;
{$APPTYPE CONSOLE}
uses SysUtils, classes;
type A = class(TComponent)
public
f: extended;
procedure S;
constructor create(AOwner:TComponent);
end;
procedure A.S;
var x: integer;
function Fact(n: extended):extended;
begin
if n=1 then result:=1
else result:=n*Fact(n-1)
end;
begin
write('Proc S from class A calculates factorial of ');
read(x);
// f:=x;
// write('is '+FloatToStr(Fact(f));
write('is '+FloatToStr(Fact(x));
read(x)
end;
constructor A.create(AOwner:TComponent);
begin
inherited create(AOwner)
end;
var x: A;
begin
x:=A.create(nil);дол
x.S;
end.
Процедура S запрашивает число у оператора, вычисляет и выводит его факториал, как показано на следующем рисунке.
Если в методе используются только методы данного класса, она может быть вызвана от переменной x типа А без порождения экземпляра класса. Однако если использовать, например, поля, как показано в закомментаренных строках примера, тогда экземпляр класса должен быть создан вызовом конструктора класса.
1.2. Наследование
Если в программу ClassTest01, приведённую в п.1.1, ввести определение класса C, наследника класса A,
type C = class(A) constructor create(AOwner:TComponent); end;
то процедуру S можно вызвать от класса С:
var x: С;
begin x.S end.
Однако если в класс C ввести объявление метода с именем S,
type C = class(A)
procedure S;
constructor create(AOwner:TComponent);
end;
а в программу – соответствующее, например, такое определение:
procedure C.S;
var x: integer;
begin
writeln('Proc S from class C');
readln(x)
end;
то процедура C.S “экранирует” процедуру S класса A. При том же обращении к S будет вызвана процедура S из класса A:
1.3. Полиморфизм
Полиморфизм обеспечивается динамическим связыванием переменной с классом присвоенного ей объекта. В следующем примере ClassTest02:
program ClassTest02;
{$APPTYPE CONSOLE}
uses SysUtils, classes;
type A = class(TComponent)
procedure M; virtual;
constructor create(AOwner:TComponent);
end;
type C = class(A)
procedure M; override;
constructor create(AOwner:TComponent);
end;
procedure A.M;
var x: integer;
begin
writeln('Proc M from class A');
readln(x)
end;
constructor A.create(AOwner:TComponent);
begin inherited create(AOwner) end;
procedure C.M;
var x: integer;
begin
writeln('Proc M from class C');
read(x)
end;
constructor C.create(AOwner:TComponent);
begin
inherited create(AOwner)
end;
var x: A;z: C;
begin
x:=A.create(nil);
x.M;
z:=C.create(nil);
z.M;
x:=z;
x.M
end.
от переменной x вызывается метод M класса А, затем от переменной z M класса С, а после присвоения x значения (объекта) переменной z вызывается M класса C.
Полиморфизм процедуры M обеспечивается директивой virtual в классе A и директивой override в классе C.
1.4. Свойства и события (методы объекта, делегаты)
1.5. Класс классов
УПРАЖНЕНИЯ
1. Составить и выполнить аналогичные примеры в среде оконного приложения Borland Delphi.
2. Составить и выполнить аналогичные примеры в среде оконного приложения Microsoft Visual Studio 2008.
2. ОРГАНИЗАЦИЯ ТИПОВЫХ ОКОННЫХ ПРИЛОЖЕНИЙ
2.1. Оконные приложения в IDE Delphi c библиотекой VCL
Пример 1. Создание заготовки проекта.
1) запустите IDE Delphi.
Вы увидите пустую форму
2) нажмите функциональную клавишу F12.
Вы увидите текст модуля:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
Этот модуль содержит объявление класса TForm1 - наследника класса Tform и глобальную переменную Form1 этого класса. Объявление класс TForm можно найти в модуле Forms, который связан с данным модулем в операторе uses.
3) вернитесь к графическому представлению формы, вновь нажав функциональную клавишу F12, наведите на неё курсор мыши и вызовите всплывающее меню нажатием правой клавиши; в этом меню активируйтеView as Text. Вы увидите
object Form1: TForm1
Left = 192
Top = 107
Width = 591
Height = 483
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
end
Этот текст представляет свойства класса TForm1 и их значения, которые автоматически установлены в приложении. При сохранении проекта этот текст образует файл Unit1.dfm, в то время, как Unit1 образует файл Unit1.pas.
4) активируйте в главном меню Project – View Source.
Вы увидите текст корневого сегмента программы
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Нетрудно заметить, что выполняются три метода класса TApplication, второй из которых создаёт экземпляр класса TForm1, определённый в модуле Unit1, и присваивает его там же определённой переменной Form1. Метод Run активирует окно, “скрывающееся ” в форме. Начало корневого сегмента служит точкой формы приложения. Поэтому рассмотренные предложения выполняются, если запустить приложение, например, нажатием функциональной клавиши F9. В результате будет создан экземпляр класса TForm1 и он будет показан на экране компьютера как форма.