Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

Vr.Prot :podlodka; {Записи для двух вражеских лодок}

i :Integer;

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

Вот программа целиком:

TYPE podlodka = record

nazvanie :String;

skorost :Real;

torped :Byte;

end;

VAR lodka :array[1..100] of podlodka;

vr, prot :podlodka;

i :integer;

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

lodka[1].nazvanie :='Щука';

lodka[1].skorost :=26;

prot.torped :=22;

{А теперь решаем первую задачу:}

for i:=1 to 100 do if lodka[i].skorost > vr.skorost then WriteLn (lodka[i].nazvanie)

END.

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

Теперь запишем нашу программу с использованием типизированных констант, для краткости ограничив наш флот тремя подводными лодками:

TYPE podlodka= record

nazvanie :String;

skorost :Real;

torped :Byte;

end;

CONST lodka :array[1..3] of podlodka=

((nazvanie :'Щука'; skorost:26; torped: 6),

(nazvanie :'Дельфин'; skorost:14; torped:10),

(nazvanie :'Леонардо'; skorost:28; torped:11));

vr :podlodka=

(nazvanie:'Шредер'; skorost:20; torped:15);

prot :podlodka=

(nazvanie:'Рокстеди'; skorost:18; torped:22);

VAR i :Integer;

BEGIN

for i:=1 to 3 do if lodka[i].skorost > vr.skorost then WriteLn(lodka[i].nazvanie);

END.

Здесь вы видите, как правильно придавать начальные значения типизированным константам типа record.

Задание 116

Создайте базу данных о своих родственниках. О каждом родственнике должно быть известно:

• Имя

• Год рождения

• Цвет глаз

Массивы не используйте. Программа должна:

1. Распечатать ваш возраст и цвет глаз.

2. Ответить на вопрос, правда ли, что ваш дядя старше тети.

Задание 117

Создайте базу данных о своих одноклассниках. О каждом однокласснике должно быть известно:

• Фамилия

• Имя

• Пол

• Год рождения

Обязательно используйте массив не меньше чем из 10 записей. Программа должна:

1. Вычислить средний возраст ваших одноклассников.

2. Определить, кого среди них больше - дам или кавалеров.

3. Ответить на вопрос, есть ли в вашей базе тёзки (это нелегко).

12.14. Множества

Множеством в Паскале называется набор значений какого-нибудь порядкового типа, подчиняющийся специфическим правилам, о которых мы поговорим дальше. В программе множество записывается в виде списка этих значений в квадратных скобках. Например: [7,5,0,4] или ['п','ж','л']. Множество не должно состоять более чем из 256 элементов и не должно содержать элементов с порядковыми номерами меньше нуля и больше 255.

Если во множестве элемент повторяется, то считается, что он входит туда только один раз. Например, множества [2,5,2] и [2,5] эквивалентны.

Порядок элементов в множестве не играет роли. Множества [2,5] и [5,2] эквивалентны.

В описании тип множества задается словами set of. Например, конструкция

VAR a: set of Byte

говорит о том, что задана переменная а, значением которой может быть любое множество из любого числа элементов типа Byte. Так, в некоторый момент процесса выполнения программы значением а может быть множество [210, 3, 92], а через некоторое время - [8,5, 3, 26,17].

Конструкция VAR с: set of ('а'.'б'.'л') говорит о том, что переменная с может иметь значением любое множество из букв 'а','б','л'. Например: ['л','а'].

Конструкция VAR d: set of 10..18 говорит о том что переменная d может иметь значением любое множество целых чисел из диапазона от 10 до 18.

Над множествами определено несколько операций. Рассмотрим три из них: объединение (+), пересечение (*) и разность (-).

Операция

Результат

Пояснение

[1,4,4,5] + [ 1,2,3,4]

[1,2,3,4,5]

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

[1,4,4,5] * [1,2,3,4]

[1,4]

В результирующее множество входят только те элементы, которые имеются в каждом из исходных множеств

[1,2,3,4] - [1,3,5]

[2,4]

В результирующее множество входят те элементы "уменьшаемого", которые не встречаются в "вычитаемом"

Операция [1,2]*[3,4] будет иметь результатом [ ], то есть пустое множество.

Вот операции сравнения множеств:

if a = b then ... Если множества а и b состоят из одинаковых элементов...

if а <> b then ... Если множества а и b отличаются хотя бы одним элементом ...

if a <= b then ... Если а является подмножеством b, то есть все элементы а являются элементами b ...

if a >= b then... Если b является подмножеством а, то есть все элементы b являются элементами а...

Операция проверки вхождения элемента Е в множество а:

if E in a then...

Например:

а:= [1,2,4]; if 2 in a then... {Если 2 входит в множество а....}

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

Пусть задано множество а, описанное как set of Byte. Будем уменьшать его на все элементы подряд, от нуля до 255, и каждый раз, когда это удается, распечатывать соответствующее число. Для дальнейших рассуждений введем еще одно множество b:

for i:=0 to 255 do begin

b:=а-[i];

if a<>b then begin WriteLn(i); a:=b end

end {for}

Вот гораздо более короткий и естественный путь: for i:=0 to 255 do if i in a then WriteLn(i)

Медиум загадывает шестерку чисел, каждое в диапазоне от 0 до 10 (числа могут и совпадать). Экстрасенс отгадывает их, называя свою шестерку. Есть ли между шестерками совпадающие числа? Если есть, то распечатать их.

Сначала, решим задачу традиционными методами, а именно с применением массивов, а не множеств:

CONST razmer =10; kol =6;

VAR Medium, Extrasens :array[1..kol] of 0..razmer;

i,j,k :Integer;

BEGIN

{Формируем случайным образом две шестерки:}

Randomize;

for i:= 1 to kol do begin

Medium[i] :=Random(razmer+1);

Extrasens[i] :=Random(razmer+1)

end {for};

{Проверяем две шестерки на совпадение:}

k:=0; {Нам придется подсчитывать количество совпадений, k - счетчик}

for i:= 1 to kol do

for j:=1 to kol do

if Medium[i] = Extrasens[i] then begin

k:=k+1;

WriteLn(Medium[i]) {Распечатываем совпадения}

end {if};

if k=0 then WriteLn('He угадал ни разу')

END.

У данной программы есть недостатки. Пусть медиум загадал числа 2 4 1 5 4 8, а экстрасенс назвал 1 4 9 6 1 4. Программа распечатает числа 4 4 1 1 4 4, а достаточно было бы только 1 4. К тому же пришлось организовывать счетчик совпадающих чисел, чтобы иметь возможность ответить, угадано ли хоть одно число.

А теперь применяем множества:

CONST razmer =10; kol =6;

VAR Medium, Extrasens, a :set of 0..razmer;

i :Integer;

BEGIN

{Формируем случайным образом две шестерки:}

Randomize;

Medium:=[]; Extrasens:=[];

{Начинаем формировать "с нуля", то есть с пустых множеств}

for i:=1 to kol do begin

{Наращиваем по одному элементу в множестве медиума}

Medium :=Medium+[Random(razmer+1)];

{Наращиваем по одному элементу в множестве экстрасенса}

Extrasens :=Extrasens+[Random(razmer+1)]

end {for};

a:= Medium * Extrasens;

{Множество а содержит совпадающие числа}

If a=[ ] then WriteLn('He угадал ни разу')

else begin

WriteLn('Ecть совпадения, вот они:');

{Распечатываем элементы множества а:}

for i:=0 to razmer do if i in a then WriteLn(i);

end {else}

END.

Задание 118

Случайным образом формируется небольшое множество заглавных букв русского алфавита. Определить, входит ли в это множество хотя бы одна из букв М, И, Ф.