Работа с пользовательскими типами данных. Организация работы с записями.
Перечисления
Интервальный тип
Адресная книга
Запись (структура)
Описание записи
Дан массив записей со следующей структурой: -  шифр группы; -  номер зачетной книжки; -  код дисциплины;  -  оценка. Требуется
Оператор присоединения WITH
Битовые поля
Запись с вариантами
Константы - записи
Вывести на экран фамилии студентов, чей балл выше среднего по группе.
Создать каталог из журнал и статей. Выдавать информацию о публикациях, удовлетворяющих тому или иному критерию, например,
Множество — это структурированный тип данных, представляющий собой набор взаимосвязанных по какому-либо признаку или группе
Операции над множествами
Операции над множеством
В городе имеется n высших учебных заведений, которые производят закупку компьютерной техники. Есть шесть компьютерных фирм:
Написать программу, позволяющую находить простые числа среди натуральных. В основу её будет заложен метод, названный решето
1.35M
Категория: ПрограммированиеПрограммирование

Работа с пользовательскими типами данных. Организация работы с записями

1. Работа с пользовательскими типами данных. Организация работы с записями.

Лекция 7

2.

Пользовательский тип
Перечисляемый
Простой
Интервальный
Запись (структура)
Структурированный
Объединение
Множество

3. Перечисления

enum <имя> { конст1, конст2, ... констN };
type <имя>=(конст1, конст2, ... констN);
enum operation // операция
{ ADD, SUBTRACT, MULTIPLY };
int calculate(int x, int y, enum operation op)
{
switch(op)
{ case ADD:
return x + y;
case SUBTRACT:
return x - y;
case MULTIPLY:
return x * y;
default:
return 0;
}
}
int main(void)
{enum operation op = MULTIPLY;
int result = calculate(4, 3, op);
printf("Result: %d\n", result); // Result: 12
printf("Operation: %d\n", op);
// Operation Code: 2
return 0;}
type znak=(oven,lev,strelets,vesi,vodoley,
bliznetsi,rak,skorpion,ribi,kozerog,telets,d
eva);
var a:znak;
Begin
read(a);
if a<=strelets then writeln('огонь');
if (a>=vesi) and (a<=bliznetsi) then
writeln ('воздух');
if (a>=rak) and (a<=ribi) then writeln
('вода');
if (a>=kozerog) and (a<=deva) then
writeln ('земля');
end.

4. Интервальный тип

type
TYear = 1900..2000;
TCharacter = 'A'..'Z';
var
y,y2:TYear;
ch,ch2:TCharacter;
begin
y := 1905; // правильно
y2:=Succ(y); // y2 = 1906
y2:=y+10; // y2 = 1915
year := 1800; // ошибка компиляции
ch := 'D';
ch2:=Succ(ch); // ch2 = 'E'
ch2:=Pred(ch); // ch2 = 'C'
end;

5. Адресная книга

Const
Max_records=50
Type
dataField=array[1.. Max_records] of string;
Var first_name, last_name, city, street :dataField;
Fist_name[i]:=‘Иванов’;
Last_name[i]:=‘Иван’;
City[i]:=‘Киров’;
Street[i]:=‘Московская’;

6. Запись (структура)

- это структурированный тип, состоящий из
фиксированного числа компонент (полей) разного
типа

7. Описание записи

Type
Data= record
god:1993..1995; mouth: byte; day: 1..31;
End;
address=record
city, street: string [30];
house, num: integer;
End;
Stud= record
FIO :string[40];
Pol: boolean;
Bd: data;
Addr : address:
Group: string[5];
End;
enum gend {m,w};
struct date {
int day;
char month[20];
int year;
};
struct address{
char city [20];
char street[20];
int house, num;
};
struct persone {
char FIO[40];
enum gend pol;
struct date bd;
struct address addr;
char group [6];
};

8. Дан массив записей со следующей структурой: -  шифр группы; -  номер зачетной книжки; -  код дисциплины;  -  оценка. Требуется

Дан массив записей со следующей структурой:
- шифр группы;
- номер зачетной книжки;
- код дисциплины;
- оценка.
Требуется определить средний балл студентов группы AI007. При вводе массива
последняя запись имеет шифр группы «99999».
Program srball;
type zap=record
shg:string[5];
nzk:integer;
kd:1..100;
oc:2..5
end;
var mas:array[1..100] of zap;
k,n,i:byte;
sum:real;
begin
i:=0;
repeat
inc(i);
readln (mas[i].shg, mas[i].nzk,
mas[i].kd, mas[i].oc)
until mas[i].shg='99999';
n:=i;
sum:=0;
k:=0;
for i:=1 to n do
if mas[i].shg='AI007' then
begin sum:=sum+mas[i].oc;
inc(k)
end;
if k<>0 then sum:=sum/k;
writeln ('Средний балл в группе AI007=',sum)
End.

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

Оператор присоединения WITH
i:=0;
repeat
i:=i+1;
WITH MAS[I] DO
readln(shg,nzk,kd,oc)
until mas[i].shg='99999';
n:=i; sum:=0; k:=0;
for i:=1 to n do
WITH MAS[I] DO
if shg=' AI007' then
begin
sum:=sum+oc;
k:=k+1;
end;

10.

struct date
{
int day; // 4 байта
char *month; // 4 байта
int year; // 4 байта
};
union ИмяОбъединения
{
тип ИмяОбъекта1;
тип ИмяОбъекта2;
...
тип ИмяОбъектаn;
};
Объединения применяются для
следующих целей:
• для инициализации объекта, если в
каждый момент времени только один
из многих объектов является
активным;
• для интерпретации представления
одного типа данных в виде другого
типа.

11.

Поменять местами два младших байта во введенном числе
#include <stdio.h>
#include <stdlib.h>
int main() {
char temp;
system("chcp 1251");
system("cls");
union
{ unsigned char p[2];
unsigned int t;
} type;
printf("Введите число : ");
scanf("%d", &type.t);
printf("%d = %x шестн.\n", type.t, type.t);
// Замена байтов
temp = type.p[0];
type.p[0] = type.p[1];
type.p[1] = temp;
printf("Поменяли местами байты, получили\n");
printf("%d = %x шестн.\n", type.t, type.t);
return 0;
}

12. Битовые поля

Используя структуры, можно упаковать целочисленные компоненты еще
более плотно, чем это было сделано с использованием массива.
Набор разрядов целого числа можно разбить на битовые поля, каждое из
которых выделяется для определенной переменной.
тип <имя>: <КоличествоБит>;
Разработать программу, осуществляющую упаковку даты в формат
struct date
{
unsigned short day : 5;
unsigned short month : 4;
unsigned short year : 7;
};

13.

#include <stdio.h>
#include <stdlib.h>
#define YEAR0 1980
struct date
{
unsigned short day : 5;
unsigned short month : 4;
unsigned short year : 7;
};
int main() {
struct date today;
today.day = 16;
today.month = 12;
today.year = 2013 - YEAR0; //today.year = 33
printf("\n Сегодня %u.%u.%u \n", today.day, today.month, today.year + YEAR0);
printf("\n Размер структуры today : %d байт", sizeof(today));
printf("\n Значение элемента today = %hu = %hx шестн.", today, today);
return 0;
}

14.

15. Запись с вариантами

type
Forma = record
Name: string;
case byte of
0: (Birthplace: string [40]);
1: (Country: string [20];
EntryPort: string [20];
EntryDate: 1..31;
ExitDate: 1..31)
end;
mem4= record
case byte of
0: (by: array [0..3] of byte);
1: (wo: array [0..1] of word);
2: (lo: longint);
end;
var
х: word;
xb: byte;
xl: Longint;
m:mem4;
begin
with m do
begin
lo := trunc(2*pi*x);
if wo[1] = 0 then
if by[1] = 0 then
xb := x[0]
else
x := wo[0]
else
xl := lo
end;
.....
end.

16. Константы - записи

type
type
point = record
forma = record
х, у: real
case Boolean of
end;
true: (Birthplace: string [40]);
vect = array [0..1] of point;
false: (Country: string [20];
month = (Jan, Feb, Mar, Apr, May,
EntryPort: string [20];
Jun, Jly, Aug, Sep, Oct, Nov, Dec);
EntryDate: array [1..3] of word;
date = record
count: word)
d: 1..31;
end;
m: month;
Const
у: 1900..1999
Percon1: forma = (Country:
end;
'Норвегия';
const
EntryPort: 'Мурманск';
origon: point = (x: 0; у: -1);
EntryDate: (16, 3, 89);
line: vector = ((x: -3.1; у: 1.5), (х:
count: 12);
J.9; у: 3.0));
Percon2: forma = (Birthplace:
SomeDay: date = (d: 16; m: Mar; у:
'Москва');
1989);

17. Вывести на экран фамилии студентов, чей балл выше среднего по группе.

type studs = record
sname: string[25];
eval: integer;
end;
var arr_studs: array[1..15] of studs;
sum: integer;
average: real;
i,n: byte;
begin
write('Количество студентов: ');
readln(n);
sum := 0;
for i:=1 to n do
with arr_studs[i] do
begin
write(i,'-й студент: ');
readln(sname);
write(' Оценка: ');
readln(eval);
sum := sum + eval;
end;
average := sum / n;
writeln;
writeln('Студенты с оценкой выше
средней:');
for i:=1 to n do
if arr_studs[i].eval > average then
writeln(arr_studs[i].sname);
readln
end.

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

изданных с 2000
года.
type t_pub = record
author: string[40];
title: string[100];
year: integer;
case t: char of
'b': (publ:string[20]);
'j': (jour:string[30]; num:byte);
end;
var catalog: array[1..20] of t_pub;
n,i: integer;
begin
write('Количество записей: ');
readln(n);
for i:=1 to n do
begin
write('Книга(b) или журнал(j): ');
readln(catalog[i].t);
write('Автор: ');
readln(catalog[i].author);
write('Название: ');
readln(catalog[i].title);
write('Год издания: ');
readln(catalog[i].year);
case catalog[i].t of
'b': begin write('Издательство: ');
readln(catalog[i].publ);
end;
'j': begin
write('Журнал: ');
readln(catalog[i].jour);
write('Номер: ');
readln(catalog[i].num);
end;
end;
writeln;
end;
for i:=1 to n do
with catalog[i] do
if (year >= 2000) and (t = 'b') then
writeln(author,' ',title,' ',publ,' ',year);
for i:=1 to n do with catalog[i] do
if (year >= 2000) and (t = 'j') then
writeln(author,' ',title,' ',jour,' ',year,' ',num);
readln;
end.

19. Множество — это структурированный тип данных, представляющий собой набор взаимосвязанных по какому-либо признаку или группе

Множество — это структурированный тип данных,
представляющий собой набор взаимосвязанных по какомулибо признаку или группе признаков объектов, которые
можно рассматривать как единое целое.
[1,2,3,4], ['а',‘b','с'], ['a'..'z'].
[]- пустое множество
ByteSize = (max div 8) - (min div 8) + 1,
где max и min — верхняя и нижняя границы базового типа данного
множества.
Const X: T = [8..10,13,23]; типа Type T = Set Of 8..23;.
байт
Номе 23 22 21
р
2
2
0
1
9
1
18
17
16
15
10
9
8
Номер1байта
значе
0 для
0 конкретного
0 0 0 элемента
0 0 Е 0вычисляется
0 1 по
0 формуле:
0 1
н ByteNumber = (E div 8) - (min div 8),
1
1
номер бита внутри этого байта по формуле:
BitNumber = E mod 8
14
13
12
11

20. Операции над множествами

['A','B'] + ['A','D']
['A'] * ['A','B','C']
даст ['A','B','D']
даст ['A']
['A','B','C'] - ['A','B'] даст ['C'].
Результат выполнения логический операций:
['A','B'] = ['A','C'] даст FALSE
['A','B'] <> ['A','C‘] даст TRUE
['B'] <= ['B','C']
даст TRUE
['C','D'] >= ['A']
даст FALSE.
A in ['A', 'B']
2 in [1, 3, 6]
даст TRUE,
даст FALSE.

21. Операции над множеством

Type m=set of byte;
Var a:m;
Добавить новый элемент в множество
a:= a+[5] ;
Include (a, 5);
Исключить элемент из множества
a:= a-[5];
Exclude (a, 5);

22. В городе имеется n высших учебных заведений, которые производят закупку компьютерной техники. Есть шесть компьютерных фирм:

«Диалог», «ТЕХПРОМ», «ТЕХНОПОЛИС»,
«Сервер», «Декада», «ЭЛЬДРАДО». Ответить на следующие
вопросы:
1) в каких фирмах закупка производилась каждым из вузов?
2) в каких фирмах закупка производилась хотя бы одним из
вузов?
3) в каких фирмах ни один из вузов не закупал компьютеры?
Занесём информации о месте закупок компьютеров
каждым из вузов в отдельное множество.
2. Ответ на первый вопрос - пересечение всех множеств.
3. Ответ на второй вопрос –объединения множеств.
4. На последний – разность множества всех фирм и
множества фирм, где хотя бы один вуз делал покупки.
1.

23.

program ex_set_1;
type firma = set of 1..6;
v = array[0..20] of firma;
const f: array [1..6] of string[10] = ('Диалог',
‘ТЕХПРОМ’, ‘ТЕХНОПОЛИС’, ‘Сервер’,
‘Декада’, ‘ЭЛЬДРАДО’.);
procedure vvod(var a: firma);
var i: byte; ans: 0..1;
begin
a:= [];
for i := 1 to 6 do
begin
Write('Вуз покупал компьютеры в фирме ',
f[i], ' (1 - да, 0 - нет)? ');
ReadLn(ans);
if ans = 1 then a:=a+[i]
end;
end;
procedure Print(a : firma);
var i: byte;
begin
for i := 1 to 6 do if i in a then write(f[i]:10);
writeln
end;
procedure Rez1(a: v; n : byte; var b : firma);
var i : byte;
begin
b := [1..6];
for i := 0 to n-1 do b := b * a[i];
end;
procedure Rez2(a: v; n : byte; var b : firma)
var i : byte;
begin
b := [];
for i := 0 to n-1 do b := b + a[i];
end;
var a: v; n, i : byte; c : firma;
begin
write('Сколько вузов делали закупку? ');
readln(n);
for i := 0 to n-1 do vvod(a[i]);
Rez1(a, n, c);
writeln(‘Ответ 1: '); Print(c);
Rez2(a, n, c);
writeln(‘Ответ 2: '); Print(c);
writeln(‘Ответ 3: '); Print([1..6]-c);
end.

24. Написать программу, позволяющую находить простые числа среди натуральных. В основу её будет заложен метод, названный решето

Эратосфена.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 24 25
Простые числа
2 3 5 7 11
program pnum;
const
N = 255;
type
SetOfNumber = set of 1 .. N;
var
n1, next, i : word;
BeginSet, PrimerSet : SetOfNumber;
begin
BeginSet := [2 .. N];
PrimerSet := [1];
next := 2;
13
17
19
23
while BeginSet <> [] do
begin
n1 := next;
while n1 <= N do
begin
Exclude (BeginSet, n1);
n1 := n1 + next
end;
Include (PrimerSet, next);
repeat
next := next + 1
until (next in BeginSet) or (next > N)
end;
for i := 1 to N do
if i in PrimerSet then
write (i:8)
end.
English     Русский Правила