Смекни!
smekni.com

Спецификация программы uWert > Текст программы uWert Доказательство корректности программы uWert Организация многооконного интерфейса и диалога в приложениях (стр. 1 из 10)

Элементы технологии программирования

в примерах и упражнениях

Уче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 и он будет показан на экране компьютера как форма.