Помощь - Поиск - Пользователи - Календарь
Полная версия: Нетипизированный файл
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
dream-x
Преобразовать файл, содержащий текст рограммы, таким образом, чтобы каждый внутренний оператор был сдвинут на 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
Ну неужели никто помочьне может!!!
volvo
Слова begin/end repeat/until гарантированно являются первыми в строке, или исходник может быть таким:

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


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

?
dream-x
Цитата(volvo @ 16.04.2008 19:26) *

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

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


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

?


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

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
СПАСИБО!!! как можно у тебя репутацию поднять я все понял))0 еще раз огромное спасибо!!!
klem4

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


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