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

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

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

 
 Ответить  Открыть новую тему 
> Исправить исхондник, Задача на множества
сообщение
Сообщение #1


Новичок
*

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

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


Задача
Пусть дан текст (т.е. мы его вводим сами), заканчивающийся точкой. Текст состоит из слов, разделённых пробелами. Слово - последовательность латинских букв. Напечатайте слова текста, имеющие нечетный номер, в которых нет ни одной повторяющейся буквы.

Вот решение задачи, но в процедуре find есть ошибка (т.е она работает неправильно).
Код

const n_max=1000; {макс длина текста}
      eot='.';
type litters = set of 'a'..'z'; {тип множества лат букв}
var txt:array [1..n_max] of char; {текст}
    n:integer;

{процедура ввода текста}
procedure read_text;
var i:integer;
begin
  Writeln ('Введите текст: ');
  i:=0;
    repeat
      repeat //два репида, эт чтоб вводить построчно
        i:=i+1;
          read(txt[i]);
      until eoln or (i=n_max) or (txt[i]=eot);
      readln;
    until (i=n_max) or (txt[i]=eot);
  if txt[i]=eot then n:=i-1
  else n:=i;
end;

{процедура поиска нужных слов}
procedure find;
var  j,i:integer; s:string; m:litters; f:boolean;
begin
  i:=1; j:=1;
  repeat
    s:=''; m:=[]; f:=false;
    repeat
      f:=txt[j] in m;
      m:=m+[txt[j]]; s:=s+txt[j];              
      j:=j+1;
    until (txt[j]=' ') or f or (txt[j]='.');  
      if not f and odd(i) then write(s);
      i:=i+1;
  until txt[i]='.';

end;
begin {main}
  read_text;
  find;
  readln;
end.


Из цикла не правильно выходит (он конеш работает, но только, когда во всех словах буквы не повторяются). Переделайте пожалуйста...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Пионер
**

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

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


Цитата(*alt @ 23.05.2007 22:58) *


Код


      if not f and odd(i) then write(s);






я так полагаю, этот кусок печатает слово, если оно прошло проверку!
но согласно твоему тексту прораммы переменная f не может принимать значения тру, т.е. проверка
только на четность у тебя.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Цитата
согласно твоему тексту прораммы переменная f не может принимать значения тру
Это почему еще?

А здесь:
Цитата
f:=txt[j] in m;
?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

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

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


да точно.

сказывается поражение ливерпуля((
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

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

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


ввел: 'nikita'

как просматривает до второй 'i' (т.е. s = 'niki'), строка s сбрасывается, счетчик слов i плюсуется, а
просмотр продолжается-то у тебя с буквы 't', а не со следующего слова...

посмотри:

разбиение на слова
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






*alt, вот так попробуй:
procedure find;
var j,i:integer; s:string; m:litters; f:boolean;
begin
i:=1; j:=1;
repeat
s:=''; m:=[]; f:=false;
repeat
f:=f or (txt[j] in m);
m:=m+[txt[j]]; s:=s+txt[j];
j:=j+1;
until (txt[j]=' ') or (txt[j]='.');
if not f and odd(i) then write(s);
i:=j;
until txt[i]='.';

end;

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


Пионер
**

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

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


Цитата(volvo @ 24.05.2007 1:37) *



f:=f or (txt[j] in m);





мне не раз встречаются строки такого типа, никак не пойму чтоже тут делается..
поясни, пожалуйста.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гуру
*****

Группа: Пользователи
Сообщений: 1 220
Пол: Мужской

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


Цитата(nikita182 @ 24.05.2007 1:42) *

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

f - переменая логического типа
txt[j] in m - входит ли элемент массива во множество m
итого^
f или входит ли элемент массива во множество m
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Цитата
никак не пойму чтоже тут делается..
Тут накапливается результат. То есть, поскольку изначально f:=false, то если не будет ни одного j, для которого выполнится условие (text[j] in m), значение f так и останется false (поскольку false OR false = false)... Но как только хоть однажды условие выполнится, сработает false OR true = true, значение f переключится в "истину", и останется таковым пока не будет опять сброшено в начале следующей итерации.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

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

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


вроде понял, но в чем отличие от

f:=txt[j] in m;



ведь в данном случае у нас также f будет false пока не выполнится условие (text[j] in m)?
или я путаю что-то?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Нет... В случае f:=txt[j] in m; у тебя в F запишется результат последней проверки на вхождение элемента во множество (у меня же - сохраняется результат накопленный, после просмотра всего слова)... И если (как, собственно, и было) добавить условием выхода (not F) в Until, то выполнение внутреннего цикла, конечно, прекратится, однако следующая итерация-то начнется не там где этого ждешь, а прямо со следующей буквы... Ты это видел, когда вводил "nikita".

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

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

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


вот теперь понял, спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

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

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


Цитата(volvo @ 24.05.2007 1:37) *

*alt, вот так попробуй:
procedure find;
var j,i:integer; s:string; m:litters; f:boolean;
begin
i:=1; j:=1;
repeat
s:=''; m:=[]; f:=false;
repeat
f:=f or (txt[j] in m);
m:=m+[txt[j]]; s:=s+txt[j];
j:=j+1;
until (txt[j]=' ') or (txt[j]='.');
if not f and odd(i) then write(s);
i:=j;
until txt[i]='.';

end;



Неа, чёт не работает, типо того, что было. если введу funky soull kill job, то выводит funky job.

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


Гость






Да, немного пришлось поменять:
procedure find;
var j,i:integer; s:string; m:litters; f:boolean;
begin
i:=1; j:=1;
repeat
s:=''; m:=[]; f:=false;
repeat
f:=f or (txt[j] in m);
m:=m+[txt[j]]; s:=s+txt[j];
j:=j+1;
until (txt[j]=' ') or (txt[j]='.');
if not f and odd(i) then write(s);
i:=i + 1; { <--- Здесь - вернул как было }
until txt[j]='.'; { <--- Здесь - изменение }

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


Новичок
*

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

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


Спасибо, volvo. Кажется работает нормально. И ещё, не совсем по теме, что значит запись const limits = [#0..#32,'.']; а именно #0..#32
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гуру
*****

Группа: Пользователи
Сообщений: 1 220
Пол: Мужской

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


Цитата(*alt @ 24.05.2007 13:10) *

Спасибо, volvo. Кажется работает нормально. И ещё, не совсем по теме, что значит запись const limits = [#0..#32,'.']; а именно #0..#32

константа перечисляемого типа, включающая в себя коды символов от 0 до 32 - служебные.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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