Программирование на языках высокого уровня
СОДЕРЖАНИЕ: МОСКОВСКИЙ ИНСТИТУТ РАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ (ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ) КУРСОВАЯ РАБОТА Программирование на языках В/У Студент: Группа:МОСКОВСКИЙ ИНСТИТУТ РАДИОТЕХНИКИ,
ЭЛЕКТРОНИКИ И АВТОМАТИКИ
(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
КУРСОВАЯ РАБОТА
Программирование на языках В/У
Студент:
Группа:
Москва 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 (Lnil) 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 Lnil do BEGIN
IF L^.sEst^.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^.sEst^.s) and (EstFest) THEN begin
New(temp); temp^.s:=L^.s; temp^.k:=L^.k; temp^.p:=Est;
PEst^.p:=temp; goto lb; end;
IF (L^.sEst^.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 Estnil 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 |
|
Далее программа выберет из списка 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. После этого программа завершает работу.