Перечислимый (перечисляемый) тип данных
Перечислимый тип = ( Идентификатор {, Идентификатор} ). |
Перечисляемый тип задается списком значений, которые может принимать переменная этого типа.
type Day = (Mon, Tue, Wed, Thu, Fri, Sat, Sun);
Color = (White, Red, Black);
Name = (Anna, Oleg, Vova, Gala);
var WorkDay: Day; NameBoy, NameGirl: Name;
Continent: (Africa, Asia, America, Australia, Europe, Antarctica)
begin
WorkDay:=Mon;
NameBoy:=Oleg;
Continent:=Asia;
end.
Идентификаторы всех элементов перечисляемого типа интерпретируются как константы. Например, White, Red, Black – константы типа Color, а Anna, Oleg, Vova, Gala - константы типа Name.
Идентификатор, указанный в списке перечислимого типа, может присутствовать только в одном описании и один раз. Например, следующее ошибочно:
type Boy = (Sasha, Vova, Oleg);
Girl = (Anna, Sasha, Lena);
Name = (Lora, Oleg, Vova, Gala, Lora);
Оператор присваивания для переменной перечислимого типа допустим, если справа стоит значение из описания типа именно этой переменной, например:
WorkDay:=Mon; Continrnt:=Africa; Но ошибочно: NameBoy:=Red;
Вопрос: а такое присваивание: Color:=Red; - верно?
Идентификаторы в списке упорядочены целыми положительными числами, начиная с 0, поэтому к ним применимы функции Pred, Succ, Ord.
Например, следующие выражения истинны:
Ord(Asia)=1; Succ(Vova)=Gala; Pred(Sat)=Fri;
К переменным перечислимого типа не применимы ни арифметические функции, ни процедуры Read и Write!
Перечислимый тип данных употребляется для улучшения читабельности программы.
Ограниченный (диапазонный, интервальный) тип данных
Ограниченный тип = Ограничение.. Ограничение. |
Ограничение = Константа порядкового типа.
Примеры: var X:1..5; Y: ‘A’..’D’; Z: -100..100;
Ограниченный тип данных задается на базе какого - либо порядкового типа с указанием более узкого, чем у базового, диапазона возможных значений.
Нижнее Ограничение не должно превышать верхнее.
К переменным ограниченного типа применимы функции Ord, Pred, Succ.
Ограниченный тип данных употребляется для контроля значений переменных, а также для улучшения наглядности программы.
Для подключения контроля диапазона используется директива компилятору {$R+}, для отключения - {$R-}.
const Min = 16; Max = 75;
type Days = (Mon,Tue,Wed,Thu,Fri,Sat,Sun);
WorkDay = Mon.. Fri; FreeDay = Sat.. Sun; Letter = ‘A’.. ‘Z’;
var Day: Days; Interval: Min.. Max; A: ‘0’.. ‘9’; B: 0.. 9; L: Letter;
begin
{$R+}
Write(‘введи большую английскую букву’};
Read(L);
case L of
‘A’.. ‘Z’: Writeln(‘ - это большая английская буква!’);
else: Writeln(‘ - это НЕ большая английская буква! ’);
end;
{$R-}
repeat
Write(‘введи любую цифру => ’};
Readln(B);
until (B>=0) and (B<=9) and (B-Trunc(B)=0)
Writeln(“Вы ввели цифру ”, B);
end.
Задача 1 Написать программу, которая по введенному номеру дня недели определяла бы предыдущий и последующий день, и для каждого из этих трех дней выясняла, выходной это или рабочий день.
Program Z1; Uses Crt; type Days=(Mon,Tue,Wed,Thu,Fri,Sat,Sun); var Day,Yesterday,Today,Tomorrow:Days; i:Byte; begin repeat ClrScr; Writeln('1 - понедельник'); Writeln('2 - втоpник'); Writeln('3 - сpеда'); Writeln('4 - четвеpг'); Writeln('5 - пятница'); Writeln('6 - суббота'); Writeln('7 - воскpесенье'); Write('Введи номеp дня => '); Readln(i); until (i>0) and (i<8); case i of 1: Today:=Mon; 2: Today:=Tue; 3: Today:=Wed; 4: Today:=Thu; 5: Today:=Fri; 6: Today:=Sat; 7: Today:=Sun; end; if Today=Sun then Tomorrow:=Mon else Tomorrow:=Succ(Today); if Today=Mon then Yesterday:=Sun else Yesterday:=Pred(Today); | i:=1; repeat case i of 1:begin Write('вчеpа был день '); Day:=Yesterday; end; 2:begin Write('сегодня '); Day:=Today; end; 3:begin Write('завтpа будет '); Day:=Tomorrow; end; end; case Day of Mon: Write(' понедельник'); Tue: Write(' втоpник'); Wed: Write(' сpеда'); Thu: Write(' четвеpг'); Fri: Write(' пятница'); Sat: Write(' суббота'); Sun: Write(' воскpесенье'); end; case Day of Mon.. Fri: Writeln(' - pабочий день '); Sat, Sun: Writeln(' - выходной день'); end; i:=i+1; until i>3; end. |
Строковый тип данных
Строковый тип данных = string [[целое без знака]]. |
Строковый тип данных языка Паскаль позволяет в программе задавать структуру данных, которая называется строкой (стрингом). Строка очень похожа на линейный массив, состоящий из символов, но в отличие от линейного массива, в среде TP v.7.0, программист может не указывать длину строки.
var S:String;
begin
S:=’флейта’;
Write(S); => флейта
end.
Для работы со строками в модуле System Turbo Pascal есть следующие подпрограммы:
Подпрограммы для работы со строками
Сoncat(s1,s2,...sn):string
возвращает строку, полученную конкатенацией строк s1,s2,…sn
Pos(Pattern,Sourse:String):Integer
возвращает номер символа, начиная с которого Pattern входит в Sourse. Если вхождения нет, функция возвращает 0.
Pos('23','12345') => 2
Pos('54','45678') => 0
Pos('23','23 12345') => 1
3. Length(S:String):Integer;
возвращает длину строки S.
Length(‘мама’) => 4
4. Copy(S:String; Pos,Len:Integer):String;
возвращает строку, полученную из Len символов строки S, начиная с позиции Pos. Если Pos больше, чем длина строки S, то возвращается пустая строка. Если значение Len+Pos больше, чем длина строки S, то возвращаются символы, принадлежащие строке S.
Copy('window',1,3) => 'win'
Copy('window',7,1) => ''
Copy('window',6,4) => 'w'
5. Delete(var S:String; Pos,Len:Integer);
убирает из строки S Len символов, начиная с Pos. Если Len больше длины S, то ничего не происходит. Если значение Pos+Len больше длины строки, то удаляются все символы до конца строки.
Delete('bravo',2,2) => 'bvo'
Delete('bravo',10,1)=>'bravo'
Delete('bravo',5,4)=>'brav'
6. Insert(S:String;var D:String;Pos:Integer);
вставляет строку S в строку D перед символом с номером Pos. Если Pos больше длины D, то S и D соединяются. Если длина результата при этом больше длины D, то в D записываются самые левые символы. A:='bravo'
Insert('DD',A,3) => 'brddavo'
Insert('KK',A,10) => 'bravokk'
Insert('AL',A,1) => 'albravo'
7. Str(I:Integer;var S:String); Str(R:Real;var S:String);
преобразует S или R из числа в строку S. I и R могут быть записаны с использованием формата.
var S:String[4]; K:Real;
begin
k:=45.678;
Str(45,S); Write(S) => '45'
Str(k:9,S); Write(S) => '4.568E+02'
Str(45:3,S); Write(S) => '_45'
Str(K:8,S); Write(S) => '4.47E+02'
Str(45:5,S); Write(S) => '___4'
end
8. Val(S:String; var R:Real; var P:Integer);
Val(S:String; var I,P:Integer);
преобразует строковую переменную S в число. Если в строке S ошибок нет, то P=0; иначе P присваивается номер ошибочного символа.
Пример 1
{Программа в предложении Stroka
все сочетания X меняет на Y}
var Stroka, X,Y:String;
N:Integer;
begin
Write('Введи предложение =Ю ');
Readln(Stroka);
Write('Что заменим? ');
Readln(X);
Write('Чем заменим? ');
Readln(Y);
N:=Pos(X,Stroka);
while N>0 do
begin
Delete(Stroka,N,Length(X));
Insert(Y,Stroka,N);
N:=Pos(X,Stroka);
end;
Writeln;
Write('Получили -');
Writeln(Stroka);
end.
Пример 2
{Программа в предложении Stroka
все слова выводит наоборот}
var Stroka, Slovo:String;
I:Integer;
begin
Write('введи предложение=> ');
Readln(Stroka);
for i:=1 to length(Stroka) do
if Stroka[i]=' ' then
begin
Write(Slovo);
Write(' ');
Slovo:='';
end
else
Slovo:=Stroka[i]+Slovo;
Write(Slovo);
end.
Пример 3
{Программа выясняет, является ли строка B перестановкой символов строки A}
var StrokaA,StrokaB:String; N,i:Integer; Priznak:Boolean;
begin
Write('Введи строку A=> '); Readln(StrokaA);
Write('Введи строку B=> '); Readln(StrokaB);
if Length(StrokaA)=Length(StrokaB)
then Priznak:=True else Priznak:=False;
if Priznak then
begin
i:=1;
while (i<=Length(StrokaA)) and Priznak do
begin
N:=Pos(StrokaA[i],StrokaB);
if N>0 then Delete(StrokaB,N,1)
else Priznak:=False;
i:=i+1;
end;
end;
Writeln; Write('Символы строки А - ');
if Priznak then Writeln(' перестановка')
else Writeln('не перестановка');
Writeln('символов строки B');
end.
Пример 4
{Программа выясняет, является ли последовательность цифр
номером счастливого билета}
uses Crt;
var i, SumLeft,SumRight,Left,Right,P1:Integer; Word:String; B:Char;
begin
repeat
i:=1; Word:=''; Writeln;
Write('введи номер билета =>');
repeat
repeat
B:=ReadKey;
until ((B>='0')and(B<='9')) or (Ord(B)=13);
if Ord(B)<>13 then
begin
Word:=Word+B; Write(Word[i]);
end;
i:=i+1;
until Ord(B)=13;
until not(Odd(Length(Word)));
SumLeft:=0; SumRight:=0;
i:=1;
while i<=Length(Word) div 2 do
begin
Val(Word[i],Left,P1);
Val(Word[Length(Word)-i+1],Right,P1);
SumLeft:=SumLeft+Left;
SumRight:=SumRight+Right;
i:=i+1;
end;
Writeln;
if (SumLeft=SumRight) and (SumLeft<>0)
then Write('это СЧАСТЛИВЫЙ БИЛЕТ!')
else Writeln(' нет в жизни счастья!');
end.