Реферат: Обучение начальных курсов методам программирования на языке 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.

еще рефераты
Еще работы по программированию, базе данных