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

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

Существенным недостатком программы расчёта площади треугольника является многократное повторение одних и тех же действий, что усложняют программу и увеличивает вероятность ошибок. В частности, при вводе длин сторон треугольника трижды производится перевод строковой величины в целочисленную, в расчётной формуле трижды от величины полупериметра отнимается длина одной из сторон и т.д. Все перечисленные действия, конечно, необходимы, однако, форма записи может быть упрощена. Для обращения к большому количеству данных, имеющих один и тот же базовый тип, используются структурированные типы – массивы. Каждое значение величины структурированного типа состоит из фиксированного количества значений одного и того же базового типа. Например, каждый треугольник определяется длинами 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-й параметр –комментарий.

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