Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] ООП + массивы


Автор: deadlegolas 28.3.2009, 03:12
Цитата

Есть 2 массива одинаковой размерности, нужно найти среди их елементов найбольший елемент и вывести имя массива,в котором этот елемент.


Как реализовать без ооп я понимаю,но как с елементами ооп? не понимаю..
буду благодарен за обьяснение\пример..

Автор: t_gran 28.3.2009, 07:08
В принципе не очень понятно, изобретать свои костыли или использовать STL. smile

Своими ручками:
Код

#include <iostream>

using namespace std;

class Array
{
   private:
      int *arr;
      int size;
   
   public:
      Array (int size);
      ~Array ();
      void Print ();
      int GetSize () {return size;};
      int operator [] (int index);
};

class Alg
{
   public:
      static int Comparison (Array &arr1, Array &arr2);
};
//----------------------------------------------//
Array::Array (int theSize)
{
   size= theSize;
   arr= new int [size];
   for (int i= 0; i < size; ++i)
      arr[i]= rand() % 89 + 10;
}
//----------------------------------------------//
Array::~Array ()
{
   delete arr;
}
//----------------------------------------------//
void Array::Print ()
{
   for (int i= 0; i < size; ++i)
      cout << arr[i] << " ";
  cout << endl;
}
//----------------------------------------------//
int Array::operator [] (int index)
{
   if (index < 0 || index > size-1)
      return -1;
   return arr[index];
}
//----------------------------------------------//
int Alg::Comparison (Array &arr1, Array &arr2)
{
   int max1= 0, max2= 0, i;
   for (i= 0; i < arr1.GetSize(); ++i)
      if (max1 < arr1[i])
         max1= arr1[i];
   for (i= 0; i < arr2.GetSize(); ++i)
      if (max2 < arr2[i])
         max2= arr2[i];   
   return max1 == max2 ? 0 : max1 > max2 ? -1 : 1;
}
//----------------------------------------------//
int main (int argc, char **argv)
{
   srand (time(NULL));
   Array arr1 (10), arr2(10);
   arr1.Print ();
   arr2.Print ();
   switch (Alg::Comparison(arr1,arr2))
   {
      case 0:
         cout << "Null" << endl;
      break;
      case -1:
         cout << "First" << endl;
      break;
      case 1:
         cout << "Last" << endl;
      break;
   }
   return 0;
}


С помощью STL:
Код

#include <iostream>
#include <iterator>
#include <vector>

using namespace std;

#define _SIZE_ 10

int main (int argc, char **argv)
{
   srand (time(NULL));
   vector <int> arr1, arr2;
   for (int i= 0; i < _SIZE_; ++i)
   {
      arr1.push_back (rand()%89+10);
      arr2.push_back (rand()%89+10);
   }
   copy (arr1.begin(), arr1.end(), ostream_iterator<int>(std::cout, " "));
   cout << endl;
   copy (arr2.begin(), arr2.end(), ostream_iterator<int>(std::cout, " "));
   cout << endl;
   int max1= *max_element (arr1.begin(),arr1.end());
   int max2= *max_element (arr2.begin(),arr2.end());
   if (max1 > max2)
      cout << "First" << endl;
   else if (max1 < max2)
      cout << "Last" << endl;
   else
      cout << "Null" << endl;
   return 0;
}


Немного кривовато, но я думаю пойдёт.

Автор: deadlegolas 28.3.2009, 13:53
Спасибо,да, мне нужно создавать костыли))
но не очень понятно что делает тильда перед Array...  `Array?
И что делает функция 
Код

int Array::operator []

За код спасибо)

Автор: zim22 28.3.2009, 14:17
deadlegolas, тильда - это деструктор.
а функция - это оператор обращения по индексу ко значению элемента.

Автор: deadlegolas 28.3.2009, 14:46
>а функция - это оператор обращения по индексу ко значению элемента. 
а почему не можно обращаться просто arr2[i] ? почему надо использовать этот оператор обращения по индексу?

Автор: zim22 28.3.2009, 15:03
deadlegolas, потому что [] - это операция. такая же как AddTwoValue(int i)
только имя покороче. Для встроенных типов данных эти операции определены. А для пользовательских классов - нужно ручками. Если она нужна конечно.

Автор: deadlegolas 28.3.2009, 17:20
тоесть таким способом можно задавать любым символам любые функции?О_О
круто)
а как ,например, сделать пример где поднести в степень число с помощью символа "*" ? Это ведь реализуемо? не покажите на примере, пожалуйста?

Автор: zim22 28.3.2009, 17:41
deadlegolas, почитайте про перегрузку операторов. там всё написано.

Автор: deadlegolas 28.3.2009, 18:34
А вот такой вот вопрос, по задачке этой же:
Реально ли вывести само имя массива (которое в коде,переменнуая) ? как это можна реализовать?

Автор: deadlegolas 28.3.2009, 18:34
А вот такой вот вопрос, по задачке этой же:
Реально ли вывести само имя массива (которое в коде,переменнуая) ? как это можна реализовать?

Автор: zim22 28.3.2009, 18:48
deadlegolas, в конструкторе назначайте массиву имя. потом с помощью функции-члена отображайте его.

Автор: deadlegolas 28.3.2009, 19:13
zim22, но это ведь будет не отображение имени переменной? а просто присваемого имени.

Автор: deadlegolas 28.3.2009, 19:33
Код

#define prin(name) cout <<#name

int a=2
prin(a);



Уже разобрался, вот так реализовал.
всем спасибо. задача решена)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)