- •1)Оператор присваивания.
- •11)Циклические вычислительные процессы.
- •12)Оператор цикла с параметром.
- •13)Вычисление конечных сумм и произведений.
- •14)Оператор цикла с предусловием.
- •15)Оператор с постусловие.
- •16)Вложенные циклы
- •17)Пример использования вложенных циклов
- •28. Процедуры и функции.
- •29.Описание процедуры.
- •30.Вызов процедуры
- •31. Описание функций.
- •32. Вызов функции.
17)Пример использования вложенных циклов
Пусть необходимо вычислить значение функции от двух переменных. Составим алгоритм программы вычисления значения функции Z=f(x,y) от двух переменных x и y, где x=x0(hx)xn и y=y0(hy)yn. В качестве функции f(x,y) возьмем например функцию sin(x+y). Для определения значений функции Z для всех различных пар(x,y) необходимо организовать вычисления следующим образом. Вначале при фиксированном значении одного из аргументов, например, при x=x0, вычислить значение Z для всех заданных y, т.е. Для y0, y0+hy...yk, затем, изменив значение x на x+hx, следует вновь перейти к полному циклу изменения переменной y. Эти действия необходимо повторить для всех заданных x, т.е. Для х0, х0+hx,...xn. При реализации данного алгоритма необходима структура вложенных циклов, в которой внешний цикл служит для изменения значений переменной х, а внутренний цикл служит для изменения значений переменной y. В этой задаче внешний и внутренний циклы можно поменять местами, при этом изменится только очередность изменения аргументов при вычисления функции. Алгоритм решения этой задачи приведен ниже:
Фрагмент программы, который в общем виде показывает структуру вложенных циклов, для данной задачи имеет вид:
.
.
.
х:=х0;
repeat {начало внешнего цикла}
y:=y0;
repeat {начало внутреннего цикла}
z:=sin(x+y);
writeln ('z=', z,'x=', x,'y=',y);
y:=y+hy
until y>yn; {завершение внутреннего цикла}
x:=x+hx
until x>xn; {завершение внешнего цикла}
18)Сложные типы данных
Все рассмотренные типы данных яв-ся не структурированными (скалярными). Структурированные (сложные) типы данных - это совокупность связанных данных и множество правил определяющих их организацию и способ доступа элементам данных. К сложным типам данных в языке Паскаль относятся массивы, записи, файлы, множества, ссылочные типы. В турбо Паскале дополнительно имеется еще строковый тип.
19)Массивы.
Массив – это упорядоченная совокупность однотипных элементов данных. Каждому элементу массива соответствует номер определяющий положение элемента в массиве. Этот номер называется индексом. Основными характеристиками массива являются имя массива, размер массива, тип элементов и тип индексов. Общая форма описания массива имеет вид: <имя массива>: array[<тип индексов>]of<тип элементов>;
Тип индексов может быть любым скалярным типом кроме типа real. Обычно тип индексов бывает целого типа, или отрезком типа. Число элементов массива определяется количеством возможных значений типа индексов. Тип элементов массива может быть любым кроме файлового.
20. Одномерные массивы.
Кол-во типов индексов в описании массива определяет размерность массива. Одномерные массивы содержат в описании один тип индекса:
Var
M:array[1..8] of real;
Массив с именем М состоит из 8 элементов вещественного типа. Здесь в кач-ве типа индекса используется отрезок целого типа от 1-го до 8-ми.
Доступ к отдельному элементу массива осуществляется указанием имени массива, за которым в квадратных скобках следует индексное выражение. Индексное выражение должно давать значения, лежащие в диапазоне определяемом типом индекса. Например, для массива М доступны след.индексные переменные: М[1],M[2],…,M[8]
Пример доступа к элементам массива:
M[1]:=3.0; {присвоить значение 3.0 элем.массива М с индексом 1}
Или:
i:=1
M[i+2]:=5.0; {присвоить значение 5.0 элем. с индексом 3}
21) Многомерные массивы.
Если кол-во типов индексов в описании массива равно n, то массив называется n-мерным. При n=2 массив называется двумерным. Многомерный массив – это абстракция, т.к.память ЭВМ одномерна и многомерные массивы хранятся в памяти ЭВМ в виде линейных последовательностей значений. В языке Паскаль элементы массива размещаются в памяти ЭВМ по строкам. Пример:
Элементы матрицы А, состоящей из 2х3 элементов
А=|1 2 3|
|4 5 6| будут размещены в памяти ЭВМ в виде последовательности:1,2,3,4,5,6.
Если указанный тип используется в программе для определения одного массива, то описание массива можно поместить в раздел описания переменных:
Var
A:array[1..2,1..3] of integer;
Здесь описан двумерный массив, массив А из 2-х строк, каждая из которых содержит 3 элемента. Доступ к отдельному элементу двумерного массива А, находящемуся на пересечении i-той строки и j-ого столбца осуществляется так:
A[i,j] или A[i][j]
Пример:
A[1,1]:=3; {Присвоить значение 3-му элементу массива А, находящемуся на пересечении 1-ой строки и 1-ого столбца}
22) Ввод и вывод массивов.
Для задания значений элементом массива, кроме операторов присваивания, можно использовать операторы ввода данных. В языке Паскаль для этого применяется поэлементный ввод массива, при котором вводятся отдельные элементы массива.
Пример ввода и вывода одномерного и двумерного массивов:
Program Massiv;
Var
V:array[1..3] of integer;
Mass:array [1..2,1..3] of integer;
i, j:integer;
begin
writeln (‘Введите элементы массива V’)
for i:=1 to 3 do {Ввод элементов}
read (V[i]); {Массива V}
writeln;
writeln (‘Введите массив mass’);
for i:=1 to 2 do {Цикл по строкам}
for j:=1 to 3 do {Цикл по столбцам}
read (Mass[i;j]);
writeln;
writeln (‘Массив V’);
for i:=1 to 3 do {Вывод массива V}
write (V[i]:3);
writeln;
writeln (‘Массив mass’);
for i:=1 to 2 do {Вывод массива mass}
begin
writeln;
for j:=1 to 3 do
write (Mass[i,j]:3)
end
end.
Для ввода и вывода значений элементов одномерного массива V использован цикл по индексу i. Для ввода и вывода двумерного массива Mass использованы вложенные циклы, осуществляющие ввод и вывод матрицы по строкам. При вводе значения элементов массива отделяются друг от друга хотя бы одним пробелом или Enter. По окончании ввода всех данных обязательно нажимается Enter. Исходные данные вводятся след.образом:
Введите элементы массива V
1 2 3 <Enter>
Введите массив mass
4 5 6 7 8 9 <Enter>
Значения элементов массивов вводятся в виде:
Massiv V
1 2 3
Massiv mass
4 5 6
7 8 9
23) Обработка элементов массивов.
В кач-ве примера обработки элем.массива рассмотрим след.задачу. Дана матрица целых чисел размером 3х3. Необходимо вычислить сумму положительных элементов матрицы.
Program Sum;
Var
M:array[1..3,1..3] of integer;
i,j:integer;
S:real;
begin
writeln (‘Введите элементы массива M’);
for i:=1 to 3 do {Ввод элементов массива}
for j:=1 to 3 do
read (M[i,j]);
S:=0
for i:=1 to 3 do {Вычисление суммы}
for j:=1 to 3 do
if M[i,j]>0 then
S:=S+M[i,j]
Writeln (‘Сумма положительных элементов матрицы =’, S)
end.
Например, при след.исходных данных:
1 2 3 1 5 6 -7 -1 -8
Программа выдаст результат 18.
24) Записи.
В массивах каждый элемент должен иметь один и тот же тип. Однако при решении большого класса задач возникает необходимость хранить и обрабатывать совокупности данных различного типа, что требует создания отдельных массивов для каждого типа данных, а для установления соответствия между ними требуется введение соответствующих индексов. Это можно показать на след.примере.
Пример: для каждого студента указаны фамилия и оценки в баллах по пяти предметам. Требуется вычислить средний балл для каждого студента.
Предположим, что в группе 25 студентов. Для хранения одной фамилии требуется массив из 15 символов. Тогда для хранения всех фамилий необходим двумерный массив размером 25 на 15. Для хранения информации о баллах, полученных студентами, потребовался бы еще один массив размером 25х5. А для хранения вычисленного среднего балла потребовался бы третий массив размером 25. Соответствие между фамилиями, полученными баллами и средним баллом определяется индексами соответствующих массивов.
Совокупность данных в этом примере можно рассматривать как запись (комбинированный тип данных). Запись – это совокупность ограниченного числа логически связанных элементов, имеющих разные типы. Например, фамилия студента может быть представлена значением строкового типа, полученная оценка представляется значением ограниченного типа, а средний балл имеет вещественное значение.
Определение записи имеет вид:
type
<имя записи>=record
<имя элемента 1>:<тип>;
<имя элемента 2>:<тип>;
.
.
.
<имя элемента>:<тип>;
end.
Имена элементов внутри записи не должны повторяться. Данные из предыдущего примера можно описать как запись след.образом:
type
Str=record
Fam:string[15]; {фамилия}
b1,b2,b3,b4,b5:2…5; {оценки}
Sb:real; {средний балл}
end;
Переменная типа Str в программе будет иметь смысл структуры, содержащей информацию по одному студенту.
Переменная типа запись описывается в разделе описания переменных, например:
Var
S:Str;
где S – имя переменной, Str – имя типа записи.
Если информацию по всем 25-ти студентам необходимо хранить в памяти ЭВМ, то используют массив записей:
Var
Tbl:array[1...25] of Str
25) Селектор записи.
Доступ к отдельному элементу записи осуществляется с помощью программной конструкции, которая называется селектор записи и имеет след.общий вид:
<имя записи>.<имя элемента>
Пример:
S.Fam {доступ к элементу Fam записи S}
S.B3 {доступ к элементу В3 записи S}
Tbl[1].Sb {доступ к элементу Sb записи Tbl[1]}
В программах селекторы записи используются так же как и переменные других типов.
Пример:
Tbl[1].B1:=5;
Tbl[7].B1:=Tbl[1].B1
Запись можно передавать в качестве параметра процедуры или функции, но значением функции запись быть не может.
26) Оператор присоединения.
Использование в программе селекторов записи приводит к её удлинению и излишней громоздкости. Для устранения этого неудобства в языке Паскаль используется оператор присоединения (with), который позволяет осуществлять доступ к элементам записи таким образом как если бы они были простыми переменными. Общий вид оператора присоединения:
with <имя записи. Do
<оператор>
В операторе к элементу записи можно обращаться только с помощью имени этого элемента.
Пример:
Var
S:Str;
.
.
.
with S do
B3:=4;
27) Вложенные записи.
Допускается использование записи в качестве элемента другой записи. В результате получается сложная (вложенная) запись.
Пример: пусть необходимо в памяти ЭВМ хранить анкетные данные представленные в виде таблицы
Обозначим запись именем ANKETA и определим её в разделе описания переменных след.образом:
Var
Анкета:record
NPP:integer;
FIO:record
Fam Im, Ot,: string[15];
end;
DR:record
God:1900..2000;
Mes:string[8];
Den:1..31;
end;
end;
Элементами записи Анкета являются так же записи FIO и DR, в результате получается сложная запись.
Запись Анкета содержит анкетные данные одного лица.
При обращении к элементам вложенных записей можно использовать оператор with, имеющий вложенную структуру с любой степенью вложенности. Например, обращение к элементу Den происходит с помощью селектора записи, а с использованием оператора Anketa.DR.Den with обращение к элементу Den происходит с помощью конструкции:
with anketa do
with DR do
Den:=1;
Использование оператора with существенно облегчает написание программ и делает более
эффективным многократное обращение к элементам одной записи.
