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();}