Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
ПРОГРАММИРОВАНИЕ И МАТЕМАТИЧЕСКОЕ МОДЕЛИРОВАНИЕСтр 1 из 6Следующая ⇒
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ФИЗИЧЕСКИЙ ФАКУЛЬТЕТ Кафедра методики преподавания физики и информатики
ПРОГРАММИРОВАНИЕ Методические указания ПРОГРАММИРОВАНИЕ И МАТЕМАТИЧЕСКОЕ МОДЕЛИРОВАНИЕ Курс, 2 семестр для студентов физическго факультета
Минск УДК 681.3.06
Рекомендовано Ученым советом Физического факультета апреля 2004 г., протокол №
Авторы-составители: Гневко С.В., Крылов Г.Г., Шапочкина И.В.
Рецензенты канд физ.-мат. Н.Н. Дорожкин канд физ.-мат. А.И. Слободянюк
Приведены заготовки проектов для выполнения лабораторных работ по курсу «Программирование и математическое моделирование: Программирование в системе 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; Популярное:
|
Последнее изменение этой страницы: 2016-03-17; Просмотров: 1429; Нарушение авторского права страницы