Допустим, надо "пройтись по всем элементам массива (матрицы)
Если массив 1-мерный - цикл по i.
Если 2-мерный - вложенные циклы по i и j
Если 3-мерный - вложенные циклы по i, j, k
А если многомерный?
Так и вкладывать, используя однотипный код?
Ну, это ладно. А если заранее не известно, скольки мерный массив, тогда как быть?
Что-то мне подсказывает, что рекурсия поможет.
Но я никак не могу сообразить, как это реализовать.
Другие языки программирования и технологии
Как быть с многоразмерными массивами? Рекурсия?
#include <iostream>
#include <time.h>
using namespace std;
template < class T > class Narray
{
int S;
int N;
int* r;
int* e;
T* m;
public:
Narray(int aN,int* ar,int(*p)(int),int x); // N - число измерений, массив количества элементов для каждого измерения
~Narray() { delete r,m,e; };
void print(); //вывод содержимого массива
T& operator[](int j) { return m[j]; }
Narray< T >& operator=(const Narray< T >&); // операция присвоения
Narray< T > operator+(Narray< T >& a);
};
template < class T > Narray< T >::Narray(int aN,int* ar,int(*p)(int),int x):N(aN)
{ int j,l,s;
r=new T[N];
e=new T[N];
for(S=1,j=0;j-N;S*=r[j++]=ar[j]);
m=new T[ S ];
for(e[0]=l=1;l-N;e[l++]=s) for(s=1,j=N-1;j>=N-l;s*=r[j--]);
for(j=0;j-S;m[j++]=p(x));
}
template < class T > void Narray< T >::print()
{
int j,l;
for(l=0;l-S;cout << m[l++] << '\t') for(j=1;j-N;) if(l % e[j++]==0) printf("\n");
cout << endl;
}
template< class T > Narray< T >& Narray< T >::operator=(const Narray< T >& r)
{ int j;
if(this!=&r) for(j=0;j-S;j++) m[j]=r.m[j];
return *this;
}
template < class T > Narray< T > Narray< T >::operator+(Narray< T >& a)
{ int j;
Narray< T > R(N,r,num,0);
for(j=0;j-S;j++) R[j]=m[j]+a.m[j];
return R;
}
int init(int i)
{
return rand() % i;
}
int num(int i)
{
return i;
}
#define K 3 // для трёхмерного массива
#define L 2 // для двухмерного массива
int main()
{
srand(time(NULL));
{
int r[K]={2,3,4};
Narray<int> Y(K,r,num,0); Y.print();
Narray<int> M(K,r,init,5); M.print();
Narray<int> N(K,r,init,4); N.print();
Y=M+N;
Y.print();
Y=M;
Y.print();
}
{
int r[L]={2,3};
Narray<int> Y(L,r,num,0); Y.print();
Narray<int> M(L,r,init,5); M.print();
Narray<int> N(L,r,init,4); N.print();
Y=M+N;
Y.print();
Y=M;
Y.print();
}
return 0;
}
#include <time.h>
using namespace std;
template < class T > class Narray
{
int S;
int N;
int* r;
int* e;
T* m;
public:
Narray(int aN,int* ar,int(*p)(int),int x); // N - число измерений, массив количества элементов для каждого измерения
~Narray() { delete r,m,e; };
void print(); //вывод содержимого массива
T& operator[](int j) { return m[j]; }
Narray< T >& operator=(const Narray< T >&); // операция присвоения
Narray< T > operator+(Narray< T >& a);
};
template < class T > Narray< T >::Narray(int aN,int* ar,int(*p)(int),int x):N(aN)
{ int j,l,s;
r=new T[N];
e=new T[N];
for(S=1,j=0;j-N;S*=r[j++]=ar[j]);
m=new T[ S ];
for(e[0]=l=1;l-N;e[l++]=s) for(s=1,j=N-1;j>=N-l;s*=r[j--]);
for(j=0;j-S;m[j++]=p(x));
}
template < class T > void Narray< T >::print()
{
int j,l;
for(l=0;l-S;cout << m[l++] << '\t') for(j=1;j-N;) if(l % e[j++]==0) printf("\n");
cout << endl;
}
template< class T > Narray< T >& Narray< T >::operator=(const Narray< T >& r)
{ int j;
if(this!=&r) for(j=0;j-S;j++) m[j]=r.m[j];
return *this;
}
template < class T > Narray< T > Narray< T >::operator+(Narray< T >& a)
{ int j;
Narray< T > R(N,r,num,0);
for(j=0;j-S;j++) R[j]=m[j]+a.m[j];
return R;
}
int init(int i)
{
return rand() % i;
}
int num(int i)
{
return i;
}
#define K 3 // для трёхмерного массива
#define L 2 // для двухмерного массива
int main()
{
srand(time(NULL));
{
int r[K]={2,3,4};
Narray<int> Y(K,r,num,0); Y.print();
Narray<int> M(K,r,init,5); M.print();
Narray<int> N(K,r,init,4); N.print();
Y=M+N;
Y.print();
Y=M;
Y.print();
}
{
int r[L]={2,3};
Narray<int> Y(L,r,num,0); Y.print();
Narray<int> M(L,r,init,5); M.print();
Narray<int> N(L,r,init,4); N.print();
Y=M+N;
Y.print();
Y=M;
Y.print();
}
return 0;
}
Функция проходится по массиву и в самом начале проверяет, является ли элемент массивом или простым объектом.
Ни на одном известном мне языке невозможно инициализировать массив, количество измерений которого неизвестно.
Александр Назаренко
Это понятно.
Вопрос о куске кода, который обращается к уже инициализировнному массиву.
Ну, не писать же разные коды для разной размерности.
Вопрос о куске кода, который обращается к уже инициализировнному массиву.
Ну, не писать же разные коды для разной размерности.
Похожие вопросы
- Напишите программу для расчета среднего арифметического всех элементов числового массива рекурсией
- Сравнить 2 массива через рекурсию
- Стоит ли использовать рекурсию в целом? (+)
- Рекурсия, возникли проблемы с изучением рекурсии, не могли бы подсказать книги или видео про обьяснение рекурсии
- Ошибка в программе delphi. Рекурсия
- Вопрос тем, кто хорошо знаком с рекурсией. Язык Си (но это второстепенно)...
- Подскажите практическую задачку на углубленное понимание что такое рекурсия?
- 1.Заполнить массив случайными числами. Вывести элементы массива на экран. Заменить все его минимальные элементы нулями.
- Задачка на Delphi, рекурсия...
- Рекурсия ф-ии
Ваш пример содержит РАЗНЫЕ варианты кода для 2- и 3-мерного массива.