Страница 2 из 4

Re: Перегрузка операции

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

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

Но, чёрт побери, зачем об этом толковать, когда студент просит помочь с простеньким алгоритмом? Он что, диссертацию пишет? Да ему не интересны твои философские изливания. Ему просто нужна помощь.

Re: Перегрузка операции

Добавлено: 05 дек 2015, 12:09
Сионист
А при том. Разность множеств есть множество, состоящее из всех элементов уменьшаемого, которых нет в вычитаемом. То есть при вычитании множеств просто из левого операнда исключаются элементы второго. Добавьте к этому, что важен лишь факт присутствия в множестве элемента, но не позиция элемента, и что элемент может войти в множество лишь однажды, и получим множество символов вместо строки. Так какой же сущностью пахнет описанное ТС вычитание строк? Но у него самого множества нет, а есть только запах множеств. И того: перегрузка предназначена для сбивания с толку. Герберт Шилдт призывает так не делать. Кстати, можно и смешней сделать - исключить единичные биты символов правого операнда. Есть, предположим, в правом операнде буква 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;
. Тоже из серии "завтра хакер пьяным будет".

Re: Перегрузка операции

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

Во всём этом я вижу повод для тебя для того, чтобы не помочь человеку. Это уже третья тема, в которой ты ведёшь себя так, так что мои подозрения теперь более, чем обоснованы :)

Re: Перегрузка операции

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

Дай знать, когда прочтёшь это сообщение, и я потру весь флуд.

Re: Перегрузка операции

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

Хорошо, напиши пожалуйста свой результат решения данного примера. Условие указано в самом первом сообщении.

Re: Перегрузка операции

Добавлено: 05 дек 2015, 12:32
Romeo
Блестящий ход, Sereg! Поверь мне, сейчас он просто съедет, либо сделает вид, что эту тему теперь вообще не читает :)

Добавлено: 05 дек 2015, 12:48
Сионист

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

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! Поверь мне, сейчас он просто съедет, либо сделает вид, что эту тему теперь вообще не читает :)
Это Вы её не читаете.

Re: Перегрузка операции

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

Sereg, если в моём алгоритме вызвать для результирующей строки алгоритм std::unique, о котором Сионист не знает, то результат будет ровно такой же, как то, что Сионист хотел добиться на словах. Подчёркиваю, именно на словах, так как на деле я не знаю, будет ли работать то, что он написал, так как у него ужасающие листинги, и у меня не хватает нервов разбирать его код. Но если ты пойдёшь по его пути и откажешься от std::string, то будь готов к тому, что тебе придётся написать полноценный класс-строку и определить ещё кучу конструкторов и операторов, чтобы всё работало. Выбирай сам, что тебе больше подходит.

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

Добавлено: 05 дек 2015, 13:04
Оксалайя
Сионист писал(а):

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


  for (f=Flags+255; f>=Flags; --f)
  {
   (*f)=true;
  }
Мои глаза кровоточат...

Re: Перегрузка операции

Добавлено: 05 дек 2015, 13:07
Сионист
Romeo писал(а):Вообще-то не 256 байт, а в четыре раза больше. Но эту тему развивать не буду. Я понимаю, что ты не профи.
А уж на стколько Вы не профи, так и не передать: Изображение.