Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2012, 16:00   #1
FlipFan
Пользователь
 
Регистрация: 30.03.2012
Сообщений: 14
По умолчанию Ошибка в функции

Помогите исправить ошибку в функции, которая ищет неповторяющиеся символы. Ошибка собственно в том, что если кол-во неповторяющихся символов чётное - программа работает правильно, если нечётное соотвественно не правильно
Код:
 Program L9_3;
{ Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Выведите на экран порядковый номер слова минимальной длины и количество неповторяющихся символов в этом слове.}
uses
  crt;
{процедура поиска самого короткого слова и его номера}
procedure KorSl(s:string; var sk:string; var ik:byte);
var
  k,len,n:byte;
  s1:string;
begin
  s:=s+' '; {добавим в конец строки пробел}
  while pos('  ',s)>0 do {удалим лишние пробелы, в кавычках 2 пробела}
    delete (s,pos('  ',s),1); {в кавычках 2 пробела}
    if s[1]=' ' then
    delete (s,1,1); {1 удаляем}
    sk:=''; {короткое слово, пока его нет}
    k:=255; {длина короткого слова}
    n:=0; {его номер}
    while pos(' ',s)>0 do {пока есть пробелы}
     begin
      len:=pos(' ',s)-1; {длина очередного слова}
      s1:=copy(s,1,len); {само слово}
      n:=n+1;
      if len<k then {если меньше предыдущих}
      begin
       sk:=s1; {запомним его}
       k:=len;
       ik:=n; {его номер}
      end;
      delete(s,1,pos(' ',s)); {удаляем проверенное слово, следующее первое}
     end;
 writeln('Самое короткое слово:  ',sk,' его номер=',ik);
end;
{функция подсчета количества неповторяющихся символов}
function KolSim(sk:string):byte;
var
 m:set of char; {вспомогательное множество символов}
 i,k:byte;
begin
 m:=[];k:=0; {множество пустое, символов нет}
 for i:=1 to length(sk) do {идем по слову}
  if not (sk[i] in m) then {если символа еще нет в множестве}
  begin
   k:=k+1;   {считаем}
   m:=m+[sk[i]];  {добавляем}
  end
  else   {если есть}
   if (sk[i] in m) then
   begin
    k:=k-1;   {вычитаем, ТУТ ОШИБКА}
    m:=m-[sk[i]];   {исключаем}
   end 
 KolSim:=k;   {значение функции}
end;
var
 st, sl :string;
 nm:byte;
begin
 clrscr;
 writeln('Введите строку из слов, отделеннvх пробелами:');
 readln(st);
 KorSl(st,sl,nm);
 writeln('Количество неповторяющихся симолов в нем=',KolSim(sl));
 readln
end.
FlipFan вне форума Ответить с цитированием
Старый 09.05.2012, 16:56   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

А это к чему вообще?
Код:
else   {если есть}
   if (sk[i] in m) then
   begin
    k:=k-1;   {вычитаем, ТУТ ОШИБКА}
    m:=m-[sk[i]];   {исключаем}
   end
Исходно множество пустое. Добавляем только не повторяющиеся символы.
А что тогда исключаем?
Просто убрать.


Как-то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 10.05.2012, 22:46   #3
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Добавляем только не повторяющиеся символы.
Это было бы неплохо, но вопрос - как? ))
Проблема в том, что если удалять символ из множества сразу после первого же повтора - он снова войдет при следующем повторе, и нечетные повторы не отследятся.

Я бы рекомендовал использовать два множества:
Код:
function KolSim(s:string):byte;
var
  m,n: set of char;
  i,k: integer;

begin
  m:= [];
  n:= [];
  for i:=1 to Length(s) do if s[i] in m then include(n,s[i]) else include(m,s[i]);
  m:= m-n;  // ключевой момент - удаление повторяющихся
  k:= 0;
  for i:=0 to 255 do if chr(i) in m then inc(k);
  KolSim:= k
end;
А еще можно без множеств - код короче, но работать будет сильно меденнее.
Код:
function KolSim(s:string):byte;
var
  i,k:byte;
begin
  k:= 0;
  for i:=1 to Length(s) do
    if Pos(s[i],Copy(s,1,i-1)+Copy(s,i+1,255))=0 then inc(k);
  KolSim:=k;
end;
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 11.05.2012, 01:16   #4
FlipFan
Пользователь
 
Регистрация: 30.03.2012
Сообщений: 14
По умолчанию

спс большое, с 2-умя множествами не подумал(

Последний раз редактировалось FlipFan; 11.05.2012 в 01:19.
FlipFan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в функции (СИ) zterry Общие вопросы C/C++ 3 28.12.2011 06:50
ошибка в функции Katus Общие вопросы Delphi 10 10.12.2011 05:43
C# Функции(ошибка) Extez1 Помощь студентам 2 17.03.2011 12:43
Ошибка в функции Lotles Общие вопросы C/C++ 10 26.11.2010 16:04
С++. ошибка в функции. phpcreator Помощь студентам 4 16.09.2009 18:42