МОСКОВСКИЙ ИНСТИТУТ РАДИОТЕХНИКИ,
ЭЛЕКТРОНИКИ И АВТОМАТИКИ
(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
КУРСОВАЯ РАБОТА
Программирование на языках В/У
Студент:
Группа:
Москва 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=#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]='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^.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: ". После этого требуется ввести путь к файлу, содержащего текст программы, и его имя и нажать клавишу "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, после которых не стоит символ " : " не являются метками и не являются идентификаторами.
Страницы: 1, 2