Помощь - Поиск - Пользователи - Календарь
Полная версия: Замена букв в файле.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Nutcase
Имеется файл, элементами которого являются отдельные слова. Если слово в файле начинается на букву 'k', то заменить ее на 'K'.
Знаю, что для того чтобы заменить ВСЕ 'k' буквы в файле, программа будет выглядеть примерно так:
var f:file of char;
s:char;
i:integer;
begin
assign (f, 'c:\a.txt');
reset (f);
while (not EoF) do
begin
read (f,s);
if (s='k') then s:='K';
seek(f, filepos(f)-1);
write(f,s);
end;
close(f);
end.


а вот что исправить, чтобы заменялось только если буква находится в начале слова? unsure.gif
Спасибо.
APAL
Не забываем про теги!

Цитата
а вот что исправить, чтобы заменялось только если буква находится в начале слова?

Ничего не исправлять, а написать заново. Пусть файл будет текстовым, тогда читать построчно. Как разложить строку на слова - читай в F.A.Q.
Гость
Смотрел faq, не нашел.
Помогите!
APAL
Цитата(Гость @ 22.03.2006 23:26) *

Смотрел faq, не нашел.


НЕ ВЕРЮ!

http://forum.pascal.net.ru/index.php?s=&sh...indpost&p=28059
TR@N
Цитата(APAL @ 23.03.2006 0:31) *


А вот мой вариант программы (работает безотказно-ПРОВЕРЯЛ good.gif ),
правда может чуть не стандартный (писал быстро)

Код

program bukva_k;
uses crt;
const max=20;
var f        :text;
    str      :string;
    i,j,i_max:integer;
    mas:array [1..max] of string;
begin
   assign (f, 'c:\a.txt');
   reset (f);
   i:=1;
   while (not EOF(f)) do
      begin
     readln (f,mas[i]);
     for j:=1 to length(mas[i]) do
        begin
           if (j=1) and (mas[i][j]='k') then mas[i][j]:='K'
           else if (mas[i][j]=' ') and (mas[i][j+1]='k') then mas[i][j+1]:='K';
        end;
      i_max:=i;
      i:=i+1;
      end;
   for i:=1 to i_max do writeln(mas[i]);
   close(f);
end.
Nutcase
Спасибо, буквы на экране меняются, но вот в файл почему-то не записываются... nea.gif
klem4
Работает говоришь безотказно ? Хм, а как ты мне объяснишь вот такую запись :

mas[i][j]


при таком описании

mas:array [1..max] of string;


Ну это уже так на сладкое, а вообще твоя программа не прошла ни один тест.

var
s : string;
w : array[1..100] of string;
i,j : byte;

begin
...
reset(f);
i := 0;
while not(eof(f)) do begin
readln(f, s);
inc(i);
if (s[1] in ['k','K']) then w[i] := s[1] else w[i] := s;
end;
rewrite(f);
for j := 1 to i do writeln(f, w[j]);
close(f);
end.
GoodWind
klem4, а если в файле больше 100 слов ?
да и память экономить стОит...

var
s:string;

begin
reset(f);
rewrite(f1);
while not(eoF(f)) do
begin
readln(f, s);
if s[1] ='k' then s [1] := 'K';
write(f1,s);
end;
close(f);
close(f1);
erase(f);
rename(f1, {имя оригинального файла)};
end.


да и этой конструкции я не понял:
if (s[1] in ['k','K']) then w[i] := s[1] else w[i] := s;
klem4
А если во время заполнения резервного файла в твоем случае, на диске не окажется свободного места ? Ты об этом подумал ? придираться можно сколько угодно.

ps по поводу строки это я переусердствовал :
if s[1] = 'k' then s[1] := 'K'; w[i] := s;
GoodWind
ладно, завершу флейм всего одной фразой:
"объем жесткого диска, как правило, в сотни раз превышает объем ОЗУ"
klem4
Я немного добавлю.
Как правило для такой задачи тестовый файл в школе едвали превысит 20 слов.
APAL
Цитата(klem4 @ 28.03.2006 7:12) *

Работает говоришь безотказно ? Хм, а как ты мне объяснишь вот такую запись :

mas[ i ][j]


при таком описании

mas:array [1..max] of string;


mas[ i ][j]
А что тебя смущает в такой записи?
Идет обращение к j-ому символу в строке i
klem4
Век живи, век учись ... никогда не видел чтобы так работали с массиовом строк. rolleyes.gif

У меня это вызвало подозрение .. Извиняюсь.
F.I.A.T.
Цитата(TR@N @ 23.03.2006 0:41)
А вот мой вариант программы (работает безотказно-ПРОВЕРЯЛ
Уважаемый TR@N! Вот это ваше заявление вызывает по меньшей мере 2 вопроса: если (как Вы утверждаете, что еще не доказано, об этом поговорим чуть позже), Ваш вариант работает безотказно, то стало быть, по-Вашему, вариант из FAQ работает с ошибками? Очень опрометчиво... Я видела, КАК тестируются те программы, которые приводятся в FAQ-е, не Вам искать в них ошибки. Объясняю - почему:

Цитата(TR@N @ 23.03.2006 0:41)
readln (f,mas[ i ]);
for j:=1 to length(mas[i]) do begin
if (j=1) and (mas[ i ][j]='k') then mas[ i ][j]:='K'
else if (mas[ i ][j]=' ') and (mas[ i ][j+1]='k') then mas[ i ][j+1]:='K';
end;

А скажите-ка мне, уважаемый, ЧТО произойдет, если последний (J) символ строки будет равен пробелу? Не приведет ли это:
mas[ i ][j+1]='k'
к попытке читать символ ЗА концом строки, и соответственно, к результату, которому нельзя верить? FPC, напрмер, на это моментально выдаст Segmentation Fault, результат работы в TP/BP будет зависеть от настроек среды программирования/опций компилятора...

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