Перегрузка операции минус

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Да при чём тут множества? Не клей сюда то, что клеить не нужно. Это обычная студенческая задачка.

Хорошо, хочешь говорить на умном языке, изволь. Да, здесь действительно нарушена семантика операции. Да, действительно результат операции не сопоставим с теорией множеств. Да, да, да. А ещё попрошу заметить, что кони в вакууме ржать не могут, так как в безвоздушном пространстве не распространяются звуковые волны из-за отсутствия колебательной материи.

Но, чёрт побери, зачем об этом толковать, когда студент просит помочь с простеньким алгоритмом? Он что, диссертацию пишет? Да ему не интересны твои философские изливания. Ему просто нужна помощь.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

А при том. Разность множеств есть множество, состоящее из всех элементов уменьшаемого, которых нет в вычитаемом. То есть при вычитании множеств просто из левого операнда исключаются элементы второго. Добавьте к этому, что важен лишь факт присутствия в множестве элемента, но не позиция элемента, и что элемент может войти в множество лишь однажды, и получим множество символов вместо строки. Так какой же сущностью пахнет описанное ТС вычитание строк? Но у него самого множества нет, а есть только запах множеств. И того: перегрузка предназначена для сбивания с толку. Герберт Шилдт призывает так не делать. Кстати, можно и смешней сделать - исключить единичные биты символов правого операнда. Есть, предположим, в правом операнде буква D. Она имеет код код 68, или в двоичном представлении 01000100, значит во всех символах левого операнда обнуляем 2-е и 6-е биты с весами 4 и 64, то есть:

Код: Выделить всё

char *p1;
char *p2;
char Mask;
Result=*this;
if ((Count>0)&&(Right.Count>0))
{
 for (p2=Right.Data+Right.Count-1; (*p2)>=Right.Data; --p2)
 {
  Mask=!(*p2);
  for (p1=Data+Count-1; (*p1)>=Data; --p1)
  {
   p1&=Mask;
  }
 }
}
return Result;
. Тоже из серии "завтра хакер пьяным будет".
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Да плевать на Герберта Шилдта! Пойми наконец разницу между решением студенческих задач и реальным коммерческим программированием! Всё, что ты пишешь, для студенческой лабораторной не важно! Преподаватель сказал - студент сделал. Иди и поспорь с преподавателем, если у тебя есть к этому непреодолимая тяга. К бедному студенту-то ты чего прицепился?

Во всём этом я вижу повод для тебя для того, чтобы не помочь человеку. Это уже третья тема, в которой ты ведёшь себя так, так что мои подозрения теперь более, чем обоснованы :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Небольшая просьба лично от меня. Если нет желания помогать, то вообще не влезай в студенческие темы, хорошо? А то флуда три страницы, а пользы - ноль.

Дай знать, когда прочтёшь это сообщение, и я потру весь флуд.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Sereg
Сообщения: 8
Зарегистрирован: 04 дек 2015, 20:25

Сионист писал(а):А при том. Разность множеств есть множество, состоящее из всех элементов уменьшаемого, которых нет в вычитаемом. То есть при вычитании множеств просто из левого операнда исключаются элементы второго. Добавьте к этому, что важен лишь факт присутствия в множестве элемента, но не позиция элемента, и что элемент может войти в множество лишь однажды, и получим множество символов вместо строки. Так какой же сущностью пахнет описанное ТС вычитание строк? Но у него самого множества нет, а есть только запах множеств. И того: перегрузка предназначена для сбивания с толку. Герберт Шилдт призывает так не делать.

Хорошо, напиши пожалуйста свой результат решения данного примера. Условие указано в самом первом сообщении.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Блестящий ход, Sereg! Поверь мне, сейчас он просто съедет, либо сделает вид, что эту тему теперь вообще не читает :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Код: Выделить всё

const char *p1;
const char *p2;
char *p3;
bool Flag;
size_t Count;
if (this->Count>0)
{
 if (Right.Count>0)
 {
  for (Count=0, p1=Data+this->Count-1; p1>=Data; --p1)
  {
   for (Flag=true, p2=Right.Data+Right.Count-1; p2>=Right.Data; --p2)
   {
    if ((*p1)==(*p2))
    {
     Flag=false;
     break;
    }
   }
   if (Flag)
   {
    ++Count;
   }
  }
  if (Count>0)
  {
   Result.Data =new char [Count];
   Result.Count=Coiunt;
   for (p1=Data+this->Count-1, p3=Result.Data+Count-1; p1>=Data; --p1)
   {
    for (Flag=true, p2=Right.Data+Right.Count-1; p2>=Right.Data; --p2)
    {
     if ((*p1)==(*p2))
     {
      flag=false;
      break;
     }
    }
    if (Flag)
    {
     (*p3)=(*p1);
     --p3;
    }
   }
   return Result;
  }
 }
 return *this;
}
Алгоритм квадратичный.

Код: Выделить всё

const char *p1;
char *p2;
bool *f;
bool Flags[256];
size_t Count;
if (this->Count>0)
{
 if (Right.Count>0)
 {
  for (f=Flags+255; f>=Flags; --f)
  {
   (*f)=true;
  }
  for (*p1=Right.Data+Right.Count-1; p1>=Right.Data; --p1)
  {
   Flags[*((const unsigned char*)p1)]=false;
  }
  for (Count=0, p1=Data+this->Count-1; p1>=Data; --p1)
  {
   if (Flags[*((const unsigned char*)p1)])
   {
    ++Count;
   }
  }
  if (Count>0)
  {
   Result.Data =new char [Count];
   Result.Count=Coiunt;
   for (p1=Data+this->Count-1, p2=Result.Data+Count-1; p1>=Data; --p1)
   {
    if (Flags[*((const unsigned char*)p1)])
    {
     (*p2)=(*p1);
     --p2;
    }
   }
   return Result;
  }
 }
 return *this;
}
Этот алгоритм линейный, но использует на 256 байт стека больше.
Romeo писал(а):Блестящий ход, Sereg! Поверь мне, сейчас он просто съедет, либо сделает вид, что эту тему теперь вообще не читает :)
Это Вы её не читаете.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Этот алгоритм линейный, но использует на 256 байт стека больше.
Вообще-то не 256 байт, а в четыре раза больше. Но эту тему развивать не буду. Я понимаю, что ты не профи.
Сионист писал(а):Это Вы её не читаете.
Аргументируй.

Sereg, если в моём алгоритме вызвать для результирующей строки алгоритм std::unique, о котором Сионист не знает, то результат будет ровно такой же, как то, что Сионист хотел добиться на словах. Подчёркиваю, именно на словах, так как на деле я не знаю, будет ли работать то, что он написал, так как у него ужасающие листинги, и у меня не хватает нервов разбирать его код. Но если ты пойдёшь по его пути и откажешься от std::string, то будь готов к тому, что тебе придётся написать полноценный класс-строку и определить ещё кучу конструкторов и операторов, чтобы всё работало. Выбирай сам, что тебе больше подходит.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Оксалайя
Сообщения: 27
Зарегистрирован: 01 сен 2015, 12:12

Сионист писал(а):

Код: Выделить всё


  for (f=Flags+255; f>=Flags; --f)
  {
   (*f)=true;
  }
Мои глаза кровоточат...
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Вообще-то не 256 байт, а в четыре раза больше. Но эту тему развивать не буду. Я понимаю, что ты не профи.
А уж на стколько Вы не профи, так и не передать: Изображение.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить