Задача на текстовые файлы и Динамические структуры данных- ПОМОГИТЕ!!!

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

paul11j
Сообщения: 8
Зарегистрирован: 16 мар 2008, 12:29

Есть 2 задачи:
1)Сначала код программы, который вводиться с клавиатуры(программа может быть какой угодно)записиваеться в файл. После прочитать текст программы с файла, потом вывести прогу на экран и вывести в алфавитном порядке все ее идентификаторы(при этом цифры выводиться не должны). Текст программы вводишь сам.
2)Составить программу которая вводит строку символов, формируя с ее элементов однонаправленный список. Удалить последние три символа строки.
Задачи на Паскале
Всем, кто ответит огромное спасибо.
Dim...ON
Сообщения: 75
Зарегистрирован: 28 янв 2008, 01:10
Контактная информация:

paul11j , стучись в аську 198-012-696
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

1. Находишь в тексте программы слово var и считываешь все, пока не встретится слово begin, function, procedure, label, const, type, interface, implementation. Потом разбиваешь полученную строку на элементы (см. раздел Алгоритмы), потом упорядочиваешь список этих слов по алфавиту (см. там же).
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

Хыиуду,
если бы всё так просто... ;-((
var ....
const ...
var ...
а есть ещё локальные переменные...
кроме того, если мне не изменяет память, то идентификтор - это любое имя (не только именя переменных, но и параметеры процедур/функции, да и сами имена функций/процедур...

задачка сильно попахивает необходимостью разработки лексического анализатора... ;-((
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Тогда если найдется еще один var - считывать дальше. В чем проблема-то?
Лексический анализатор я писал где-то на 4 курсе, он именно так и работал.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Упс, неправильно прочитал сообщение: не все переменные, а все идентификаторы. Тогда действительно надо писать лексический анализатор. Думаю, лучше всего сделать это с помощью конечного автомата.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

&quot писал(а):, лучше всего сделать это с помощью конечного автомата.
к слову. а готовый есть? Было бы чисто интересно для себя посмотреть...
вспомнить молодость, студенческие года... ;-)))) (впрочем, как Вы можете догадаться, другой, кроме любопытства и ностальгии, нужнды лично у меня, нет.. ;-)
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Как я понимаю-все кроме значений(числовых,символьных и т.д), операторов и комментариев-есть идентификаторы(че-то я подзабыл определение идентификатора).
Тогда ничего сложного - берем строку, отсенваем все знаки(точки минусы и т.д.), разбиваем её на слова, потом убираем из массива слов все числовые, строковые, символьные и т.д значения.
Потом проверяем, не является ли данное слово оператором(можно занести все основные операторы в файл и читать оттуда).
Наконец, берем то, что осталось и проверяем, есть ли уже в массиве идентификаторов такой идентификатор, если нет-записываем.
Так обрабатываем все строки.
Дальше стандартный алгоритм сортировки.
Или я в чем-то неправ?
Ни что так не ограничивает фантазию программиста, как компилятор...
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Вот первые наработки.
По моему работает:

[syntax='Delphi']
program Ident;

const
ServSymbSet=[',',#39,'[',']','=',':',';','<','>','*','(',')','-','+',' '];
Digits=['0'..'9','.'];

var
FSrc:text;
FKeyList:text;
CurLine:string;
i:integer;
Blocks:array[1..128]of string;
ResWords:array[1..100]of string;
ResWdCount:integer;
cnt:integer;
St:string;

Function UpperCase(S:string):string;
var
SS:string;
i:integer;
begin
SS:='';
for i:=1 to Length(S) do
SS:=SS+UpCase(S);
UpperCase:=SS;
end;

Procedure LoadRes;
begin
Assign(FKeyList,'ResWords.txt');
Reset(FKeyList);
while not eof(FKeyList) do
begin
inc(ResWdCount);
Readln(FKeyList,ResWords[ResWdCount]);
end;
close(FKeyList);
end;

Function ParceText(txt:string):integer;
var l,c:integer;
wd:string;
begin
c:=0;
l:=length(txt);
wd:='';
for i:=1 to l+1 do
begin
if ((not (txt in ServSymbSet))and(i<>l+1)) then
wd:=wd+txt
else
begin
inc(c);
Blocks[c]:=wd;
wd:='';
end;
end;
ParceText:=c;
end;

Function RemoveStrValues(Src:string):string;
var
s:string;
i:integer;
SV:boolean;
begin
s:='';
SV:=False;
For i:=1 to Length(Src) do
begin
if Src=#39{'} then
SV:=not SV;
if (not SV)and(Src<>#39) then
s:=s+Src;
end;
RemoveStrValues:=s;
end;

Function DelNumAndRes(Src:string):string;
var
i,j:integer;
cnt:integer;
s:string;
begin
s:='';
cnt:=ParceText(Src);
for i:=1 to cnt do
if (Blocks[1] in Digits)or(Blocks=' ')then
Blocks:='*';

for i:=1 to cnt do
for j:=1 to ResWdCount do
if UpperCase(Blocks)=ResWords[j] then
Blocks[i]:='*';

for i:=1 to cnt do
if (Blocks[i]<>'*')and(Blocks[i]<>' ') then
s:=s+Blocks[i]+' ';

DelNumAndRes:=s;
end;


begin
LoadRes;
St:='if s=''str''then b:=110+12*3.14+data[i];';
St:=RemoveStrValues(St);
St:=DelNumAndRes(St);
Writeln(St);
cnt:=ParceText(St);
writeln;
for i:=1 to cnt do
writeln(Blocks[i]);
readln;
end.

[/syntax]
В папке программы должен быть файл ResWords.txt с зарезервироваными словами(по слову в строке, символы в верхнем регистре).
Ни что так не ограничивает фантазию программиста, как компилятор...
paul11j
Сообщения: 8
Зарегистрирован: 16 мар 2008, 12:29

MOTOCoder, За код конечно спасибо, но мне он нужен на Pascal'е.(запускал на Паскале, но она работает не так как надо)
Ответить