Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Замена букв в файле.

Автор: 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.


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

Автор: APAL 23.03.2006 1:46

Не забываем про теги!

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

Ничего не исправлять, а написать заново. Пусть файл будет текстовым, тогда читать построчно. Как разложить строку на слова - читай в F.A.Q.

Автор: Гость 23.03.2006 3:26

Смотрел faq, не нашел.
Помогите!

Автор: APAL 23.03.2006 4:31

Цитата(Гость @ 22.03.2006 23:26) *

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


НЕ ВЕРЮ!

http://forum.pascal.net.ru/index.php?s=&showtopic=2361&view=findpost&p=28059

Автор: TR@N 23.03.2006 4:41

Цитата(APAL @ 23.03.2006 0:31) *

НЕ ВЕРЮ!

http://forum.pascal.net.ru/index.php?s=&showtopic=2361&view=findpost&p=28059


А вот мой вариант программы (работает безотказно-ПРОВЕРЯЛ 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.



Прикрепленные файлы
Прикрепленный файл  FORUM.PAS ( 564 байт ) Кол-во скачиваний: 255

Автор: Nutcase 28.03.2006 0:33

Спасибо, буквы на экране меняются, но вот в файл почему-то не записываются... nea.gif

Автор: 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

Век живи, век учись ... никогда не видел чтобы так работали с массиовом строк. rolleyes.gif

У меня это вызвало подозрение .. Извиняюсь.

Автор: 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 будет зависеть от настроек среды программирования/опций компилятора...

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