Здавалка
Главная | Обратная связь

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



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

Для организации циклов используются специальные операторы языка, называемые операторами цикла. Познакомимся с оператором цикла с парамет­ром For.

Структура оператора

for переменная := начало to конец do оператор;

или

for переменная := начало downto конец do оператор;

где

- оператор - простой или составной оператор (тело цикла);

- переменная – параметр цикла;

- начало и конец– соответствен­но начальное и конечное значения параметра.

for ([фо] – для), to ([ту] – к), downto ([даунту] – уменьшать) – ключевые слова.

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

1) в качестве параметра может использоваться только переменная порядкового типа (например, целого);

2) начальное и конечное значения параметра могут быть конс­тантами, переменными или выражениями, но должны иметь одинаковый с ним тип;

3) параметр цикла, а также его начальное и конечное значения не могут быть изменены никаким оператором в теле цикла;

4) после завершения цикла значение его параметра становится неопределенным.

Выполнение оператора с ключевым словом to. В этом варианте оператора необходимо, чтобы начало £ конец. В противном случае тело цикла не выполнится ни разу.

1. Вычисляются и запоминаются начальное и конечное значение параметра цикла (начало и конец).

2. Значение параметра (обозначим его i ) сравнивается с конечным значением конец. Если i £ конец, то выполня­ется тело цикла. В противном случае выполнение цикла прекращается.

3. Значение i увеличивается на 1 и повторяется шаг 2.

Выполнение оператора с ключевым словом downto. В этом варианте оператора необходимо, чтобы начало ³ конец. В противном случае тело цикла не выполнится ни разу.

1. Вычисляются и запоминаются начальное и конечное значение параметра цикла (начало и конец).

2. Значение параметра (обозначим его j ) сравнивается с конечным значением конец. Если j ³ конец, то выполня­ется тело цикла. В противном случае выполнение цикла прекращается.

3. Значение j уменьшается на 1 и повторяется шаг 2.

Пример 3.13.Вычислить значения функции y = sin (x 2) на отрезке [a, b], если шаг изменения её аргумента Dx.

В этой задаче количество повторений цикла равняется числу точек разбиения на отрезке [a, b] и может быть вычислено до выпол­нения цикла как целая часть от деления длины отрезка b – a на ве­личину шага Dx плюс 1. Для вычисления целой части воспользуемся встроенной функцией trunc.

var x, y, deltaX, a, b: real;

n, i : integer;

Begin

{ вычисление числа повторений тела цикла }

n := trunc ((b - a) / deltaX) + 1;

for i := 1 to n do

Begin

x := a + (i-1)* deltaX;{ вычисление текущего х }

y := sin ( sqr (x));

writeln ('x =', x:10:3, ' y =' ,y:10:3);

End

End.

Вычисление сумм

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

Пример 3.15. Вычислить сумму .

Для решения данной задачи воспользуемся методом накопления суммы. Суть его состоит в следующем. Положим S = 0 – это начальное значение S, когда вычисление суммы еще не начато. Далее вычислим следующее выражение: S + , значение которого равно 1, присвоим его переменной S. На языке PASCAL эта ото действие можно записать в виде оператора

S := S + 1/sqr(1);

После выполнения этой операции значение S будет равно 1, т.е. первому слагаемому.

Теперь вычислим выражение: S + , значение которого, снова присвоим переменной S. На языке PASCAL эта ото действие можно записать в виде оператора

S := S + 1/sqr(2);

При выполнении этой операции к старому значению S = 1 прибавится второе слагаемое, и результат запишется в S. После выполнения этой операции значение S будет равно , т.е. сумме первых двух слагаемых.

Аналогично, после выполнения оператора

S := S + 1/sqr(3);

мы получим сумму 3-х слагаемых, и т.д. Для вычисления всей суммы надо 20 раз повторить следующий оператор

S := S + 1/sqr(k);

увеличивая при этом каждый раз значение k на 1. Окончательно получаем следующий алгоритм:

1. Положить S = 0, k = 1.

2. Вычислить S + и записать результат в S.

3. Увеличить k на 1.

4. Если k £ 20, повторить шаг 2, иначе СТОП.

На PASCAL этот алгоритм удобно записать с помощью цикла repeat, т.к. в данном варианте алгоритма проверка условия прекращения цикла происходит после выполнения действия.

var S : real;

k: integer;

Begin

S:= 0; k :=1;

repeat S:= S + 1/sqr(k);

k := k + 1;

until k > 20;

writeln(‘ S = ’, S:10:5):

End.

Задачу примера 3.15 можно решить с помощью другого варианта циклического алгоритма.

1. Положить S = 0, k = 1.

2. Если k > 20, то СТОП, иначе продолжить.

3. Вычислить S + и записать результат в S.

4. Увеличить k на 1.

5. Повторить шаг 2.

На PASCAL этот алгоритм удобно записать с помощью цикла while, т.к. в данном варианте проверка условия прекращения цикла происходит до выполнения действия.

var S : real;

k: integer;

Begin

S:= 0; k :=1;

while k <= 20 do

begin S:= S + 1/sqr(k);

k := k + 1;

end;

writeln(‘ S = ’, S:10:5):

End.

В приведенных примерах количество повторений тела цикла можно оценить еще до его выполнения. Однако, во многих задачах количество этих повторений заранее не известно и вычислено быть не может. Опера­торы repeat и while позволяют организовывать такие циклы. В сле­дующих двух примерах рассмотрим нахождение суммы бесконечного ря­да с заданной точностью.

Пример 3.16.Найти сумму членов бесконечно убывающей геометрической прогрессии с точностью до слагаемого, меньшего заданной величины e:

z = 1 + x + x2 + x3 +…+ xn + …

При нахождении суммы такого ряда не следует вычислять от­дельно каждый элемент. Достаточно установить зависимость, по ко­торой из предыдущего элемента образуется следующий. Обозначим через an = xn – n-й член прогрессии, тогда

an+1 = xn+1 = an × x; a0 = 1.

Та­кой подход позволяет сократить количество вычислительных операций и уменьшить время счета. Сумму будем накапливать в переменной S, которую предвари­тельно необходимо обнулить, как и в предыдущем примере.

Условие окончания цикла – |an | £ e., которое означает, что последнее слагаемое по модулю меньше e. Так как слагаемые данного выражения убывают, то и все следующие слагаемые малы, значит, сумма от последующих сложений практически не увеличится и процесс накопления суммы можно прекратить.

Ниже приведены два варианта программы. В первом варианте использован оператор while, во втором – repeat. В программах an обозначено именем а.

Первый вариант

Var

x, s, eps, a : real;

Begin

write ('введите х и epsilon - ');

readln (x, eps);

s:=0;

a:=1; { задание параметру цикла его начального значения }

while abs(a) > eps do{ проверка условия выхода из цикла }

Begin

s := s + a; a := a * x;

end;

writeln ('сумма прогрессии = ', s:10:3)

End.

Второй вариант

Var

x, s, eps, a : real;

Begin

write ('введите х и epsilon - ');

readln (x, eps);

s := 0;

a := 1; { задание параметру цикла его начального значения }

Repeat

s := s + a; a := a * x;

until abs(a) < eps; { проверка условия выхода из цикла }

writeln ('сумма прогрессии = ', s:10:3)

End.

Пример 4.18.Выполнить задание, приведённое в примере 4.15, используя оператор for.

var s: real;

n, k : integer;

Begin

n:= 20; s:=0;

for k := 1 to n do

s := s + 1/sqr(k);

writeln ('s = ', s:10:3);

End.

 

Тема 4.Структурированные типы данных

Структурированные или сложные типы данных, в отличие от простых типов, содержат более одной компоненты, т.е. состоят из нескольких элементов. Из существующих в PASCAL структурированных типов мы рассмотрим только наиболее используемый тип – “массив”.

 

Одномерные массивы

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

Массив может быть одномерным или многомерным. Одномерный массив (линейный) соответствует в математике понятию вектора. Двумерный массив соответствует понятию матрицы. Трехмерный массив можно считать набором матриц или кубом. Массивы большей размерности на практике встречаются редко.

Все элементы имеют одно и то же имя, совпадающее с именем массива. Каждый элемент снабжает­ся индексом (порядковым номером), определяющим его относительную позицию в ряду других элементов. Индекс элемента записывается вслед за его именем в квадратных скобках, например, a[3], max[10] и т.д.

Характеристиками каждого массива являются его имя, размер­ность и длина. Имя массива выбирается по тем же правилам, что и имя простой (неиндексированной) переменной. Под длиной массива будем понимать количест­во составляющих его элементов.

В программе каждый массив должен быть описан. Его описание может быть сделано либо в разделе описания переменных – var, либо в двух разделах: описания типов – type и описания переменных – var.

Описание массива в разделе переменных выглядит так:

var имя массива : array [тип индекса] of тип элементов;

В качестве элементов массива могут выступать переменные любого типа, допустимого в языке. Тип индекса задает количество элементов в массиве; это количество определяется числом возможных значений типа, указанного в описании массива. Для индексации элементов массива чаще всего используется ограниченный тип, который образуется из какого-либо порядкового типа, кроме longint,

Пример 4.1

a) var amper : array [0..30] of real;

Описан массив с именем amper, состоящий из 31 элемента типа real; индексация его элементов начинается с нуля и заканчивается целым числом 30.

б) var v, w: array [-1..15] of integer;

Описаны два эквивалентных массива vи w целого типа, содер­жащие по 17 элементов в каждом.

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

type имя типа = array [тип индекса] of тип элементов;

var имя массива : имя типа;

 

Пример 4.2.

type vec = array [-5..10] of integer;

var b: vec;

Обращение к элементу массива. Массивы не могут обрабатываться целиком. Для того, чтобы получить доступ к элементу массива, нужно записать обращение к нему, которое выглядит как

имя массива [ индекс ]

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

Пример 4.3

b[100], c[k], yes[j+2]

Приведены обращения к элементам массивов с именами b, cи yes. Значения переменных kиj должны быть определены заранее.

Ввод и вывод одномерных массивов. Для ввода и вывода всего массива или его части используют операторы цикла, как правило, оператор for.

Пример 4.4

Var

z : array [10..100] of integer;

k : integer;

Begin

for k := 10 to 100 do read (z [ k ]);

for k := 21 to 30 do write (z [ k ]);

В приведенном фрагменте программы вводятся все элементы мас­сива z целого типа, а выводятся 10 его элементов – с 21-го по 30-й.

Отдельные элементы массивов вводятся так же, как и простые переменные.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.