Лабораторная работа №04 по дисциплине "Информатика и программирование модуль 2"
ТЕМА: Операторы (инструкции) цикла. Массивы.
----
ОПЕРАТОРЫ (ИНСТРУКЦИИ) ЦИКЛА
------
1. ОПЕРАТОРЫ ( ИНСТРУКЦИИ) ЦИКЛА служат для организации ЦИКЛОВ.
ЦИКЛ представляет собой последовательность операторов,
которая может выполняться более одного раза.
Последовательность повторяемых операторов называется ТЕЛОМ ЦИКЛА.
Для построения цикла в принципе можно использовать операторы ПЕРЕДАЧИ
УПРАВЛЕНИЯ с передачей управления на начало ТЕЛА ЦИКЛА, но все-таки
в большинстве случаев удобнее использовать ОПЕРАТОРЫ ЦИКЛА.
Выполнение оператора цикла может быть прервано из ТЕЛА ЦИКЛА с помощью
оператора перехода goto или специального оператора без параметров break,
который передает управление оператору, следующему за ОПЕРАТОРОМ ЦИКЛА.
С помощью специального оператора без параметров continue можно досрочно
передать управление в конец ТЕЛА ЦИКЛА, что равносильно досрочному
завершению очередного повторения ТЕЛА ЦИКЛА.
Операторы цикла могут быть вложены друг в друга.
2. ОПЕРАТОР ЦИКЛА С ПРЕДУСЛОВИЕМ (с предварительным условием)
while <Условие> do <Оператор>;
целесообразно использовать, когда число повторений тела цикла
заранее неизвестно и тело цикла может даже ни разу не выполниться.
<Оператор> тела цикла выполняется, пока значение логического выражения <Условие> равно true до тех пор, пока это значение не примет значение false, после чего происходит передача управления оператору,
следующему за этим оператором цикла.
Если перед первым выполнением цикла значение <Условия> равно false,
то тело цикла не выполняется ни разу и происходит передача управления оператору, следующему за этим оператором цикла.
<Операторы> тела цикла должны влиять на значение <Условия>, иначе произойдет зацикливание (повторение тела цикла без возможности выхода из цикла).
3. ОПЕРАТОР ЦИКЛА С ПОСТУСЛОВИЕМ (с последующим условием)
repeat
<Оператор1>;
...
<ОператорN>;
until <Условие>;
целесообразно использовать, когда тело цикла необходимо выполнить не менее одного раза и заранее неизвестно число повторений цикла.
<Операторы> между repeat и until составляют тело цикла и выполняются, пока значение логического выражения <Условие> не примет значение true,
после чего происходит передача управления оператору,
следующему за этим оператором цикла,
(то есть тело цикла повторяется при значении <Условия>, равном false).
Так как условие проверяется в конце цикла,
<Операторы> выполняются хотя бы один раз.
<Операторы> тела цикла должны влиять на значение <Условия>, иначе произойдет зацикливание (повторение тела цикла без возможности выхода из цикла).
4. ОПЕРАТОР ЦИКЛА С ПАРАМЕТРОМ имеет две разновидности:
for <Параметр>:=<Выражение1> to <Выражение2> do <Оператор>;
и
for <Параметр>:=<Выражение1> downto <Выражение2> do <Оператор>;
и применяется, если количество повторений цикла известно заранее.
<Оператор> тела цикла выполняется до полного перебора всех значений
<Параметра> (параметра цикла) с шагом 1 для оператора с to и с шагом –1
для оператора с downto от значения <Выражения1> (начального значения)
до значения <Выражения2> (конечного значения).
Начальное и конечное значения не изменяются при выполнении цикла.
Значение параметра цикла не должно изменяться при выполнении <Оператора>.
Цикл с to может не выполниться ни разу, если начальное значение больше конечного.
Цикл с downto может не выполниться ни разу, если начальное значение меньше конечного.
5. Примеры использования различных ОПЕРАТОРОВ ЦИКЛА для суммирования элементов числового ряда
1 1 1 1 S = ¾ + ¾ + ¾ + ... + ¾
12n2 до тех пор, пока значение очередного элемента ряда больше заданного числа e (заданной точности) или с заданным числом n элементов ряда:
e:=0.001;
s:=0;
n:=1;
a:=e+1;
while a>e do begin a:=1/(n*n); s:=s+a; n:=n+1 end;
Соответствующее этому примеру тело цикла с использованием
только операторов передачи управления может выглядеть следующим образом:
m1: if a>e then begin a:=1/(n*n); s:=s+a; n:=n+1; goto m1; end;
e:=0.001;
s:=0;
n:=1;
repeat a:=1/(n*n); s:=s+a; n:=n+1; until a<=e;
Соответствующее этому примеру тело цикла с использованием
только операторов передачи управления может выглядеть следующим образом
m1: a:=1/(n*n); s:=s+a; n:=n+1; if a<=e then else goto m1;
(в этом теле цикла между then и else операторы отсутствуют или, иначе говоря, там находится пустой оператор):
n:=1000;
s:=0;
for i:=1 to n do begin a:=1/(i*i); s:=s+a end;
Соответствующее этому примеру тело цикла с использованием
только операторов передачи управления может выглядеть следующим образом:
i:=1; m1: if i<=n then begin a:=1/(i*i); s:=s+a; i:=i+1; goto m1; end;
6. Примеры использования различных ОПЕРАТОРОВ ЦИКЛА для вычисления значений функции f(x) с заданными начальным значением аргумента x0,
конечным значением аргумента xk и шагом изменения значения аргумента dx:
x:=x0; while x<=xk+dx/2 do begin y:=f(x); writeln(x,y); x:=x+dx end;
x:=x0; repeat y:=f(x); writeln(x,y); x:=x+dx until x>xk+dx/2; В этом и предыдущем примере значение переменной xk из-за погрешности вычислений может оказаться не равно конечному значению переменной x и поэтому значение этой переменной x сравнивается со значением выражения xk+dx/2.
x:=x0;
for i:= 1 to round((xk-x0)/dx+1) do begin y:=f(x); writeln(x,y); x:=x+dx end; В этом примере для оператора цикла с параметром
выражение round((xk-x0)/dx+1) вычисляет целочисленное конечное значение параметра, равное количеству повторений цикла.
Во всех этих примерах перед выполнением оператора цикла переменной x присваивается значение x0 (x:=x0), в теле цикла вычисляется значение y (y:=f(x)), выводятся значения переменных x и y (writeln(x,y)) и значение переменной x изменяется на величину dx (x:=x+dx).
Вместо использования функции вычисление значения переменной y может происходить и другими способами
(с использованием выражений, операторов перехода, цикла и т. д.).
СОЗДАНИЕ ПРОГРАММЫ
-------
ПРОГРАММА 4-1
--
7. Создайте консольное приложение (с использованием оператора цикла с while
или оператора цикла с repeat – по Вашему выбору),
выполняющее сначала ввод начального значения
действительного аргумента
,
конечного значения
этого аргумента и шага изменения
этого аргумента,
затем в циклическом режиме вычисление значений функции
для значений аргумента
, начиная от
с шагом
до
(
,
,
, ... ,
),
и вывод в отдельной строке (с двумя знаками после десятичного разделителя)
текущего значения аргумента
и текущего значения функции
,
(например, для
).
После вывода результатов вычислений в приложении должен быть предусмотрен
переход снова на ввод начального и конечного значений аргумента и шага его
изменения.
МАССИВЫ
-------
8. Массив – это индексированная совокупность однотипных элементов, имеющая общее имя.
Каждый элемент массива однозначно определяется именем массива и индексом
(номером этого элемента массива) или индексами, если массив многомерный.
Для обращения к отдельному элементу массива указывается имя этого массива
и индекс элемента, заключенный в квадратные скобки (или индексы элемента,
если массив многомерный), например,
mass[2], mass[i], arrm[5,1], mm[i,k].
Количество индексов определяется размерностью массива (одномерный,
двумерный и т. д.), причем размерность не ограничивается.
Чаще всего используются одномерные и двумерные массивы. В математике аналогом одномерного массива является вектор, двумерного – матрица.
Индексы чаще всего имеют целочисленный тип и могут быть выражением целого
типа.
Массивы могут быть статические и динамические. Для статического массива границы индексов и, соответственно, размеры массива задаются при объявлении
(описании) массива, т. е. они известны еще до компиляции программы.
Формат описания (объявления) типа статического массива:
<Имя>: array [Тип индексов] of <Тип элементов>
9. Примеры описаний (объявлений) статических массивов:
var z: array [1..20] of real;
ab: array [10..100] of integer;
v: array [1..20,1..10] of real;
Здесь z и ab являются одномерными массивами, v – двумерным массивом.
Каждый из элементов массива ab – целое число типа integer,
массивов z и v – вещественное число типа real.
Массив z состоит из 20 элементов (нижняя граница индексов – 1,
верхняя граница – 20),
массив ab состоит из 91 элемента (нижняя граница индексов – 10,
верхняя граница – 100),
массив v состоит из 200 элементов (из 20 строк по 10 элементов в каждой).
10. При описании (объявлении) массивов могут быть использованы
именованные константы.
Именованные константы могут быть использованы в программе вместо числовых значений этих констант. Раздел описания (объявления) констант может находиться в программе в том же месте, где и раздел описания (объявления) переменных.
Примеры описания (объявления) констант:
const w1='WORD'; otl='5'; e=2.71828;
Имя константы отделяется от выражения знаком равенства.
Тип константы автоматически распознается на основании типа выражения
справа от знака равенства.
Примеры использования именованных констант при описании (объявлении) массивов:
const M=10; N=20; L=100;
var z: array [M..N] of real;
ab: array [M..L] of integer;
v: array [1..N,1..M] of real;
Использование в таких случаях именованных констант позволяет изменять используемые в разных местах программы значения границ индексов массивов, изменяя лишь значения соответствующих именованных констант в области их описания (объявления).
11. В программах для работы с массивами наиболее употребительным является
ОПЕРАТОР ЦИКЛА С ПАРАМЕТРОМ (оператор цикла с for).
12. Пример ввода и затем суммирования элементов массива
(ввод должен выполняться в цикле отдельно для каждого элемента массива):
for i:=1 to 20 do Readln(z[i]);
s:=0; for i:=1 to 20 do s:=s+z[i];
13. Пример определения максимального значения (max) элементов массива
и определения индекса (imax) первого из элементов массива, имеющих
максимальное значение:
max:=z[1]; //1-й элемент массива тоже может быть максимальным
imax:=1;
for i:=1 to 20 do if z[i]>max then begin max:= z[i]; imax:=i end;
14. Пример вложенного цикла для суммирования элементов каждой строки двумерного массива v с размещением полученных сумм в тех элементах массива z,
индексы которых совпадают с номерами строк массива v:
for i:=1 to 20 do begin z[i]:=0;
for k:=1 to 10 do z[i]:=z[i]+v[i,k]
end;
15. При вводе и выводе значений элементов массива можно указывать только элемент массива с индексами, например:
Readln(z[10], z[i+k], v[k,I+1]);
Writeln(z[1], z[i+1], v[i,k]);
СОЗДАНИЕ ПРОГРАММ
------
ПРОГРАММА 4-2
--
16. Создайте консольное приложение, при выполнении которого происходит:
а) ввод вещественных чисел в одномерный массив, состоящий из 10 элементов,
с нижней границей индексов, значение которой равно номеру Вашего компьютера
(в описании массивов должны быть использованы идентификаторы именованных
констант для указания значений границ индексов массива, и, кроме того,
идентификаторы этих же именованных констант должны быть использованы
при вычислениях вместо значений границ индексов массива);
б) вычисление и вывод с 2 знаками после десятичной точки значений следующих
величин:
суммы значений элементов массива;
минимального значения элементов массива;
среднего значения элементов массива;
максимального значения элементов массива.
ПРОГРАММА 4-3
--
17. Создайте консольное приложение, при выполнении которого происходит:
а) ввод вещественных чисел в двумерный массив, состоящий из 3 строк
по 4 элемента в каждой, с нижними границами индексов, равными 1;
б) вычисление для каждой строки этого двумерного массива
суммы значений элементов строки и присвоение вычисленных значений сумм
элементам одномерного массива соответствующей длины;
в) вычисление для каждой строки этого двумерного массива
среднего значения элементов строки и присвоение вычисленных
средних значений элементам еще одного одномерного массива
соответствующей длины;
г) вывод в одной строке с двумя знаками после десятичной точки
значений первых элементов этих двух одномерных массивов,
затем вывод во второй строке также с двумя знаками после десятичной точки
значений вторых элементов этих двух одномерных массивов,
затем вывод в третьей строке также с двумя знаками после десятичной точки
значений третьих элементов этих двух одномерных массивов.
ДИНАМИЧЕСКИЕ МАССИВЫ
18. Динамические массивы отличаются от статических тем, что при их объявлении
(описании) не указывается число элементов массива и место для их размещения
не отводится. В связи с этим динамические массивы следует использовать тогда,
когда объемы массивов заранее неизвестны и определяются в процессе выполнения
программы.
Формат объявления (описания) типа динамического массива:
<Имя>: array of <Тип элементов>
19. Примеры объявлений (описаний) динамических массивов:
var a: array of real; //Одномерный динамический массив вещественных чисел
b: array of array of integer; //Двумерный динамический массив целых чисел
20. Перед использованием динамического массива следует задать его размер
процедурой SetLength, в качестве аргументов которой указываются имя массива
и целые значения, определяющие размеры массива.
Например, при выполнении оператора процедуры
SetLength(a,N);
для одномерного динамического массива a будет выделена память для размещения
N элементов этого массива и заданы нулевые значения этих элементов.
Индексы динамического массива являются целыми числами, начинающимися с 0. В приведенном выше примере динамический массив a содержит N элементов
от a[0] до a[N-1] включительно.
При выполнении оператора процедуры
SetLength(b,i,k);
для двумерного динамического массива b будет выделена память для размещения
i·k элементов этого массива и заданы нулевые значения этих элементов.
21. При записи операторов элементы динамических массивов имеют такой же вид,
как и элементы статических массивов.
22. При повторном применении процедуры SetLength к уже существующему в памяти
динамическому массиву его размер изменяется.
Если новое значение размера больше предыдущего, то все значения элементов
сохраняются и в конце массива добавляются новые нулевые элементы.
Если новое значение размера меньше предыдущего, то в массиве остаются только
значения первых элементов (массив усекается).
23. Удалить из памяти динамический массив (например, массив a) можно:
или присвоением ему значения nil:
a:=nil;
или использованием функции Finalize:
Finalize(a);
или использованием процедуры SetLength для задания нулевого размера массива:
SetLength(a,0);
СОЗДАНИЕ ПРОГРАММЫ
-------
ПРОГРАММА 4-4
--
24. Создайте консольное приложение, при выполнении которого происходит то же,
что и при выполнении ПРОГРАММЫ 4-2, но с использованием одномерного
динамического массива (разумеется, с нижней границей индексов, равной нулю)
и с вводом размера этого динамического массива.
ОТЧЕТ О ВЫПОЛНЕНИИ РАБОТЫ
---
25. Продемонстрируйте тексты созданных программ,
а также их выполнение в среде программирования и независимо от нее.
________________________________________________________________________________


