МОСКОВСКИЙ
ИНСТИТУТ РАДИОТЕХНИКИ,
ЭЛЕКТРОНИКИ
И АВТОМАТИКИ
(ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ)
КУРСОВАЯ РАБОТА
Программирование на
языках В/У
Студент:
Группа:
Москва 2003
СОДЕРЖАНИЕ
1 ЗАДАНИЕ 3
2 БЛОК-СХЕМА ПРОГРАММЫ
3
3 ТЕКСТ ПРОГРАММЫ
7
4 ОПИСАНИЕ РАБОТЫ
ПРОГРАММЫ 9
5 РУКОВОДСТВО
ОПЕРАТОРА 18
1 ЗАДАНИЕ
Напечатать в
алфавитном порядке все различные идентификаторы программы на языке Pascal, указав для
каждого число его вхождений в тексте программы.
Программа находится
в текстовом файле. Максимальная длина идентификатора заранее неизвестна.
2 БЛОК-СХЕМА
ПРОГРАММЫ
|
Нет
Да
|
Нет Да
Нет
Да
Нет Да
Нет
Да
Нет
Да
|
|||
Да
Нет
|
Да
Нет
Да
Нет
Да
Нет
|
Да
Нет
Да
Нет
Нет Да Да
Нет
|
Нет
Да
|
||||||||
|
||||||||
Да
Нет
|
|||||||||
Нет
Да
|
Да
|
||||||
Нет
|
|||||||||||||
Да
Нет
|
Да
Нет
Да
Нет
Да
Нет
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 ОПИСАНИЕ РАБОТЫ
ПРОГРАММЫ
ТАБЛИЦА ТИПОВ,
ИСПОЛЬЗУЕМЫХ ПРОГРАММОЙ
Имя типа
Тип
Назначение
структурой Recspisok
String (s) для хранения слова, переменную типа word (k) для хранения числа входов этого слова в тексте программы
и ссылку (p).
ТАБЛИЦА ПЕРЕМЕННЫХ,
ИСПОЛЬЗУЕМЫХ ПРОГРАММОЙ
Имя
Тип
Назначение
списке L
программы, после встречи слов: TYPE,
VAR, CONST, PROCEDURE, FUNCTION
программы, после встречи слова LABEL
текстового файла
слово из текстового файла
произвольного элемента списка L,
который содержит все имена идентификаторов программы, а также число вхождений
этих идентификаторов в программе
первого элемента списка L
произвольного элемента списка Est,
который содержит все имена идентификаторов программы в алфавитном порядке, а
также числе вхождений идентификаторов в программе
элемента списка Est
произвольного элемента списка Est
записи адреса вспомогательного элемента списка
текст программы
Также в программе
используется метка 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, указав для
каждого число его вхождений в тексте программы.
Программа находится
в текстовом файле. Максимальная длина идентификатора заранее неизвестна.
Вначале программа
спрашивает имя текстового файла, в котором находится программа. Программа
выдает на экран строку:
Далее требуется
ввести путь к файлу, содержащего текст программы, и его имя и нажать клавишу
"Enter".
К примеру возьмем
текст данной программы. Для этого необходимо ввести путь к этому файлу и его
имя. К примеру, если файл имеет имя "kurs.pas" и находится
в директории "Programs" на логическом диске С, то для того,
чтобы программа начала работу с текстом данного файла необходимо ввести
следующую строку: "C:Programskurs.pas".
После этого
программа начинает считывать каждый символ текста по очереди, формирует слова,
исключает зарезервированные слова и другие символы, выбирает из этих слов
идентификаторы, считает количество вхождений каждого идентификатора в программе
и формирует список. Затем программа сортирует получившийся список по алфавиту и
выводит на экран в алфавитном порядке все идентификаторы программы, указывая
число вхождений каждого идентификатора программы.
В данном примере
список L можно представить
в виде:
. . .
Далее программа
составляет новый список, состоящий из элементов списка L (имен
идентификаторов программы, а также чисел их вхождений в тексте программы),
отсортированных в алфавитном порядке.
Изначально список Est будет иметь один
элемент (первый элемент списка L). Далее элементы из списка L по очереди будут
добавляться в список Est. Список Est будет
формироваться по алфавиту, то есть вначале список Еst содержит один
элемент:
nil
Далее программа
выберет из списка L
следующий элемент:
Имя F младше по алфавиту
имени LB, соответственно
список Est будет преобразован
в следующий список:
И так далее до тех
пор пока список 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". После этого программа завершает
работу.