Изучение языка объектно-ориентированного программирования Borland Delphi и разработка практических заданий

Тип работы:
Реферат
Предмет:
Программирование


Узнать стоимость новой

Детальная информация о работе

Выдержка из работы

Содержание

программа delphi точка квадрат

Формулировка задания

Введение

1. Описание интерфейса

2. Порядок работы с программой

3. Структура данных

4. Генерация точек

5. Ручное добавление точек

6. Поиск квадратов

7. Рисование квадратов

Список используемой литературы

Приложение

Формулировка задания

Имеется множество точек на плоскости. Выявить все квадраты, которые могут быть образованы этими точками.

Введение

Целью курсовой работы является изучение языка объектно-ориентированного программирования Borland Delphi и разработка практических заданий. При выполнении курсовой работы предстоит:

— изучить теорию и технологию работы со средой программирования Delphi;

— изучить и проанализировать соответствующую литературу;

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

Первый объектно-ориентированный язык программирования Simula 67 был разработан в конце 60-х годов в Норвегии. Авторы этого языка очень точно угадали перспективы развития программирования: их язык намного опередил свое время. Однако современники (программисты 60-х годов) оказались не готовы воспринять ценности языка Simula 67, и он не выдержал конкуренции с другими языками программирования (прежде всего, с языком Fortran).

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

Но достоинства языка Simula 67 были замечены некоторыми программистами, и в 70-е годы было разработано большое число экспериментальных объектно-ориентированных языков программирования: например, языки CLU, Alphard, Concurrent Pascal и др. Эти языки так и остались экспериментальными, но в результате их исследования были разработаны современные объектно-ориентированные языки программирования: C++, Smalltalk, Delphi и др.

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

Delphi — чрезвычайно быстро развивающаяся система. Первая версия — Delphi 1. 0 была выпущена в феврале 1995 г. А затем новые версии выпускались ежегодно.

Каждая последующая версия Delphi дополняла предыдущую.

Большинство версий Delphi выпускается в нескольких вариантах: Standart — стандартном, Professional профессиональном, Client/Server — клиент/сервер, Enterprise — разработка баз данных предметных областей. Различаются варианты в основном разным уровнем доступа к системам управления базами данных. Последние варианты — Client/Server и Enterprise, в этом отношении наиболее мощные.

1. Описание интерфейса

Внешний вид программы приведен на рисунке 1.

Окно содержит следующие визуальные компоненты:

— поле для вывода результата (Timage);

— поле, содержащее список точек (TListBox);

— поля для ввода координат точки (TEdit);

— кнопка для ручного добавления точки (TButon);

— поле для ввода количества точек для случайной генерации точек (TEdit);

— кнопки для генерации точек и кнопка для запуска процесса расчета (TButon).

2. Порядок работы с программой

Процесс работы с программой заключается в выполнении следующих шагов:

1. пользователь вводит количество точек (N), которое необходимо сгенерировать и нажимает кнопку «Сгенерировать» или вручную добавляет необходимые точки;

2. пользователь нажимает на кнопку «Рассчитать»;

3. программа находит все возможные квадраты, рисует их на поле для вывода результата и выводит их количество.

3. Структура данных

Для хранения данных о точках введем тип данных tmypoint:

1. type

2. tmypoint = record

3. x: Integer;

4. y: Integer;

5. end;

Тип tmypoint представляет собой запись, которая имеет 2 поля: x и y, для хранения соответствующих координат точек.

Для хранения информации о рабочем поле будем использовать объектный тип tfield. Его код приведен ниже.

tfield = object

points: array [0. 100 000] of tmypoint;

cnt: Integer;

function is_digit (s: string): Boolean;

procedure update_list ();

procedure add_point_str (_x, _y: string);

procedure add_point_int (x, y: integer);

function distance (p1, p2: tmypoint): Double;

function is_bar (p1, p2, p3, p4: tmypoint):

Boolean;

procedure drawbar (p1, p2, p3, p4: tmypoint);

procedure gen_bars ();

end;

4. Генерация точек

Ниже приведен обработчик нажатия на кнопку «Сгенерировать».

1. procedure TForm1. genClick (Sender: TObject);

2. var

3. i: Integer;

4. begin

5. Randomize;

6. if not field. is_digit (n_gen. Text)

7. then

8. begin

9. ShowMessage ('Неподходящие координаты');

10. Exit;

11. end;

12. for i := 1 to StrToInt (n_gen. Text) do

13. field. add_point_int (Random (img1. Width), Random (img1. Height));

14. field. update_list;

15. end;

В строке 5 происходит инициализация генератора случайных чисел процедурой Randomize. Если пользователь ввел некорректное числовое значение, то программа сообщает об ошибке и выходит из процедры (строки 6−11). В случае, если пользователь ввел корректное числовое значение N, программа генерирует 2*N случайных числа, с условием, что они могут быть корректными координатами точек. Сгенерированные координаты добавляются в список методом add_point_int объекта tfield (строки 12−13), после чего происходит обновление списка методом update_list.

Листинг метода add_point_int приведен ниже.

1. procedure tfield. add_point_int (x, y: integer);

2. begin

3. if (x > form1. img1. Width) or (y > Form1. img1. Height) or (x < 0) or (y < 0)

4. then

5. begin

6. ShowMessage ('Неподходящие координаты');

7. Exit;

8. end;

9. points[cnt].x := x;

10. points[cnt].y := y;

11. Inc (cnt);

12. end;

Эта процедура добавляет в список точек точку с координатами (x, y), после чего увеличивает на 1 счетчик точек.

Листинг процедуры update_list приведен ниже.

1. procedure tfield. update_list ();

2. var i: integer;

3. canvas: tcanvas;

4. begin

5. Form1. lst1. Clear;

6. canvas := Form1. img1. Canvas;

7. canvas. Brush. Color:=clWhite;

8. canvas. Rectangle (0, 0, Form1. img1. Width, Form1. img1. Height);

9. canvas. Brush. Color:=clBlack;

10. for i := 0 to cnt-1 do

11. begin

12. Form1. lst1. Items. add (IntToStr (points[i]. x)+ ', '+IntToStr (points[i]. y));

13. canvas. Ellipse (points[i]. x-2, Form1. img1. Height — points[i]. y-2, points[i]. x+2, Form1. img1. Height — points[i]. y+2);

14. end;

15. end;

В строке 5 очищается список точек.

В строке 6 ссылка на canvas поля для вывода результата сохраняется в локальную переменную для быстрого доступа в дальнейшем.

В строках 6−7 фон поля для вывода результата меняется на белый.

В строках 8−12 рисуются и добавляются в список точек сами точки.

5. Ручное добавление точек

Обработчик нажатия на кнопку «Добавить» приведен ниже.

1. procedure TForm1. addClick (Sender: TObject);

2. var

3. x, y: Integer;

4. begin

5. field. add_point_str (point_x. Text, point_y. text);

6. field. update_list;

7. end;

Здесь происходит вызов процедуры добавления точки в список (add_point_str) и обновление списка точек.

Листинг метода add_point_str приведен ниже.

1. procedure tfield. add_point_str (_x, _y: string);

2. var

3. x, y: Integer;

4. begin

5. if not is_digit (_x) or not is_digit (_y)

6. then

7. begin

8. ShowMessage ('Ошибка ввода');

9. Exit;

10. end;

11. x := StrToInt (_x);

12. y := StrToInt (_y);

13. add_point_int (x, y);

14. end;

Здесь проверяется корректность введенных данных (строки 5−10), преобразование строковых координат в числовые и добавление в список методом add_point_int.

6. Поиск квадратов

Для поиска всех квадратов введем метод, определяющий, возможность построения квадрата с вершинами в точках p1, p2, p3, p4.

1. function tfield. is_bar (p1, p2, p3, p4: tmypoint): Boolean;

2. var d1, d2, d3, d4: double;

3. begin

4. d1 := distance (p1, p2);

5. d2 := distance (p2, p3);

6. d3 := distance (p3, p4);

7. d4 := distance (p4, p1);

8. Result := (d1 = d2) and (d2 = d3) and (d3 = d4) and (d4 = d1) and (d1 < > 0);

9. end;

Решение о возможности построить квадрат с координатами в точках p1, p2, p3, p4 принимается на основе следующего утверждения: расстояние между точками p1 и p2 совпадает с расстояниями между точками p2 и p3, p3 и p4, p4 и p1.

При при этом это расстояние не равно 0, то возможно построить квадрат с вершинами в точках p1, p2, p3, p4, в противном случае такое построение невозможно.

Метод distance выглядит следующим образом.

1. function tfield. distance (p1, p2: tmypoint): Double;

2. begin

3. Result := (Sqrt (Sqr (p2.x — p1. x) + Sqr (p2.y — p1. y)));

4. end;

Метод, осуществляющий поиск квадратов.

1. procedure tfield. gen_bars ();

2. var

3. i1, i2, i3, i4, acnt: Integer;

4. begin

5. acnt := 0;

6. for i1 := 0 to cnt-1 do

7. for i2 := i1+1 to cnt-1 do

8. for i3 := i2+1 to cnt-1 do

9. for i4 := i3+1 to cnt-1 do

10. if is_bar (points[i1], points[i2], points[i3], points[i4])

11. then

12. begin

13. drawbar (points[i1], points[i2], points[i3], points[i4]);

14. inc (acnt);

15. end;

16. ShowMessage (IntToStr (acnt)+' квадратов найдено');

17. end;

В результате своей работы метод выводит на экран число квадратов с вершинами в данных точках, а также рисует их на поле для вывода.

В строке 5 инициализируется значение счетчика квадратов.

В строках 6−9 организуется перебор всех возможных четверок точек.

В строке 10 проверяется, возможно ли построение квадрата с вершинами в текущих координатах.

В случае успешной проверки квадрат рисуется на поле для вывода (строка 13) и увеличивается счетчик квадратов (строка 14).

В строке 16 выводится ответ.

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

1. procedure TForm1. btn1Click (Sender: TObject);

2. begin

3. field. gen_bars;

4. end;

7. Рисование квадратов

Процедура рисования квадратов выглядит следующим образом.

1. procedure tfield. drawbar (p1, p2, p3, p4: tmypoint);

2. begin

3. Form1. img1. Canvas. MoveTo (p1. x, Form1. img1. Height — p1. y);

4. Form1. img1. Canvas. LineTo (p2. x, Form1. img1. Height — p2. y);

5. Form1. img1. Canvas. LineTo (p3. x, Form1. img1. Height — p3. y);

6. Form1. img1. Canvas. LineTo (p4. x, Form1. img1. Height — p4. y);

7. Form1. img1. Canvas. LineTo (p1. x, Form1. img1. Height — p1. y);

8. end;

Последовательно рисуются линии от 1 точки к 2, от 2 к 3, от 3 к 4 и от 4 к 1.

Следует отметить, что из-за различий системы координат в Canvas и от привычной декартовой системы координат приходится «инвертировать» значения ординат точек.

Список используемой литературы

1. Дал У., Дэйкстра Э., Хоор К. Структурное программирование

2. Глас Р. Руководство по надежному программированию

3. Хьюз Дж., Мичтом Дж. Структурный подход к программированию

4. Боэм Б. и др. Характеристики качества программного обеспечения

Приложение

unit Unit1;

interface

uses

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

Dialogs, StdCtrls, ExtCtrls;

type

TForm1 = class (TForm)

img1: TImage;

lst1: TListBox;

point_x: TEdit;

lbl1: TLabel;

point_y: TEdit;

lbl2: TLabel;

add: TButton;

btn1: TButton;

n_gen: TEdit;

gen: TButton;

lbl3: TLabel;

procedure addClick (Sender: TObject);

procedure FormShow (Sender: TObject);

procedure genClick (Sender: TObject);

procedure btn1Click (Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *. dfm}

type

tmypoint = record

x: Integer;

y: Integer;

end;

var

points: array [0. 100 000] of tmypoint;

cnt: Integer;

// проверка, является ли s числом

function is_digit (s: string): Boolean;

var i: integer;

f: boolean;

begin

f := true;

if s = '' then f := false;

for i := 1 to length (s) do

if (Ord (s[i]) < Ord ('0')) or (Ord (s[i]) > Ord ('9'))

then

f := false;

Result := f;

end;

// рисует список точек

procedure update_list ();

var i: integer;

canvas: tcanvas;

begin

Form1. lst1. Clear;

canvas := Form1. img1. Canvas;

canvas. Brush. Color:=clWhite;

canvas. Rectangle (0, 0, Form1. img1. Width, Form1. img1. Height);

canvas. Brush. Color:=clBlack;

for i := 0 to cnt-1 do

begin

Form1. lst1. Items. add (IntToStr (points[i]. x)+ ', '+IntToStr (points[i]. y));

canvas. Ellipse (points[i]. x-2, Form1. img1. Height — points[i]. y-2, points[i]. x+2, Form1. img1. Height — points[i]. y+2);

end;

end;

// добавляет точки в список

procedure add_point_int (x, y: integer);

begin

if (x > form1. img1. Width) or (y > Form1. img1. Height) or (x < 0) or (y < 0)

then

begin

ShowMessage ('Неподходящие координаты');

Exit;

end;

points[cnt].x := x;

points[cnt].y := y;

Inc (cnt);

end;

// добавляет точки в список

procedure add_point_str (_x, _y: string);

var

x, y: Integer;

begin

if not is_digit (_x) or not is_digit (_y)

then

begin

ShowMessage ('Неподходящие координаты');

Exit;

end;

x := StrToInt (_x);

y := StrToInt (_y);

add_point_int (x, y);

end;

procedure TForm1. addClick (Sender: TObject);

var

x, y: Integer;

begin

add_point_str (point_x. Text, point_y. text);

update_list;

end;

procedure TForm1. FormShow (Sender: TObject);

begin

cnt := 0;

update_list;

end;

procedure TForm1. genClick (Sender: TObject);

var

i: Integer;

begin

Randomize;

if not is_digit (n_gen. Text)

then

begin

ShowMessage ('Неподходящие координаты');

Exit;

end;

for i := 1 to StrToInt (n_gen. Text) do

add_point_int (Random (img1. Width), Random (img1. Height));

update_list;

end;

function distance (p1, p2: tmypoint): Double;

begin

Result := (Sqrt (Sqr (p2.x — p1. x) + Sqr (p2.y — p1. y)));

end;

function is_bar (p1, p2, p3, p4: tmypoint): Boolean;

var d1, d2, d3, d4: double;

begin

d1 := distance (p1, p2);

d2 := distance (p2, p3);

d3 := distance (p3, p4);

d4 := distance (p4, p1);

Result := (d1 = d2) and (d2 = d3) and (d3 = d4) and (d4 = d1) and (d1 < > 0);

end;

procedure drawbar (p1, p2, p3, p4: tmypoint);

begin

Form1. img1. Canvas. MoveTo (p1. x, Form1. img1. Height — p1. y);

Form1. img1. Canvas. LineTo (p2. x, Form1. img1. Height — p2. y);

Form1. img1. Canvas. LineTo (p3. x, Form1. img1. Height — p3. y);

Form1. img1. Canvas. LineTo (p4. x, Form1. img1. Height — p4. y);

Form1. img1. Canvas. LineTo (p1. x, Form1. img1. Height — p1. y);

end;

procedure gen_bars ();

var

i1, i2, i3, i4, acnt: Integer;

begin

acnt := 0;

for i1 := 0 to cnt-1 do

for i2 := i1+1 to cnt-1 do

for i3 := i2+1 to cnt-1 do

for i4 := i3+1 to cnt-1 do

if is_bar (points[i1], points[i2], points[i3], points[i4])

then

begin

drawbar (points[i1], points[i2], points[i3], points[i4]);

inc (acnt);

end;

ShowMessage (IntToStr (acnt)+' квадратов найдено');

end;

procedure TForm1. btn1Click (Sender: TObject);

begin

gen_bars ();

end;

end.

ПоказатьСвернуть
Заполнить форму текущей работой