Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[Pascal] Исправить исхондник. Задача на множества

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

Вот решение задачи, но в процедуре 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);
      until eoln or (i=n_max) or (txt=eot);
      readln;
    until (i=n_max) or (txt=eot);
  if txt=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='.';

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


Из цикла не правильно выходит (он конеш работает, но только, когда во всех словах буквы не повторяются). Переделайте пожалуйста...
622
23 мая 2007 года
nilbog
507 / / 19.12.2006
несовсем ясно зачем вы загоняете текст в массив :d
а если там будет больше символов?
по сабжу
вы используете i и j счетчики - в j получается число символов а в i число слов
почему у вас условия выхода txt[i] хотя последний просмотренный символ в j
это первое что бросается
13K
23 мая 2007 года
*alt
36 / / 12.04.2007
Ну ладно, как бы с вводом не существенно (врядли кто-то по клаве будет настукивать 1000 символов). А вот процедуре как-то надо переделать, чтоб раньше времени из цикла не выходил (i поменял на j).
622
24 мая 2007 года
nilbog
507 / / 19.12.2006
аа
вот еще )
вообще то это будет не всегда корректно работать у вас
 
Код:
m:=m+[txt[j]];

может возникнуть несоответствие типов :)
13K
24 мая 2007 года
*alt
36 / / 12.04.2007
Цитата: nilbog
аа
вот еще )
вообще то это будет не всегда корректно работать у вас
 
Код:
m:=m+[txt[j]];

может возникнуть несоответствие типов :)


Не тут всё нормально, не то там с f по-моему. +а что значит (по ASCII кодам) такая фишка: const limits = [#0..#32,'.'] ? а именно #0..#32

622
24 мая 2007 года
nilbog
507 / / 19.12.2006
дело в том что в этой строчке txt[j] может равнятся пробелу или точке
а м у вас set of 'a'..'z'
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог