Алгоритмы итерационной структуры.
Итерационными называются такие циклические вычислительные процессы, в которых количество циклов заранее неизвестно.
Выход из цикла достигается при достижении какого либо условия.
Найти сумму ряда
x x x
y = x - ----- + ----- - ----- + …
2! 3! 4!
С точностью = 10, точность считается достигнутой, если очередной член ряда по модулю <.
Составим программу: x
Program iter; a = a *----- общий член ряда.
uses crt; i
var y = y +a cумма ряда.
x, y, a: real;
i = integer; esp: = real;
begin
Clr Scr; - очищение экрана
Writeln (' введите x, esp'); readln (' x, esp);
определение начальных значений.
While abc (a)>esp do
begin
Вычисление суммы ряда -
Writeln ('y=', y, ' кол. итер.=', i );
end.
1шаг 2 шаг 3 шаг
a = (-1)*(x/1) a = -(x)*(x/2) a = -(-x/2)*(x/3)…
a = +x a = x/2 a = +x/(2*3) = x/3!
Массивы.
Массив объединяет элементы одного типа данных. Всему набору данных присваивают общее имя - имя массива. Каждый элемент массива определяется с помощью индекса, определяющего место этого элемента в общем наборе.
Описание массивов:
a: array[1…n] of <mun>;
описывается в "описательной части" программы.
a - имя массива;
n - максимальное количество элементов массива;
<mun> - тип элементов массива.
Например:
program mas;
var
Mas: array[1…10] of real;
begin
….
Описан массив Mas - содержащий 10 элементов вещественного типа. Каждый элемент массива определяется с помощью индекса, стящего справа от именив квадратных скобках.
a[i], a[i+2], a[9]
Индекс может быть - переменной, константой, ариф. выражением целого типа.
Размер массива должен быть задан в явном виде, или через const.
Например:
Program mas;
const
n = 10;
var
Mas: array [1…n] of real;
… i : integer;
Mas - имя массива;
i - индекс массива.
Задача 1:
Составить программу подсчета суммы и произведения элементов одномерного массива.
Program sum-prois;
uses crt;
const
n = 100;
var
a: array [1…n] of real;
n, k, i: integer;
p, s: real;
begin
clrscr; s: = 0; p: =1;
writeln ('введите размер массива'); readln (nk);
writeln ('введите элемент массива');
for i:=1 to nk do
readln (a[i] );
for i:=1 to nk do
begin
s:= s + a[ i ];
p:= p * a[ i ];
end;
writeln ('Сум. = ', s, 'Произ. =' , p);
end.
Необходимо подготовить ячейки:
-
при накапливании суммы - s=0
-
при подсчете произведения - p=1.
Задача рассчитана на обработку массива с максимальным размером 100 элементов (n=100).
Конкретный размер массива вводится с клавиатуры (nk).
При каждом прохождении через цикл с клавиатуры вводится только один элемент массива. Два цикла for можно было объединить в один.
----------------------------------------------------------------------------------------------------------------
Задача 2:
Составить программу подсчета суммы только тех элементов массива, целая часть которых - нечетная.
Program sum;
coust n=100;
var a: array [1..n] of real;
s: real;
n, k, i: integer;
begin
s: =0; writeln ('введите n100'); readln (nk);
for i:=1 to nk do
begin
writeln ('введ.', i, '- й элемент массива');
readln (a[ i ] );
if odd (trunc (a[ i ] ) then s: = s + a[ i ];
end;
writeln ('Сумма нечетных элементов = ', s);
end.
Ввод и обработка элементов массива производится в одном цикле.
Функция trunc (a[ i ] ) - выделяют целую часть каждого элемента.
Функция odd - вырабатывает значение TRUE - если целая часть элемента массива - нечетное число, и этот элемент попадает в сумму.
Оператор writeln (odd ( trunc(x)) - выдает на печать:
TRUE - если x - нечетное;
FALSE - если x - четное.
-------------------------------------------------------------------------------------------------------------------
Задача 3:
Дан массив a(n). Найти max элемент и определить его номер.
Program max;
var
a: array [1…100] of real;
i, n, k: integer; max: real;
begin
writeln ('введите размер массива');
readln (n);
writeln ('введите элементы массива');
for i:=1 to n do
readln (a[ i ] );
max: =a[1];
k:=1;
for i:=1 to n do
{Составной оператор:}
If a[i]>max then
begin
max: =a[i];
k: =i;
end;
writeln ('max =', max, ' N=', k);
end.
Для поиска min - достаточно изменть a[i]<min.
-------------------------------------------------------------------------------------------------------------------
Задача 4:
Дан массив a(n). Преобразовать массив, циклически сдвинув его на k позиций влево.
Program prim;
var
a: array [1…100] of integer;
i, j, k, n, p: integer;
begin
writeln ('введите размер массива n100 и число k');
readln (n, k);
writeln ('введите элементы массива');
{ввод}
for i:=1 to n do
readln (a[i]);
{сдвиг}
for i:=1 to k do
begin
p: =a[1];
for i:=1 to n-1 do
a[i]:=a[i+1];
a[n]:=p;
end;
{печать }
for i:=1 ton do writein (a[i]);
end.
p - буфер для обмена содержимого ячеек.
k - число сдвигов.
n - реальный размер массива (n100).
--------------------------------------------------------------------------------------------------------------------
Задача 5:
Даны три массива:a(n), b(m), c(k).
Массив a(n)- упорядочен,
a[i]<a[i+1]
Из a(n) - удалить m элементов с номерами, хранящимися в b(m) ,(m<n). Затем в массив a(n) - вставить k элементов, не нарушая упорядоченности из массива c(k).
n-m+k100
Program prim;
label 3;
type
mas = array [1..100] of integer;
var
a, b, c: mas;
i, j, p, n, m, k:integer;
begin
write(' введите n, m, k'); readln(n, m, k);
writeln ('введите массив a);
for i:=1 to n do readln (a[i]);
writeln ('введите массив b');
for i:=1 to m do readln (b[i]);
writeln ('введите массив c');
for i:=1 to k do readln (c[i]);
{ удаление элементов из a }
for i=:1to m do
begin
for i:=b[i] to n-1 do a[i]:=a[i+1];
n:=n-1;
end;
{ вставка элементов в a }
for j:=1 to k do
begin
if c[j]>=a[n] then {если c[j] - наибольший - его ставим в конец массива.}
begin
a[n+1]:=c[j]; n:=n+1;
end;
else
for i:=1 to n do
if a[i]>c[j] then
begin
for p: =n down to i do
a[p+1]:=a[p];
a[i]:=c[j];
n:=n+1; go to 3;
end;
3: end;
for i:=1 to n do
writeln (a[i]);
end.
--------------------------------------------------------------------------------------------------------------
Задача 6:
Упорядочить элементы одномерного массива по возрастанию.
Program prim;
var
a: array [1…100] of real;
f, n, i: integer; p: real;
begin
readln (n);
for i:=1 to n do readln (a[i]);
repeat
f:=0;
for i:=1 to n-1 do
if a[i]>a[i+1] then
begin
p: =a[i];
a[i]:=a[i+1];
a[i+1]:=p; f:=1;
end;
until f=0;
for i:=1 to n do writeln (a[i]);
end.
f =1 - выставляется флаг, что два соседних элемента менялись местами.
f = 0 - массив упорядочен.