Показать сообщение отдельно
Старый 21.05.2013, 22:27   #1 (permalink)
Алинkа
Новичок
 
Регистрация: 12.05.2013
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Составить программу на Паскале

Составить программу, которая в тексте программы на Паскале осу ществляет преобразование конструкции case … of в последовательность конструкции if … else..
есть готовая прога,что по ней скажете, её можно упростить(прога для курсовой),не знаю как можно сформулировать тему для курсовой по этой проге(заранее спасибо)
вот программа:
uses crt;
var f,out:text;
c:char;
str,name,cond:string;
i:integer;
flag,flag1:boolean;
begin
clrscr;
writeln('Enter filename');
readln(name);
assign(f,name);{исходный файл}
assign(out,'result.pas');{результат работы программы}
rewrite(out);
reset(f);
while not eof(f) do{пока не конец файла}
begin
readln(f,str);{считываем строку из f}
if (pos('case',str)>0) then {если в строке есть case}
begin
cond:=''; {инициализация условия case }
flag:=false; {этот флаг нужен, чтобы вставлять else }
flag1:=false; {флаг нужен для корректной обработки составных операторов в пункте else}
i:=0; {смещение в строке}
while str[pos('case',str)+4+i]=' ' do {избавляемся от пробелов, необязательно}
i:=i+1;
while str[pos('case',str)+4+i]<>' ' do {считываем условие для case}
begin
cond:=cond+str[pos('case',str)+4+i];
i:=i+1;
end;
readln(f,str);
while pos('end',str)=0 do {изменяем код программы до тех пор, пока не найдем end для case}
begin
while (pos(':',str)=0) and (pos('else',str)=0) do {ищем первое условие}
readln(f,str);
if (flag=true) then
begin
writeln(out,'else'); {если условие не первое, то записываем else}
end
else
flag:=true; {если нет, говорим, что первое условие уже было}
if pos('else',str)=0 then {если условие не else}
begin
writeln(out,'if ',cond,'=',copy(str,1,pos(':',str)-1),' then'); {запись конструкции if}
writeln(out,copy(str,pos(':',str)+1,length(str)-pos(':',str)));
readln(f,str);
while (pos(':',str)=0) and (pos('else',str)=0) do {записываем до тех пор, пока не дойдем до следующего условия}
begin
if (pos('end',str)<>0) then
str[pos('end',str)+3]:=' '; {если сотавной оператор, то избавляемя от точки-запятой после end}
writeln(out,str);
readln(f,str);
end;
end
else{если встретили else, то записываем соответствующую конструкцию}
begin
writeln(out,'else ',copy(str,pos('else',str)+4,length(str)-pos('else',str)-3));
if pos('begin',str)<>0 then{если после else составной оператор, в результирующий файл будем записывать до тех пор, пока не встретим end}
flag1:=true;
readln(f,str);
if pos('begin',str)<>0 then
flag1:=true;
while (pos('end',str)=0) or (flag1=true) do{пока не найдем end}
begin
writeln(out,str);
readln(f,str);
if pos('end',str)<>0 then{если встретили end}
flag1:=false;
end;
end;
end;
end
else{если не встретили case? то просто записываем в файл}
writeln(out,str);
end;
close(f);
close(out);
writeln('Done. Save in RESULT.PAS.');
readln;
end.
Алинkа вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070