Программирование на языках высокого уровня

МОСКОВСКИЙ ИНСТИТУТ РАДИОТЕХНИКИ,

ЭЛЕКТРОНИКИ И АВТОМАТИКИ

(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)













КУРСОВАЯ РАБОТА

Программирование на языках В/У















									Студент: 

									Группа: 











Москва 2003




СОДЕРЖАНИЕ



1	ЗАДАНИЕ 											 3

2	БЛОК-СХЕМА ПРОГРАММЫ 					 3

3	ТЕКСТ ПРОГРАММЫ 								 7

4	ОПИСАНИЕ РАБОТЫ ПРОГРАММЫ 			 9

5	РУКОВОДСТВО ОПЕРАТОРА 					 18




1	ЗАДАНИЕ



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

Программа находится в текстовом файле. Максимальная длина идентификатора заранее неизвестна.



2	БЛОК-СХЕМА ПРОГРАММЫ



Fst:=nil;

Write('File >: '); ReadLn(st);

Assign(f,st); Reset(f); st:='';



Начало программы







L:=Fst;

a:=false; b:=false;

Read(f,ch);ch:=UpCase(ch);





ch=''''

ch=''''



Read(f,ch);													       Нет



								      Да





Read(f,ch);

ch='{'

ch='}'						      Нет						       Да



													       Нет



								      Да





						      Нет						       Да





(ch=' ') or (ch='!') or (ch='"') or (ch='#') or (ch='$') or (ch='%') or (ch='&') or (ch='*') or (ch='+') or (ch=',') or (ch='-') or (ch='.') or (ch='/') or (ch=':') or (ch=';') or (ch='<') or (ch='=') or (ch='>') or (ch='@') or (ch='[') or (ch=']') or (ch='\') or (ch='^') or (ch='`') or (ch='|') or (ch='~') or (ch='(') or (ch=')') or (ch=#10) or (ch=#13) or (ch='}')















   Нет





















							    Да

































			Нет





				        Да







ST='BEGIN'



c:=false; e:=false;

						       Да





				        Нет











(ST='TYPE') OR (ST='VAR') OR (ST='CONST') OR (ST='PROCEDURE') OR (ST='FUNCTION')











c:=true; e:=false; ST:=''								Да









a=true

st:=st+ch;

a:=true;





				        Нет















ST='LABEL'						      Да



c:=true; e:=true; ST:='';





				         Нет







(st='AND') or (st='XOR') or (st='NOT') or (st='OR') or (st='DIV') or (st='MOD') or (st='SHL') or (st='SHR') or (st='NIL') or (st='OBJECT') or (st='ARRAY') or (st='FILE') or (st='OF') or (st='RECORD') or (st='SET') or (st='BYTE') or (st='SHORTINT') or (st='WORD') or (st='INTEGER') or (st='LONGINT') or (st='STRING') or (st='BOOLEAN') or (st='REAL') or (st='DOUBLE') or (st='EXTENDED') or (st='COMP') or (st='CHAR') or (st='END') or (st='TEXT')





















															Да









ST:='';

















							      Нет













(e=false) and (c=true) and  ((st[1]='0') or (st[1]='1') or (st[1]='2') or (st[1]='3') or (st[1]='4') or (st[1]='5') or (st[1]='6') or (st[1]='7') or (st[1]='8') or (st[1]='9'))











ST:='';								  Да













				Нет





(e=false) and (c=false) and ((st[1]='0') or (st[1]='1') or (st[1]='2') or (st[1]='3') or (st[1]='4') or (st[1]='5') or (st[1]='6') or (st[1]='7') or (st[1]='8') or (st[1]='9')) and (ch<>':')









								   Да





ST:='';









				Нет





(L<>nil) and (st<>'')



L^.s=st

							   Нет					Да			     Да







(b=false) and (st<>'') and (c=true)														    Нет



L:=L^.p;

				       Нет









							    Да







st:=st+ch;

L:=Fst; New(Fst); Fst^.s:=st; Fst^.k:=1; Fst^.p:=L; L:=Fst; st:='';









New(FEst); FEst^.s:=L^.s; FEst^.k:=L^.k; FEst^.p:=nil;

ch=#26

				       Да





		       Нет







L:=L^.p; Est:=FEst;











L<>nil

					        Нет





							        Да





PEst:=Est; Est:=Est^.p;

L^.s>Est^.s

											         Да



L^.k:=L^.k+1;

st:=''; b:=true; L:=L^.p;



						          Нет





New(temp); temp^.s:=L^.s; temp^.k:=L^.k; temp^.p:=nil; PEst^.p:=temp;



Est=nil



									Да





						          Нет







(L^.s<Est^.s) and (Est<>Fest)



New(temp); temp^.s:=L^.s; temp^.k:=L^.k; temp^.p:=Est; PEst^.p:=temp;										         Да







					        Нет







(L^.s<Est^.s) and (Est=FEst)



										         Да



New(temp); temp^.s:=L^.s; temp^.k:=L^.k; temp^.p:=Est; PEst^.p:=temp;





							       Нет



















			   Да





		 Нет















Write(Est^.s,'=',Est^.k,'; '); Est:=Est^.p;

Est<>nil



ReadLn;



Выход












3	ТЕКСТ ПРОГРАММЫ



Program Project1;

{$APPTYPE CONSOLE}

Uses SysUtils;

type spisok=^Recspisok;

Recspisok=record

s:String; k:word; p:spisok; end;

var a,b,c,e:boolean; ch:char; st:string;

L,Fst,FEst,PEst,Est,temp:spisok; f:text;

label lb;

BEGIN

Fst:=nil;

Write('File >: '); ReadLn(st);

Assign(f,st); Reset(f); st:='';

REPEAT

L:=Fst;

a:=false; {a-признак конца слова}

b:=false; {b-признак наличия текущего слова в списке}

Read(f,ch);ch:=UpCase(ch);

{УДАЛЕНИЕ СЛОВ, ПЕЧАТАЕМЫХ ПРОЦЕДУРОЙ WRITE}

if ch='''' then begin

Repeat Read(f,ch); Until ch=''''; end;

{УДАЛЕНИЕ КОМЕНТАРИЕВ}

if ch='{' then begin

Repeat Read(f,ch); Until ch='}'; end;

{ПРОВЕРКА СИМВОЛА НА ПРИЗНАК КОНЦА СЛОВА}

if (ch=' ') or (ch='!') or (ch='"') or (ch='#') or (ch='$') or (ch='%') or

(ch='&')or(ch='*')or(ch='+')or(ch=',')or(ch='-')or(ch='.') or

(ch='/')or(ch=':')or(ch=';')or(ch='<')or(ch='=')or(ch='>')or

(ch='@')or(ch='[')or(ch=']')or(ch='\')or(ch='^')or(ch='`')or

(ch='|')or(ch='~')or(ch='(')or(ch=')')or(ch=#10)or(ch=#13)or(ch='}')

then a:=true;

{ЕСЛИ a=true, ТО СЛОВО СФОРМИРОВАНО. ПЕРЕХОДИМ К ПРОВЕРКЕ}

if (a=true) THEN BEGIN

IF (ST='BEGIN') THEN begin c:=false; e:=false; end;

IF (ST='TYPE') OR (ST='VAR') OR (ST='CONST') OR (ST='PROCEDURE') OR (ST='FUNCTION') THEN

begin c:=true; e:=false; ST:=''; end;

IF (ST='LABEL') THEN begin c:=true; e:=true; ST:=''; end;

{УДАЛЕНИЕ ЗАРЕЗЕРВИРОВАННЫХ СЛОВ}

if (st='AND')or(st='XOR')or(st='NOT')or(st='OR')or(st='DIV') or

(st='MOD')or(st='SHL')or(st='SHR')or(st='NIL')or(st='OBJECT') or

(st='ARRAY')or(st='FILE')or(st='OF')or(st='RECORD')or(st='SET') or

(st='BYTE')or(st='SHORTINT')or(st='WORD')or(st='INTEGER')or

(st='LONGINT')or(st='STRING')or(st='BOOLEAN')or(st='REAL')or

(st='DOUBLE')or(st='EXTENDED')or(st='COMP')or(st='CHAR')or(st='END')

or(st='TEXT') then st:='';

{--УДАЛЕНИЕ ЦИФР В ОПИСАНИИ ПЕРЕМЕННЫХ--}

if (e=false) and (c=true) and ((st[1]='0')or(st[1]='1')or(st[1]='2')or

(st[1]='3')or(st[1]='4')or(st[1]='5')or(st[1]='6')or(st[1]='7')or

(st[1]='8')or(st[1]='9')) then st:='';



{--УДАЛЕНИЕ ЦИФР В ПРОГРАММЕ--}

if (e=false) and (c=false) and ((st[1]='0')or(st[1]='1')or(st[1]='2')or

(st[1]='3')or(st[1]='4')or(st[1]='5')or(st[1]='6')or(st[1]='7')or

(st[1]='8')or(st[1]='9')) and (ch<>':') then st:='';



{УВЕЛИЧЕНИЕ СЧЕТЧИКА СЛОВА НА ЕДИНИЦУ. ЕСЛИ ЭТО СЛОВО УЖЕ ЕСТЬ}

while (L<>nil) and (st<>'') do begin

if L^.s=st then begin L^.k:=L^.k+1; st:=''; b:=true; L:=L^.p; end

else L:=L^.p; end;

{ДОБАВЛЕНИЕ СЛОВА. ЕСЛИ ЕГО НЕТ В СПИСКЕ}

if (b=false) and (st<>'') and (c=true) then begin L:=Fst;

New(Fst); Fst^.s:=st; Fst^.k:=1; Fst^.p:=L; L:=Fst; st:=''; end else st:='';



END ELSE st:=st+ch;

UNTIL ch=#26;



{ФОРМИРОВАНИЕ ОТСОРТИРОВАННОГО СПИСКА}

New(FEst); FEst^.s:=L^.s; FEst^.k:=L^.k; FEst^.p:=nil;

lb: L:=L^.p; Est:=FEst;

While L<>nil do BEGIN

IF L^.s>Est^.s THEN begin PEst:=Est; Est:=Est^.p; end;



IF Est=nil THEN begin New(temp); temp^.s:=L^.s; temp^.k:=L^.k;

temp^.p:=nil; PEst^.p:=temp; goto lb; end;



IF (L^.s<Est^.s) and (Est<>Fest) THEN begin

New(temp); temp^.s:=L^.s; temp^.k:=L^.k; temp^.p:=Est;

PEst^.p:=temp; goto lb; end;



IF (L^.s<Est^.s) and (Est=FEst) THEN begin

New(temp); temp^.s:=L^.s; temp^.k:=L^.k; temp^.p:=FEst;

FEst:=temp; goto lb; end;

                END;

while Est<>nil do begin Write(Est^.s,'=',Est^.k,'; '); Est:=Est^.p; end;

ReadLn;

END.

END.




4	ОПИСАНИЕ РАБОТЫ ПРОГРАММЫ



ТАБЛИЦА ТИПОВ, ИСПОЛЬЗУЕМЫХ ПРОГРАММОЙ

Имя типа

Тип

Назначение

spisok



Динамическая переменная со структурой Recspisok

Recspisok

record

запись, содержащая переменную типа String (s) для хранения слова, переменную типа word (k) для хранения числа входов этого слова в тексте программы и ссылку (p).



ТАБЛИЦА ПЕРЕМЕННЫХ, ИСПОЛЬЗУЕМЫХ ПРОГРАММОЙ

Имя

Тип

Назначение

a

boolean

Признак конца слова

b

boolean

Признак наличия текущего слова в списке L

c

boolean

Признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION

e

boolean

Признак считывания раздела программы, после встречи слова LABEL

ch

char

Символы, которые считываются из текстового файла

st

string

Переменная содержащая отдельное слово из текстового файла

L

spisok

Указатель, содержащий адрес произвольного элемента списка L, который содержит все имена идентификаторов программы, а также число вхождений этих идентификаторов в программе

Fst

spisok

Указатель, содержащий адрес первого элемента списка L

Est

spisok

Указатель, содержащий адрес произвольного элемента списка Est, который содержит все имена идентификаторов программы в алфавитном порядке, а также числе вхождений идентификаторов в программе

FEst

spisok

Указатель, содержащий адрес первого элемента списка Est

PEst

spisok

Указатель, содержащий адрес произвольного элемента списка Est

temp

spisok

Вспомогательный указатель, для записи адреса вспомогательного элемента списка

f

text

Файловая переменная, содержащая текст программы



Также в программе используется метка lb.


Идентификаторы в языке Pascal – это имена констант, переменных, меток, типов, процедур, функций и полей в записях. Идентификаторы могут состоять максимум из 63 символов. Идентификатор всегда начинается буквой, за которой могут следовать буквы и цифры, а также символ подчеркивания. Пробелы и специальные символы алфавита не могут входить в идентификатор.

Специальные символы:

+ - * / = ' . : ; < > [ ] ( ) { } ^ @ $ # ! ~ %

К специальным символам относятся также следующие пары символов:

<> <= >= := (* *) (. .)



Вначале программы указателю Fst присваивается значение nil. Этот указатель, содержит адрес первого элемента списка L, который будет содержать все имена идентификаторов программы, а также число вхождений идентификаторов в программе.

Далее программа печатает на экран строку "File >: ". После этого требуется ввести путь к файлу, содержащего текст программы, и его имя и нажать клавишу "Enter". Этот путь и имя файла считываются в переменную st. Далее файловая переменная f связывается с именем файла, содержащимся в переменной st, в результате обращения к стандартной процедуре ASSIGN. Далее программа инициирует файл для чтения с помощью стандартной процедуры RESET. При выполнении этой процедуры дисковый файл подготавливается к чтению информации. В результате специальная переменная-указатель, связанная с этим файлом, f будет указывать на начало файла, т. е. на компонент с порядковым номером 0. После этого переменной st присваиваем пустую строку.

Далее организуется цикл с помощью операторов REPEAT и UNTIL, который выполняется до тех пор пока переменная типа char сh не станет равной символу EOF (код #26). В этом цикле программа будет считывать символы из текстового файла и записывать их в переменную ch. Если перед выполнением чтения указатель файла достигнет конца очередной строки, то результатом чтения будет символ CR (код #13), а если достигнут конец файла, то – символ EOF (код #26). В результате работы этого цикла весь текстовый файл будет считан и сформирован список идентификаторов, а также число их вхождений в тексте программы на языке Pascal.

Вначале цикла указатель L, который имеет адрес произвольного элемента списка L, принимает значение указателя Fst. Затем переменным а (признак конца слова) и b (Признак наличия текущего слова в списке L) присваивается значение false. Далее с помощью стандартной процедуры READ из файловой переменной f считывается символ, на который указывает указатель файла, в переменную ch. В первом цикле это будет первый символ текстового файла. При помощи стандартной процедуры UPCASE программа из преобразует символы латинского алфавита от "а" до "z" в прописные буквы. Если же это прописная буква или любой другой символ, то в результате преобразования ничего не изменится.

Далее программа исключает слова, которые стоят между двумя одинарными кавычками. Чаще всего это текст, который печатается стандартной процедурой WRITE. Проверяется условие, если символ в переменной ch является символом " ' ", то тогда начинается цикл, образованный операторами REPEAT и UNTIL. В этом цикле программа считывает из файла в переменную ch символы до тех пор пока символ в переменной ch снова не будет равен символу " ' ". Далее цикл завершается, и переменная ch будет содержать символ " ' ".

Далее аналогичным способом программа исключает комментарии, встречающиеся в тексте программы, т. е. текст стоящий между двумя фигурными скобками. Проверяется условие, если символ в переменной ch является символом " { ", то тогда начинается цикл, образованный операторами REPEAT и UNTIL. В этом цикле программа считывает из файла в переменную ch символы до тех пор пока символ в переменной ch не станет равен символу " } ". Далее цикл завершается, и переменная ch будет содержать символ " } ".



Далее программа производит проверку символа в переменной ch и если он равен одному из символов: " ", '!', " ' ", "#", "$", "%", "&", "*", "+", ",", "-", ".", "/", ":", ";", "<", "=", ">", "@", "[", "], "\", "^", "`", "|", "~", "(", ")", код символа #10, код символа #13, "}", то это означает что слово в тексте, если оно было перед этими символами закончилось. И переменной a (признак конца слова) присваивается значение true. Если же символ в переменной ch не равен ни одному из этих символов, это означает, что это значащий символ, то переменная a останется равной false, и программа добавит этот символ в переменную st, содержащую текущее сформированное программой слово. Слово это будет содержаться в переменной строкового типа st. И если а будет равно true, то тогда начнется проверка этого слова. Если это окажется идентификатором, то оно запишется в список L, а если оно уже есть в списке, то тогда число вхождений этого слова в программе, которое содержится в этом же списке, увеличится на 1.



Если а равно true, то начинается блок программы, проверяющий текущее значение слова в переменной st.

1) Если переменная st содержит слово "BEGIN", то тогда переменным c (признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) присваивается значение false, e (признак считывания раздела программы, после встречи слова LABEL) присваивается значение false.

2) Если переменная st содержит одно из слов: "TYPE", "VAR", "CONST", "PROCEDURE", "FUNCTION", то тогда переменным c (признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) присваивается значение true, e (признак считывания раздела программы, после встречи слова LABEL) присваивается значение false, и переменной st присваивается пустая строка, т. к. она содержала одно из слов "TYPE", "VAR", "CONST", "PROCEDURE", "FUNCTION", а они не являются идентификаторами.

3) Если переменная st содержит слово "LABEL", то тогда переменным c (признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) присваивается значение false, e (признак считывания раздела программы, после встречи слова LABEL) присваивается значение true, и переменной st присваивается пустая строка, т. к. она содержала слово "LABEL", а оно не являетя идентификатором.

4) Если переменная st содержит одно из слов: "AND", "XOR", "NOT", "OR", "DIV", "MOD", "SHL", "SHR", "NIL", "OBJECT", "ARRAY", "FILE", "OF", "RECORD", "SET", "BYTE", "SHORTINT", "WORD", "INTEGER", "LONGINT", "STRING", "BOOLEAN", "REAL", "DOUBLE", "EXTENDED", "COMP", "CHAR", "END", "TEXT", то переменной st присваивается пустая строка, т. к. она содержала одно из этих слов, а оно не является идентификатором.

5) Если переменные с (признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) равно true, e (признак считывания раздела программы, после встречи слова LABEL) равно false, что соответствует разделу описательной части программы, и не разделу описания меток, и первый символ в строке равен цифре, то тогда переменной st присваивается пустая строка, т. к. она содержит слово, находящееся в описательной части программы и начинающееся с цифры, т. е. цифру. А цифры в описательной части программы, если они не являются метками, то и не являются идентификаторами.

6) Если переменные с (признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) равно false, e (признак считывания раздела программы, после встречи слова LABEL) равно false, что соответствует разделу программы стоящей между словами BEGIN и END, и первый символ в строке равен цифре, а текущее значение переменной ch не равно символу " : ", то тогда переменной st присваивается пустая строка, т. к. она содержит слово, находящееся в части программы, стоящей между словами BEGIN END, и начинающееся с цифры, т. е. цифру. А цифры в части программы, стоящей между словами BEGIN END, после которых не стоит символ " : " не являются метками и не являются идентификаторами.

7) С помощью оператора WHILE образуется цикл: в то время как указатель L не равен значению nil, то есть список L уже содержит какие-то слова из текста программы и число вхождений каждого из этих слов, и переменная st не равна пустой строке проверяется условие. Если значение в поле s динамической переменной структуры Recspisok, адрес которой содержится в указателе L равно слову содержащемуся в переменной st, то выполняется следующие действия. Значению в поле k динамической переменной структуры Recspisok, адрес которой содержится в указателе L увеличивается на единицу (k – тип word). Значению переменной st присваивается значение пустой строки, переменной b (признак наличия текущего слова в списке L) присваивается значение true. Указатель L принимает значение ссылки содержащейся в данном элементе списка, на который указывает указатель L. Иначе указатель L принимает значение ссылки содержащейся в данном элементе списка, на который указывает указатель L. И таким образом проверяется следующий элемент списка L и т. д. весь список L, на содержание текущего слова в списке. Если оно уже существует в списке L, то число вхождений этого слова в тексте программы увеличивается на 1, если оно не содержится в списке, то тогда будет выполнятся следующая часть программы, образованная операторами IF и THEN. И это слово включается в список L.

8) Проверяется условие: если переменная b (Признак наличия текущего слова в списке L) равна значению false, что соответствует отсутствию слова, содержащегося в переменной st в списке L, и переменная st не равна пустой строке, и переменная с (признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) равна значению true, что соответствует то выполняется следующее. Указатель L принимает значение указателя Fst, имеющего адрес первого элемента списка L. Далее с помощью стандартной процедуры NEW резервируется память в ЭВМ под динамическую переменную, адрес которой будет содержать указатель Fst. В поле s динамической переменной, адрес которой содержится в указателе Fst присваивается значение слова, содержащегося в переменной st. Количество вхождений этого слова в тексте программы, содержится в поле k динамической переменной, на которую указывает указатель Fst. В данное поле записывается значение 1. И в поле ссылки данной динамической переменной, адрес которой содержится в указателе Fst записывается значение адреса указателя L, который имел значение адреса первого элемента списка L. А далее указатель L принимает значение адреса указателя Fst. Переменной st присваивается значение пустой строки. А иначе, если условие не выполняется, то переменной st присваивается значение пустой строки.



На этом часть проверки слова заканчивается. Она начиналась с проверки значения переменной a. И если а не равно true, то тогда в конец слова, содержащегося в переменной st добавляется символ, содержащийся в переменной ch.



Далее проверяется условие: если символ в переменной ch равен коду #26, что соответствует концу файла, то происходит выход из цикла, образованного операторами REPEAT и UNTIL, если же символ не равен этому коду, то тогда программа переходит к началу этого цикла. В результате чего формируется список L, содержащий все идентификаторы программы и число их вхождений в тексте программы.



Далее формируется новый список (Est), который будет содержать эти слова в алфавитном порядке.

С помощью процедуры NEW в памяти ЭВМ резервируется место под динамическую переменную, адрес которой будет содержаться в указателе FEst (указатель, содержащий адрес первого элемента списка Est). В поле s динамической переменной, адрес которой содержится в указателе Fest присваивается значение поля s динамической переменной, адрес которой содержится в указателе L. В поле k динамической переменной, адрес которой содержится в указателе Fest присваивается значение поля k динамической переменной, адрес которой содержится в указателе L. В поле p динамической переменной, адрес которой содержится в указателе Fest присваивается значение nil.

Далее перед строкой стоит метка lb.

Указатель L принимает значение, содержащееся в поле р динамической переменной, на которую ссылается этот указатель. Указателю Est (указатель, содержащий адрес произвольного элемента списка Est, который содержит все имена идентификаторов программы в алфавитном порядке, а также числе вхождений идентификаторов в программе) присваивается значение указателя Fest.

Далее организуется цикл при помощи оператора WHILE. В то время как указатель L имеет значение отличное от nil выполняется следующие действия, разбитые на 4 пунктов. В результате этих операций будет сформирован список Est, который будет содержать идентификаторы в алфавитном порядке, а также число их вхождений в тексте программы.

1) Если слово, содержащееся в поле s динамической переменной, адрес которой находится в указателе L старше в алфавитном порядке слова, содержащегося в поле s динамической переменной, адрес которой находится в указателе Est (указатель, содержащий адрес произвольного элемента списка Est), то выполняется следующее. Это соответствует тому, что текущий идентификатор в списке L старше идентификатора в списке Est. Поэтому мы должны добавить идентификатор из списка L в ячейку, стоящую после идентификатора в списке Est. Для этого указателю PEst (указатель, содержащий адрес произвольного элемента списка Est) присваивается значение указателя Est. Указатель Est принимает значение содержащееся в поле р динамической переменной, на которую ссылается этот указатель. Таким образом в списке Est мы переходим к следующему элементу.

2) Если в указатель Est содержит значение nil, то выполняется следующее. С помощью процедуры NEW в памяти ЭВМ резервируется место под динамическую переменную, адрес которой будет содержаться в указателе temp (вспомогательный указатель, для записи адреса вспомогательного элемента списка). В поле s динамической переменной, адрес которой находится в указателе temp записывается значение поля s динамической переменной, адрес которой находится в указателе L. В поле k динамической переменной, адрес которой находится в указателе temp записывается значение поля k динамической переменной, адрес которой находится в указателе L. Затем в поле р динамической переменной, адрес которой находится в указателе temp записывается значение nil. В поле р динамической переменной, адрес которой находится в указателе PEst записывается значение адреса указателя temp. Далее осуществляется переход по метке lb. Таким образом происходит добавление элемента списка Est в его конец.

3) Если слово, содержащееся в поле s динамической переменной, адрес которой находится в указателе L младше в алфавитном порядке слова, содержащегося в поле s динамической переменной, адрес которой находится в указателе Est (указатель, содержащий адрес произвольного элемента списка Est), и адрес указателя Est не равен адресу первого элемента списка Est, то есть адресу указателя FEst, то выполняется следующее. С помощью процедуры NEW в памяти ЭВМ резервируется место под динамическую переменную, адрес которой будет содержаться в указателе temp (вспомогательный указатель, для записи адреса вспомогательного элемента списка). В поле s динамической переменной, адрес которой находится в указателе temp записывается значение поля s динамической переменной, адрес которой находится в указателе L. В поле k динамической переменной, адрес которой находится в указателе temp записывается значение поля k динамической переменной, адрес которой находится в указателе L. Затем в поле р динамической переменной, адрес которой находится в указателе temp записывается адрес, находящийся в указателе Est. В поле р динамической переменной, адрес которой находится в указателе PEst записывается значение адреса указателя temp. Далее осуществляется переход по метке lb.

4) Если слово, содержащееся в поле s динамической переменной, адрес которой находится в указателе L младше в алфавитном порядке слова, содержащегося в поле s динамической переменной, адрес которой находится в указателе Est (указатель, содержащий адрес произвольного элемента списка Est), и адрес указателя Est равен адресу первого элемента списка Est, то есть адресу указателя FEst, то выполняется следующее. С помощью процедуры NEW в памяти ЭВМ резервируется место под динамическую переменную, адрес которой будет содержаться в указателе temp (вспомогательный указатель, для записи адреса вспомогательного элемента списка). В поле s динамической переменной, адрес которой находится в указателе temp записывается значение поля s динамической переменной, адрес которой находится в указателе L. В поле k динамической переменной, адрес которой находится в указателе temp записывается значение поля k динамической переменной, адрес которой находится в указателе L. Затем в поле р динамической переменной, адрес которой находится в указателе temp записывается адрес, находящийся в указателе FEst. В поле р динамической переменной, адрес которой находится в указателе FEst записывается значение адреса указателя temp. Далее осуществляется переход по метке lb.



В результате этого цикла указатель L будет переходить к следующим ячейкам и достигнет значения nil. Когда это произойдет в результате цикла будет сформирован отсортированный список Est. Далее необходимо по условию задачи распечатать этот список. После выполнения этого цикла программа перейдет к выполнению строки, стоящей после метки lb. Указатель Est будет иметь адрес первого элемента отсортированного списка (FEst).

Для распечатки на экран списка Est организуется цикл с помощью оператора WHILE. В то время как указатель Est не равен значению nil будет выполнятся следующее. С помощью оператора WRITE распечатывается значение, содержащееся в поле s и k динамической переменной, адрес которой содержится в указателе Est. И значению адреса указателя присваивается значение, содержащееся в поле р данной динамической переменной, на которую ссылается этот указатель.

Далее программа ждет нажатия на клавишу "Enter" при помощи процедуры READLN. Программа завершает работу.










5	РУКОВОДСТВО ОПЕРАТОРА



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

Программа находится в текстовом файле. Максимальная длина идентификатора заранее неизвестна.



Вначале программа спрашивает имя текстового файла, в котором находится программа. Программа выдает на экран строку:

File >:

Далее требуется ввести путь к файлу, содержащего текст программы, и его имя и нажать клавишу "Enter".

К примеру возьмем текст данной программы. Для этого необходимо ввести путь к этому файлу и его имя. К примеру, если файл имеет имя "kurs.pas" и находится в директории "Programs" на логическом диске С, то для того, чтобы программа начала работу с текстом данного файла необходимо ввести следующую строку: "C:\Programs\kurs.pas".

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

В данном примере список L можно представить в виде:

LB

5





F

6





TEMP

16





EST

17





. . .



SPISOK

3

nil





Далее программа составляет новый список, состоящий из элементов списка L (имен идентификаторов программы, а также чисел их вхождений в тексте программы), отсортированных в алфавитном порядке.

Изначально список Est будет иметь один элемент (первый элемент списка L). Далее элементы из списка L по очереди будут добавляться в список Est. Список Est будет формироваться по алфавиту, то есть вначале список Еst содержит один элемент:

LB

5

nil

Далее программа выберет из списка L следующий элемент:

F

6



Имя F младше по алфавиту имени LB, соответственно список Est будет преобразован в следующий список:

F

6





LB

5

nil

И так далее до тех пор пока список L не кончится. Программа проверяет старше ли имя идентификатора элемента списка L имени идентификатора изначально первого элемента списка Est. Если да, то программа переходит к сравнению имени идентификатора элемента списка L со следующим именем идентификатора элемента списка Est. Как только список Est заканчивается или же имя идентификатора списка L будет младше имени идентификатора элемента списка Est, то программа вставляет элемент списка L после предыдущего элемента списка Est.



В итоге программа распечатает на экран содержание списка Est, что в данном примере будет выглядеть следующим образом:

A=4; B=4; C=7; CH=44; E=6; EST=17; F=6; FEST=10; FST=10; K=14; L=33; LB=5; P=14; PEST=4; RECSPISOK=2; S=19; SPISOK=3; ST=75; TEMP=16;



Далее программа ждет нажатия на клавишу "Enter". После этого программа завершает работу.





2