Консультация № 126947
12.03.2008, 13:47
0.00 руб.
0 2 2
Уважаемые эксперты, помогите написать следующую задачу:
Реализовать динамический двумерный массив, каждый элемент которого есть структура.
Пользователь должен сам задавать размеры массива, заполнять его, иметь возможность доступа к элементам массива по введенной строке и столбцу, а также в любой момент добавлять строку или столбец к уже заданному размеру.

Заранеее благодарен.

Обсуждение

Неизвестный
12.03.2008, 15:03
общий
это ответ
Здравствуйте, Новиков Роман Юрьевич!

Я уже отвечал на похожий вопрос (121736), поэтому чаще пользуйтесь поиском.
Ответ приведен в приложении. Дополнительно реализована функция циклического сдвига матрицы.

Приложение:
#include <iostream>#include <iomanip>template <class T> class matrix { private: T **ptr;unsigned int M,N; public: matrix() : ptr(0) ,M(0) ,N(0) {} matrix(unsigned int ranki,unsigned int rankj) :M(ranki) ,N(rankj) { ptr = alloc_mem(M,N); } ~matrix() { free_mem(ptr,M); }private:static T** alloc_mem(unsigned int M,unsigned int N) { T** p = new T*[M]; for (unsigned int i=0; i<M; ++i) p[i] = new T[N]; return p; }static void free_mem(T** p,unsigned int M) { if (p) { for (unsigned int i=0; i<M; ++i) delete [] p[i]; delete [] p; p=0; } }template <class Ty> static void shift(Ty* &v,unsigned int size,unsigned int count) { Ty *newv = new Ty[size]; int newpos,offset = count % size; //этот фрагмент лучше вынести из цикла и в прошлом примере for (unsigned int i=0; i<size; ++i) { newpos = i+ offset; if (newpos<0) newpos+= size; else if ((unsigned int)newpos >=size) newpos-=size; newv[newpos] = v[i]; } delete [] v; v = newv; } public: void ins_row(const T* new_row,unsigned int row_length,unsigned int pos) { if ((M == 0 && pos== 0 && (N = row_length)) || (pos <= M && row_length == N)) { unsigned int i,j,k; T **new_ptr = alloc_mem(M+1,N); for (i=0, k=0; i<M; ++i, k+= (k==pos) ? 2:1) for (j=0;j<N ;++j ) { new_ptr[k][j] = ptr[i][j]; } for (j=0;j<N ;++j ) new_ptr[pos][j] = new_row[j]; free_mem(ptr,M); ptr = new_ptr; M++; } } void ins_col(const T* new_col,unsigned int col_height,unsigned int pos) { if ((N==0 && pos==0 && (M = col_height)) || (pos <= N && col_height == M)) { unsigned int i,j,k; T **new_ptr = alloc_mem(M,N+1); for (i=0;i< M ;++i ) for (j=0, k=0;j<N ;++j, k+= (k==pos)? 2:1 ) { new_ptr[i][k] = ptr[i][j]; } for (i=0;i<M ;++i ) new_ptr[i][pos] = new_col[i]; free_mem(ptr,M); ptr = new_ptr; N++; } }void shift_down(int count) { shift(ptr,M,count); }void shift_right(int count) { for (unsigned int i=0;i<M ;++i ) shift(ptr[i],N,count); }void view() { unsigned int i,j; for (i=0; i< M; ++i) { for (j=0; j< N; ++j) std::cout <<std::setw(6) << ptr[i][j]; std::cout << std::endl; } std::cout << std::endl; }T* operator[] (unsigned int i) { if (i<M) return ptr[i]; else throw; } }; ///////************ Демонстрация#include <stdlib.h>#include <time.h>void main(){///1.вставка строк и столбцов matrix<double> m_double; double arrs[][3] = { {1,2,3}, {4,5,6}, {7,8,9}, }; m_double.ins_row(arrs[0],3,0); m_double.ins_row(arrs[1],3,1); m_double.ins_row(arrs[2],3,2); m_double.view(); m_double.ins_col(arrs[0],3,3); m_double.ins_col(arrs[1],3,4); m_double.view();///2.Заполнение числами и сдвиг matrix<int> m_int(3,3); unsigned int i,j; srand((unsigned)time(0)); for (i=0; i<3; ++i) for (j=0; j<3; ++j) m_int[i][j] = rand()%20; m_int.view(); m_int.shift_down(1); m_int.view(); m_int.shift_right(1); m_int.view(); m_int.shift_down(-2); m_int.view(); m_int.shift_right(-1); m_int.view();}
Неизвестный
13.03.2008, 06:27
общий
это ответ
Здравствуйте, Новиков Роман Юрьевич!
Предложу вариант реализации вашей задачи на основе динамического одномерного массива (вектора).

Приложение:
#include <iostream>#include <iomanip>using namespace std;template <class T>class vector { T *data; int size;public: vector() : data(NULL), size(0) { } ~vector() { if(data) delete[] data; } void push_back(const T& item) { T *new_data = new T[size + 1]; for(int i=0; i<size; i++) new_data[i] = data[i]; new_data[size] = item; delete[] data; data = new_data; size++; } void clear() { delete[] data; data = NULL; size = 0; } T& operator [] (int index) { return data[index]; } vector<T>& operator = (const vector<T>& ref) { delete[] data; size = ref.size; data = new T[size]; for(int i=0; i<size; i++) data[i] = ref.data[i]; return *this; }};template <class T>class matrix { vector<vector<T> > data; int n; int m;public: matrix(int _n, int _m) : n(_n), m(_m) { for(int i=0; i<n; i++) { vector<T> v; for(int j=0; j<m; j++) v.push_back(T()); data.push_back(v); } } ~matrix() { } vector<T>& operator [] (int index) { return data[index]; } void push_row(const vector<T>& row) { data.push_back(row); n++; } void push_col(vector<T>& col) { for(int i=0; i<n; i++) data[i].push_back(col[i]); m++; }};int main(int argc, char* argv[]) { int n = 4; int m = 5; matrix<int> A(n, m); cout << "Matrix A: " << endl; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { A[i][j] = i + j; cout << setw(3) << A[i][j]; } cout << endl; } vector<int> v; for(int i=0; i<m; i++) v.push_back(i*i); A.push_row(v); n++; cout << endl << endl << "Matrix A after push row: " << endl; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) cout << setw(3) << A[i][j]; cout << endl; } v.clear(); for(int i=0; i<n; i++) v.push_back(i*i); A.push_col(v); m++; cout << endl << endl << "Matrix A after push column: " << endl; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) cout << setw(3) << A[i][j]; cout << endl; } return 0;}
Форма ответа