Таким чином, якщо поле pol має значення male, то запис повинен мати два додаткових поля (армія, зріст). Якщо ж pol дорівнює female, то потрібно три додаткові поля. Решта ж полів мають бути однакові. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Таким чином, якщо поле pol має значення male, то запис повинен мати два додаткових поля (армія, зріст). Якщо ж pol дорівнює female, то потрібно три додаткові поля. Решта ж полів мають бути однакові.



Для реалізації таких комбінованих типів використовуються записи із варіантними частинами. Вони будуються подібно до звичайних записів, але використовують оператор case.

Зауваження

Варіантна частина у записі може бути лише одна і лише в кінці. Службове слово end є спільним для конструкції record і варіантної частини.

Ключ варіантної частини повинен бути визначеним певним типом. Для кожного значення ключа задається перелік полів запису, кожному полю вказується тип. Якщо кількість полів відповідно значення ключа більша ніж одне, то ці поля обмежуються парою дужок.

Величини типу записів з варіантами розміщується так само, як і звичайні записи, розмір відповідає максимуму сумарних розмірів всіх полів серед всіх варіантів. Таким чином запис студент матиме розмір 51+(2+1+1)+1+1+6+1+1.

Таким чином варіантна частина запису пишеться на одній ділянці, при цьому на цьому місці можуть бути різні дані в залежності від значення ключа, тому коректність даних залежить від самого програміста.

Ключ визначає ніби маску, яка накладається на ділянку пам’яті і інтерпретує певну кількість байтів, як значення певного типу

Окрім структури і збереження в пам’яті записи із варіантами всі решта дії аналогічні звичайним записам.

Наприклад

База даних про студентів

Var

a: array[1..n] of student;

i, j: byte;

Begin

for i:=1 to n do

with a[i] do begin

readln(name);

With date born do

readln(yy, mm, dd);

readln(j);

if j=1 then educ:=pay else educ:=state;

readln(usp);

writeln(‘введіть стать: 0-жін; 1-чол’);

readln(j);

if j=1 then pol:=male else pol:=female;

Case pol of

Male: begin

writeln(‘0-непридатний, 1-придатний’);

readln(j);

if j=1 then army:=yes else army:=no;

writeln(‘зріст’);

readln(hight);

end;

Female: begin

writeln(‘волосся: 0-чорне, 1-шатенка, 2-блондинка’);

readln(j);

Case j of

0: hair:=black;

1: hair:=shaten;

2: hair:=blond;

end;

writeln(‘очі: 0-чорні, 1-зелені, 2-сині, 3-карі’);

readln(j);

Case j of

0: eyes:=black;

1: eyes:=green;

2: eyes:=blue;

3: eyes:=brown;

end;

writeln(‘косметика’);

readln(cosmetics);

end;

end;

end;

End.

Пошук потенційних танкістів.

For i:=1 to n do

With a[i] do

If (pol=male) and (date born.yy<1985) and (date born.mm<11) and (usp<3) and (army=yes) and (hight<=175) then writeln (name, ‘танкіст’);

End.

ТЕМА: Програми обробки структурованих типів.

1. Прикладизадач з масивами

a) Знайти середнє арифметичне додатніх і від’ємних елементів масиву цілих чисел.

Var

a: array[1..20] of integer;

S1, S2, i, i1, i2: integer;

x1,x2: real;

Begin

for i:=1 to 20 do

Begin

write (‘?’); {ввід масиву}

readln(a[i])

end;

for i:=1 to 20 do

Begin

if a[i]>0 then begin S1:=S1+a[i]; i1:=i1+1 end;

if a[i]<0 then begin S2:=S2+a[i]; i2:=i2+1 end;

end;

if i1>0 then begin x1:=S1/i1; writeln(x1)

else writeln(‘+немає’);

if i2>0 then begin x2:=S2/i2; writeln(x2) else writeln (‘ – немає’);

End

Показаний приклад показують, що вибір індекса масиву залежить від типу оброблюваних даних. Деколи зручніше організувати індекси не цілочисельні, а за допомогою символів чи якогось перелічувального типу. Такі масиви в якості своїх значень можуть зберігати в кількості елементів такого символьного або перелічувального типу.

При обробці багатовимірних масивів використовуються вкладені оператори циклу. При цьому слід пам’ятати: самі зовнішні цикли відповідають самому першому індексу, а внутрішні останні.

Перетинання тіл циклів не призводить до синтаксичної помилки, а лише дасть неправильний результат.

2. Стандартніпідпрограмиобробкирядків

Pascal має набір стандартних підпрограм обробки рядків: функції, процедури.

Функції на відміну процедур мають результат деякого типу і можуть бути використані в якості компонентів виразу.

Процедури являють собою дію. Вони будуть окремими командами програми. Результат обертатиметься у вигляді параметрів.

а) Функціявизначеннядовжини

Параметром (аргументом) буде рядок символів, результатом – ціле число типу byte.

LENGTH(‘<рядок>’)=<довжина рядка>;

Вона не може змінювати довжину рядка.

б) Функціявиділеннячастинирядка

Якщо з деякого рядка треба виділити підрядок, використовується функція copy.

COPY (<ідентифікатор рядка>,<позиція, з якої відбувається крпіювання>,<довжина потрібного фрагменту>);

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

i – номер позиції, j- довжина фрагменту. Значення виразу i+j-1 – перевищує реальну довжину, то відбуватиметься виділення лише наявної частини рядка. Фрагмент буде коротшим ніж j символів.

Наприклад

Перевірити чи введений рядок є паліндромом.

Var

S1,S2: string;

i: byte;

Begin

writeln(‘’);

readln(S1);

S2:=”;

For i:=length(S1) downto 1 do

S2:=S2+copy(S1,I,1);

If S1=S2 then writeln (‘’) else writeln (‘’);

End.

в) Функціязнаходженняномерапозиції

Ця функція знаходить номер позиції, з якої починається перше входження деякого слова в рядок. Якщо це слово в рядку не знайдено, то буде надруковано число 0.

POS (<шукане слово>,<ідентифікатор рядка>);

Наприклад

Const R=’Севастополь’;

WORD=’сто’;

Var P: byte;

Begin

P:=pos(WORD,R); {P=5}

Writeln(P);

End.

г) Процедуравставленняслова

Ця процедура вставляє деяке слово в рядок, починаючи з вказаної позиції.

INSERT(<слово, яке треба вставити>,<ідентифікатор рядка>,<позиція>);

Наприклад

Var

Poz: integer;

R,WORD: string;

Begin

Poz:=20; {Мова програмування Turbo Pascal}

R:=’Мова програмування Pascal’;

WORD:= ‘Turbo’;

Insert(WORD,R,Poz);

Writeln(R);

End.

д) Процедуравидалення

Процедура видалення знищує слово, яке починається з вказаної позиції і має задану довжину в рядку.

Наприклад

Var

R: string;

N,Poz: integer;

Begin

R:= ‘Мова програмування Turbo Pascal’;

Poz:= 1;

N:=19; {Turbo Pascal}

Delete(R,Poz,N);

Writeln(R);

End.

е) Функціяобєднаннярядків

обєднання рядків може проводитися не лише при доповню вального знака операції +, а і функцією concat. Ця функція може містити довільну кількість аргументів типу string.

CONCAT (<рядок1>,<рядок2>,…);

Якщо сумарна довжина результуючого рядка перевищує 255, то надлишок ігнорується.

Наприклад

В рядку символів замінити всі ланцюги ABC на xy.

Var

S1, S2: string;

i: byte;

Begin

writeln(‘’);

readln(S1);

S2:=S1;

For i:=1 to length(S2) do

If copy(S1,i,3)=’abc’ then

Begin

Delete(S2,i,3);

Insert(‘xy’, S2,i);

End;

Writeln(S1);

Writeln(S2);

End.

З рядка символів вилучити всі повторення підряд однакових символів крім першого.

Var

S1, S2: string;

i: byte;

begin {}

S2:=S1;

For i:=1 to length(S2) do

If copy(S2,i,1)=copy(S2, i+1,1) then

Begin

Delete(S2,i+1,1);

i:=i-1;

end;

writeln(S1);

writeln(S2);

End.

3. Операціїнадмножинами

Над множинами можуть виконуватися наступні дії:

а) Обєднання (додавання)

Виконується над множинами одного базового типу.

Наприклад

A:=[1,2,3] B:=[3,4,8] C:=A+B { C=[1,2,3,4,8] }

Виконання операції додавання фактично є побітовою операцією диз’юнкції.

б) Перетин (множеннямножин)

Результатом є спільна частина двох множин.

Наприклад

[1,2,3]*[3,4,8] =[3]

[1,2,3]*[ ]= [ ]

Виконання операції множення фактично є побітовою кон’юнкцією.

в) Віднімання множин

Результат віднімання деякої множини В від множини А будуть всі елементи А, яких немає в множині В.

Наприклад

[1,2,3]-[3,4,8]=[3]

В памяті операція віднімання фактично є

Це побітова операція виключення або одиничними бітами у зменшуваному.

Крім операцій додавання, множення, віднімання над множинами виконуються логічні операції порівняння та належності.

Множини можуть порівнюватися на рівність та нерівність.

г) Операція належності

Дає істиний результат, якщо деякий елемент належить множині. Операція хибна в іншому випадку.

Наприклад

[1] in [3,4,8] = false

[1] in [1,2,3]=true

Формування множини безпосередньо з клавіатури і вивід їх на екран неможливо, оскільки стандартні процедури вводу-виводу не допускають параметрів множини так як і перелічувального. Але ці дії легко реалізувати за рахунок операції обєднання та перевірки належності in для виводу.

Звичайно базовий тип множини в цьому випадку повинен бути допустимим для процедур вводу-виводу.

Наприклад

Var A:=[ ]; A:=[ ];

A: set of byte; repeat readln(x);

i, x: byte; readln(x); while x<>0 do

… A:=A+[x]; begin

A:=[ ]; until x=0; A:=A+[x];

for i:=1 to n do readln(x);

Begin end.

readln(x);

A:=A+[x]

End;

Варіант із циклом repeat until завершує формування множини із записанням в неї нульового елемента, тобто в будь-якому випадку множина матиме хоча б один елемент.

Варіант із циклом while do припиняє формування множини без введення елемента 0 в неї, тобто може отриматися пуста множина.

Для виводу елементів множини можна скористатися операцією in.

Наприклад

For i:=1 to 255 do

If I in A then writeln(i);

В деякій установі є k працівників, кожен з них має два вихідні в тижні, але всі різні. Перевірити чи забезпечується неперервність виробничого процесу протягом тижня.



Поделиться:


Последнее изменение этой страницы: 2016-09-19; просмотров: 226; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.21.97.61 (0.052 с.)