Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Нетипизированный файл

Автор: dream-x 16.04.2008 19:52

Преобразовать файл, содержащий текст рограммы, таким образом, чтобы каждый внутренний оператор был сдвинут на 2 позиции вправо по сравнению с внешним.

Вот мои наработки только я не пойму как мне сделать чтобы можно было найти например begin и после него все операторы были смещены вправо до end. Мне можно и словами))


program pr;
var
newfile,oldfile:file;
newname,oldname:string[20];
oblbuf:array[1..200,1..128] of byte;
count,result,res:word;
begin
repeat
writeln('vvedite imya ishodnogo file');
read(oldname);
assign(oldfile,oldname);
{$I-}
reset(oldfile);
{$I+}
res:=result;
if res <> 0
then
writeln('file no found');
until res=0;
writeln('vvedite imya vihodnogo file');
readln(newname);
assign(newfile,newname);
{$I-}
rewrite(newfile);
{$I+}
if result <> 0
then
begin
writeln('error ',newname);
HALT;
end;
repeat
blockread(oldfile,oblbuf,200,count);
{ вставка }
until count<200;
close(oldfile);
close(newfile);
end.


Автор: dream-x 16.04.2008 22:02

Ну неужели никто помочьне может!!!

Автор: volvo 16.04.2008 22:26

Слова begin/end repeat/until гарантированно являются первыми в строке, или исходник может быть таким:

program p; begin writeln('hello'); end.


и тебе его надо превратить в
program p;
begin
writeln('hello');
end.

?

Автор: dream-x 17.04.2008 0:54

Цитата(volvo @ 16.04.2008 19:26) *

Слова begin/end repeat/until гарантированно являются первыми в строке, или исходник может быть таким:

program p; begin writeln('hello'); end.


и тебе его надо превратить в
program p;
begin
writeln('hello');
end.

?


ДА, объясни пожалуйста.

Автор: volvo 17.04.2008 0:58

Что ДА? Если эти слова будут первыми в строке, то программа будет вот такой:

const off_str = '   ';

function trim(s: string): string;
var i: integer;
begin
while s[1] = ' ' do delete(s, 1, 1);
trim := s;
end;

var
f_in, f_out: text;
offset: integer;
s: string;
i: integer;

begin
assign(f_in, 'reform.txt'); reset(f_in);
assign(f_out, 'reform.rf'); rewrite(f_out);

offset := 0;

while not eof(f_in) do begin
readln(f_in, s);

if (pos('until', trim(s)) = 1) or (pos('end', trim(s)) = 1)
then dec(offset);


if s <> '' then
for i := 1 to offset do begin
s := off_str + s;
end;
writeln(f_out, s);

if (pos('repeat', trim(s)) = 1) or (pos('begin', trim(s)) = 1)
then inc(offset);


end;

close(f_out);
close(f_in);

end.
(Если хочется добавлять "лесенку" после других слов тоже - лучше добавить функцию, которая будет проверять начало прочитанной строки на некоторые зарезервированные слова)

Программа рабочая - я взял то, что было у тебя в первом посте, удалил пробелы в начале всех строк и запустил свою программу. Получилась лесенка...

Автор: dream-x 17.04.2008 1:45

СПАСИБО!!! как можно у тебя репутацию поднять я все понял))0 еще раз огромное спасибо!!!

Автор: klem4 17.04.2008 12:41


Цитата
как можно у тебя репутацию поднять


У тебя пока недостаточно сообщений на форуме для этого, я подниму репутацию volvo от твоего имени.