Консультация онлайн # 161105

Раздел: Pascal / Delphi / Lazarus
Автор вопроса: Комаров Антон Сергеевич
Дата: 22.02.2009, 09:29 Консультация неактивна
Поступило ответов: 0
здравствуйте! Создать текстовый файл в любом текстовом редакторе. Выполнить его обработку по указанному в варианте заданию.
вот мой вариант: Написать программу, которая заменяет одно слово текста на другое. Оба слова вводятся с клавиатуры.
Ниже приведен листинг! учитель сказал разобраться с ассигнами. что неправильно?

P.S. на "begin SetWindowCaption('Работа с файлами Автор: Антон Комаров,ИСТ-1-08');" не обращайте внимания-делал в паскаль ABC.
Приложение:
Последнее редактирование 23.02.2009, 09:35 Лысков Игорь Витальевич (Советник)
Вопрос перенесен

Ответов еще не поступило.

Мини-форум консультации # 161105

Вадим Исаев ака sir Henry

Мастер-Эксперт

ID: 425

177418

= общий =    23.02.2009, 10:00
Assign - назначает переменной файлового типа какое-то имя файла. Все файловые операции в программе идут именно посредством этих переменных.
А теперь смотрите, что Вы пишете:

assign(g,'WOW.doc');
reset(f);


Вы назначили переменной "g" имя файла "wow.doc" и открываете файл переменной "f". А где имя файла назначенное этой переменной? Оно чёрте где и искать его надо с фонарями. Присваивайте имя файла файловой переменной именно там, где Вы с этим файлом работаете, чтобы Ваша программа была понятной и не надо было бы рыскать по всему тексту пытаясь найти что бы означало то или иное выражение.
=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
неизвестный

177424

= общий =    23.02.2009, 10:23
Сэр Анри, так ведь у нас f связана с S которую мы вводим с клавиатуры
Вадим Исаев ака sir Henry

Мастер-Эксперт

ID: 425

177427

= общий =    23.02.2009, 10:43
Попробуйте ещё раз прочитать то, что я Вам написал. Если уж тогда не поймёте, то я и не знаю...
=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
неизвестный

177525

= общий =    23.02.2009, 21:03
уже лучше! он старый файл удаляет,а в новом пишет тот же текст что и в старом! как заменить одно слово на другое?

Program CHANGE_WORD;
uses crt,graphABC;
var f,g:text;
s,s1,s2:string;

Procedure CHANGE(c1,c2:string);
var c:string;
begin
assign(f,'C:\Documents and Settings\Пользователь\Рабочий стол\WOW.txt');
assign(g,'C:\Documents and Settings\Пользователь\Рабочий стол\LOGO.txt');
reset(f);
rewrite(g);
while not eof(f) do begin
while not eoln(f) do
begin
read(f,c);
if c=c1 then c:=c2;
write(g,c);
end;
readln(f); writeln(g);
end;
close(f); close(g);
erase(f);
end;

begin
write('Первое слово: '); readln(s1);
write('Второе слово: '); readln(s2);
CHANGE(s1,s2);
readkey;
end.
Вадим Исаев ака sir Henry

Мастер-Эксперт

ID: 425

177575

= общий =    24.02.2009, 09:35
Вот смотрите. Вы читаете построчно исходный файл, пока не достигнут конец файла и в прочитанной строке ищете, с помощью функции Pos() первое слово. Если оно найдено, то с помощью процедуры Delete удаляете из строки символы, начиная с найденой позиции (которую Вам даёт функция Pos() ) количество символов как длина первого слова. После этого вставляете втрое слово в строку с помощью процедуры Insert(). Все строки без исключения, и изменённые и неизменённые, записываете во второй файл. Сможете реализовать этот алгоритм?
У Вас там почти уже всё что надо, только добавьте то, что я Вам сказал и удалите те строки кода, которые не вписываются в алгоритм.
=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
неизвестный

177663

= общий =    24.02.2009, 19:46
Смотрите я немножко подругому поступил я в процедуру влепил выделение слова из строки! но почему то во второй файл тот же самый текст добавляется! без преобразований!!

Program CHANGE_WORD;
uses crt,graphABC;
var f,g:text;
s1,s2:string;

Procedure CHANGE(c1,c2:string);
var c,st:string; n,l,r:integer;
begin
assign(f,'C:\Documents and Settings\Пользователь\Рабочий стол\WOW.txt');
assign(g,'C:\Documents and Settings\Пользователь\Рабочий стол\LOGO.txt');
reset(f);
rewrite(g);
while not eof(f) do begin
while not eoln(f) do
begin
read(f,c);
n:=length(c); { длина строки }
l := 1;
r := 1;
WHILE r<=n DO BEGIN
WHILE (c[l]=' ') and (l<=n) DO l:=l+1; { поиск начала слова }
r := l;
WHILE (c[r+1]<>' ') and (r+1<=n) DO r:=r+1; { поиск конца слова }
st := copy(c,l,r-l+1); { выделяем слово из строки }
l := r+1;
IF st = c1 THEN st:=c2; { Заменяем }
END;
write(g,c);
end;
readln(f); writeln(g);
end;
close(f); close(g);
erase(f);
end;

begin SetWindowCaption('Работа с файлами Автор: Антон Комаров,ИСТ-1-08');
write('первое слово: '); readln(s1);
write('второе слово: '); readln(s2);
CHANGE(s1,s2);
readkey;
end.
Вадим Исаев ака sir Henry

Мастер-Эксперт

ID: 425

177726

= общий =    25.02.2009, 08:46
Комаров Антон Сергеевич
Вот это совершенно лишнее:
Код
while not eoln(f) do

Конструкция
readLn(f,c);
Будет прекрасно читать целую строку файла, от начала и до конца.
К сожалению дальше я ничего не понял. smile Однако вот эта конструкция:
Код
write(g,c);

однозначно говорит о том, что Вы во второй файл записываете именно ту строку, которая была в первом.
Вот вариант с применением функции Pos():
Код
While not Eof(f) Do
Begin
  ReadLn(f, c);
  n:=-1;
  While n<>0 Do
  Begin
     n:=Pos(s1, c);
     If n>0 Then
     Begin
        Delete(c, n, Length(s1));
        Insert(s2, c, n);
     End;
  WriteLn(g, c);
  End;
End;
=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
неизвестный

177797

= общий =    25.02.2009, 16:24
спасибо!!
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.