1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Имеется файл, элементами которого являются отдельные слова. Если слово в файле начинается на букву '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.
а вот что исправить, чтобы заменялось только если буква находится в начале слова? Спасибо.
а вот что исправить, чтобы заменялось только если буква находится в начале слова?
Ничего не исправлять, а написать заново. Пусть файл будет текстовым, тогда читать построчно. Как разложить строку на слова - читай в F.A.Q.
--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно. -------------------- Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно. -------------------- Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
А вот мой вариант программы (работает безотказно-ПРОВЕРЯЛ ), правда может чуть не стандартный (писал быстро)
Код
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.
Работает говоришь безотказно ? Хм, а как ты мне объяснишь вот такую запись :
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.
Сообщение отредактировано: volvo -
--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
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;
Сообщение отредактировано: volvo -
--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
А если во время заполнения резервного файла в твоем случае, на диске не окажется свободного места ? Ты об этом подумал ? придираться можно сколько угодно.
ps по поводу строки это я переусердствовал :
if s[1] = 'k' then s[1] := 'K'; w[i] := s;
Сообщение отредактировано: volvo -
--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
Работает говоришь безотказно ? Хм, а как ты мне объяснишь вот такую запись :
mas[ i ][j]
при таком описании
mas:array [1..max] of string;
mas[ i ][j] А что тебя смущает в такой записи? Идет обращение к j-ому символу в строке i
--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно. -------------------- Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
А вот мой вариант программы (работает безотказно-ПРОВЕРЯЛ
Уважаемый 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 будет зависеть от настроек среды программирования/опций компилятора...
Так что, я бы порекомендовала Вам в следующий раз более внимательно тестировать приводимые программы, и, соответственно, тщательно выбирать выражения...