Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Запрещен




Примеры применения переменных множественного типа, описанных выше:

c:=['a'..'e']; {c:=['a','b','c','d','e']}

ch:=['d'..'f']; {c:=['d','e','f'], c<>ch}

cc:=c+ch; {cc=['a','b','c','d','e','f'], cc>=c или c<=cc}

cc:=c*ch; {cc=['d','e']}

cc:=c-ch; {cc=['a','b','c']}

for cha:='a' to 'z' do if cha in cc then write(cha); {печать элементов множества сс}

c2:=[]; {пустое множество}

for i:=1 to 7 do можно заменить одним оператором:

c2:=c2+[i]; {множество c2:=[1..7];

чисел от 1 до 7}

for i:=1 to 7 do if i in c2 then write(i); {печать множества с2}

Правила приоритета для множественных операций:

Приоритетный уровень Операции Пояснения  
1 (высший) * | Пересечение    
  + – Объединение, разность    
3 (низший) = <> in >= <= Равенство, неравенство, принадлежность, подмножество (две операции) -    

ЗАДАНИЯ

№1. Какие из следующих описаний неверны и почему?

type

{ 1 } Tochki = set of real;

{ 2 } bajt = array [1.. 8] of 0..1;

{ 3 } europe = (england, france,germany,spain,italy);

{ 4 } oset = set of europe;

{ 5 } vektor = array [1..10] of boolean;

{ 6 } oneset = set of vektor;

{ 7 } digits = '0'..'9';

{ 8 } threeset = set of digits;

{ 9 } matrica = array [digits] of threeset;

{ 10 } fiveset = set of boolean;

{ 11 } fourset = set of integer;

№2. Какие из следующих конструкций являются множествами (в смысле языка PASCAL), а какие нет и почему?

а) [9,3,6,0]; б) [2..3],5,7; в) [1..15,4..18];

г) ['*','*']; д) [0..0]; е) [true..false];

ж) [2,sqrt(9)]; з)['=','>=','>']; и) [[],[5]];

к) [ord(7),0<2]

№3. Что будет на экране в результате выполнения следующей программы:

Type

Primery=(Red,Yellow,Blue,White,Black);

Color =set of Primery;

Var

H0,H1:Color;

C1,C2,C3:set of Char;

B1,B2:Boolean;

Ch:Char;

Begin

{ лат.алф.:A,B,C,D,E,F,G,H,I,J,K,L,M,

N,O,P,Q,R,S,T,U,V,W,X,Y,Z }

H0:=[Yellow];

H1:=H0+[succ(Blue)];

if Blue in H1 then writeln('Blue');

C2:=['F'..'K','M','X'..'Z'];

C1:=['L','N'..'W'];

C3:=C1+C2;

for Ch:='A' TO 'Z' DO

if Ch in C3 THEN

Write(Ch:2);

Writeln;

B1:= C3 = C1 + C2;

B2:= C3 <= C2;

Writeln(B1,B2:6,'M' in C1:6);

End.

№4. Имеется описание:

var

x,y,z:set of 8..22;

Переменной x присвоить множество всех целых чисел от восьми до 22, переменной y - множество всех составных чисел из этого же диапазона, а переменной z присвоить множество всех простых чисел из того же диапазона.

№5. Не используя дополнительные переменные, поменять местами значения переменных-множеств А и В.

12. ИСПОЛЬЗОВАНИЕ ЗАПИСЕЙ

Под записью в языке PASCAL понимается структура данных, состоящая из фиксированного числа элементов разного типа.

Составляющие запись объекты называются ее полями. В записи каждое поле имеет свое собственное имя (идентификатор).

В определении типа записи после служебного слова RECORD следует, СПИСОК ПОЛЕЙ, состоящий из одного или нескольких элементов, называемых СЕКЦИЯМИ ЗАПИСИ. Если секций записи более одной, то они разделяются точкой с запятой. Вся последовательность завершается служебным словом END.

ОБЩИЙ ВИД ОПЕРАТОра

Допустим, что мы хотим определить тип данных RECORD с именем adress, и наша запись должна содержать три элемента: улицу (тип string), номер дома и номер квартиры (тип integer). Это будет выглядеть следующим образом:

TYPE

Adress RECORD

street: string;

house, flat: integer

END;

Теперь, располагая определением типа adress, можно объявить одну и более переменных этого типа или даже ряд из элементов типа adress:

VAR

home: adress;

familiy: array [1..100] of adress;

fater: RECORD

street: string;

house, flat: integer

end;

Названия полей записи могут совпадать с именами переменных, констант и других объектов программ, но не могут совпадать с названиями полей других записей.

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

home.street:='Ленина';

home.house:=25;

home.flat:=1;

for i:=1 to 100 do

begin

readln(familiy[i].street);

readln(familiy[i].house,familiy[i].flat)

end;

home:=familiy[1]; {все поля переменной home равны полям первого элемента массива familiy}

Понятно, что такой синтаксис может стать довольно обременительным, в особенности с записями очень сложной структуры. В качестве альтернативы в языке PASCAL предусмотрено специальное средство, называемое WITH (присоединение). Формально предложение WITH строится по следующей схеме:

WITH префикс[,префикс [...]] DO оператор

где слово префикс обозначает имя одного или нескольких уровней записи. За заголовком WITH... DO следует любой оператор или группа операторов, заключенные в операторные скобки BEGIN и END.

Например:

for i:=1 to 100 do

WITH familiy[i] do

begin

Readln(street);

Readln(house,flat)

end;

ПРИМЕР 1

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

Решение

TYPE

class = RECORD

nom: 1..11; {номер класса}

ch: char {буква класса}

end;

uchenik = RECORD

fam,imya:string[15];

kl: class

end;

VAR

u: array[1..1000] of uchenik;

x: uchenik;

n,i: integer;

Begin

WRITE('сколько учеников в школе?');

Readln(n);

for i:=1 to n do {ввод сведений по всем ученикам}

begin

Writeln(i,'-й уч.');

Writeln('фамилия?'); Readln(u[i].fam);

Writeln('имя?'); Readln(u[i].imya);

Writeln('класс N'); Readln(u[i].kl.nom);

Writeln('буква класса?'); Readln(u[i].kl.ch)

end;

{определим, каких больше классов: 1-х или 2-х или..}

x:=u[1]; {первого ученика берем за основу}

for i:=2 to n do

with u[i],kl do

if ch>x.kl.ch then x:=u[i];

Writeln(x.kl.nom,'-х классов больше всего. Их ',

ord(x.kl.ch)-ord('а')+1);

End.

ЗАДАНИЯ

№1. Описать следующие понятия в виде записи:

а) цена в рублях и копейках;

б) время в часах, минутах и секундах;

в) адрес (город, улица, дом, квартира);

г) бланк требования на книгу (сведения о книге: шифр, автор, название; сведения о читателе: номер читательского билета, фамилия; дата заказа);

д) экзаменационная ведомость (предмет, номер группы, дата экзамена, 25 строчек с полями: фамилия студента, номер его зачетной книжки, оценка за экзамен).

№2. В программе имеются описания:

Type mast = (piki,trefy,bubny,chervy); {?????}

dostoinstvo = (shest,sem,vosem,devyt,desyt,valet,

dama,korol,tuz); {???????????}

karta = Record

M:mast;

D:dostoinstvo

End;

Описать логическую функцию F(K1,K2,KM), проверяющую, «бьет» ли карта К1 карту К2, с учетом того, что масть KM является козырной.

№3. В программе имеются описания:

Type

kryg=Record radius: real;

centr: Record

x,y:real

End

End;

Var

K:krug;

Требуется переменной К присвоить значение, соответствующее кругу радиуса 2.5 с центром в точке (0,1.8). В каких из следующих операторов присоединения правильно решается эта задача, а в каких нет и почему?

а) with K do begin

radius:=2.5;

x:=0;

y:=1.8

end;

б) with K do begin

radius:=2.5;

with centr do begin

x:=0;

y:=1.8

end

end;

в) with K do begin

radius:=2.5;

centr.x:=0;

centr.y:=1.8

end;

г) with K, centr do begin

radius:=2.5;

x:=0;

y:=1.8

end;

д) with centr, K do begin

radius:=2.5;

x:=0;

y:=1.8

end;

№4. В программе имеется следующее описание:

Type

vremy=Record

chas:0..23;

min, sec:0..59

End;

Описать процедуру F(t,t1), присваивающую параметру t1 время, на секунду больше времени t (учесть смену суток).

№5. В программе имеются описания:

Typy

kost = Record

lev,prav:0..6

End;

ryd = array [1..28] of kost;

Описать логическую функцию L(r), которая проверяет, правильно ли выставлены кости домино в ряду r (равна ли правая цифра очередной кости левой цифре следующей кости).

13. РАБОТА СО СТРОКАМИ

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

string[n];

#

Максимальная длина строки – целочисленная константа от 1 до 255.

Если максимальная длина строки не указана, то она равна 255.

Пример описания переменных типа STRING:

VAR

a,b,c: STRING [ N ];

или

VAR

b: STRING;

Все символы строки пронумерованы, т.е. имеют индекс, значение которого изменяется от 1 до числа n. К любому символу в строке можно обратиться точно так же, как к элементу одномерного массива: ARRAY [0..N ] OF CHAR.

Самый первый байт в строке имеет индекс 0 и содержит текущую длину строки, т.е., чтобы узнать текущую длину строки, например b, достаточно обратиться к функции ORD следующим образом:

N:=ORD(b[0])

ОПЕРАЦИИ НАД СТРОКАМИ

К строкам можно применить операцию “+” - сцепление строк.

Например:

'Turbo/' + 'Pascal' Þ 'Turbo/Pascal';

'24' + '.' + '36' Þ '24.36'.

Если длина сцепленной строки превышает максимально допустимую, то строка обрезается.

Операции отношения выполняются после операции ' + '.

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

В языке PASCAL все латинские и русские символы упорядочены в порядке соответственно латинского и русского алфавитов, например:

'r' < 's';

'ф' > 'д'.

Напомним, что соответствующие большие и маленькие буквы каждого алфавита имеют разные коды, например:

'F'≠'f'.

Примеры присваивания строковых данных:

AGE:='fiftinth';

U:='Yes '+ AGE;

Если переменная U описана как string[9], то, поскольку превышать максимальную длину строки нельзя, переменная U после выполнения описанных операций будет равна

U='Yes fifti'.

функции для обработки строковых переменных

1. CONCAT(ST1, ST2,..., STN:String):STRING - возвращает строку, представляющую собой сцепление строк-параметров ST1,ST2,...,STN.

Количество сцепляемых строк - произвольное.

Примеры:

1) T:=CONCAT('Зима,', ' Весна,', ' Лето,', ' Осень');

В результате Т будет равно:

Т='Зима, Весна, Лето, Осень'.

2) ST:=concat('Turbo/', 'Pascal');

В результате ST будет равно:

ST= 'Turbo /Pascal'.

2. LENGTH(ST:String):INTEGER - возвращает длину строки ST (количество символов в строке).

Пример:

ST:='ЮРГТУ(НПИ)';

i:=length(st); Þ i=10.

3. COPY(ST:String;I,K:Integer):STRING - копирует из строки ST K символов, начиная с символа с номером I.

Если I>length(ST), то в результате получится пустая строка.

Если I+K>length(ST), то берутся только символы, которые содержатся в строке.

Пример: R:='1 января 2009 года';

S:=copy(R,10,6); Þ S='2009 г'

4. POS(SUBST,ST:String): INTEGER - просматривает строку ST и отыскивает первое появление в ней подстроки SUBST. Результатом является целое число - номер той позиции строки, в которой находится первый символ подстроки SUBST. Если заданная подстрока не найдена, то результат равен нулю.

Пример: ST:='студенты';

I:=pos('ден',ST); Þ I=4

ПРОЦЕДУРЫ ДЛЯ ОБРАБОТКИ СТРОКОВЫХ ПЕРЕМЕННЫХ

1. DELETE(var ST:String;I,K:Integer) - удаляет из строки ST участок, содержащий K символов, начиная с I -го символа (т.е. начиная с позиции I); результат заносится в ту же строку ST.

Если I>length(ST), то никакие символы не удаляются.

Если I+K>length(ST), то удаляются только те символы, которые присутствуют в строке.

Пример:

Var

st:string;

Begin

st:='ABCDEF';

delete(st,2,4);

……................ Þ st='AF'

2. INSERT(SUBST:String;var ST:String;I:integer) - вставляет подстроку SUBST в строку ST, начиная с позиции c номером I.

Если I>length(ST), то строка SUBST присоединяется к строке ST. Лишние символы отсекаются.

Пример:

ST:=' январь 2004 г.';

insert('Месяц',st,1); Þ ST='Месяц январь 2004 г. '

3. STR(X [:WIDTH [:DECIMALS ] ]: Integer (или Real); var ST: String) - преобразует число X вещественного или целого типа в строковое представление (строку ST). WIDTH определяет общую длину поля, выделенного под соответствующее символьное числа X представление вещественного или целого числа X; DECIMALS определяет количество символов в дробной части.

Примеры:

1) i:=5237;

Str(i,st); Þ st='5237'

Str(i:4,st); Þ st='5237'

Str(i:6,st); Þ st=' 5237

Str(i:2,st); Þ st='5237'

2) a:=28.36;

STR(a,st); Þ st=' 2.8360000000E-01 '

STR(a:9,st); Þ st=' 2.84E-01'

STR(a:5,st); Þ st=' 2.8E-01'

STR(a:5:2,st); Þ st='28.36'

STR(a:8:3,st); Þ st=' 28.360'

STR(a:3:1,st); Þ st='28.4'

4. VAL(ST:String;var X:Integer(или Real);var CODE:byte) - преобразует строковую величину ST в числовое представление целой или вещественной переменной X (тип определяется типом переменной X).

ST не должно содержать незначащих пробелов в начале или в конце строки.

Параметр CODE содержит ноль, если преобразование прошло успешно, и тогда в X помещается результат преобразования. Иначе CODE равен номеру первого ошибочного символа в строке ST, и в этом случае содержимое X не меняется (перевод не осуществится).

Пример: ST:='234';

val(ST,i,r); Þ i=234; r=0.




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 427; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.096 сек.