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

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

Форум «Всё о Паскале» _ Задачи _ Строки

Автор: Herotic 3.03.2010 21:27

Помогите пожалуйста разработать программу, которая считывает текст из файла и выводит на экран только предложения, в которых нет запятых и двоеточий. Спасибо большое.

Автор: Client 3.03.2010 21:45

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

Автор: Herotic 3.03.2010 22:08

Цитата(Client @ 3.03.2010 18:45) *

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


C файла читать умею, а вот с разбиением на предложением не знаю как быть.

Автор: volvo 3.03.2010 22:22

Предложения разделяются чем? В самом верху раздела FAQ есть прикрепленная тема - http://forum.pascal.net.ru/index.php?showtopic=6972 Там можешь посмотреть десяток способов, как разбить строку на слова. Но ведь точно таким же образом группа предложений разбивается на отдельные предложения (только заменить разделители. Для слов - это пробелы, точки, запятые, еще что там нужно; для предложений - точка, вопросительный и восклицательный знак. Можешь еще что-то добавить, неважно).

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

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

Автор: Herotic 4.03.2010 2:43

В общем попробовал сделать это все дело и вот что получилось:

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 4.03.2010 3: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;
Так попробуй, я не тестил

Автор: Herotic 4.03.2010 3:18

Цитата(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 4.03.2010 15:45

Добавил переменную, которая содержит в себе признак отсутсвия двоеточия или запятой