Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2010, 12:36   #1
Dissan
 
Регистрация: 17.06.2010
Сообщений: 3
По умолчанию Pascal. Текстовый файлы.

Вообщем у меня такая программа: Текст программы на Паскале хранится в файле на диске. Считать программу с диска и получить распечатку программы. Степень вложенности операторов цикла пометить добавлением слева соответствующего количества пробелов.

Проблема в том, что не могу понять, по какому принципу/алгоритму будет работать определение вложенности. Как понимаю это будет связано с поиском слов while/for + операторных скобок begin/end; Помогите решить пожалуйста. Заранее спасибо.
Dissan вне форума Ответить с цитированием
Старый 17.06.2010, 12:48   #2
MadReason
Ищу работу
Форумчанин
 
Аватар для MadReason
 
Регистрация: 16.02.2007
Сообщений: 269
По умолчанию

делай стек. проходи текста программы, при встрече begin, while, for, repeat, if, then ,else, case добавляй в стек количество пробелов, на которые нужно отступить. а при нахождении end, until извлекай из стека количество пробелов.
Пишу на Delphi все что угодно, недорого, красиво, с комментариями
###icq 107335###
MadReason вне форума Ответить с цитированием
Старый 17.06.2010, 12:48   #3
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

по begin end'у.
Для простоты используй входной файл, где каждый begin или end является отдельной строкой.
Сканируй его построчно:
нашел begin - перед ним и каждой последующей строкой добавляешь пробел.
нашел далее begin - ставишь уже два пробела. Используй счетчик пробелов.
нашел end уменьшай счетчик на 1.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 17.06.2010, 13:02   #4
Dissan
 
Регистрация: 17.06.2010
Сообщений: 3
По умолчанию

MadReason
мне препод тож говорил через стек с помощью баланса скобок, но я в динамических структурах полный 0, поэтому даже не пытаюсь сделать.
Z1000000
да, идея хорошая, уже пробывал, но там есть один нюанс, который я никак не могу исправить и уже думаю 2ой день. Заключается он в следующем:
если идёт например 2 цикла подряд (тот же for do), то он по идее должен увеличить вложенность (поставить пробел) перед 2ым for do. Я представлял себе алгоритм такой: нашёл for do, нужно проверить следующую строчку, если в ней есть for do, то поставить дополнительный пробел, если нету, то удалить пробел. А вот в чём проблема: я не знаю как проверить, есть ли в следующей строке for do/while, находясь при этом на текущей.

Была идея с занесением всего файла в массив строк, но тогда не знаю как оформить всё это дело
Dissan вне форума Ответить с цитированием
Старый 17.06.2010, 13:55   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Могу предложить без стека
Код:
var f:text;e,i:integer;s:string;
begin
Assign(f,'Project1.dpr');
reset(f); i:=0;
while not eof(f) do
begin
readln(f,s);
if s='begin' then
begin
inc(i);
end;
if s='end;' then
begin
dec(i);
end;
for e:=0 to i do write(' ');writeln(s);
end;
  { TODO -oUser -cConsole Main : Insert code here }
close(f);
readln;
end.
Это самое простое, но тут однозначно нужно чтоб программные "скобки" были в отдельной строке
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.06.2010, 13:55   #6
Dissan
 
Регистрация: 17.06.2010
Сообщений: 3
По умолчанию

Вообщем вот программа, где я пытался сделать через занесение строк файла в массив:
Код:
Program kurs;
uses crt;
const n=500;
Var F:text;
    l,k:string;
    i,j,w,q:integer; {за вложенность отвечает w}
    G:array [1..n] of string[100];
Begin
Clrscr;
Assign (F,'Kurs.txt');
reset(F);
w:=-1; {-1, т.к. учитывается самый первый Begin}

while not Eof(F) do
Begin
readln(F,l);
inc(j);
G[j]:=l; {здесь заносим все строки в массив}
end;
close(F);

reset(F);
while not Eof(F) do
Begin
readln(F,l);
k:='';
inc(q); {счётчик текущей строки}

 for i:=1 to length(l) do
 if (l[i]<>' ') then k:=k+l[i]   else
 if (k='while') or (k='for') then
 {а вот здесь мне надо реализовать посимвольное чтение строки q+1 взятой из массива, но как это сделать я не знаю}



 if (k='begin') or (k='Begin') then inc(w);
 for i:=1 to w do
 write (' ');
 writeln(l);
 if (k='end;') or (k='End;') or
 (k='end') or (k='End') then w:=w-1;

end;
Readln;
close (F);
End.
Всё, сделал я этот момент с чтением следующей строки посимвольно))) ура))) теперь вопрос к другой части моей программы: распечатке программы отметить операторов, изменяющих значения заданных переменных (их имена вводятся).
Отметить как я понимаю наверно цветом, но это не особо важно. Не могли бы подсказать как это можно сделать? Заранее премного благодарен)

Последний раз редактировалось Stilet; 21.05.2011 в 17:27.
Dissan вне форума Ответить с цитированием
Старый 21.05.2011, 15:10   #7
monster_63
Новичок
Джуниор
 
Регистрация: 19.05.2011
Сообщений: 2
По умолчанию

Dissan не мог бы ты выложить полный код программы?? У меня токой же курсач. Заранее спасибо.

Последний раз редактировалось monster_63; 21.05.2011 в 15:44.
monster_63 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Текстовый тип файлов [Pascal] TRueXe Помощь студентам 3 18.04.2010 17:23
[Pascal] Считать текстовый файл Рамик Помощь студентам 13 27.05.2009 14:34
текстовый файл.Pascal. xartion Помощь студентам 2 26.05.2009 22:31
pascal.Текстовый файл Mashul'ka Помощь студентам 1 14.05.2009 19:45
как определить какие файлы есть в папке и вывести их имена в текстовый файл Tdoctor Паскаль, Turbo Pascal, PascalABC.NET 3 04.11.2008 05:18