#include <locale>
#include <limits>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <stdexcept>
using namespace std;
// Ввод с подсказкой
template<class T>
T input(const char *const msg)
{
while(true)
{
T res;
cout<<msg;
cin>>res;
if(cin.fail())
{
cout<<"Ошибочный ввод"<<endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
}
else
{
cin.ignore(numeric_limits<streamsize>::max(),'\n');
return res;
}
}
}
// Суммирует по диагональ
template<class T>
T sumDiag(T *matrix,size_t dim,size_t no)
{
T res=0;
// Вычисляем индекс первого элемента
size_t i=0,j=0;
if(no<dim)
{
i=dim-1-no;
}
else if(no<(((dim-1)<<1)+1))
{
j=no-dim+1;
}
else
{
throw invalid_argument("Номер диагонали выходит за диапазон матрицы");
}
// Указатель на первый суммируемый элемент
T* current=matrix+i*dim+j;
// Количество элементов в диагонали
size_t count=dim-(i>j?i:j);
// Суммирование
while(count--)
{
res+=*current;
current+=dim+1;
}
return res;
}
int main()
{
srand(static_cast<unsigned int>(time(0)));
setlocale(LC_ALL,"russian");
size_t dim=input<size_t>("Введите размерность матрицы:");
int* matrix=0
,*vector=0;
if(dim)
{
try
{
matrix=new int[dim*dim];
size_t dimVec=(dim<<1)-1;
vector=new int[dimVec];
cout<<"Матрица:"<<endl;
// Заполняем матрицу случайными числами и печатаем ее
int* current=matrix;
for(size_t i=0;i<dim;++i)
{
for(size_t j=0;j<dim;++j,++current)
{
*current=rand()%101-50;
cout<<setw(4)<<*current<<' ';
}
cout<<endl;
}
// Считаем суммы
for(size_t i=0,j=0;i<dimVec;++i)
{
vector[j++]=sumDiag(matrix,dim,i);
}
// Выводим результат
cout<<"Получен вектор:"<<endl;
for(size_t i=0;i<dimVec;++i)
{
cout<<vector[i]<<' ';
}
cout<<endl;
}
catch(bad_alloc)
{
cout<<"Не могу выделить память"<<endl;
}
if(matrix)
{
delete[]matrix;
}
if(vector)
{
delete[]vector;
}
}
else
{
cout<<"С такой размерностью матрицы нет"<<endl;
}
system("PAUSE");
return 0;
}
Введите размерность матрицы:5
Матрица:
-28 -1 -15 25 -26
-28 15 9 4 14
41 4 1 -41 41
25 -42 -24 3 16
-22 28 -37 -30 -16
Получен вектор:
-22 53 -38 -78 -25 -17 30 39 -26
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.