Пример программы двумерного массива Паскаля




Program proizvedenie;
Type
Matrix=array [1..10, 1..10] of integer;
Var
A: matrix;
N, m, i, j: byte;
P: integer;
Procedure vvod (var m: matrix);
Var k, h: byte;
Begin
For i:=1 to n do {переменная n для процедуры является глобальной, а значит «известной»}
For j:=1 to m do {переменная m для процедуры является глобальной, а значит «известной»}
M[i,j]:= random(10);
End;
Procedure print (m: matrix);
Var k, h: byte;
Begin
For i:=1 to n do
begin
For j:=1 to m do
Write (M[i, j]: 4);
Writeln;
end;
End;
Begin {начало основной программы}
Writeln (‘Введите размерность матрицы:’);
Readln(N, M);
Vvod(a);
Print(a);
P:=1;
For i:=1 to N do
For j:=1 to M do
If a[i, j]<>0 then p:=p*a[i, j];
Writeln (p);
End.

 

Записи

 

Запись представляет собой совокупность ограниченного числа логически связанных компонент, принадлежащих к разным типам. Компоненты записи называются полями, каждое из которых определяется именем. Поле записи содержит имя поля, вслед за которым через двоеточие указывается тип этого поля. Поля записи могут относиться к любому типу, допустимому в языке Паскаль, за исключением файлового типа.

Описание записи в языке Паскаль осуществляется с помощью служебного слова record, вслед за которым описываются компоненты записи. Завершается описание записи служебным словом end.

Например, телефонный справочник содержит фамилии и номера телефонов, поэтому отдельную строку в таком справочнике удобно представить в виде следующей записи:

type TRec = Record FIO: String[20]; TEL: String[7] end;var rec: TRec;

Описание записей возможно и без использования имени типа, например:

var rec: Record FIO: String[20]; TEL: String[7] end;

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

rec.FIO, rec.TEL

Такое имя называется составным. Компонентой записи может быть также запись, в таком случае составное имя будет содержать не два, а большее количество имен.

Обращение к компонентам записей можно упростить, если воспользоваться оператором присоединения with.

Он позволяет заменить составные имена, характеризующие каждое поле, просто на имена полей, а имя записи определить в операторе присоединения:

with rec do оператор;

Здесь rec - имя записи, оператор - оператор, простой или составной. Оператор представляет собой область действия оператора присоединения, в пределах которой можно не использовать составные имена. Например для нашего случая:

with rec do begin FIO:='Иванов А.А.'; TEL:='2223322'; end;

Такая алгоритмическая конструкция полностью идентична следующей:

rec.FIO:='Иванов А.А.';rec.TEL:='2223322';

Инициализация записей может производиться с помощью типизированных констант:

type RecType = Record x,y: Word; ch: Char; dim: Array[1..3] of Byte end; const Rec: RecType = (x: 127; y: 255; ch: 'A'; dim: (2, 4, 8));

 

Подробнее..

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

Например, сконструируем запись, в которой мы будем хранить данные о некоторой геометрической фигуре (отрезок, треугольник, окружность).

typeTFigure = record type_of_figure: string[10]; color_of_figure: byte;... case integer of 1: (x1,y1,x2,y2: integer); 2: (a1,a2,b1,b2,c1,c2: integer); 3: (x,y: integer; radius: word); end;var figure: TFigure;

Таким образом, в переменной figure мы можем хранить данные как об отрезке, так и о треугольнике или окружности. Надо лишь в зависимости от типа фигуры обращаться к соответствующим полям записи.

Заметим, что индивидуальные поля для каждого из типов фигур занимают тем не менее одно адресное пространство памяти, а это означает, что одновременное их использование невозможно.

В любой записи может быть только одна вариантная часть. После окончания вариантной части в записи не могут появляться никакие другие поля. Имена полей должны быть уникальными в пределах той записи, где они объявлены.

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

type t = record id11, id12, …: type1; id21, id22, …: type2; ……………….end;

здесь id – идентификаторы полей; type – типы полей; t – имя типа.

Пример. Данные комплексного вида можно описать переменной типа record.

type complex = record re, im: realend;var c: complex;

здесь complex – имя типа, а c – имя переменной. Переменная c состоит из двух полей: re и im, имеющих один и тот же тип (real). Эти поля переменной c обозначаются как c.re и c.im.

Пример. Даты каких-либо событий можно описать следующим образом:

type date = record month: 1..12; day: 1..31; year: integerend;var d: date;

В этом примере описан тип date и переменная d, принадлежащая этому типу.

Переменная d описана как запись, состоящая из трех полей: month,day и year. Каждое поле содержит соответственно данные: целое число в пределах от 1 до 12 (номер месяца), целое число от 1 до 31 (число), целое число (год).

Поле day переменной d записывается как d.day.

Например, чтобы заслать в d дату 12.01.2003, надо выполнить следующие операторы:

d.month:= 1;d.day:= 12;d.year:= 2003;

Пример. Вычислить сумму s двух комплексных чисел x = 2 + 7i и y = 6 + 3i (т.е. x, y, s: complex;).

x.re:= 2.0; x.im:= 7.0;y.re:= 6.0; y.im:= 3.0;s.re:= x.re + y.re;s.im:= x.im + y.im;

Запись может быть компонентой других структур. Например, введем тип family (семья: отец, мать, 1-й ребенок, 2-й ребенок):

type family = (father, mother, child1, child2);var birthday: array[family] of date;

где date – описанная выше запись.

Переменная birthday есть массив, состоящий из записей – дат рождения членов семьи: отца, матери, 1-го ребенка, 2-го ребенка. Каждая дата рождения имеет тип date, который может быть описан в программе.

Для занесения даты рождения, например, mother, достаточно выполнить операторы:

birthday[mother].month:= 5;birthday[mother].day:= 1;birthday[mother].year:= 1965;

Записи в языке Pascal

Запись — структурированный тип данных. Записи являются неоднородными неупорядоченными структурами с прямым доступом к компонентам. Компоненты записи называют полями записи.

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

Например, информация о рекордах по бегу у мужчин для открытых стадионов может содержать следующие атрибуты

рекордсмен страна статус соревнований (Олимпиада, чемпионат мира) длина дистанции год рекорда время

Структурная диаграмма для записи

Запись может быть объявлена в разделе type:

идентификатор типа = Record поле1: тип; поле2: тип; … полеN: типend;

Например,

type beg = record fam: string[25]; srtana: string[20]; status: boolean; {Олимпиада - true; чемпионат мира - false} dlina: longint; god: 1900..2009; vr: string[15]; end; Var a: beg;

К каждому элементу записи можно обратиться, используя составное имя, которое имеет следующую структуру:

<имя переменной>.<имя поля>

Например,

a.fam; a.dlina и т.п.

Если, например, требуется полю "status" присвоить значение «true», то это делается так:

a.status:= true;

Поля записи могут иметь любой тип, кроме файла, в частности, сами могут быть записями.

Например,

type beg1 = record fam: string[25]; srtana: string[20]; status: boolean; {Олимпиада - true; чемпионат мира - false} dlina: longint; god: 1900..2009; vr: record min: longint; sec: real end end; Var a: beg1;

Поля такой записи, находящиеся на третьем уровне, идентифицируются тройным составным именем. Например,

a.vr.min a.vr.sec

В программе могут использоваться массивы записей.

Любая обработка записей, в том числе ввод и вывод, производится поэлементно.

Например,

var b: array[1..200] of beg1;...write('Число рекордсменов? '); readln(n);for i:=1 to n dowith b[i] dobegin write('Фамилия спортсмена? '); readln(fam); write('Гражданин какой страны спортсмен? '); readln(strana); write('Статус соревнования? '); readln(status); write('Длина дистанции? '); readln(dlina); write('Год проведения соревнования? '); readln(god); write('Время, за которое спортсмен пробежал дистанцию (мин, сек)? '); readln(vr.min, vr.sec);end;...

В примере был использован оператор присоединения, который имеет следующий вид:

with <переменная типа запись> do <оператор>;

Он позволяет, один раз указав имя переменной типа "запись" после слова with, работать в пределах одного оператора (простого или составного) с именами полей как с обычными переменными, т.е. не писать громоздких составных имен.

Объём памяти, занимаемый записью, определяется суммарным объёмом, занимаемым её полями:

type beg1 = record fam: string[25]; {26 байт} srtana: string[20]; {21 байт} status: boolean; {1 байт} dlina: longint; {4 байта} god: 1900..2009; {2 байта} vr: record min: longint; {4 байта} sec: real {6 байт} end end;

Всего получаем: 26+21+1+4+2+4+6=65 байт

Массив, описанный выше, занимает 65 байт × 200 элементов = 13000 байт оперативной памяти.

Записи с вариантами

При определении типа записи в нее можно включать вариантную часть. Это означает, что разные переменные, хотя они относятся к одному типу, могут иметь различные структуры.

Вариантная часть записи начинается выбором case и следует за общей частью; после ее окончания в записи не могут появляться никакие другие поля, поэтому case закрывается служебным словом end.

Любая запись может иметь только одну вариантную часть, которая должна размещаться в конце записи (после фиксированной части). Однако, внутри какого-либо варианта, в свою очередь, может присутствовать другая вариантная часть, вложенная в первую.

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

Структурная диаграмма для записи с вариантами

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

Type pol=(m,w); people=record fam:string[20]; godro:1900..2007; case mw:pol of m: (voen: boolean; spec: string[15]); w: (merry: boolean; child: byte) end;var p1, p2: people;

Все имена элементов должны быть различными, даже если они встречаются в разных вариантах.

К элементам вариантной части можно обращаться так же, как к элементам фиксированной части записи.

P1.mw:=m; p1.voen:=true; p2.child:=2;

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

Данное обстоятельство учитывается и при подсчете объема памяти, отводимого под запись с вариантами. Статические поля учитываются обычным образом, а среди вариативной части отыскивается тот случай, где суммарный объем памяти для полей максимальный.

Type pol=(m,w); people=record fam:string[20]; {21} godro:1900..2007; {2} case mw:pol of {1} m: (voen: boolean; spec: string[15]); {1+16=17} w: (merry: boolean; child: byte) {1+1=2} end; 21 + 2 + 1 + max(17, 2) = 41 (байт)

 

Рассмотрим пример работы с записями без вариантов.

Задача. Сведения о деталях, хранящихся на складе, содержат следующие атрибуты: название, количество, стоимость одной детали. Вывести информацию о детали, суммарная стоимость для которой максимальна.

program ex_zap;type detal = record a: string[30]; kol, st: integer; end;var a: array [0..99] of detal; n, i, max: integer;begin write('Количество деталей? '); readln(n); for i:=0 to n-1 doWith a[i] do begin write('Информация об ', i, ' детали: '); readln(a); readln(kol); readln(st); end; max:= 0; for i:= 1 to n-1 do if a[max].kol*a[max].st < a[i].kol*a[i].st then max:=i; writeln('Искомая деталь: ', a[max].a, ' стоимостью ', a[max].st, ' в количестве ', a[max].kol);end.

 

Контрольные вопросы и задания

  1. Чем отличается тип "запись" от других структурированных типов?
  2. Могут ли поля записи быть одного и того же типа?
  3. Как обратиться к отдельному полю записи?
  4. Что такое "оператор присоединения"? В каких целях он используется?
  5. Что такое "запись с вариантами"?
  6. Как определить объем памяти под статическую запись? запись с вариантами?
  7. Как заполнить массив записей?

Pascal-Паскаль



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: