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

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

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

Автор: -=Domestos=- 17.02.2007 22:08

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

Я делаю так - вводится текст, записывается в строку S, далее в цикле ищу слово, сохраняю его в Slovo, а оставшуюся строку сохраняю в S1. Проверяю, если pos(Slovo,S1)=0 - вывожу слово, иначе - новая итерация.
В результате выводится полнейший бред...
Помогите, пжлст! В понедельник надо показать задачу...

Автор: volvo 17.02.2007 22:12

Алгоритм рабочий (за исключением некоторых мелочей), показывай реализацию...

Автор: -=Domestos=- 17.02.2007 22:38

Вот текст проги:

program stroki;
uses CRT;
var S,S1,Slovo: string;
i,j,K: integer;
begin
clrscr;
write('Введите строку: ');
readln(S);
K:=length(S);
writeln;

{убираем лишние пробелы между слов}
for i:=1 to K do
begin
if (S[i]=' ') and (S[i+1]=' ') then
begin
delete(S,i+1,1);
dec(i);
end;
end;

writeln('Неповторяющиеся слова:');
writeln;
j:=1; {­номер начала нового слова}

for i:=1 to K do
begin
if S[i]=' ' then
begin
Slovo:=copy(S,j,i-j);
S1:=copy(S,i+1,K-i);
if pos(Slovo,S1)=0 then writeln(Slovo);
j:=i+1;
end;
end;
readkey;
end.

Автор: volvo 17.02.2007 22:47

Во-первых, ты изменяешь параметр цикла внутри самого цикла, что нельзя делать - исправляй...

Во-вторых, я говорил, что есть некоторые мелочи, которые надо исправить? Вот это, например:

...
if S[i]=' ' then
begin
Slovo:=copy(S,j,i-j);

{ S1:=copy(S,i+1,K-i); } { <--- Вместо этого - следующие 2 строки }
S1 := s;
Delete(s1, j, i - j);

if pos(Slovo,S1)=0 then writeln(Slovo);
j:=i+1;
end;
...


Автор: -=Domestos=- 18.02.2007 2:55

Цитата
Во-первых, ты изменяешь параметр цикла внутри самого цикла, что нельзя делать - исправляй...

Параметр цикла меняю только в части программы, которая удаляет лишние пробелы, притом эта часть работает корректно!

Прога работает почти правильно. Выводит только различные слова, НО если два одинаковых слова в строке рядом, то она почему-то выводит это слово... blink.gif

Автор: volvo 18.02.2007 3:11

Цитата
притом эта часть работает корректно!
Да? У меня она даже не компилировалась, и тебе не советую "замалчивать ошибку". Читай доки, там однозначно сказано, что такие действия некорректны. Ссылку привести?


Цитата
НО если два одинаковых слова в строке рядом, то она почему-то выводит это слово...
Что я делаю не так?
var
S, S1, Slovo: string;
i,j,K: integer;
begin
s := 'son mother mother father';
K := length(S);
writeln;

{ Это я не изменял, просто закомментировал для теста }
for i:=1 to K do begin
if (S[i]=' ') and (S[i+1]=' ') then begin
delete(S,i+1,1);
dec(i);
end;
end;

s := s + ' ';
writeln('Неповторяющиеся слова:');
writeln;
j:=1;

for i:=1 to K do begin
if S[i]=' ' then begin
Slovo:=copy(S,j,i-j);
S1 := s;
delete(s1, j, i - j);
if pos(Slovo,S1)=0 then writeln(Slovo);
j:=i+1;
end;
end;
readln;
end.
В результате - "son father"

Автор: -=Domestos=- 18.02.2007 15:42

Теперь идеально работает! Спасибо!
А с изменением параметра цикла - компилируется и работает smile.gif

Автор: мисс_граффити 18.02.2007 18:55

от компилятора зависит...
но даже если пропускает - это неблагородно... лучше таким не заниматься.