Реферат: Программирование на языках высокого уровня
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 |