Рефераты. Программирование на языках высокого уровня p> 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:Programskurs.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". После этого программа завершает работу.
-----------------------
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')

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

ST='LABEL'

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

Fst:=nil;

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

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

L:=L^.p;

L^.k:=L^.k+1; st:=''; b:=true; L:=L^.p;

L^.s=st

Lnil

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

(Lnil) and (st'')

ST:='';

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

st:=st+ch;

(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^.s>Est^.s

(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'))

(b=false) and (st'') and (c=true)

ch=#26

st:=st+ch;

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

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

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

(ST='FUNCTION')

c:=false; e:=false;

ST='BEGIN'

a=true

a:=true;

(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='}')

ch='}'

Read(f,ch);

ch='{'

ch=''''

Read(f,ch);

ch=''''

L:=Fst; a:=false; b:=false;

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

Est=nil

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

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

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

(L^.s


Страницы: 1, 2



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.