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

Поиск:

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


Новичок



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

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



Не могли бы вы объяснить, почему при печати двумерного динамического масиива, несмотря на то, что у него в одной из строк больше элементов, выводится только то количество, которое совпадает с количеством элементов в других строках.  
Код

#include "iostream"
#include "conio.h"
using namespace std; 
class Vektor
{
    int *pvect;
    int size;                                   //размерность вектора
public:
    Vektor(int n = 1);                          //конструктор, позволяющий задавать размерность вектора
    Vektor(const Vektor&);                      //конструктор копирования
    ~Vektor();                                  //деструктор 
    void Print(int);                            //печать одного элемента вектора
    void PrintAll();                            //печать всего вектора
    void operator +=(Vektor);                   //сложение двух векторов
    Vektor operator + (const Vektor&);          //сложение двух векторов
                Vektor & operator=(const Vektor&);          //перегруженный оператор присваивания
    int & operator[](int);                      //перегруженный оператор индексации
};
class Vektor_2D
{
public:
    Vektor *pvect_2D;
    int size_str, size_stol;
public:
    Vektor_2D (int m = 1, int n = 1);                                    //конструктор, позволяющий задавать размеры матрицы
    Vektor_2D (const Vektor_2D& );                            //конструктор копирования
    ~Vektor_2D();                                            //деструктор
    void Inicialization();                                    //инициализация
    void PrintAll();                                        //печать всей матрицы
    Vektor& Vektor_2D::operator [] (int);                    //перегруженный оператор индексации
    Vektor_2D& Vektor_2D::operator = (const Vektor_2D& );    //перегруженный оператор присваивания
    void Insert (int, int, int);                            //вставка элемента
};
//---------------------------
//конструктор, позоляющий задавать размерность вектора
Vektor::Vektor(int n)
{
    size = n;
    pvect = new int[size];
    for (int i = 0; i < size; i++)
        pvect[i] = 0;
}
//---------------------------
//конструктор копирования
Vektor::Vektor(const Vektor &right)
{
    size = right.size;
    pvect = new int[size];
    for (int i = 0; i < size; i++)
        pvect[i] = right.pvect[i];
}
//---------------------------
//деструктор
Vektor::~Vektor()
{
    delete [] pvect;
}
//---------------------------
//печать одного элемента вектора
void Vektor::Print(int nomer)
{
    if (nomer > size)
    {
        cout << "Net takogo elementa" << endl;
    }
    else
    {
        cout << operator[] (nomer-1) << endl;
    }
}
//---------------------------
//печать всего вектора
void Vektor::PrintAll()
{
    for (int i = 0; i < size; i++)
    {
        cout << pvect[i] <<" ";
    }
    cout << endl;
}
//---------------------------
//сложение двух векторов
void Vektor::operator +=(Vektor x1)
{
    Vektor x2;
    x2.size = x1.size + size;
    x2.pvect = new int [x2.size];
    for (int i = 0; i < size; i++)
    {
        x2.pvect[i] = pvect[i];
    }
    for (int i = size; i < size + x1.size; i++)
    {
        x2.pvect[i] = x1.pvect[i-size];
    }
    *(this) = x2;
}
//---------------------------
//сложение двух векторов
Vektor Vektor::operator+ (const Vektor& right) 
{
    if (size == right.size)                               //размерности векторов совпадают
    {
        Vektor tmp(size);                                 //создание временного объекта
        for (int i = 0; i < size; i++)
            tmp.pvect[i] = pvect[i] + right.pvect[i];
        return tmp;
    }
    else                                                  //размерности векторов не совпадают   
    {
        cout <<"Raznue razmernosti vektorov" << endl;
        return *this;
    }
}
//---------------------------
//перегруженный оператор присваивания
Vektor& Vektor::operator=(const Vektor& right)
{
    if (&right == this)                           //проверка на присваивание
        return *this;                             //объекта самому себе
    if (size != right.size && size != 0)
    {
        delete [] pvect;
        size = right.size;
        pvect = new int[size];
    }
    for (int i = 0; i < size; i++)
        pvect[i] = right.pvect[i];
    return *this;
}
//---------------------------
//перегруженный оператор индексации
int& Vektor::operator[] (int n)
{
    int *ptr = pvect;
    int k = size;
    if (n < 0)                                           //если индекс меньше нуля,
    {                                                     //то возвращаем нулевой элемент массива
        cout << "Indeks slishkom malen'kii" << endl;
        return pvect[0];
    }
    else if (n > size - 1)                               //если индекс больше максимального элемента  
    {
        while (k < n + 1)
            k++;
        pvect = new int[k];
        for (int i = 0; i < size; i++)
        {
            pvect[i] = ptr[i];
        }
        delete [] ptr;
        for (int i = size; i < k; i++)
        {
            pvect[i] = 0;
        }
        size = k;
        return pvect[n];
    }
    else                                                 //возврат заданного элемента
        return pvect[n];
}
//---------------------------
//конструктор, позволяющий задавать размеры матрицы
Vektor_2D::Vektor_2D(int m, int n)
{
    size_str = m; size_stol = n;
    pvect_2D = new Vektor [size_str];
    for (int i = 0; i < size_str; i++)
    {
    for (int j = 0; j < size_stol; j++)
        {
            operator[](i)[j] = 0;
        }
    }
}
//---------------------------
//конструктор копирования
Vektor_2D::Vektor_2D (const Vektor_2D& matrica)
{
    size_str = matrica.size_str;
    size_stol = matrica.size_stol;
    pvect_2D = new Vektor [size_str];
    for (int i = 0; i < size_str; i++)
        *(pvect_2D + i) = *(matrica.pvect_2D + i);
}
//---------------------------
//деструктор
Vektor_2D::~Vektor_2D()
{
    delete [] pvect_2D;
}
//---------------------------
//инициализация
void Vektor_2D::Inicialization()
{
    for (int i = 0; i < size_str; i++)
    {
        for (int j = 0; j < size_stol; j++)
        {
            operator[](i)[j]=i;
        }
    }    
}
//---------------------------
//печать всей матрицы
void Vektor_2D::PrintAll()
{
    for (int i = 0; i < size_str; i++)
    {
        for (int j = 0; j < size_stol; j++)
        {
            cout << operator[](i)[j]<< " ";
        }
        cout << endl;
    }
}
//---------------------------
//перегруженный оператор индексации
Vektor& Vektor_2D::operator [] (int stroka)
{
    int m = size_str;
    if (stroka < size_str) 
    {
        return *(pvect_2D + stroka);
    }
    else
    {
        Vektor_2D Matr = *this;
        while (m < stroka)
            m += size_str;
        delete [] pvect_2D ;
        pvect_2D = new Vektor[m];
        for (int i = 0; i < size_str; i++)
        {
                pvect_2D[i] = Matr.pvect_2D[i];
            }
        size_str = m;
    return pvect_2D[stroka];
    }
}
//---------------------------
//перегруженный оператор присваивания
Vektor_2D& Vektor_2D::operator = (const Vektor_2D& matrica)
{
    delete [] pvect_2D;
    size_str = matrica.size_str;
    size_stol = matrica.size_stol;
    pvect_2D = new Vektor [size_str];
    for (int i = 0; i < size_str; i++)
    {
        *(pvect_2D + i) = *(matrica.pvect_2D + i);
    }
    return *(this);
}
//---------------------------
//вставка элемента
void Vektor_2D::Insert(int data, int m, int n)
{
    if ((m <= size_str) && (n <= size_stol)) 
    {
        operator[](m)[n] = data;
    }
    else
    {
        int p = size_str, q = size_stol;
        while ( p <= m)
        {
            p += size_str;
        }
        while ( q <= n)
        {
            q += size_stol;
        }
        Vektor_2D Matr = *this;
        delete [] pvect_2D;
        pvect_2D = new Vektor [p];
        for (int i = 0; i < size_str; i++)
        {
            for (int j = 0; j < size_stol; j++)
            {
                operator[](i)[j] = Matr[i][j];
            }
        }        
        size_str = p; size_stol = q;
        operator[](m)[n] = data;
    }
}
class Application
{
public:
    void Run();
};
void Application::Run()
{
    Vektor_2D matrica1(4,4);
    matrica1[1][3] = 1;
    matrica1.PrintAll();
    cout << endl;
    matrica1[5][2] = 1;
    matrica1.PrintAll();
    cout << endl;
    matrica1[1][6] = 1;
    matrica1.PrintAll();
    cout << endl;
    matrica1[1].PrintAll();
    /*Vektor_2D matrica2 = matrica1; 
    matrica2.PrintAll();
    cout << endl;
    Vektor_2D matrica3;
    matrica3 = matrica1;
    matrica1[5][2] = 3;
    matrica1.PrintAll();
    cout << endl;
    matrica1.Inicialization();
    matrica1[6][2] = 3;
    matrica1.PrintAll();
    cout << endl;
    matrica2.Insert(10, 6, 5);
    matrica2.PrintAll();
    cout << endl;
    matrica3.Inicialization();
    matrica3.PrintAll();
    cout << endl;
    cout << matrica3 [2][3] << endl;
    matrica3[1].PrintAll();*/
    _getch();
}
void main()
{
    Application *pApplication = new Application;
    pApplication->Run();
}

p.s. привела код всей программы, чтобы запустив и увидев, можно было понять суть моего вопроса.
 Может быть нужно как-то по-другому переопределять индексирование?
PM MAIL   Вверх
JackYF
Дата 9.12.2007, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(sherbet @  8.12.2007,  22:50 Найти цитируемый пост)
for (int i = 0; i < size_str; i++)
    {
        for (int j = 0; j < size_stol; j++)
        {
            cout << operator[](i)[j]<< " ";
        }
        cout << endl;
    }

Всего не смотрел, но посмотри на этот кусок кода. Здесь явно выводится одно и то же число элементов строки - size_stol. Если надо разное, то, соотвественно, впиши сюда нужную функцию/переменную, определяющую количество элементов именно в этой строке.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
sherbet
Дата 9.12.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Если надо разное, то, соотвественно, впиши сюда нужную функцию/переменную, определяющую количество элементов именно в этой строке.

 Это мне теоритически понятно, но вот как это реализовать я и спрашиваю..  smile 
PM MAIL   Вверх
JackYF
Дата 9.12.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(sherbet @  9.12.2007,  10:36 Найти цитируемый пост)
но вот как это реализовать

ну, допустим:

в класс вектор определи метод
Код

int Vector::size() const
{
  return size;
}


Функцию ту тогда перепиши так:
Код

for (int i = 0; i < size_str; i++)
    {
        for (int j = 0; j < operator[](i).size(); j++)
        {
            cout << operator[](i)[j]<< " ";
        }
        cout << endl;
    }



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
sherbet
Дата 11.12.2007, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое, все гениальное, как обычно, просто! smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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