Работа с текстовым файлом и строками в нем
Модератор: Модераторы
Работа с текстовым файлом и строками в нем
Помогите пожалуйста. В текстовом файле хранятся строки, состоящие из слов, разделенных одним или несколькими пробелами. Удалить в текущей строке те слова, которые начинаются и заканчиваются на одну и ту же букву, и записать преобразованные строки в новый файл.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Стандартная функция фрипаскаля SplitString (модуль strutils)- https://www.freepascal.org/docs-html/rt ... tring.html указать в качестве разделителя пробел и получить набор слов в массиве. Потом пройтись в цикле по этому массиву и сравнивать первый и последний символ каждого строкового элемента. Вуаля!
Поколение Z избегает циклов, это прошлый век, они только усложняют логику кода.Снег Север писал(а): Потом пройтись в цикле по этому массиву и сравнивать первый и последний символ каждого строкового элемента.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Поколение "Zа победу" - это я. А то, о чём вы написали - это поколение Ж.iskander писал(а):Поколение Z избегает циклов,
Sonora писал(а):В текстовом файле хранятся строки, состоящие из слов, разделенных одним или несколькими пробелами. Удалить в текущей строке те слова, которые начинаются и заканчиваются на одну и ту же букву, и записать преобразованные строки в новый файл.
Код: Выделить всё
function removeWords(inp: string): string;
var
s: string;
sb : string;
ln : longint;
i,j : longint;
begin
s := '';
j := 1;
for i:=1 to length(inp) do
begin
if inp[i] = ' ' then begin
sb := Copy(inp, j, i-j);
ln := length(sb);
if (sb<>'') and (sb[1]<>sb[ln]) then
s:=s+sb;
s:=s+' ';
j := i+1;
end;
end;
i:=length(inp)+1;
sb := Copy(inp, j, i-j);
ln := length(sb);
if (sb<>'') and (sb[1]<>sb[ln]) then
s:=s+sb;
removeWords := s;
end;
var
f, fout: text;
s: string;
begin
assign(f, 'input.txt');
assign(fout, 'output.txt');
reset(f);
rewrite(fout);
while not eof(f) do begin
readln(f, s);
s := removeWords(s);
writeln(fout, s);
end;
close(f);
close(fout);
end.Снег Север Предложил более развитое решение.
Ваши решения работают, но, судя по условиям, это классическая задача на машину состояний и решается буфером и посимвольным чтение, иначе бы в условиях не было бы текстового файла.
Так как объектом анализа/действия является слово (а никак не символ, слово анализируется по критериям первая/последняя - кстати, БУКВА, нифига не символ), то работать нужно со словами, анализируя первую/последнюю буквы.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
RRYTY, любая буква - это символ. Ваш Кэп.
Снег Север, не любой символ - буква. По условиям задачи требуется сравнивать не первый/последний символ, а букву. Есть такой грешок, стремление ТЗ воспринимать буквально.любая буква - это символ
Но, на практике, будет работать и при анализе первого/последнего байта, т.е. - символа.
Даже с учётом того, что слова на русском языке в кодировке UTF-8/16?RRYTY писал(а):Но, на практике, будет работать и при анализе первого/последнего байта, т.е. - символа.
Проверил, в локали ru_RU.utf8, нет разных букв с одинаковым последним байтом. Нанайцы пусть проверяют самостоятельно. Вряд ли автор ветки - нанаец. Но, возможно из-за СВО, выполняет некий стратегический нанайский заказ.
Спасибо вам всем большое за помощь!!
Вот почему я иногда читаю срачи - и тут можно выудить полезную для себя инфу. Вроде давно в Паскале, а про SplitString не знал 
