Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-=Domestos=-
Задача такая:
Вводится произвольный текст в строку. Вывести слова из строки, которые не повторяются. Под словом считать набор символов, разделенный от другого одним или несколькими пробелами.
Т.е. если строка "сын мама папа мама", вы вывести прога должна "сын" и "папа"...

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

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

Во-вторых, я говорил, что есть некоторые мелочи, которые надо исправить? Вот это, например:
...
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=-
Цитата
Во-первых, ты изменяешь параметр цикла внутри самого цикла, что нельзя делать - исправляй...

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

Прога работает почти правильно. Выводит только различные слова, НО если два одинаковых слова в строке рядом, то она почему-то выводит это слово... blink.gif
volvo
Цитата
притом эта часть работает корректно!
Да? У меня она даже не компилировалась, и тебе не советую "замалчивать ошибку". Читай доки, там однозначно сказано, что такие действия некорректны. Ссылку привести?


Цитата
НО если два одинаковых слова в строке рядом, то она почему-то выводит это слово...
Что я делаю не так?
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=-
Теперь идеально работает! Спасибо!
А с изменением параметра цикла - компилируется и работает smile.gif
мисс_граффити
от компилятора зависит...
но даже если пропускает - это неблагородно... лучше таким не заниматься.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.