ПРОГРАММИРОВАНИЕ И МАТЕМАТИЧЕСКОЕ МОДЕЛИРОВАНИЕ
Лекции.ИНФО


ПРОГРАММИРОВАНИЕ И МАТЕМАТИЧЕСКОЕ МОДЕЛИРОВАНИЕ



БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ФИЗИЧЕСКИЙ ФАКУЛЬТЕТ

Кафедра методики преподавания физики и информатики

 

ПРОГРАММИРОВАНИЕ
в системе Delphi

Методические указания
к лабораторным работам по курсу

ПРОГРАММИРОВАНИЕ И МАТЕМАТИЧЕСКОЕ МОДЕЛИРОВАНИЕ

Курс, 2 семестр

для студентов физическго факультета

 

Минск

УДК 681.3.06

 

 

Рекомендовано Ученым советом

Физического факультета

апреля 2004 г., протокол №

 

Авторы-составители:

Гневко С.В., Крылов Г.Г., Шапочкина И.В.

 

 

Рецензенты

канд физ.-мат. Н.Н. Дорожкин

канд физ.-мат. А.И. Слободянюк

 

 

    Программирование в системе Delphi : Методические указания к лабораторным работам для студентов физического факультета / Авторы : Гневко С.В., Крылов Г.Г., Шапочкина И.В.. – Мн. : БГУ, 2005. – 47 с.

 

 

Приведены заготовки проектов для выполнения лабораторных работ по курсу «Программирование и математическое моделирование: Программирование в системе Delphi», указаны связанные с выполнением лаботарорных работ необходимые компоненты, приведены индивидуальные задания по лабораторным работам.

.

Предназначено для студентов 1 курса всех специальностей физического факуль­тета.

 

 

© БГУ, 2005

Введение

Курс программирования и математического модели­рования для студентов, обучающихся по специальности физика должен включать обучение с исполь­зова­нием современных технологий программи­рования для современных операционных систем. В этой связи выбор в качестве языка программирования – языка Object Pascal и инстру­ментальной системы быстрой разработки приложений Delphi является оптимальным, так как она строится на интуитивно понятном интер­фейсе, сочетает всю полноту использования библиотек стандартных ком­понентов системы Microsoft Windows с возможностью визуальных средств быстрой разработки прило­жений.

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

Возможность изучения документации при подготовке к работе обеспечивается при этом имеющимися в электронном виде двумя учебниками по языку Object Pascal и среде разработки Dephi (в дальнейшем мы будем ссылаться на них как на Уч. Д1, Уч. Д2), которые размещаются на каждом рабочем месте.

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

· цель работы;

· перечень основных компонент, необходимых для выпол­нения работы;

· пример разработки приложения с минимальной функцио­нальностью;

· примерный перечень заданий для выполнения студентами.

 

Задания для разработки различаются по уровню сложности, что позволяет преподавателю дифферен­ци­рованно подойти к обучению каждого студента.

 


ЛАБОРАТОРНАЯ РАБОТА Л-2.1

 

Работа в интегрированной среде разработки Delphi.
Приложение с простым меню и реакцией на клавиатуру

и мышь.

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

 

Материал Уч. Д1, необходимый для написания работы, -

LES01.htm – LES03.htm, LES07.htm,LES10.htm

 

Перечень основных компонент, необходимых для выполнения работы

TFORM, TCANVAS, MessageDlg

 

Пример разработки приложения с минимальной функциональностью

 

Ниже приведена программа, обладающая следующей функциональ­ностью.

Имеется меню, содержащее пункты – Выход и О программе, нажатие на любую клавишу выдает сообшение «Клавиша=>», нажатие на клавишу мыши выдает сообщение – «правая/левая (x,y)»

 

unit L2_1; {Основной модуль работы № 1 }

Interface

Uses

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

Dialogs, Menus;

Type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

public

procedure N1Click(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure FormKeyPress(Sender: TObject; var Key: Char);

end;{class}

 

Var

Form1: TForm1;

Implementation

{$R *.dfm}

 

{Реакция на событие – пункт меню «Выход»}

procedure TForm1.N1Click(Sender: TObject);

begin

Close;

end;

 

{Реакция на событие – пункт меню «О программе»}

procedure TForm1.N2Click(Sender: TObject);

begin

MessageDlg('Мини Лаб №1', mtInformation, [mbOk], 0);

end; {Proc}

 

{Реакция на событие – мышь}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

case Button of

mbLeft: begin

Canvas.TextOut(X, Y, 'Левая('+IntToStr(X)+','+ IntToStr(Y)+')');

end;

mbRight:begin

Canvas.TextOut(X, Y, 'Правая('+IntToStr(X)+','+ IntToStr(Y)+')');

end;

end;

end; {proc}

 

{Реакция на событие – клавиатура}

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

var

st: string;

begin

st:='Клавиша=> '+Key; MessageDlg(st, mtInformation, [mbOk], 0);

end; {Proc}

end.{Unit}

Примерный перечень заданий для выполнения

 

1. На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Определить номера точек с минимальной / максимальной коорди­натами по X и по Y. Начало работы алгоритма - по нажатию правой кнопки мыши, результат выдать в окно диалога.

2. На форму поместить N точек (каждая точка помещается на форму по нажатию левой / правой кнопок мыши и имеет номер 1..N). Оп­ре­делить номера точек с минимальной / максимальной коорди­на­та­ми по X и по Y. Задачу решить отдельно для групп точек, созданных по левой и по правой кнопке мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре.

3. На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Упорядочить точки по возрастанию / убыванию координаты X. Начало работы алгоритма - по нажатию правой кнопки мыши, результат выдать в окно функцией TextOut.

4. На форму поместить N точек (каждая точка помещается на форму по нажатию правой кнопки мыши и имеет номер 1..N). Упоря­дочить точки по возрастанию / убыванию координаты Y. Начало работы алгоритма - по нажатию левой кнопки мыши, результат выдать, написав номер в позициях (x,y) каждой точки.

5. На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Вычислить расстояния всех точек до точки, помещенной на форму первой. Начало работы алгоритма - по нажатию правой кнопки мыши, результат выдать в окно диалога.

6. На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Вычислить расстояния всех точек до точки, помещенной на форму последней по нажатию правой кнопки мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдать в окно диалога.

7. На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Найти точку, максимально удаленную от точки, первой помещенной на форму по нажатию правой кнопки мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдать в окно функцией TextOut.

8. На форму поместить N точек (каждая точка помещается на форму по нажатию правой кнопки мыши и имеет номер 1..N). Найти точку, минимально удаленную от точки, последней помещенной на форму по нажатию левой кнопки мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдать в окно диалога.

9. На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Вычислить расстояния между всеми парами точек. Начало работы алгоритма - по нажатию правой кнопки мыши, результат подписать функцией TextOut в серединах отрезка, соединяющих пары точек.

10. На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Вычислить расстояния между всеми парами точек с нечетными номерами. Начало работы алгоритма - по нажатию правой кнопки мыши, результат подписать функцией TextOut в серединах отрезка, соеди­няющих пары точек.

11. На форму поместить N точек (каждая точка помещается на форму по нажатию левой / правой кнопок мыши и имеет номер 1..N). Вычислить сумму расстояний между всеми парами точек с четными номерами. Задачу решить отдельно для групп точек, созданных по левой и по правой кнопке мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдать функцией TextOut в середине окна.

12. На форму поместить N точек (каждая точка помещается на форму по нажатию правой кнопки мыши и имеет номер 1..N). Упорядочить точки по возрастанию / убыванию расстояния до точки, заданной последним нажатием левой кнопки мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдать функцией TextOut, подписав номера каждой точки.

13. На форму поместить 2 точки нажатием левой кнопки мыши. Определить координаты точки, лежащей в середине отрезка, соединяющего данные точки. Вычислить расстояние от найденной точки до правого нижнего угла формы и до точек, заданных нажатием правой кнопки мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдается в окне диалога.

14. * На форму поместить N точек (каждая точка помещается на форму по нажатию правой кнопки мыши и имеет номер 1..N). Определить порядок соединения точек незамкнутой непересекаю­щейся ломанной. Начало работы алгоритма - по нажатию левой кнопки мыши. Точки подписать их номерами, порядок соединения выдать парами номеров точек у правой границы окна.

15. На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Определить порядок соединения точек замкнутой ломанной, проводимой в порядке возрастания координат (x,y) . Начало работы алгоритма - по нажатию правой кнопки мыши. Точки подписать их номерами, порядок соединения выдать парами номеров точек у правой границы окна.

16. На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Вычислить сумму расстояний от точки с номером (N div 2) до всех остальных. Результат выдать в диалог.


ЛАБОРАТОРНАЯ РАБОТА Л-2.2

 

Пользовательские типы данных, ввод и вывод.

 

Основной целью второй лабораторной работы является изучение базовых структурных типов данных – строк, записей, массивов и их использование, а также элементарные приемы ввода-вывода данных в Delphi.

 

Материал Уч. Д1, необходимый для написания работы,

Глава3, пп.1-3, Глава4, п.1-2

 

Interface

Uses

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

Dialogs, StdCtrls, Menus;

Type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

Labl1: TMenuItem;

Edt1: TMenuItem;

ScrollBar1: TMenuItem;

Label1: TLabel;

ScrBr1: TMenuItem;

Edit1: TEdit;

Label2: TLabel;

ScrollBar2: TScrollBar;

Label3: TLabel;

public

procedure N2Click(Sender: TObject);

procedure Labl1Click(Sender: TObject);

procedure Label1Click(Sender: TObject);

procedure Edt1Click(Sender: TObject);

procedure Edit1KeyPress(Sender: TObject; var Key: Char);

procedure ScrollBar2Change(Sender: TObject);

procedure ScrollBar1Click(Sender: TObject);

procedure ScrollBar2Exit(Sender: TObject);

procedure Edit1Exit(Sender: TObject);

procedure ScrBr1Click(Sender: TObject);

end;{class}

 

Var

Form1: TForm1;

 

Implementation

{$R *.dfm}

 

{Реакция на событие – пункт меню «Выход»}

procedure TForm1.N2Click(Sender: TObject);

begin

Close;

end; {Proc}

 

{Реакция на событие – пункт меню «Ввод-вывод-Label»}

procedure TForm1.MenuLablClick(Sender: TObject);

begin

Label1.Visible:=True;

end; {Proc}

 

{Реакция на событие – клик на метку «Label»}

procedure TForm1.Label1Click(Sender: TObject);

begin

Label1.Visible:=False;

end; {Proc}

 

{Реакция на событие – пункт меню «Ввод-вывод-Edit»}

procedure TForm1.Edt1Click(Sender: TObject);

begin

Label2.Visible:=true; Edit1.visible:=true;

end; {Proc}

 

{Реакция на событие – ввод с клавиатуры в Edit}

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

var

v:real;

code:integer;

begin

if(key=#13) then begin {Конец ввода}

val(Edit1.Text,v,code);

if(code<>0) then begin

MessageDlg('Введено не число !!!', mtInformation, [mbOk], 0);

Edit1.Text:='1';

end else begin

if(v<=0) then begin

MessageDlg('Плохое число !!!', mtInformation, [mbOk], 0);

Edit1.Text:='1';

end else begin

Edit1.Visible:=false; Label2.Visible:=false

end;

end;

end;

inherited;

end; {Proc}

 

 

{Реакция на событие – изменение ScrollBar}

procedure TForm1.ScrollBar2Change(Sender: TObject);

var

s:string;

begin

Str(Scrollbar2.Position,s); Label3.Caption:='Текущее значение '+ s;

end; {Proc}

 

{Реакция на событие – щелчок по ScrollBar }

procedure TForm1.ScrollBar1Click(Sender: TObject);

begin

Label3.Visible:=true; Scrollbar2.Visible:=true;

end; {Proc}

 

{Реакция на событие – ScrollBar, потеря фокуса ввода}

procedure TForm1.ScrollBar2Exit(Sender: TObject);

begin

Scrollbar2.Visible:=false; Label3.Visible:=false;

end; {Proc}

 

{Реакция на событие – Edit, потеря фокуса ввода}

procedure TForm1.Edit1Exit(Sender: TObject);

begin

Edit1.Visible:=false; Label2.Visible:=false;

end; {Proc}

 

{Реакция на событие – пункт меню «О программе»}

procedure TForm1.MenuAbout(Sender: TObject);

var

st: string;

begin

st:='Мини. Лаб. № 2';

with Application do begin

MessageBox(Pchar(st), 'О программе', MB_OK);

end;

end; {Proc}

 

end.{Unit}

 

Примерный перечень заданий для выполнения студентами

 

1. Числа a и b – длины катетов одного прямоугольного треуголь­ника, c и d – другого. Разработать программу, определяющую, являются ли треугольники подобными.

2. Разработать программу, которая представляет исходную строку в обратном порядке и при этом удаляет в строке результата указан­ную группу символов.

3. Разработать программу, которая заменяет в исходной строке одну указанную группу символов на другую.

4. Вычислить сумму

 

с заданной точностью ε для различных значений параметров a, b.

5. Вычислить значения функции на отрезке с шагом h>0

6. Вычислить значения функции на отрезке с шагом h>0

7. Вычислить сумму

 

с заданной точностью ε для различных значений параметров a, b.

 

8. Вычислить сумму

 

 

с заданной точностью ε для различных значений параметров a, b.

 

9. Вычислить сумму

 

 

с заданной точностью ε для различных значений параметров a, b.

 

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

11. Разработать программу, которая из строки, содержащей некоторый текст, выделяет все слова и печатает их в алфавитном порядке (по первой букве).

12. Разработать программу, которая определяет, является ли данная строка палиндромом (пример: «А роза упала на лапу Азора»).

13. Разработать программу, которая исключает из данной строки группы символов, расположенные между скобками [ … ]. Сами скобки тоже должны быть исключены.

14. Дана строка символов, состоящая из нулей, единиц и пробелов. Группы единиц и нулей, разделенные пробелами и не содержащие пробелов внутри себя, называются словами. Разработать программу, подсчитывающую число слов в строке. Рассматривая слова как числа (двоичные), определить количество слов, делящихся на 5 без остатка. Найти максимальное и минимальное такое слово.

15. Разработать программу, реализующую основные арифметические операции с комплексными числами.

 

Вопросы для самопроверки

 

1. Когда и почему исчезает элемент управления Edit при нажатии клавиши «ввод»?

2. Каковы условия исчезновения с формы элементов управления?

3. Где в программе сохраняется численное значение введенного числа в Edit?

4. Как изменить свойства метки Label1, чтобы она не исчезала с формы при нажатии, а изменяла цвет фона?

5. Какова реакция ScrollBar на щелчок мыши?

 


ЛАБОРАТОРНАЯ РАБОТА Л-2.3

 

Работа с файлами

 

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

 

Материал Уч. Д1, необходимый для написания работы, -

Глава3, пп.1-3, Глава 4, п.1-2

 

Пример разработки приложения с минимальной функциональностью.

 

Ниже приведена программа, обладающая следующей функцио­нальностью. Имеется меню, содержащее пункты – Файл и О программе

 

Подпункты меню Файл позволяют прочитать и записать короткий текстовый файл. Прочитанный файл помещается в объект TMemo и может построчно редактироваться. Диалоговое окно О программе реализовано как отдельный модуль (диалог) и (вслед­ствие его простоты) в методичке не показано, но доступно на диске.

 

unit L2_3;

Interface

Uses

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

Dialogs, Menus, ExtCtrls,StdCtrls, ComCtrls;

Type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

N1, N2, N3, N4, N5, N6, N7: TMenuItem;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

Memo1: TMemo;

Label1: TLabel;

UpDown1: TUpDown;

Edit1: TEdit;

Label2: TLabel;

public

{ Public declarations }

procedure N2Click(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure Label1Click(Sender: TObject);

procedure Edit1KeyPress(Sender: TObject; var Key: Char);

procedure UpDown1Changing(Sender: TObject; var AllowChange: Boolean);

procedure N7Click(Sender: TObject);

end;{class}

Var

Form1: TForm1;

fin,fout: Text; {текстовый файл для записи эксперимента}

lines:integer;

 

Implementation

uses Unit1;

{$R *.dfm}

 

{Реакция на событие – пункт меню “Файл-Открыть”}

procedure TForm1.N2Click(Sender: TObject);

var

fn,st,st1:string;

begin

if OpenDialog1.Execute then begin {успешно закончен}

fn:=OpenDialog1.FileName;

AssignFile(fin,fn); reset(fin); lines:=0;

Label1.Visible:=true;

while NOT (EOF(fin)) do begin

readln(fin,st); Memo1.Lines.Add(st); lines:=lines+1;

end;

closefile(fin); str(lines,st1);

Label1.Caption:='Прочитан файл '+fn+ ' длиной'+st1;

st:=''; Memo1.Visible:=true; lines:=0; Edit1.visible:=true;

Label2.Visible:=true; Edit1.Text:=Memo1.Lines[lines];

UpDown1.Visible:=true;

end else begin {отменен}

st:='';

end;

end; {Proc}

 

{Реакция на событие – пункт меню “Файл-выход”}

procedure TForm1.N5Click(Sender: TObject);

begin

Close;

end; {Proc}

 

{Реакция на событие – пункт меню “Файл-Записать”}

procedure TForm1.N3Click(Sender: TObject);

var

st:string;

i:integer;

begin

if SaveDialog1.Execute then begin {успешно закончен}

st:=SaveDialog1.FileName;

AssignFile(fout,st); rewrite(fout);

for i:=0 to memo1.lines.capacity do begin

writeln(fout,Memo1.lines[i]);

end;

closefile(fout); Memo1.Visible:=false;

Label1.Visible:=false; Label2.Visible:=false;

Edit1.Visible:=false; UpDown1.Visible:=false;

end else begin {отменен} st:='';

end;

end; {Proc}

 

{Реакция на событие - «клик на метку 1»}

procedure TForm1.Label1Click(Sender: TObject);

begin

Memo1.Visible:=false; Label1.Visible:=false;

Label1.Caption:= 'Прочитан файл длиной'

end; {Proc}

 

{Реакция на событие – клавиатура для Edit1}

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

if(key=#13) then begin

Memo1.Lines[lines]:=Edit1.Text;

end;

end; {Proc}

 

{Реакция на событие – бегунок текущей позиции}

procedure TForm1.UpDown1Changing(Sender: TObject;

var AllowChange: Boolean);

var

st:string;

begin

str(UpDown1.position+1,st);

lines:=UpDown1.position;

Label2.Caption:='Текущая строка файла '+ st;

Edit1.Text:=Memo1.Lines[UpDown1.position];

Label2.Show;

end; {Proc}

 

{Реакция на событие – диалог «О программе»}

procedure TForm1.N7Click(Sender: TObject);

begin

OkBottomDlg.ShowModal;

end; {Proc}

end.{unit}

 

Примерный перечень заданий для выполнения студентами

1. Задан текстовый файл. Разработать программу поиска в файле заданного слова. Подсчитать количество таких вхождений. Прог­рамма должна позволять сформировать исходный файл.

2. Задан текстовый файл. Разработать программу замены/удаления в файле заданного слова. Подсчитать количество произведенных операций. Результат помещается в отдельный файл. Программа должна позволять сформировать исходный файл.

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

4. Разработать программу вычисления длины вектора. Координаты вектора находятся в файле. Программа должна позволять сфор­ми­ровать исходный вектор.

5. Разработать программу вычисления скалярного произведения век­торов. Координаты векторов находятся в файле. Программа должна позволять сформировать исходные векторы.

6. Разработать программу нахождения максимального и минималь­ного элементов вектора. Координаты вектора находятся в файле. Программа должна позволять сформировать исходный вектор.

7. Разработать программу сортировки одномерного массива по возрастанию/убыванию. Элементы массива находятся в файле. Программа должна позволять сформировать исходный массив. Результат помещается в отдельный файл.

8. Разработать программу вычисления произведения двух матриц. Матрицы располагаются в отдельных файлах. Программа должна позволять сформи­ровать исходные матрицы. Результат помещается в отдельный файл.

9. Разработать программу вычисления суммы двух матриц. Матрицы располагаются в отдельных файлах. Программа должна позволять сформи­ровать исходные матрицы. Результат помещается в от­дель­ный файл.

10. Разработать программу, удаляющую из матрицы строку и столбец, содержащие максималь­ный/минимальный элементы. Матрица рас­по­­ла­­­гается в отдельном файле. Программа должна позволять сфор­ми­ровать исходную матрицу. Результат помещается в отдельный файл.

11. Разработать программу учета книг в библиотеке. Данные должны располагаться в файле. Программа должна позволять формировать файл. Преду­смотреть возможность поиска книги по различным критериям (автор, название, издательство).

12. Разработать программу учета успеваимости студентов группы за сессию. Данные должны располагаться в файле. Программа должна позво­лять формировать файл. Предусмотреть возмож­ность поиска студента по фамилии. Вычислять средний балл конкретного студента и всей группы.

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

14. Разработать программу учета автомобилей на станции ТО. Данные должны располагаться в файле. Программа должна позволять формировать файл. Предусмотреть возможность поиска авто­мобиля по марке. Вычислять суммарную стоимость стоимость произве­ден­ных работ.

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

 

Вопросы для самопроверки

 

1. Когда изменяется текст метки Label1

2. Зачем используется элемент контроля – бегунок UpDown?

3. Насколько маленьким должен быть считываемый файл?

4. Как добавить в меню пункт «Новый файл»?

5. Как в меню «Файл» была проведена черта, отделяющая пункт «Выход»?

 


ЛАБОРАТОРНАЯ РАБОТА Л-2.4

 

Глава 3, пп. 1-3, Глава 4, пп. 1-2

 

Interface

Uses

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

Dialogs, Menus, StdCtrls, ComCtrls, ExtCtrls;

Const

SizeN=50;

dt=0.05;

Type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

N1,N2,N3,N4,N5,N6,N7,N8: TMenuItem;

Timer1: TTimer;

Button1,Button2 ,Button3:: TButton;

Image1,Image2, Image3: TImage;

public

procedure N8Click(Sender: TObject);

procedure N6Click(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure UpDown1Changing(Sender: TObject; var AllowChange: Boolean);

procedure Timer1Timer(Sender: TObject);

procedure Button1Click(Sender: TObject);

end;{class}

Var

Form1: TForm1;

PointsArray: array[1..SizeN] of TPoint;

fi:real;

vx,vy:real;

xx,yy,SizeYY:integer;

t:real;

Implementation

uses Unit2_4_2;

{$R *.dfm}

 

{Обработка события «О программе»}

procedure TForm1.N8Click(Sender: TObject);

begin

OKRightDlg.ShowModal;

end; {Proc}

 

{Обработка события «пункт меню Выход»}

procedure TForm1.N6Click(Sender: TObject);

begin

close;

end;{Proc}

 

{Обработка события «Моделирование-прямые»}

procedure TForm1.N2Click(Sender: TObject);

var

i:integer; sizeX,sizeY:integer;

begin

Image1.visible:=true;

sizeX:=Image1.BoundsRect.Right-Image1.BoundsRect.Left;

sizeY:=Image1.BoundsRect.Bottom – Image1.BoundsRect.Top;

randomize;

for i:=1 to SizeN do begin

PointsArray[i].X:=random(sizeX); PointsArray[i].Y:=random(sizeY);

end;

Image1.Canvas.MoveTo(PointsArray[1].X,PointsArray[1].Y);

for i:=2 to SizeN do begin

Image1.Canvas.Lineto(PointsArray[i].X,PointsArray[i].Y);

end;

Button2.Visible:=true;

end; {Proc}

 

{Обработка события «Закончить рисование линий»}

procedure TForm1.Button2Click(Sender: TObject);

begin

Image1.visible:=false; Button2.Visible:=false;

end; {Proc}

 

{Обработка события «Моделирование - эллипсы»}

procedure TForm1.N3Click(Sender: TObject);

var

i:integer;

sizeX,sizeY:integer;

begin

Image2.visible:=true;

sizeX:=Image2.BoundsRect.Right-Image2.BoundsRect.Left;

sizeY:=Image2.BoundsRect.Bottom-Image2.BoundsRect.Top;

randomize;

for i:=1 to SizeN do begin

PointsArray[i].X:=random(sizeX); PointsArray[i].Y:=random(sizeY);

end;

for i:=1 to SizeN do begin

Image2.Canvas. Ellipse(PointsArray[i].X,PointsArray[i].Y,

PointsArray[i].Y,PointsArray[i].X);

end;

Button3.Visible:=true;

end; {Proc}

 

{Обработка события «Закончить рисование эллипсов»}

procedure TForm1.Button3Click(Sender: TObject);

begin

Image2.visible:=false; Button3.Visible:=false;

end; {Proc}

 

{Обработка события пункт меню «Камень»}

procedure TForm1.N4Click(Sender: TObject);

var

i:integer;

sizeX,sizeY:integer;

begin

Image3.visible:=true; Button1.visible:=true;

 

sizeX:=Image3.BoundsRect.Right-Image3.BoundsRect.Left;

sizeY:=Image3.BoundsRect.Bottom-Image3.BoundsRect.Top;

sizeYY:=Image3.BoundsRect.Bottom – Image3.BoundsRect.Top;

 

vx:=round(50/1.4); vy:=round(50/1.4); fi:=arctan(vy/vx);

xx:=0; yy:=sizeY; t:=0;

Image3.Canvas.MoveTo(0,SizeY);

Image3.Canvas.Lineto(0+round(50*Cos(fi)), SizeY-round(50*Sin(fi)));

Image3.Canvas.MoveTo(0,SizeY);

Image3.Canvas.Pen.Color:=clBlue;

end; {Proc}

 

{Обработка события «Угол наклона»}

procedure TForm1.UpDown1Changing(Sender: TObject;

var AllowChange: Boolean);

begin

fi:=arctan(vy/vx);

end; {Proc}

 

{Обработка события «Таймер»}

procedure TForm1.Timer1Timer(Sender: TObject);

begin

t:=t+dt;

xx:=round(xx+vx*dt); vy:=vy-10*dt; yy:=round(yy-vy*dt);

Image3.Canvas.LineTo(xx,yy);

if(yy>sizeYY) then begin

Timer1.enabled:=false; button1.Caption:='STOP';

end;

end; {Proc}

 

procedure TForm1.Button1Click(Sender: TObject);

begin

if(button1.caption='START') then begin

Timer1.Enabled:=true;

end else begin

button1.Caption:='START'; button1.Visible:=false;

Timer1.enabled:=false; Image3.Hide;

end;

end; {Proc}

end{Unit}.

 

Примерный перечень заданий для выполнения студентами

 

Построить графики и численно найти нули следующих функций (координатные оси должны быть нарисованы и подписаны)

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

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

,

где N – общее число точек, m – число точек, попавших в круг, Skp – площадь круга, Skb – площадь квадрата. Изобразить решение графически.

 

Вопросы для самопроверки

 

1. Элемент управления UpDown для выбора угла бросания не работает, как его настроить?

2. Камень в примере летит «как то не так…», что надо сделать, чтобы действительно нарисовать параболу?

3. Почему затирается текст «Рисуем линии» при действиях с окном формы, а область Image - нет?

4. На каких еще видимых элементах можно рисовать?

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


ЛАБОРАТОРНАЯ РАБОТА Л-2.5

 

ООП, классы, методы, наследование

 

Целью пятой лабораторной работы является освоение концепций наследования, полиморфизма и виртуальных правил на базе простых иерархий графических объектов. При этом используются процедуры работы с графикой стандартных классов системы Delphi, порожденных от TСontrol, осваивается материал, связанный со сложными (вектор­ными свойствами) и обработка клавиатурных событий.

 

Материал Уч. Д1, необходимый для написания работы, –

Глава 3, пп. 1-3, Глава 4, пп. 1-2

 

Пример разработки приложения с минимальной функциональностью.

 

Ниже приведена программа, обладающая следующей функцио­нальностью. Имеется меню, содержащее пункты – Работа и О программе,

Подпункты меню Работа позволяют работать с графическими объектами Точка, Окружность, Многоугольник, связанных в иерархию наследованием (отдельный модуль Unit3). При этом работа с объектом осуществляется единообразно – с использованием указателя на базовый класс. Намеренно не используется механизм динамического определения типа объекта (а вводится индекс объекта в иерархии), эта возможность оставлена для самостоятельного использования в заданиях для сильных студентов.

Диалоговое окно О программе реализовано как отдельный модуль (немодальный диалог) и (вследствие его простоты) в методичке не показан, но доступен на диске.

 

unit Unit1; // Работа с формой главного окна приложения

Interface

Uses

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

Dialogs, Menus,Unit2,Unit3,ExtCtrls, ComCtrls, StdCtrls;

Type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

point: TMenuItem;

circle: TMenuItem;

N_angle: TMenuItem;

N6: TMenuItem;

exit: TMenuItem;

Public

procedure exitClick(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure pointClick(Sender: TObject);

procedure FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure circleClick(Sender: TObject);

procedure N_angleClick(Sender: TObject);

procedure FormPaint(Sender: TObject);

end;{class}

Var

Form1: TForm1;

Point1: TMyPoint;

FlagPoint: Boolean; //Активность

ObjectType:integer;

 

Implementation

{$R *.dfm}

 

{Обработка пункта меню «Выход»}

procedure TForm1.exitClick(Sender: TObject);

begin

Close; {Окончание работы}

end; {proc}

 

{Обработка пункта меню «О программе»}

procedure TForm1.N2Click(Sender: TObject);

begin

Form2.Show;

end; {proc}

 

{Обработка пункта меню «Точка»}

procedure TForm1.pointClick(Sender: TObject);

begin

ObjectType:=1;

Point1:=TMyPoint.Create(100,100,clRed);// создана красная точка

Point1.Show; // показать

FlagPoint:=True; // сделать активной для клавиатуры

end; {proc}

 

{Обработка события на форме – нажатие на клавиатуре }

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

var

i:integer;

begin

if(FlagPoint) then begin

// Если точка активна, то клавиатурные нажатия

// изменяют ее поля так

// пробел - изменение цвета по модулю 16

// управление курсором - перемещение точки

 

case Key of

VK_Space: begin

Point1.Hide; Point1.Color:=Point1.Color+255; Point1.Show;

end;

Vk_Right: begin

Point1.Hide; Point1.X:= (Point1.X+1) mod Form1.Width; Point1.Show;

end;

Vk_Left: begin

Point1.Hide; Point1.X:= (Point1.X-1) mod Form1.Width;

if(Point1.X<0) then Point1.X:= Point1.X+Form1.Width;

Point1.Show;

end;

Vk_Up: begin

Point1.Hide; Point1.Y:= (Point1.Y-1) mod Form1.Height;

if(Point1.Y<0) then Point1.Y:= Point1.X+Form1.Height;

Point1.Show;

end;

VK_Down:begin

Point1.Hide; Point1.Y:= (Point1.Y+1) mod Form1.Height; Point1.Show;

end;

VK_Escape:begin

Point1.Hide; Point1.Free; // Деструктор

FlagPoint:=False; // неактивна

ObjectType:=0;

end;

end;{case}

 

if ObjectType>1 then begin

// доступны рястяжения - сжатия

case Key of

VK_F1: begin

(Point1 as Tcircle).Expand(5);

end;

VK_F2: begin

(Point1 as Tcircle).Contract(5);

end;

end;//case

end;

 

if ObjectType>2 then begin

// доступны вращения

case Key of

VK_F3: begin

(Point1 as TPoligon).Rotate(Pi/20);

end;

VK_F4: begin

(Point1 as TPoligon).Rotate(-Pi/20);

end;

end;//case

end;

end; {if}

end;{proc}

 

{Обработка пункта меню «Окружность»}

procedure TForm1.circleClick(Sender: TObject);

begin

Point1:=TCircle.Create(100,100,50,clGreen);// создан зеленый круг

ObjectType:=2;

Point1.Show; // показать

FlagPoint:=True; // сделать активной для клавиатуры

end; {proc}

 

{Обработка пункта меню «Многоугольник»}

procedure TForm1.N_angleClick(Sender: TObject);

begin

Point1:=TPoligon.Create(100,100,50,6,clBlue);// создан синий шестиугольник

ObjectType:=3;

Point1.Show; // показать

FlagPoint:=True; // сделать активной для клавиатуры

end; {proc}

 

{Обработка события формы - перерисовка}

procedure TForm1.FormPaint(Sender: TObject);

begin

if (FlagPoint=True) and (ObjectType=3) then begin

(Point1 as TPoligon).Show;

end;

end; {proc}

end. {Unit1}

 

// ============ Второй модуль программы ========================

unit Unit3; // Пользовательская иерархия графических объектов

Interface

Uses

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

Dialogs, Menus,ExtCtrls;

Type

// Наша декларация точки

// Основное - использование массива TForm.Canvas.Pixels[x,y]

//

TMyPoint = class {Объект}

public

X,Y: Integer;

Visible: Boolean; {свойство - Видимость !!!}

Color: TColor;

public

function GetX: Integer; {Получить координату Х}

function GetY: Integer; {Получить координату Х}

constructor Create(InitX, InitY: Integer;IColor:TColor);

destructor Free;virtual;

procedure Show;virtual; {Показать объект на экране}

procedure Hide;virtual; {Убрать объект с экрана }

function IsVisible: Boolean; {Проверить видимость объекта }

procedure MoveTo(NewX, NewY: Integer); { Переместить объект}

end;{class}

 

// Наша декларация круга

// Основное - использование виртуальных правил в модуле 1

//









Читайте также:

Последнее изменение этой страницы: 2016-03-17; Просмотров: 146;


lektsia.info 2017 год. Все права принадлежат их авторам! Главная