Помощь - Поиск - Пользователи - Календарь
Полная версия: Строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Herotic
Помогите пожалуйста разработать программу, которая считывает текст из файла и выводит на экран только предложения, в которых нет запятых и двоеточий. Спасибо большое.
Client
С файла читать умеешь? На предложения разбить можешь?
Herotic
Цитата(Client @ 3.03.2010 18:45) *

С файла читать умеешь? На предложения разбить можешь?


C файла читать умею, а вот с разбиением на предложением не знаю как быть.
volvo
Предложения разделяются чем? В самом верху раздела FAQ есть прикрепленная тема - Разбиение на слова. Все способы. Там можешь посмотреть десяток способов, как разбить строку на слова. Но ведь точно таким же образом группа предложений разбивается на отдельные предложения (только заменить разделители. Для слов - это пробелы, точки, запятые, еще что там нужно; для предложений - точка, вопросительный и восклицательный знак. Можешь еще что-то добавить, неважно).

Итого - алгоритм: либо читаешь все содержимое файла в одну строку, и потом прогоняешь функцию разбивки (вряд ли получится, скорее всего длина файла больше 255 символов, так что не пойдет. Но если меньше - вполне), либо читаешь из файла посимвольно (и собираешь символы в строку), пока не прочел точку или вопрос. знак, или воскл. знак, или перевод строки.

Когда прочел окончание предложения ( .?! ) - смотришь строку. Есть символы ( ,: ) - ничего не делать. Нет - вывести строку на печать.
Herotic
В общем попробовал сделать это все дело и вот что получилось:

Program File_text;
Uses CRT;
var
f1 : text;
st : string;
n: byte;
i:integer;
ka:integer;
begin
ClrScr;
assign (f1, 'file1.txt');
rewrite (f1);
writeln ( f1, 'Tolko ety stroky dolshno vivesty. v etoi stroke nety zapyatih i dvoetochiy');
writeln ( f1, 'I ety toje parampampam');
writeln ( f1, 'sdfsdfsdf,');
writeln ( f1, 'sdfsdf:');
writeln ( f1, 'sdfsdfd:,');
close (f1);
reset (f1);
while not eof (f1) do
begin
readln (f1, st);
for i:= 1 to length(st) do
begin
if (st[i] =':') OR (st[i] =',') then
writeln(st);
end;
end;
close (f1);
readln
end .


Сейчас программа выводит строки где есть символы двоеточия и запятой. А вот если я пытаюсь сделать "не равно" то выводит лабуду. Подскажите пожалуйста, как правильно сделать, чтобы оно работало?
Client
добавить переменную - флаг
while not eof (f1) do 
begin
readln (f1, st);
flag:=true;
i:=1;
while (i<=length(st)) and (flag) do
begin
if (st[i] =':') OR (st[i] =',') then flag:=false;
inc(i);
end;
if flag then writeln(st);
end;
Так попробуй, я не тестил
Herotic
Цитата(Client @ 4.03.2010 0:16) *

добавить переменную - флаг
while not eof (f1) do 
begin
readln (f1, st);
flag:=true;
i:=1;
while (i<=length(st)) and (flag) do
begin
if (st[i] =':') OR (st[i] =',') then flag:=false;
inc(i);
end;
if flag then writeln(st);
end;
Так попробуй, я не тестил


Спасибо большое, все работает. Расскажи пожалуйста, что ты сделал, если тебе не составит труда. Спасибо.
Client
Добавил переменную, которая содержит в себе признак отсутсвия двоеточия или запятой
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.