IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача на строки, Подскажите алгоритм...
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Алексей

Репутация: -  0  +


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

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


Гость






Алгоритм рабочий (за исключением некоторых мелочей), показывай реализацию...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Алексей

Репутация: -  0  +


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

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.


Сообщение отредактировано: -=Domestos=- -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

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

 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Алексей

Репутация: -  0  +


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

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

Прога работает почти правильно. Выводит только различные слова, НО если два одинаковых слова в строке рядом, то она почему-то выводит это слово... blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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


Цитата
НО если два одинаковых слова в строке рядом, то она почему-то выводит это слово...
Что я делаю не так?
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"
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Алексей

Репутация: -  0  +


Теперь идеально работает! Спасибо!
А с изменением параметра цикла - компилируется и работает smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.11.2020 10:39
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name