Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль-конспект ИНФОРМАТИКА.doc
Скачиваний:
59
Добавлен:
09.04.2015
Размер:
639.49 Кб
Скачать

7.2. Оператор присоединения.

Мы отметили, что обращение к элементам записи происходит с помощью уточнённого имени. Оператор присоединения позволяет упростить обращение к элементу записи. Имя записи выносится в заголовок оператора присоединения, а в блоке Begin–endиспользуются только имена элементов записи.

Оператор присоединения имеет вид:

Withимя_записиdo

Begin

Операторы

End;

Пример.Для 1-ой экзаменационной ведомости (списка 1) оператор присоединения можно записать так:

With C1 do

Begin

Read(N);

Summa := Ball[1] + Ball[3];

End;

Пример. Имеется ведомость учащихся с оценками:

Иванов Иван 2

Петров Пётр 2

Сидоров Сидор 3

Составить программу для вычисления среднего балла.

Поскольку в каждой строке ведомости представлены данные различного типа, введём запись с именем СПИСОК, состоящую из двух полей:

Name– фамилия и имя – упакованный массив из 15 символов;

Ball– оценка – целое число.

Для вычисление среднего балла Midballнаходится сумма всех оценокSumma, которая делится на число студентовN.

ProgramW123;

Const N = 3; (* число учащихся в списке *)

M = 15; (* максимальная длина Name *)

Type T = Record

Name: Packed Array [1..M] of Char;

Ball: Integer;

End;

Var Spisok: T;

I, K: Integer; (* параметры цикла *)

Midball: Real; (* средний балл *)

Summa: Integer; (* сумма оценок *)

Begin

Summa := 0;

Writeln(‘ введите таблицу ‘);

For I := 1 to N do

Begin

For K := 1 to M do

Read(Spisok.Name[K]);

Read(Spisok.Ball);

Summa := Summa + Spisok.Ball;

End;

Midball := Summa / N;

Writeln(‘----------------------------‘);

Writeln(‘ средний балл = ‘, Midball: 5: 2);

End.

Описание записи сделано в разделе Type, где Т – имя типа. В разделе переменныхVarуказано, что переменная СПИСОК тип Т.

Раздел операторов состоит из двух циклов: один вложен в другой. Внешний цикл с параметром Iвыполняется столько раз, сколько имеется фамилий в ведомости (в данном случаеN= 3). Внутренний цикл с параметром К предназначен для ввода фамилии и имени. На фамилию и имя отводится поле из 15 позиций. Лишние позиции поля заполняются пробелами. Внутри поля фамилию и имя можно располагать свободно,например:

_ _ _ _ Иванов _ Иван

или _ _Иванов _ Иван_ _

или _ _ _Иванов _ Иван_

или _ Иванов_ _ Иван_ _

После имени следует оценка.

Пример.Присвоить звание “отличник” тем, у кого по всем предметам пятёрки.

Из исходного списка С1, в котором содержатся фамилии и оценки, нужно сформировать другой список С2, состоящий из отличников. Для формирования списков используется массив массивов.

Programotl;

ConstK= 5; (* количество человек *)

Type Tip = Record

Name: Array [1..K, 1..15] of Char;

Math: Array [1..K] of Integer;

Phis: Array [1..K] of Integer;

Chem: Array [1..K] of Integer;

End;

Var C1, C2: Tip; (* списки *)

I, J, N: Integer; (* параметры циклов *)

Begin

J:= 0;

Writeln(‘ введите фамилию и оценки: ‘);

For I := 1 to K do

Begin

For N := 1 to 15 do Read(C1.Name[I, N]);

Read(C1.math[I], C1.Phis[I], C1.Chem[I]);

If (C1.Math[I] = 5) And

(C1.Phis[I] = 5) And

(C1.Chem[I] = 5) then

Begin

J := J + 1;

C2.Name[J] := C1.Name[I];

End;

End;

If J = 0 then Writeln(‘нет отличников ‘)

else Begin

Writeln(‘-----------------------‘);

Writeln(‘отличники:‘);

For I := 1 to J do

Writeln(C2.Name[I]);

End;

End.

Пример.Дан многочлен 4А + 5В – 8С + 16А – 3А + 9К – 1А

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

Введём обозначения:

М1 – элемент многочлена (запись),

М2 – результирующий элемент (запись),

Coef– коэффициент (элемент записи),

Buk– буква (элемент записи),

Elem– тип записи,

Sum– сумму коэффициентов.

ProgramEx4;

Type Elem = Record (* тип элемента *)

Coef: Integer; (* коэффициент *)

Buk: Char; (* буква *)

End;

VarM1:Elem; (* входной элемент *)

M2:Elem; (* выходной элемент *)

Sum: Integer; (* сумма коэффициентов *)

Begin

Sum := 0;

Writeln(‘ введите многочлен ‘);

While Not EOLN do (* end of line *)

Begin

Read(M1.Coef, M1.Buk);

If M1.Buk = ‘A’ then Sum := Sum + M1.Coef;

End;

M2.Coef := Sum;

M2.Buk := ‘A’;

Writeln(‘подобный член = ‘,M2.Coef: 3,M2.Buk);

End.

Запись - это комбинированный тип, сложная переменная с несколькими компонентами. В отличие от массивов компоненты записи (поля) могут иметь разные типы, и доступ к ним осуществляется не по индексу, а по имени поля.

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

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

В области действия оператора присоединения Withимена переменных-записей и полей, указанные в его заголовке, можно опускать. Транслятор автоматически формирует полные имена. В области действия оператора присоединения нельзя изменять элементы списка переменных-записей и полей, указанные в заголовке.

Пример.Определить число студентов 1974 г. рождения.

Type Student = Record

Name: Array [1..15] of Char;

Date: Integer;

End; { of record }

Var Grope: Array [1..30] of Student;

K, I: Integer;

Begin

K := 0;

For I := 1 to 30 do

With Grope[I].Date do

If Date = 1974 then K := K + 1;

Writeln(K);

End.

В данном примере в заголовке оператора WithстоитGrope[I] – элемент массива, зависящий от параметраI, поэтому оператор присоединения вставлен внутрь цикла поI.