Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать класс с динамическим двумерным массивом, конструктор копирования... 
V
    Опции темы
Recev
  Дата 5.12.2010, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 18.10.2010

Репутация: нет
Всего: нет



Решение:

Код

#include <iostream.h>
#include <conio.h>
#include <iomanip.h>

class mass
{
   private:
    int **mas, kr, ks;

   public:
    friend istream &operator >> (istream &, mass &);
    friend ostream &operator << (ostream &, const mass &);
    mass ();
    mass (int, int);
    mass (const mass &);
    int min_element () const;
    mass &variant ();
    void rozmir (int, int);
    ~mass ();
    int &index (int, int);
};

istream &operator >> (istream &input, mass &n)
{
   for (int i = 0; i < n.kr; i++)
       for (int j =0; j < n.ks; j++)
       {
      cout << "mas [" << i << "][" << j << "]: ";
      input >> n.mas [i][j];
       }
   return input;
}

ostream &operator << (ostream &output, const mass &n)
{
   for (int i = 0; i < n.kr; i++)
   {
      for (int j = 0; j < n.ks; j++)
      output << setw (6) << n.mas [i][j] << "   ";
      cout << "\n";

   }
   return output;
}

mass :: mass ()
{
   cout << endl << "Constructor bez parametrov!" << endl;
}

mass :: mass (int kr1, int ks1)
{
   cout << endl << "Constructor s parametrami!" << endl;
   rozmir (kr1, ks1);
   int i;
   mas = new int* [kr];
   for ( i = 0; i < kr; i++)
       mas [i] = new int [ks];
   for (i = 0; i < kr; i++)
       for (int j = 0; j < ks; j++)
       mas [i][j] = 0;
}

mass :: mass (const mass &point)
{
   cout << endl << "Constructor copy!" << endl;
   kr = point.kr;
   ks = point.ks;
   int i;
   mas = new int * [kr];
   for ( i = 0; i < kr; i++)
       mas [i] = new int [ks];
   for (i = 0; i < kr; i++)
       for (int j = 0; j < ks; j++)
       mas [i][j] = point.mas [i][j];

}

int mass :: min_element () const
{
   int ns, min = mas [0][0];
   for (int i = 0; i < kr; i++)
       for (int j = 0; j < ks; j++)
       if (min >= mas [i][j])
       {
          min = mas [i][j];
          ns = j;
       }
   cout << "Min element massiva = " << min;
   cout << ", nahoditsy v stolbce pod #" << ns + 1 << ";" << endl;
   return ns;
}

mass &mass :: variant ()
{
   int ns = min_element (), *masiv, i, dod;
   mass *temp = new mass (*this);
   masiv = new int [kr];
   for (i = 0; i < kr; i++)
       masiv [i] = mas [i][ns]; // masiv - это теперь наш столбец, который мы щас отсортируем
   int nmin = masiv [0];
   int size = kr;
   for (i = 0; i < size-1; ++i) {
   int min_i = i;
   for (int j = i + 1; j < size; ++j) {
        if (masiv[j] < masiv[min_i]) {
            min_i = j;
        }
    }
    /* меняем значения местами */
    dod = masiv[i];
    masiv[i] = masiv[min_i];
    masiv[min_i] = dod;
                               }
   for (i = 0; i < kr; i++)
       temp -> index (i, ns) = masiv [i];
   delete [] masiv;
   return *temp;
}

void mass :: rozmir (int kr1, int ks1)
{
   kr = kr1;
   ks = ks1;
}

mass :: ~mass ()
{
   cout << endl << "Destructor!" << endl;
   for (int i = 0; i < kr; i++)
       delete mas [i];
   delete [] mas;
}

int &mass :: index (int r1, int s1)
 {
  return mas [r1][s1];
 }

 void main ()
{
   clrscr ();
   int kr1, ks1;
   cout << "Vvedite razmernost: ";
   cin >> kr1;
   mass m1 (kr1, kr1);
   cout << endl << "Vvedite elementy massiva: " << endl;
   cin >> m1;
   cout << endl << "Massiv: " << endl;
   cout << m1;
   cout << endl << "Obrabotka: " << endl;
   cout << endl << "Otsortirov. massiv:" << endl << m1.variant ();
   getch ();
}


Спасибо всем, кто помог. smile 
PM MAIL   Вверх
Чoо
Дата 5.12.2010, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Recev, с массивом просто работать, я ж писал выше.
Начнем с одномерного массива. Что он представляет собой? Да, правильно, указатель на первый элемент массива. Что из этого означает? а то, что что бы обратиться к первому элементу, достаточно знать только его адрес,  все остальные элементы следуют в памяти друг за другом. Что бы обратиться ко второму, надо прибавить к адресу первого элемента, столько байт, сколько занимает один элемент этого массива. Если хотим обратиться ко третьему элементу, то нужно прибавлять столько, сколько занимают два элемента.  Поскольку массив - указатель, то что бы получить значение без оператора [], указатель надо разыменовывать (оператор разыменвоания "*"). 
Таким образом:
Код

m[0] <=> *m
m[1] <=> *(m+1)
m[2] <=> *(m+2)
m(N) <=> *(m+N)

<=> - так обозначил эквивалентность операций.
что же представляет собой двумерный массив? Двумерный массив же представляет собой указатель на указатель, то есть при объявлении int m[3][4] выделяется память для 3-х одномерных массивов, содержащих в себе по 4 указателя на элементы типа int . Может коряво сказал, но по-другому объяснить что-то ни как не получается.
Из этого следует, что что бы обратиться к первому элементу первого одномерного массива (назовем это строкой), надо вычислить адрес строки и прибавить к ней номер элемента.  Адрес строки определяется из указателя на первый элемент + номер нужной строки. 
Это будет выглядеть так:
Код

m[0][0] <=> *(*(m+0)+0)
m[0][1] <=> *(*(m+0)+1)
m[0][N] <=> *(*(m+0)+N)
m[M][N] <=> *(*(m+M)+N)


Вернемся к нашему массиву: mas[i1*j+j1]
Этот массив хранит в себе не целые числа, а только указатели на целые числа, поэтому, если мы выделили память для этих чисел, то обращаться к нему нужно всегда используя оператор разыменования:
Код

*mas[i1*j+j1]

вот так правильно smile.
А вообще, пока я это писал, я понял, что по сути мы объявили одномерный массив, который двумерным даже не пахнет. Объяснение - вышеsmile. Каюсь smile.
Двумерный массив будет выглядеть так:
int ***a; //тобишь указатель на (указатель на указатель)
Вот предыдущий класс с именно "двумерным массивом":
Код

#include <stdio.h>
#include <stdarg.h>

class array{
    int ***a;
    int N,M; //размерность
public:
    array() {a = 0; N = M =0;}
    array(const int line,const int column, ...);
    void show();
};
array::array(const int line, const int column, ...)
{
    N = line;
    M = column;
    va_list ap;
    va_start(ap,column);
    a = new int**[N];
    for(int i = 0; i<N; ++i)
        *(a+i) = new int*[M]; //делаем "разметку" как в двумерном массиве
    for(int i = 0; i<N; ++i)
        for(int j = 0; j<M; ++j)
            a[i][j] = new int(va_arg(ap,int));
    va_end(ap);
}
void array::show()
{
    for(int i=0; i<N; ++i)
    {
        for(int j=0; j<M; ++j)
            printf("%4d",*a[i][j]);
        printf("\n");
    }
}

int main()
{
    array a(3,4,1,2,3,4,5,6,7,8,9,10,11,12);
    a.show();
}

в этом случае им можно будет пользоваться и как обычноым двумерным массивом.

Добавлено через 6 минут и 43 секунды
если объяснить "на пальцах", то статический двумерный массив состоит из указателей на указатели, разыменовав которые, мы получим:
Код

a[2][3] = {1,2,3,4,5,6}
  *(a+0)
          *(a+0)+0 = 1
          *(a+0)+1 = 2
          *(a+0)+2 = 3
  *(a+1)
          *(a+1)+0 = 4
          *(a+2)+1 = 5
          *(a+3)+2 = 6


соответственно и объявление динамического массива выглядит как int ***a;

Добавлено через 8 минут и 59 секунд
долго я печатал: пока писал, автор уже и справился вроде smile


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0434 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.