Инвертирование слов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Инвертирование слов

Сообщение Trasebit » 16.12.2013 18:39:48

asd
Последний раз редактировалось Trasebit 20.03.2015 22:03:44, всего редактировалось 1 раз.
Trasebit
незнакомец
 
Сообщения: 2
Зарегистрирован: 16.12.2013 18:05:33

Re: Инвертирование слов

Сообщение Лекс Айрин » 16.12.2013 22:19:20

Код: Выделить всё
for j:=x to length(a) do

странноватое, имхо, условие.

бы сделал примерно по такому алгоритму.
Код: Выделить всё
Взять строку-источник.... пока не конец строки проверяем условие (пробел или нет)
        если нет, то берем первый символ и записываем его в буферную строку первым символом
        Если да, то записываем буферную строку в строку-приемник и добавляем пробел. очищаем буфер
конец цикла
записать строку в файл


куча циклов for заменена одним while
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Инвертирование слов

Сообщение Paster Fob » 16.12.2013 22:27:47

Код: Выделить всё
const
  sf=[' ','.',',','!','?','-'];

procedure ReadFile(var af:text;var st:string);
var
  sc:string;
  ch:char;
begin
  sc:='';
  repeat
    read(af,ch);
    if not(ch in sf) then
        sc:=ch+sc
    else begin
      sc:=sc+ch;
      st:=st+sc;
      sc:='';
    end;
  until eof(af);
end;

var
  f:text;
  s:string;

begin
  Assign(f,'C:\Files for Program Pascal\files\Testin.txt');
  reset(f);
  s:='';
  ReadFile(f,s);
  close(f);
  Assign(f,'C:\Files for Program Pascal\files\Testout.txt');
  rewrite(f);
  write(f,s);
  Close(f);
  writeln('Готово!');
  readln;
end.


Зачем заморачиваться с массивом,можно проще сделать.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Инвертирование слов

Сообщение Лекс Айрин » 16.12.2013 22:36:08

Paster Fob
Я бы все же сделал предусловие -- могут подсунуть и пустой файл. Тогда прога вылетит с ошибкой.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Инвертирование слов

Сообщение bormant » 16.12.2013 23:58:04

Код: Выделить всё
procedure Rev(b, e: integer; var s: string);
var t: char;
begin
  while b<e do begin
    t:=s[b]; s[b]:=s[e]; s[e]:=t;
    inc(b); dec(e);
  end;
end;
const
  blanks = [#0..#127]-['0'..'9','A'..'Z','a'..'z'];
var
  fi, fo: Text;
  s: string;
  i, j: integer;
begin
  Assign(fi,'in.txt'); Assign(fo,'out.txt');
  Reset(fi); Rewrite(fo);
  while not EOF(fi) do begin
    ReadLn(fi,s);
    i:=Length(s);
    while i>0 do begin
      while (s[i] in blanks) and (i>0) do dec(i);
      j:=i; while not (s[i] in blanks) and (i>0) do dec(i);
      Rev(i+1,j,s);
    end;
    WriteLn(fo,s);
  end;
  Close(fi); Close(fo);
end.


Добавлено спустя 7 часов 54 минуты 57 секунд:
Или ещё проще:
Код: Выделить всё
const
  blanks = [#0..#127]-['0'..'9','A'..'Z','a'..'z'];
var
  fi, fo: Text;
  bi, bo: array [0..1024*4-1] of byte; {*}
  s: string;
  c: char;
begin
  Assign(fi,'in.txt'); Assign(fo,'out.txt');
  Reset(fi); Rewrite(fo);
  SetTextBuf(fi,bi,sizeof(bi)); SetTextBuf(fo,bo,sizeof(bo)); {*}
  s:='';
  while not EOF(fi) do begin
    Read(fi,c);
    if c in blanks then begin
      Write(fo,s,c); s:='';
    end else s:=c+s;
  end;
  Write(fo,s);
  Close(fi); Close(fo);
end.
Строки, помеченные {*} можно убрать, их назначение -- повысить скорость обработки больших файлов за счёт буферизации ввода/вывода.
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Re: Инвертирование слов

Сообщение Trasebit » 17.12.2013 21:02:29

qqw
Последний раз редактировалось Trasebit 20.03.2015 22:04:06, всего редактировалось 1 раз.
Trasebit
незнакомец
 
Сообщения: 2
Зарегистрирован: 16.12.2013 18:05:33

Re: Инвертирование слов

Сообщение Лекс Айрин » 17.12.2013 21:40:10

Trasebit писал(а):начала пытался реализовать способ форумчанина с ником Лекс Айрин, но что-то у меня с синтаксисом не срослось, а потом постоянно вылетало несоответствие типов.


Вообще-то мой алгоритм здесь уже превратили в программу... пример bormant вариант 2 тождественен алгоритму.. Только он использует прямую работу с файлами. Впрочем, с учетом буферизации один в один. Да и выбранный Вами отличается только нюансами.

Не понимаю как может быть несоответствие типов, если тут везде используются только строки?

Trasebit писал(а):Кстати, если запустить код, а файл пуст, то ошибки нет. В этом случае единственным результатом программы будет создание пустого файла.

а она почти наверняка вылезла, но была подавлена стандартной процедурой обработки ошибок. Для проверки просто запретите директивами
обработку ошибок для операций ввода-вывода и прогоните прогу еще раз.
Trasebit писал(а):Это условие нужно ,чтобы цикл продолжался с начала следующего слова.

Слишком сложно.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Инвертирование слов

Сообщение SSerge » 18.12.2013 09:42:06

А вот теперь акт изощренного издевательства: компилируем работающую программу под linux с текущей локалью UTF8, и долго думаем, почему алгоритм внезапно перестал работать :lol:
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Инвертирование слов

Сообщение Лекс Айрин » 18.12.2013 10:57:46

SSerge, а тут и думать нечего... все придумано за нас :) Для UTF8 нужно пользоваться своими функциями.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru