Загрузить архив: | |
Файл: hai-0010.zip (11kb [zip], Скачиваний: 58) скачать |
Краткая теория
Строковые типы
Значением строкового типа является последовательность симво-
лов с динамическим атрибутом длины (в зависимости от действитель-
ного числа символов при выполнении программы) и постоянныматри-
бутом размера в диапазоне от 1 до 255.Текущее значение атрибута
длины можно получить с помощью стандартной функции Length.
┌──────┐
строковый тип ───>│string├──┬──────────────────────────────>
└──────┘│ ^
│┌───┐ ┌─────┐ ┌───┐ │
└─>│ [ ├──>│целое├──>│ ] ├─┘
└───┘ │ без │ └───┘
│знака│
└─────┘
Отношение междулюбыми двумя строковыми значениями устанав-
ливается согласно отношению порядка между значениямисимволов в
соответствующих позициях. В двух строках разной длины каждый сим-
вол более длинной строки без соответствующего символа в более ко-
роткой строке принимает значение "больше"; например, 'Xs' больше,
чем 'X'.Нулевые строки могут быть равны только другимнулевым
строкам, и они являются наименьшими строковыми значениями.
К идентификаторустроковоготипаи к ссылке на переменную
строкового типа можно применять стандартные функции Low и High. В
этом случае функция Low возвращает 0,а High возвращает атрибут
размера (максимальную длину) данной строки.
Параметр-переменная, описанная с помощью идентификатора
OpenString и ключевого слова string в состоянии {$P+},является
открытым строковым параметром.Открытые строковые параметры поз-
воляютпередавать одной и той же процедуре или функции строковые
переменные изменяющегося размера.
Конкретный элементмассива обозначается с помощью ссылки на
переменную массива, за которой указывается индекс, определяющий
данный элемент.
Конкретный символв строковой переменной обозначается с по-
мощью ссылки на строковую переменную,за которой указывается ин-
декс, определяющий позицию символа.
┌───┐ ┌─────────┐ ┌───┐
индекс ──>│ [ ├───────>│выражение├────┬──>│ ] ├──>
└───┘ ^ └─────────┘ │ └───┘
│ ┌───┐ │
└───────┤ , │<───────┘
└───┘
Индексные выражения обозначают компонентыв соответствующей
размерности массива.Числовыражений не должно превышать числа
индексных типов в описании массива. Более того, тип каждого выра-
жениядолженбыть совместимым по присваиванию с соответствующим
индексным типом.
В случае многомерного массива можноиспользоватьнесколько
индексов или несколько выражений в индексе. Например:
Matrix[I][J]
что тождественно записи:
Matrix[I,J]
Строковую переменнуюможнопроиндексировать с помощью оди-
ночного индексного выражения, значение которого должно быть в ди-
апазоне 0...n,где n - указанный в описании размер строки.Это
дает доступ к каждому символу в строковом значении, если значение
символа имеет тип Char.
Первый символ строковой переменной (индекс 0) содержит дина-
мическую длину строки, то есть Length(S) тождественно Ord(S[0]).
Если атрибуту длины присваивается значение, то компилятор не про-
веряет, является ли это значение меньшим описанного размера стро-
ки. Вы можете указать индекс строки и вне ее текущей динамической
длины.В этом случае считываемыесимволыбудут случайными,а
присваивания вне текущей длины не повлияют на действительное зна-
чение строковой переменной.
Когда с помощью директивы компилятора {$X+} разрешен расши-
ренный синтаксис, значение PChar может индексироваться одиночным
индексным выражением типа Word. Индексное выражение задает смеще-
ние, которое нужнодобавитьк символу перед его разыменованием
для получения ссылки на переменную типа Char.
Открытые параметрыпозволяют передавать одной и той же про-
цедуре или функции строки и массивы различных размеров.
Открытые строковые параметры могут описываться двумя спосо-
бами:
- с помощью идентификатора OpenString;
- с помощью ключевого слова string в состоянии {$P+}.
Идентификатор OpenString описываетсявмодуле System.Он
обозначает специальный строковый тип, который может использовать-
ся только в описании строковых параметров.В целях обратной сов-
местимости OpenString не является зарезервированным словом и мо-
жет, таким образом, быть переопределен как идентификатор, задан-
ный пользователем.
Когда обратная совместимость значения не имеет,для измене-
ния смысла ключевого слова stringможно использоватьдирективу
компилятора {$P+}. В состоянии {$P+} переменная, описанная с клю-
чевым словом string, является открытым строковым параметром.
Для открытого строкового параметра фактический параметр мо-
жет быть переменной любого строкового типа. В процедуре или функ-
ции атрибут размера (максимальная длина) формальногопараметра
будет тем же, что у фактического параметра.
Открытые строковыепараметрыведут себя также как парамет-
ры-переменные строкового типа,только их нельзяпередавать как
обычные переменные другимпроцедурам или функциям.Однако, их
можно снова передать как открытые строковые параметры.
В следующем примере параметр SпроцедурыAssignStr -это
открытыйстроковыйпараметр:
procedure AssignStr(var S: OpenString);
begin
S := '0123456789ABCDEF';
end;
Так как S - это открытый строковый параметр, AssignStr можно
передавать переменные любого строкового типа:
var
S1: string[10];
S1: string[20];
begin
AssignStr(S1); { S1 := '0123456789' }
AssignStr(S2); { S2 := '0123456789ABCDEF' }
end;
В AssingStr максимальная длина параметра S та же самая,что
у фактического параметра.Такимобразом, в первом вызове
AssingStr при присваивании параметра S строка усекается, так как
максимальная длина S1 равна 10.
При применении к открытому строковомупараметру стандартная
функция Low возвращает0,стандартная функция High возвращает
описанную максимальную длину фактическогопараметра, афункция
SizeOf возвращает размер фактического параметра.
В следующемпримерепроцедура FillString заполняет строку
заданным символом до ее максимальной длины.Обратите внимание на
использование функции High для получения максимальной длины отк-
рытогостроковогопараметра.
procedure FillStr(var S: OpenString; Ch: Char);
begin
S[0] := Chr(High(S)); { задаетдлинустроки }
FillChar(S[1], High(S), Ch);{ устанавливает число
символов }
end;
Значения и параметры-константы,описанные с использованием
идентификатора OpenString или ключевого слова string всостоянии
{$P+}, не являютсяоткрытыми строковыми параметрами.Они ведут
себя также,как если бы были описаны с максимальной длиной стро-
кового типа 255,афункция Hinghдля таких параметров всегда
возвращает 255.
uses crt,dos;
var i,j,i1,x:integer;
DI: SearchRec;
textf:array[1..800] of string[79];
procedure music;
begin
sound(800);
delay(200);
nosound;
end;
procedure myerror (s:string);
var c:char;
begin
textbackground(4);
window(10,10,70,16);
clrscr;
textcolor(15);
write('╔════════════════════════ Внимание ═════════════════════════╗');
write('║ ║');
write('║ ║');
write('║ ║');
write('║ ║');
write('╚═══════════════════════════════════════════════════════════╝');
gotoxy(10,2);
write(' Втекущемкаталогенетфайла ',s,'.');
gotoxy(15,3);
write(' Без него не могу работать.');
textbackground(1);
gotoxy(27,5);
write(' Да');
c:=chr(1);
{ выдаётзвукавойсигнал }
music;
while(c<>chr(13)) do
c:=readkey;
end;
procedure ins(x,y,w:integer;ct,ft:integer);
var l,i:integer;
attr:byte;
begin
attr:=ct+16*ft;
if lastmode=co40 then l:=y*80+2*x+1;
if lastmode=co80 then l:=y*160+2*x+1;
i:=l;
while (i begin mem[$b800:i]:=attr; i:=i+2; end; end; procedure
hide; var
r:registers; begin r.ah:=$01; r.ch:=$20; r.cl:=$00; intr($10,r); end; function
myexit:boolean; var
c:char; i,x:integer; begin window(20,8,55,13); textbackground(7); textcolor(0); write('╔═══════Прекратитьпросмотр════════╗'); write('║ ║'); write('║ ║'); write('║ ║'); write('╚══════════════════════════════════╝'); textbackground(6); gotoxy(8,3); write('
да ' ); textbackground(3); gotoxy(21,3); write('
нет'); ins(20,12,36,7,0); ins(55,12,1,7,0); ins(55,11,1,7,0); ins(55,10,1,7,0); ins(55,9,1,7,0); ins(55,8,1,7,0); c:=chr(1); i:=1; x:=26; while(c<>chr(13)) do begin c:=readkey; { по ESC
закрывает запрос } if c=chr(27) then begin
i:=2;break;end; if c=chr(0) then begin c:=readkey; ins(x,9,7,15,3); if c=chr(77) then if i=2 then begin
x:=26;i:=1;end else begin x:=39;i:=2;end; if c=chr(75) then if i=2 then begin
x:=26;i:=1;end else begin x:=39;i:=2;end; ins(x,9,7,15,6); end; end; case i of 1:myexit:=true; 2:myexit:=false; end; end; procedure
obuch; var
n,c:char; s,zx:string; t:boolean; y,x,y1,m:integer; f:text; begin window(1,1,80,25); textbackground(0); clrscr; hide; m:=1;i:=1; window(1,1,80,2); textbackground(2); clrscr; textcolor(5); write('строка 21'); gotoxy(20,1); window(1,23,80,24); textbackground(2); clrscr; window(1,2,80,23); textbackground(1); clrscr; textbackground(7); window(1,1,80,25); gotoxy(20,1); gotoxy(2,24); write(' ',char(24),' - вверх '); gotoxy(14,24); write(' ',char(25),' - вниз '); gotoxy(25,24); write(' PgUp - листвверх '); gotoxy(45,24); write(' PgDn - листвниз '); gotoxy(65,24); write(' ESC - выход '); textbackground(1); textcolor(15); window(1,2,80,23); assign(f,'curswork.txt'); reset(f); while((i=1)and(m<796)) do begin readln(f,s); if (s[1]='#')and(s[2]='#')and(s[3]='#') then
break; textf[m]:=s; if m<22 then writeln(s); m:=m+1; end; x:=m; c:=chr(1); m:=0; while c<>chr(27) do begin c:=readkey; if c=chr(27) then if myexit then c:=chr(27)
else begin c:=chr(1); window(1,2,80,23); textbackground(1); clrscr; textcolor(15); for i:=m to m+21 do begin writeln(textf[i]); end; end; if c=chr(0) then begin c:=readkey; if ((c=chr(81))) then if
(m+23<=x-23) then m:=m+21 else m:=x-21; if ((c=chr(73))) then if
(m-23>1) then m:=m-21 else m:=0; if ((c=chr(80)) and
(x-23>=m)) then m:=m+1; if ((c=chr(72)) and
(m>0))then m:=m-1; clrscr; for i:=m to m+21 do begin writeln(textf[i]); end; window(1,1,80,25); gotoxy(1,1); textbackground(2); textcolor(5); write(' '); gotoxy(1,1); write('строка ',m+1); window(1,2,80,23); textcolor(15); textbackground(1); end; end; textbackground(0); window(1,1,80,25); clrscr; end; function
select:integer; var
om:integer; c:char; begin om:=lastmode; textmode(co40); textbackground(0); hide; window(5,3,35,20); textbackground(1); clrscr; textcolor(15); window(1,1,40,25); gotoxy(1,3); for i:=5 to 35 do begin gotoxy(i,5); write('═'); gotoxy(i,20); write('═'); end; for i:=5 to 20 do begin gotoxy(5,i); write('║'); gotoxy(35,i); write('║'); end; gotoxy(5,20); write('╚'); gotoxy(5,5); write('╔'); gotoxy(35,20); write('╝'); gotoxy(35,5); write('╗'); textcolor(5); gotoxy(5,3); write(' Строковый
тип данных в TP 7.0 '); textcolor(15); gotoxy(12,8); write('Теория'); gotoxy(12,10); write('Помощь'); gotoxy(12,12); write('О
программе'); gotoxy(12,14); write('Выход'); ins(5,x,29,1,2); c:=chr(1); while(c<>chr(13)) do begin c:=readkey; if c=chr(0) thenbegin c:=readkey; ins(5,x,29,15,1); if c=chr(80) then if i1=4 then begin x:=7;i1:=1;end else begin x:=x+2;i1:=i1+1; end; if c=chr(72) then if i1=1 then begin x:=13;i1:=4;end else begin x:=x-2;i1:=i1-1; end; ins(5,x,29,1,2); end; end; textmode(om); case (i1) of 1:select:=1; 2:select:=2; 3:select:=3; 4:select:=4; end; end; procedure
help; var
s:string; f:text; i:byte; begin textmode(co80); hide; window(10,5,70,20); textbackground(1); textcolor(15); clrscr; write('╔═══════════════════════
Справка
═══════════════════════════╗'); write('║ ║'); write('║
║'); write('║
║'); write('║
║'); write('║
║'); write('║
║'); write('║
║'); write('║ ║'); write('║
║'); write('║
║'); write('║
║'); write('║ ║'); write('║ Выходлюбаяклавиша ║'); write('╚═══════════════════════════════════════════════════════════╝'); assign(f,'help.txt'); reset(f); i:=2; while not(eof(f)) do begin gotoxy(2,i); readln(f,s); if ((s[1]='#') and (s[2]='#')) then break; writeln(s); i:=i+1; end; close(f); readkey; end; procedure
about; var
f:text; q:byte; s:string; begin textmode(co80); hide; window(10,5,70,20); textbackground(1); textcolor(15); clrscr; write('╔═════════════════════
Опрограмме
════════════════════════╗'); write('║
║'); write('║ ║'); write('║
║'); write('║
║'); write('║
║'); write('║ ║'); write('║
║'); write('║
║'); write('║
║'); write('║
║'); write('║
║'); write('║
║'); write('║ Выход любая клавиша ║'); write('╚═══════════════════════════════════════════════════════════╝'); assign(f,'about.txt'); reset(f); q:=2; while not(eof(f)) do begin gotoxy(2,q); readln(f,s); if ((s[1]='#') and (s[2]='#')) then break; writeln(' ',s); q:=q+1; end; close(f); readkey; end; begin hide; findfirst('curswork.txt',anyfile,di); if doserror<>0 then begin myerror('curswork.txt'); halt(1); end; findfirst('help.txt',anyfile,di); if doserror<>0 then begin myerror('help.txt'); halt(1); end; findfirst('about.txt',anyfile,di); if doserror<>0 then begin myerror('about.txt'); halt(1); end; j:=1; i1:=1; x:=7; while j=1
do begin i:=select; case i of 1:obuch; 2:help; 3:about; 4:begin textbackground(0);clrscr;halt;end;
end; end; end.