Дан текстовый файл F. Удалить из файла слова длиннее 5 символов, результат записать в файл G.
Через turbopascal
создать текстовый файл
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Решение с применением конечного автомата
Код: Выделить всё
program ShortWordsFiler;
type
FSMState = (Reading,Skiping);
FSMEvent = (
(*Reading events*)
NoWordFound,WordGoesOn,ShortWordFinished,LongWordDetected,
(*Skiping events*)
LongWordGoesOn,LongWordFinished
);
var
Input: file of char;
Output: Text;
iBuf :Char;
oBuf :String;
Evt : FSMEvent;
State: FSMState;
const
WordChar: set of Char = ['a'..'z','A'..'Z'];
begin
State := Reading;
assign(Input,'c:\tmp\F.txt');
assign(Output,'c:\tmp\G.txt');
reset(Input);
rewrite(Output);
while not eof(input) do begin
Read(Input,iBuf);
if length(oBuf) < SizeOf(String) then oBuf:=oBuf+iBuf;
case State of
Reading: begin
if iBuf in WordChar then begin
case length(oBuf) of
1..5: Evt:=WordGoesOn;
else Evt:=LongWordDetected;
end;
end else begin
case length(oBuf) of
1 : Evt:=NoWordFound;
else Evt:=ShortWordFinished;
end;
end;
end;
Skiping: begin
if iBuf in WordChar
then Evt:= LongWordGoesOn
else Evt:= LongWordFinished;
end;
end;
case Evt of
WordGoesOn, LongWordGoesOn: begin
end;
LongWordDetected: begin
State:=Skiping;
end;
ShortWordFinished: begin
oBuf[length(oBuf)]:=' ';
Write(Output,oBuf); oBuf:=''; State:=Reading;
if iBuf in [#13,#10] then Write(Output,iBuf);
end;
LongWordFinished: begin
oBuf:=''; State:=Reading;
if iBuf in [#13,#10] then Write(Output,iBuf);
end;
NoWordFound:begin
oBuf:='';
if iBuf in [#13,#10] then Write(Output,iBuf);
end;
end;
end;
close(Input);
close(Output);
end.
Предвижу ответ "Нам запрещают пользоваться конечными автоматами, потому что мы их еще не прошли!"
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Да это глум над убогими, чтоб им преподы неуд ставили за полное отсутствие мозга..
[syntax=Delphi] [/syntax]
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Нет, это глум над преподами, которые могут заявить, что это решение неправильное.
В условии задачи даже не сказано
- что является словом
- можно ли считать всё остальное за разделители
- что делать с разделителями идущими подряд
В условии задачи даже не сказано
- что является словом
- можно ли считать всё остальное за разделители
- что делать с разделителями идущими подряд