Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
7. Построить объемное изображение (призму, пирамиду, шар и т. п.), используя графические примитивы.
8. Осуществите анимацию (движение) любой геометрической фигуры.
§12. Комбинированные типы данных (записи)
В Паскаль наряду с регулярными типами, примером которых являются массивы и символьные величины, используются комбинированные типы или записи.
Запись - это структура данных, состоящая из фиксированного числа компонент, называемых полями, причем в одном поле данные имеют одинаковый тип, в разных полях могут иметь разные типы. В отличие от массива доступ к компонентам записи (поля) осуществляется не по индексу, а по имени поля.
В виде записи оформляются величины, которые должны быть описаны несколькими параметрами, например:
а) оценки учеников по нескольким предметам
б) анкетные данные работника
в) сведения о книге в библиотеке
г) комплексные числа в математике
При определении комбинированного типа задаются имя и тип каждого поля.
Запись может быть описана двумя способами.
1. Непосредственное описание в разделе описания переменных
var <имя записи>:record
<имя поля 1>: <тип поля 1>;
<имя поля 2>: <тип поля 2>;
…;
<имя поля n>: <тип поля n>;
end;
К каждому компоненту записи можно обратиться, используя имя переменной типа записи и имя поля, разделенных точкой:
<имя записи>.<имя поля>
Такие имена в программах используются так же, как и переменные других типов.
2. Описание нового типа в разделе описания типов. В этом случае создается новый тип данных, который может быть использован в качестве типа переменных наряду с типами real, integer, string и т. д. в разделе описания переменных.
Общий вид описания и задания типа RECORD:
type <имя типа> = record
<поле 1>: <тип поля 1>;
<поле 2>: <тип поля 2>;
. . . . .
<поле n>: <тип поля n>;
end;
var <имя1>, <имя2>,…,<имяN>: <имя типа>;
<имя типа> - идентификатор типа ЗАПИСЬ
<поле> – идентификатор каждого поля записи
<тип поля> - тип каждого поля записи
<имя> - идентификаторы переменных типа ЗАПИСЬ
Поля одного типа при описании могут объединяться
Пример 1:
type r = record
x, y:real;
s:char;
end;
var rec: r;
Для переменной rec типа ЗАПИСЬ составные имена запишутся в виде:
rec. x, rec. y и rec. s
Пример 2: В математике комплексными называются числа вида: с = a + bi, где ![]()
В Паскале нет стандартного типа для комплексных чисел. Определим его с помощью записи.
type complex=record
re: real;
im: real;
end;
var с: complex;
где re, im - идентификаторы полей, complex - идентификатор записи, с - переменная типа ЗАПИСЬ. Поля переменной с обозначаются c. re и c. im.
Пример 3:
type rec: record
n:integer;
fio:string[40];
ozenka:array[1..3] of integer;
end;
var x, p:rec;
Над полями можно проделывать те операции, которые характерны для соответствующего типа.
Пример 4: Вычислить сумму двух комплексных чисел.
Program complex;
uses crt;
type complex=record
re:real;
im:real;
end;
var x, y:complex;
s:complex;
Begin
clrscr;
write('введите действительную и мнимую части числа х:');
readln(x. re, x.im);
write('введите действительную и мнимую части числа у:');
readln(y. re, y.im);
s. re:=x. re+y. re; s. im:=x. im+y. im;
writeln('сумма равна ',s. re:4:2,' +i*',s. im:4:2)
End.
Пример 5: Построить структуру данных, описывающую книгу.
type book=record
avtor:string[30];
nazvanie:string[50];
izdat:string[20];
jear:integer;
str:1..600;
end;
var tom: book;
Как задать конкретные значения полей записи?
tom. avtor:='И. Виртэ'; tom. izdat:='Финансы и статистика';
tom. jear:=1982; tom. str:=152;
Пример 6: Имеется запись-ведомость. Необходимо подсчитать число учащихся - отличников и учащихся, фамилии которых начинаются на "А".
Program primer6;
uses crt;
type t=record
name: string;
bal: integer
end;
var spisok: t;
n, i,sum1,sum2:integer;
Begin
clrscr;
sum1:=0; sum2:=0;
write('введите количество учащихся в списке: '); readln(n);
writeln('введите фамилию и бал: ');
for i:=1 to n do
begin
write(i:2,' учащегося: фамилия-'); readln(spisok. name);
write('бал-');readln(spisok. bal);
if spisok. bal=5 then sum1:=sum1+1;
if copy(spisok. name,1,1)='а' then sum2:=sum2+1;
end;
writeln('число отличников = ',sum1:2);
writeln('количество учащихся на "а":',sum2:2)
End.
Возникает вопрос: «Можно ли задавая значения полей, не повторять имя переменной-записи?» Для сокращения записи при присваивании полям конкретных значений используется оператор присоединения.
Общий вид:
with <A> do <P>;
<A> - имя переменной типа RECORD,
<P> - оператор, в котором при ссылках на компоненты записи имя <А> можно опускать.
Используя данный оператор, пример 5 запишется следующим образом:
with tom do
begin
avtor:='и. виртэ'; izdat:='финансы и статистика';
jear:=1982; str:=152;
end;
Пример: Дана информация о пяти студентах: фамилия, год рождения, год поступления в техникум и оценки последней сессии. Распечатать список отличников. Информацию о каждом студенте оформить в программе в виде записи. Совокупность записей объединить в массив.
Program zapis;
uses crt;
const n=5;
type stud=record
fio: string[15];
gr: 1975..1985;
grt: 1995..1997;
ozenki: record
alg, ist, inf: 1..5;
end;
end;
var gruppa: array[1..n] of stud;
s1:stud;
i, j:integer;
Begin
clrscr;
with s1,ozenki do
begin
for i:=1 to n do
begin
writeln;
write(i:2,'студент: фио'); readln(fio);
write('год рождения: '); readln(gr);
write('год поступления: '); readln(grt);
write('оценки: алг.,ист.,пк: '); readln(alg, ist, inf);
gruppa[i]:=s1;
end;
end;
writeln; writeln('список отличников: ');
for i:=1 to n do
with gruppa[i],ozenki do
if (alg=5) and (ist=5) and (inf=5) then
writeln(fio,' годр=',gr:4,' годпт=',grt:4)
End.
Результат:
Вводим данные:
Воронов | 1980 | 1995 | 3 | 4 | 3 |
Каратаев | 1981 | 1995 | 5 | 5 | 5 |
Короткова | 1981 | 1995 | 4 | 5 | 5 |
Романов | 1980 | 1995 | 5 | 5 | 5 |
Макаров | 1980 | 1995 | 3 | 4 | 4 |
Список отличников:
Каратаев годр=1981 годпт=1985
Романов годр=1980 годпт=1985
Вопросы
1. Что такое запись?
2. Для задания каких величин используют записи?
3. Какие способы описания записи Вы знаете?
4. Какой из этих способов более универсален?
5. Могут ли компоненты записи быть различных типов?
6. Как осуществляется доступ к полям записей?
7. Приведите примеры описание различных записей.
8. Для чего используется оператор присоединения?
9. В чем отличие записи от массивов и множеств?
Задания
1. Охарактеризуйте запись, заданную следующим описанием:
book: record
nazv: array[1..20] of char;
god_izd: 1000..1997;
price: real;
end;
Назвать компоненты записи и их типы.
2. Имеется описание:
type family=record
glava: string[20];
vozr:25..90;
deti: array[1..2] of record
name: string[10];
godr: 1900..2000;
end;
end;
var A, B: family;
Занести исходную информацию в переменную а без использования оператора присоединения и продублировать ее в переменную b.
Задание: Используя данную процедуру, удвоить каждую букву слова.
3. Известно, что
type clock=record
chas: 0..23;
min, sec: 0..59
end;
var T1,T2: clock;
Написать программу, которая вводит значения полей записей t1 и t2 и печатает TRUE, если t1 предшествует t2, и печатает FALSE в противном случае.
4. Определить запись, включающую в себя следующую информацию:
- название завода-изготовителя; название завода-поставщика сырья; номер магазина-потребителя; названия производимых товаров, 50 наименований; цена каждого товара за 1 штуку в рублях; количество каждого товара в штуках.
Все наименования содержат не более 15 символов.
5. Составить список учебной группы, включающей 25 человек. Для каждого учащегося указать дату рождения, год поступления в техникум, курс, группу, оценки каждого года обучения. Информацию о каждом учащемся оформить в программе в виде записи. Совокупность записей объединить в массив. Составить программу, которая обеспечивает ввод полученной информации, распечатку ее в виде таблицы, а также распечатку информации согласно конкретному варианту:
а) распечатать анкетные данные студентов, успевающих на 4 и 5; упорядочить список студентов по среднему баллу и распечатать его.
б) распечатать анкетные данные студентов, получивших за все время обучения одну оценку 4, а все остальные оценки - 5; упорядочить список студентов по среднему баллу последней сессии и распечатать его.
в) распечатать список студентов, фамилии которых начинаются с буквы А, и их оценки за все время обучения; упорядочить список студентов по году рождения и распечатать его.
г) вычислить средний балл группы и распечатать список студентов, имеющих средний бал ниже среднего бала группы; распечатать список студентов, упорядоченный по алфавиту.
д) распечатать фамилии и даты рождения студентов, не получивших ни одной оценки 3 за все время обучения; распечатать список отличников, упорядоченный по году рождения.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |


