Имеется файл, элементами которого являются отдельные слова. Если слово в файле начинается на букву 'k', то заменить ее на 'K'. Знаю, что для того чтобы заменить ВСЕ 'k' буквы в файле, программа будет выглядеть примерно так:
var f:fileof char;
s:char;
i:integer;
begin
assign (f, 'c:\a.txt');
reset (f);
while (not EoF) dobegin
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.
Nutcase
28.03.2006 0:33
Спасибо, буквы на экране меняются, но вот в файл почему-то не записываются...
klem4
28.03.2006 10:12
Работает говоришь безотказно ? Хм, а как ты мне объяснишь вот такую запись :
mas[i][j]
при таком описании
mas:array [1..max] ofstring;
Ну это уже так на сладкое, а вообще твоя программа не прошла ни один тест.
var
s : string;
w : array[1..100] ofstring;
i,j : byte;
begin
...
reset(f);
i := 0;
whilenot(eof(f)) dobegin
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 := 1to 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);
whilenot(eoF(f)) dobegin
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] ofstring;
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:=1to length(mas[i]) dobeginif (j=1) and (mas[ i ][j]='k') then mas[ i ][j]:='K'elseif (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 будет зависеть от настроек среды программирования/опций компилятора...
Так что, я бы порекомендовала Вам в следующий раз более внимательно тестировать приводимые программы, и, соответственно, тщательно выбирать выражения...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.