Форум «Всё о Паскале» _ Задачи _ Замена букв в файле.
Автор: Nutcase 23.03.2006 1:37
Имеется файл, элементами которого являются отдельные слова. Если слово в файле начинается на букву '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.
а вот что исправить, чтобы заменялось только если буква находится в начале слова? Спасибо.
Автор: APAL 23.03.2006 1:46
Не забываем про теги!
Цитата
а вот что исправить, чтобы заменялось только если буква находится в начале слова?
Ничего не исправлять, а написать заново. Пусть файл будет текстовым, тогда читать построчно. Как разложить строку на слова - читай в F.A.Q.
А вот мой вариант программы (работает безотказно-ПРОВЕРЯЛ ), правда может чуть не стандартный (писал быстро)
Код
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.
Спасибо, буквы на экране меняются, но вот в файл почему-то не записываются...
Автор: klem4 28.03.2006 10:12
Работает говоришь безотказно ? Хм, а как ты мне объяснишь вот такую запись :
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 28.03.2006 11:11
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 28.03.2006 11:22
А если во время заполнения резервного файла в твоем случае, на диске не окажется свободного места ? Ты об этом подумал ? придираться можно сколько угодно.
ps по поводу строки это я переусердствовал :
if s[1] = 'k' then s[1] := 'K'; w[i] := s;
Автор: GoodWind 28.03.2006 20:25
ладно, завершу флейм всего одной фразой: "объем жесткого диска, как правило, в сотни раз превышает объем ОЗУ"
Автор: klem4 28.03.2006 20:27
Я немного добавлю. Как правило для такой задачи тестовый файл в школе едвали превысит 20 слов.
Автор: APAL 28.03.2006 21:12
Цитата(klem4 @ 28.03.2006 7:12)
Работает говоришь безотказно ? Хм, а как ты мне объяснишь вот такую запись :
mas[ i ][j]
при таком описании
mas:array [1..max] of string;
mas[ i ][j] А что тебя смущает в такой записи? Идет обращение к j-ому символу в строке i
Автор: klem4 28.03.2006 21:20
Век живи, век учись ... никогда не видел чтобы так работали с массиовом строк.
У меня это вызвало подозрение .. Извиняюсь.
Автор: F.I.A.T. 29.03.2006 13:15
Цитата(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 будет зависеть от настроек среды программирования/опций компилятора...
Так что, я бы порекомендовала Вам в следующий раз более внимательно тестировать приводимые программы, и, соответственно, тщательно выбирать выражения...