создать текстовый файл

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
oportuno
Сообщения: 1
Зарегистрирован: 18 окт 2013, 00:47

18 окт 2013, 00:48

Дан текстовый файл F. Удалить из файла слова длиннее 5 символов, результат записать в файл G.

Через turbopascal
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

18 окт 2013, 04:10

Решение с применением конечного автомата

Код: Выделить всё

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.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

18 окт 2013, 21:13

Предвижу ответ "Нам запрещают пользоваться конечными автоматами, потому что мы их еще не прошли!"
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

18 окт 2013, 21:39

Да это глум над убогими, чтоб им преподы неуд ставили за полное отсутствие мозга..
[syntax=Delphi] [/syntax]
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

19 окт 2013, 07:38

Нет, это глум над преподами, которые могут заявить, что это решение неправильное.
В условии задачи даже не сказано
- что является словом
- можно ли считать всё остальное за разделители
- что делать с разделителями идущими подряд
Ответить