Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Использование массивов и циклов




Существенным недостатком программы расчёта площади треугольника является многократное повторение одних и тех же действий, что усложняют программу и увеличивает вероятность ошибок. В частности, при вводе длин сторон треугольника трижды производится перевод строковой величины в целочисленную, в расчётной формуле трижды от величины полупериметра отнимается длина одной из сторон и т.д. Все перечисленные действия, конечно, необходимы, однако, форма записи может быть упрощена. Для обращения к большому количеству данных, имеющих один и тот же базовый тип, используются структурированные типы – массивы. Каждое значение величины структурированного типа состоит из фиксированного количества значений одного и того же базового типа. Например, каждый треугольник определяется длинами 3-х сторон, т.е. тремя элементами целого или вещественного типа. Поэтому все значения массива можно объединить некоторым групповым именем, а к каждому элементу массива обращаться, указав его имя и порядковый номер, называемый индексом. Следовательно, для корректного определения регулярного типа необходимо задать 2 характеристики: тип его элементов, а также количество и «способ нумерования» элементов. В языке Object Pascal определены две разновидности массивов: статические и динамические. Количество элементов статического массива должно быть известно перед компиляцией программы, а элементы массива хранятся в памяти в течение всего периода работы программы. Поэтому использование статических массивов часто сопряжено с нерациональным использованием ресурсов компьютера. Определение статического массива имеет следующий общий вид:

Type

A=array[T1] of T2

Где array и of - служебные слова; Т1 – тип индекса массива; T2 – тип компонент. В качестве типа индекса может выступать любой перечислимый или интервальный тип, сформированный на основе какого-либо дискретного типа, кроме LongInt. В памяти машины массив не должен занимать более 64 кБт. Массив, представляющий собой последовательность целых чисел в количестве не более 20 (одномерный массив), может быть описан следующим образом: M1: Array[1..20] of integer. Если элементами массива являются массивы(массив в виде матрицы), то для идентификации элемента необходимы два индекса – номер строки и номер столбца. В этом случае говорят, что массив двумерный. Для описания двумерного массива используется запись: Matrix:Array[1..10,1..20] of integer. Число индексов, т.е. размерность массива не ограничивается. Обращение к элементу одномерного массива М1 имеет вид М1[5], а обращение к элементу двумерного массива - Matrix[5,6], где указываются номер строки и номер столбца. Паскаль допускает единственно возможное действие над массивами – присваивание его в операторе присваивания A:=B. Каждый элемент массива считается переменной, и ему можно присвоить значение обычным способом. Особенности работы с динамическими массивами будут рассматриваться ниже.

В задаче о расчёте площади треугольника можно использовать два одномерных массива – массив строковых величин, вводимых пользователем в поля редактирования, и массив длин сторон треугольника. Эти массивы должны быть описаны следующим образом:

A1: array[1..3] of string[5];

A: array[1..3] of integer;

Каждый массив может содержать не более 3-х элементов. Строки, входящие в состав массива А1, содержат не более 5-ти символов.

В Object Pascal имеются 3 оператора для создания циклических конструкций.

Оператор цикла с параметром.

Блок операторов
Вход

 

 

 
 

 


Выход

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

Данный вариант оператора цикла определяет:

1. Диапазон изменения значений управляющей переменной и число повторений оператора, содержащегося в теле цикла.

2. Направление изменения значения переменной (возрастание или убывание).

3. Собственно действия, выполняемые на каждой итерации (оператор тела цикла).

Синтаксическая диаграмма оператора цикла с параметром имеет вид:

 

Диапазон

 

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

1. В качестве управляющей переменной должна использоваться простая переменная, описанная в текущем блоке.

2. Управляющая переменная должна иметь дискретный тип.

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

4. В теле цикла запрещается явное изменение значения управляющей переменной (например, оператором присваивания).

Фрагмент программы выполнения цикла с параметром имеет следующий вид:

for i:=1 to n do

begin

……… {Тело цикла}

end;

Здесь i – параметр цикла;

n - верхняя граница интервала изменения параметра цикла.

После нормального завершения цикла значение управляющей переменной становится неопределённым. При каждом последующем выполнении цикла управляющая переменная либо увеличивается, либо уменьшается на единицу.

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

1. Шаг = 1 и i2<i1

2. Шаг = -1 и i2>i1

Фрагмент программы расчёта площади треугольника с использованием операторов цикла приведен ниже

a1[1]:=Edit1.Text;

a1[2]:=Edit2.Text;

a1[3]:=Edit3.Text;

for i:=1 to 3 do a[i]:=StrToInt(a1[i]);

for i:=1 to 3 do

begin

b:=i+1;

c:=i+2;

if b>3 then b:=b-3;

if c>3 then c:=c-3;

if a[i]>(a[b]+a[c]) then

begin

k:=1;

if k<>0 then MessageDlg('Введено ошибочное значение длины '

+#13+IntToStr(i)+'-й стороны',

mtError,[mbRetry],0);

end;

end;

if k=0 then

begin

p:=0;

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

p:=p/2;

s1:=p;

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

s:=sqrt(s1);

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

end

end;

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

Во многих случаях нет необходимости выполнять все итерации внутри диапазона изменения параметра цикла, выполнение тела цикла может быть прекращено после выполнения какого-либо условия. В задаче о расчёте площади треугольника такая ситуация имеет место в процессе контроля правильности ввода исходных данных. Длина только одной стороны может превосходить сумму длин двух других сторон. Поэтому, если установлено, что a[1]>a[2]+a[3], нет необходимости контролировать правильность ввода длин остальных сторон, и выполнение цикла может быть прекращено после первой же итерации. Следовательно, при каждом новом выполнении тела цикла должен решаться вопрос о переходе к новой итерации или о завершении цикла. Проверка выполнения условия продолжения цикла может осуществляться либо перед выполнением тела цикла (предпроверка условия), либо после выполнения тела цикла (постпроверка условия). В большинстве случаев возможны оба варианта.

Для решения задачи с предварительной проверкой условия используется оператор While … Do (до тех пор, пока). Синтаксическая диаграмма этого оператора имеет вид

 

Блок-схема алгоритма оператора While … Do, следующая

Блок операторов
Нет
Да
Вход

 

 
 

 

 


Выход

Проверка условия производится в на­чале работы оператора. Если условие не выполняется, повторение тела цикла прекращается, и выполняется сле­дующий оператор.

 

Последний среди операторов цикла – оператор с последующей проверкой условия Repeat … Until (до тех пор пока). Его синтаксическая диаграмма имеет вид

 

 


Блок-схема алгоритма, реализуемого этим оператором, следующая

Нет
Блок операторов
Вход

 

       
   
Да
 
 


Выход

Отличия, от оператора While…do заключаются в том что 1 Проверка условия производится после выполнения цикла. 2 Повторение цикла имеет место лишь до тех пор, пока условие не выполняется. Выполнение условия сопровождается прекращением цикла.    

 

3 Между служебными словами While … Do может находиться только один оператор, возможно, составной, а между словами Repeat … Until может быть размещено несколько операторов.

i:=0; While i< 10 do Begin i:=i+1; …………. End; i:=0; Repeat I:=i+1; ………….. until i>=10;

 

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

i:=0;

Repeat

i:=i+1;

b:=i+1;

c:=i+2;

if b>3 then b:=b-3;

if c>3 then c:=c-3;

if a[i]>(a[b]+a[c]) then

Begin

k:=1;

if k<>0 then MessageDlg('Введено ошибочное значение длины '

+#13+IntToStr(i)+'-й стороны',

mtError,[mbRetry],0);

end;

until (k<>0) or (i=3);

Здесь проверка условия осуществляется после ввода значений длин сторон. Поэтому использован оператор Repeat … Until (подчёркнут). Прекращение цикла имеет место либо, когда параметр цикла станет равным 3 (будут проверены все исходные данные), либо после выявления ошибки ввода. В подобных случаях возможна проверка условия перед выполнением следующей итерации с использованием оператора While…do. Кроме того, для вывода информации об ошибке использована процедура MessageDlg, имеющая 4 параметра. 1-й параметр –сообщение («Ошибка…..»); 2- параметр – тип стандартной эмблемы окна диалога (mtWarning - предупреждение, mtError - ошибка, mtInformation - информация, mtConfirmation подтверждение, mtCustom – сообщение пользователя); 3-й параметр – надпись на кнопке (mrNone, mrAbort, mrYes, mrOk, mrRetry, mrNo, mrCancel, mrIgnore, mrAll); 4-й параметр –комментарий.

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

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

 
 


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

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

Ai2=√((Хi+1i)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






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных