IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Текстовые файлы, Нужна помощь с алгоритмом
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской
Реальное имя: Владимир

Репутация: -  0  +


Задача:''Дан текстовый файл f. Записать в файл g с сохоанением порядка следования те символы файла f которым в этом файле предшествует буква b ''. Алгоритм нормальный придумать немогу.Ведь для текстовых файлов не действует процедура SEEK..Написал только для одной буквы.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var f,g:textfile;
    i,j,k:integer;
    ch:char;
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.SaveToFile('c:\f.txt');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
memo2.Lines.LoadFromFile('c:\g.txt');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
k:=0;
AssignFile(f,'c:\f.txt');
AssignFile(g,'c:\g.txt');
reset(f);
rewrite(g);
While not EOF(f) do begin
read(f,ch);
inc(k);
if ch='b' then begin
reset(f);
while i<>k do begin
inc(i);
read(f,ch);
if i=k-1 then write(g,ch);
end;
end;
end;
CloseFile(f);
CloseFile(g);
end;

end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Нужно сохранять предыдущий считанный символ в отдельной переменной, и если текущий ="b", то записать его в файл.

repeat
Read (f,b);
if b='b' then write (g, p);
p:=b;
until eof(f);

правда, символ 'b' может оказаться первым, эту ситуацию тоже можно предусмотреть.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской
Реальное имя: Владимир

Репутация: -  0  +


Malice спасибо тебе...А если мы будем читать не символы а строки т.е.
Код
procedure TForm1.Button2Click(Sender: TObject);
begin
k:=0;
AssignFile(f,'c:\f.txt');
AssignFile(g,'c:\g.txt');
reset(f);
rewrite(g);
While not EOF(f) do begin
readln(f,s);
for i:=1 to length(s) do begin
if (s[i]='b') and (i<>1) then write(g,s[i-1]);
end;
end;
CloseFile(f);
CloseFile(g);
end;

Так можно???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Rudolf,
а если файл будет таким:
Цитата(Пример)
aaaabaa<Enter>
baaaaacb
?
Выделенному символу не предшествует 'a' или символ переноса строки? Если "нет", то твое решение подойдет, а если "да", то ты уже потеряешь некоторые символы...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской
Реальное имя: Владимир

Репутация: -  0  +


А можете подсказать какие условия надо наложить чтобы избежать потери символов??Я попробовал но не совсем работает...
Код

procedure TForm1.Button2Click(Sender: TObject);
begin
k:=0;
AssignFile(f,'c:\f.txt');
AssignFile(g,'c:\g.txt');
reset(f);
rewrite(g);
While not EOF(f) do begin
inc(k);
readln(f,s);
for i:=1 to length(s) do begin
if i=length(s) then ch:=s[i];
if (s[i]='b') and (k<>1) and (i=1) then write(g,ch);
if (s[i]='b') and (i<>1) then write(g,s[i-1]);
end;
end;
CloseFile(f);
CloseFile(g);
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






procedure TForm1.Button2Click(Sender: TObject);
begin
ch := #0;
AssignFile(f,'f1.txt'); reset(f);
AssignFile(g,'g1.txt'); rewrite(g);

While not EOF(f) do begin
readln(f, s);
if (ch <> #0) and (s[1] = 'b') then write(g, ch);
ch := s[length(s)];

for i := 2 to length(s) do begin
if s[i] = 'b' then write(g, s[i - 1]);
end;
end;
CloseFile(f);
CloseFile(g);
end.

Пойдет?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской
Реальное имя: Владимир

Репутация: -  0  +


Да, пойдет good.gif Спасибо большое...но только наверное понадобится еще одно условие в случае когда у нас подряд идет два 'b'... ну это я еще посмотрю..Спасибо еще раз.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата(Rudolf @ 17.05.2006 20:02)
только наверное понадобится еще одно условие в случае когда у нас подряд идет два 'b'...
no1.gif Никаких дополнительных условий не понадобится... Все, что нужно уже есть... Теперь любая комбинация должна обрабатываться. Двойной 'b' я проверял, кстати smile.gif ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской
Реальное имя: Владимир

Репутация: -  0  +


Тогда еще бо'льшее СПАСИБО smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Цитата(Rudolf @ 17.05.2006 8:16) *

Задача:''Дан текстовый файл f. Записать в файл g с сохоанением порядка следования те символы файла f которым в этом файле предшествует буква b ''.

обратите внимание: не которые предшествуют b, а которым.
то есть для комбинации abc это будет с.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(мисс_граффити @ 20.05.2006 16:56) *

обратите внимание: не которые предшествуют b, а которым.
то есть для комбинации abc это будет с.

smile.gif Точно, блин. Тогда, конечно, все еще проще, но вся работа на смарку.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 17:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name