Реферат: Обучение начальных курсов методам программирования на языке Turbo Pascal
Краткая теория
Строковые типы
Значениемстрокового типа является последовательность симво-
лов с динамическим атрибутом длины (в зависимости отдействитель-
ного числа символов при выполнении программы) ипостоянным атри-
бутом размера в диапазоне от 1 до 255. Текущее значение атрибута
длины можно получить с помощью стандартной функцииLength.
┌──────┐
строковый тип───>│string├──┬──────────────────────────────>
└──────┘ │ ^
│ ┌───┐ ┌─────┐ ┌───┐ │
└─>│ [├──>│целое├──>│ ]├─┘
└───┘ │ без │ └───┘
│знака│
└─────┘
Отношениемежду любыми двумя строковыми значениямиустанав-
ливается согласно отношению порядка между значениями символов в
соответствующих позициях. В двух строках разной длиныкаждый сим-
вол более длинной строки без соответствующего символа вболее ко-
роткой строке принимает значение «больше»;например, 'Xs' больше,
чем 'X'. Нулевыестроки могут быть равны только другим нулевым
строкам, и они являются наименьшими строковымизначениями.
Кидентификатору строкового типа ик ссылке на переменную
строкового типа можно применять стандартные функции Low иHigh. В
этом случае функция Low возвращает 0, а Highвозвращает атрибут
размера (максимальную длину) данной строки.
Параметр-переменная, описанная с помощью идентификатора
OpenString и ключевого слова string в состоянии {$P+}, является
открытым строковым параметром. Открытые строковые параметры поз-
воляют передаватьодной и той же процедуре или функции строковые
переменные изменяющегося размера.
Конкретныйэлемент массива обозначается с помощьюссылки на
переменную массива, за которой указывается индекс, определяющий
<span Courier New";mso-fareast-font-family: Batang;mso-ansi-language:RU;mso-fareast-language:KO;mso-bidi-language:AR-SA">данный элемент.
Конкретныйсимвол в строковой переменнойобозначается с по-
мощью ссылки на строковую переменную, за которой указывается ин-
декс, определяющий позицию символа.
┌───┐ ┌─────────┐ ┌───┐
индекс──>│ [├───────>│выражение├────┬──>│] ├──>
└───┘ ^ └─────────┘ │ └───┘
│ ┌───┐ │
└───────┤,│<───────┘
└───┘
Индексныевыражения обозначают компоненты всоответствующей
размерности массива. Число выражений не должно превышать числа
индексных типов в описании массива. Более того, типкаждого выра-
жения должен быть совместимым по присваиванию ссоответствующим
индексным типом.
В случаемногомерного массива можно использовать несколько
индексов или несколько выражений в индексе. Например:
Matrix[I][J]
что тождественно записи:
Matrix[I,J]
Строковуюпеременную можно проиндексировать с помощью оди-
ночного индексного выражения, значение которого должно бытьв ди-
апазоне 0...n, где n — указанный вописании размер строки. Это
дает доступ к каждому символу в строковом значении, еслизначение
символа имеет тип Char.
Первый символстроковой переменной (индекс 0) содержит дина-
мическую длину строки, то есть Length(S) тождественно Ord(S[0]).
Если атрибуту длины присваивается значение, то компиляторне про-
веряет, является ли это значение меньшим описанногоразмера стро-
<span Courier New";mso-fareast-font-family: Batang;mso-ansi-language:RU;mso-fareast-language:KO;mso-bidi-language:AR-SA">ки. Вы можете указать индекс строки и вне ее текущейдинамической
длины. В этомслучае считываемые символы будут случайными, а
присваивания вне текущей длины не повлияют надействительное зна-
чение строковой переменной.
Когда спомощью директивы компилятора {$X+} разрешен расши-
ренный синтаксис, значение PChar может индексироваться одиночным
индексным выражением типа Word. Индексное выражениезадает смеще-
ние, которое нужно добавить к символу перед его разыменованием
для получения ссылки на переменную типа Char.
Открытыепараметры позволяют передавать одной итой же про-
цедуре или функции строки и массивы различных размеров.
Открытыестроковые параметры могут описываться двумя спосо-
бами:
— с помощьюидентификатора OpenString;
— с помощьюключевого слова string в состоянии {$P+}.
ИдентификаторOpenString описывается в модуле System. Он
обозначает специальный строковый тип, который можетиспользовать-
ся только в описании строковых параметров. В целях обратной сов-
местимости OpenString не является зарезервированным словом и мо-
жет, таким образом, быть переопределен как идентификатор, задан-
ный пользователем.
Когда обратнаясовместимость значения не имеет, дляизмене-
ния смысла ключевого слова string можно использовать директиву
компилятора {$P+}. В состоянии {$P+} переменная,описанная с клю-
чевым словом string, является открытым строковымпараметром.
Для открытогострокового параметра фактический параметр мо-
жет быть переменной любого строкового типа. В процедуреили функ-
ции атрибут размера (максимальная длина) формального параметра
будет тем же, что у фактического параметра.
Открытыестроковые параметры ведут себя также как парамет-
<span Courier New";mso-fareast-font-family: Batang;mso-ansi-language:RU;mso-fareast-language:KO;mso-bidi-language:AR-SA">ры-переменные строкового типа, только их нельзя передавать как
обычные переменные другим процедурам или функциям. Однако, их
можно снова передать как открытые строковые параметры.
В следующемпримере параметр 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 для получения максимальной длины отк-
рытогостроковогопараметра.
<span Courier New";mso-fareast-font-family: Batang;mso-ansi-language:EN-US;mso-fareast-language:KO;mso-bidi-language:AR-SA">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.
<span Courier New";mso-fareast-font-family: Batang;mso-ansi-language:EN-US;mso-fareast-language:KO;mso-bidi-language:AR-SA">usescrt,dos;
vari,j,i1,x:integer;
DI: SearchRec;
textf:array[1..800] of string[79];
proceduremusic;
begin
sound(800);
delay(200);
nosound;
end;
proceduremyerror (s:string);
varc: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;
procedureins(x,y,w:integer;ct,ft:integer);
varl,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<l+2*w) do
begin
mem[$b800:i]:=attr;
i:=i+2;
end;
end;
procedurehide;
varr:registers;
begin
r.ah:=$01;
r.ch:=$20;
r.cl:=$00;
intr($10,r);
end;
functionmyexit:boolean;
varc: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 begini:=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 beginx:=26;i:=1;end
else begin x:=39;i:=2;end;
if c=chr(75) then if i=2 then beginx:=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;
procedureobuch;
varn,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]='#') thenbreak;
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;
functionselect:integer;
varom: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) then begin
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;
procedurehelp;
vars: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;
procedureabout;
varf: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.