Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktikum_po_informatike_2003_c_uvelichennym_og....doc
Скачиваний:
31
Добавлен:
12.11.2018
Размер:
5.3 Mб
Скачать

§ 11 Компонент Memo и его использование для ввода элементов массивов

Рассмотрим решение более сложной задачи, в которой расчёт площади треугольника является лишь одним из нескольких шагов алгоритма, одной из нескольких процедур. Пусть имеется многоугольник. Количество его вершин равно (n+1), начиная с 0-й, кончая n-й. 0-я вершина совмещена с началом координат. Координаты остальных вершин известны. Требуется найти площадь многоугольника.

Y

X

0

1

2

3

4

Рис.6-7

Для решения задачи соединим вершину, расположенную в начале координат, со всеми остальными вершинами и разобьём фигуру на (n-1) треугольников, как показано на рис. 6-7. Длина каждого отрезка (стороны или диагонали многоугольника) определяется координатами его начала и его конца: √((Хнк)2+(Yн-Yк)2). Исходные данные можно представить в виде двумерного массива (матрицы) значений, в каждой строке которого расположены две координаты одной точки, а в каждом столбце – однотипные координаты различных точек. Вершинами i-го треугольника являются 0-я, i -я и (i +1)-я точки. Следовательно, длины сторон i-го треугольника равны:

Ai1=√((Хi0)2+(Yi-Y0)2);

Ai2=√((Хi+1-Хi)2+(Yi+1-Yi)2);

Ai3=√((Хi+10)2+(Yi+1-Y0)2).

Площадь треугольника Si можно рассчитать по формуле Герона. Программа расчёта площади при известных длинах сторон описана выше. При переходе к следующему треугольнику расчёт повторяется. Расчётные формулы могут быть упрощены, если учесть, что Х0= Y0=0. Кроме того, Ai3= A(i+1)1. Таким образом, для решения задачи необходимо объявить 3 массива:

  1. Двумерный массив координат точек X[1:n,1:2].

  2. Двумерный массив длин сторон треугольников A[1:(n-1),1:3].

  3. Одномерный массив площадей треугольников S[1:(n-1)].

Алгоритм решения задачи реализуется с использованием операторов цикла. Ввод данных можно осуществить с использованием окон редактирования. Однако, при большом количестве вершин количество полей редактирования может превысить разумные пределы. Количество полей редактирования может быть уменьшено за счёт ввода нескольких данных в каждое поле. В таком случае необходимо производить расшифровку информации, содержащейся в поле редактирования, с использованием специальной программы. Поэтому для ввода информации целесообразно использовать новый компонент – Memo, который находится на вкладке стандартных визуальных компонентов и может быть установлен в форму точно также, как поля редактирования и кнопки, создание которых рассматривалось выше. Этот компонент может содержать несколько строк. Информация в них может быть внесена также как в поле редактирования и воспринимается как строка символов. Доступ к информации осуществляется либо через свойство Text, либо через свойство Lines. Свойство Text используется для доступа ко всей информации целиком, а свойство Lines – для построчного доступа. В последнем случае следует указать номер строки. Например, Edit1.Text:=Memo1.Lines[1] . Нумерация строк начинается с 0. На каждой строке должно находиться не более одного числа. В противном случае необходима программа преобразования строки в последовательность чисел. Ввод и редактирование данных осуществляется либо через компонент Memo , либо через редактор String List Editor, доступ к которому возможен через окно инспектора объектов. Для вызова String List Editor следует : 1) Выбрать свойство Lines компонента Memo; 2) Щёлкнуть мышью по многоточию в правой части соответствующей строки в окне инспектора объектов. Если все данные не могут быть размещены в видимой части поля Memo, то пользователь с целью упрощения процедуры просмотра имеет возможность ввести одну или две полосы прокрутки, выбрав одно из возможных значений свойства ScrollBars (ssVertical, ssHorizontal, ssBoth, ssNone), пользователь вводит вертикальную полосу прокрутки. При считывании информации, представленной в таком виде, необходимо использовать вложенные циклы, т.е. конструкцию в которой один оператор цикла находится внутри другого. Других новых конструкций языка программа не содержит. После считывания информации и преобразования строковых данных в числовые, производится расчёт длин сторон и диагоналей многоугольника по, приведенным выше, формулам. Далее следует расчёт площадей отдельных треугольников. Общая площадь фигуры равна сумме площадей составляющих. Ниже приведен фрагмент программы расчёта площади многоугольника по координатам его вершин.

begin

n:= StrToInt(Edit1.Text);

n:=n-1;

m:=0;

for i:=1 to n do

for j:=1 to 2 do

begin

m:=m+1;

x[i,j]:=StrToInt(Memo1.Lines[m])

end;

for i:=1 to (n-1) do

begin

a[i,1]:=sqrt(sqr(x[i,1])+sqr(x[i,2]));

a[i,2]:=sqrt(sqr(x[i,1]-x[i+1,1])+sqr(x[i,2]-x[i+1,2]));

a[i,3]:=sqrt(sqr(x[i+1,1])+sqr(x[i+1,2]))

end;

for i:=1 to n-1 do

begin

p:=0;

for j:=1 to 3 do p:=p+a[i,j];

p:=p/2;

s1:=p;

for j:=1 to 3 do s1:=s1*(p-a[i,j]);

s[i]:=sqrt(s1);

{ShowMessage(FloatToStr(s[i]));}

end;

Stot:=0;

for i:=1 to n-1 do Stot:=Stot+s[i];

ShowMessage('ПЛОЩАДЬ ФИГУРЫ РАВНА' + #13 + FloatToStrF(Stot/10000,ffFixed,5,3)+' га')

end;

П

Рис. 8

ри расчёте площади фигуры по координатам её вершин, очевидно, нет необходимости контролировать правильность соотношения между длинами сторон образующих её треугольников. Поэтому элементы, связанные с таким контролем в данной программе отсутствуют.ид окна программы расчёта площади многоугольника приведен на рис.6-8. Результат выводится в окно сообщения, аналогичное окну, показанному на рис. 6-4. В поле компонента Memo введены координаты вершин квадрата, длина стороны которого равна 100 м. Если информация введена непосредственно в поле Memo, после закрытия окна формы она пропадает. Для длительного хранения информации её следует внести в процессе разработки формы с использованием редактора String list editor. Некоторые другие возможности использования компонента Memo будут рассмотрены ниже.

Рис. 6-8

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]