#include <iostream>
using namespace std;
const int MaxSize=100;
// 定义矩阵的最大行数和列数
// 定义一个方向标,用来求出一个元素周围的值
struct position
{
int x;
int y;
};
// 求矩阵的四边的数值总和
// int matrix[MaxSize][MaxSize] 为矩阵
// maxrow 为该矩阵的行数 maxline 为矩阵的列数
int GetCircleSum(int matrix[MaxSize][MaxSize],int maxrow,int maxline)
{
int sum=0;
int i;
//求矩阵上下两行数据元素之和
for(int i=0;i<maxline;i++)
{
sum+=matrix[0][i];
sum+=matrix[maxrow-1][i];
}
//求矩阵左右两边除了第一个和最后一个数据元素之外的其他数据元素之和,
for(i=1;i<maxrow-1;i++)
{
sum+=matrix[i][0];
sum+=matrix[i][maxline-1];
}
return sum;
}
// 使用前提:矩阵为方阵,也就m=n=size
// 该函数是:求出对角线之和
int GetSum(int matrix[MaxSize][MaxSize],int size)
{
int sum=0;
int i;
//求主对角线数据元素之和
for(int i=0;i<size;i++)
{
sum+=matrix[i][i];
}
cout<<" the sum of one of the diagonal is:"<<sum<<endl;
//求副对角线上数据元素之和
sum=0;
for(i=0;i<size;i++)
{
sum+=matrix[size-1-i][size-1-i];
}
cout<<" the sum of the other diagonal is:"<<sum<<endl;
return sum;
}
// 该函数是:输入一个矩阵中的位置,求出它附近相邻的元素之和
// int matrix[MaxSize][MaxSize] 为矩阵
// maxrow 为该矩阵的行数 maxline 为矩阵的列数
// row 为输入元素的行数 line 为输入元素的列数
int GetAroundSum(int matrix[MaxSize][MaxSize],int row,int line,int maxrow,int maxline)
{
//利用位置结构体,以输入数据元素的下标为原点,计算该数据元素周围其他8个点的相对位置
position dir[8];
dir[0].x=1;dir[0].y=0;
dir[1].x=1;dir[1].y=1;
dir[2].x=0;dir[2].y=1;
dir[3].x=-1;dir[3].y=1;
dir[4].x=-1;dir[4].y=0;
dir[5].x=-1;dir[5].y=-1;
dir[6].x=0;dir[6].y=-1;
dir[7].x=1;dir[7].y=-1;
int sum=0;
//求出一个数据元素周围8个数据元素的方向标,并以此作为数组下标,求出这些数据元素之和
for(int i=0;i<8;i++)
{
int x=row+dir[i].x;
int y=line+dir[i].y;
if(x<0||x>maxrow)
continue;
if(y<0||y>maxline)
continue;
sum+=matrix[x][y];
}
return sum;
}
//求从A[0][0]开始的互不相邻的各元素之和
int GetInterSum(int matrix[MaxSize][MaxSize],int row,int line)
{
int sum=0;
for(int i=0;i<row;i++)
{
if((i%2)==0)
{
for(int j=0;j<line;j=j+2)
{
sum+=matrix[i][j];
}
}
else
{
for(int j=1;j<line;j=j+2)
{
sum+=matrix[i][j];
}
}
}
return sum;
}
// 菜单选项
void menu()
{
cout<<" **************** 数组应用 ****************"<<endl;
cout<<" *** ***"<<endl;
cout<<" *** 菜单 ***"<<endl;
cout<<" *** 输入矩阵 PRESS 1 ***"<<endl;
cout<<" *** 求对角线之和 PRESS 2 ***"<<endl;
cout<<" *** 求不相邻元素之和 PRESS 3 ***"<<endl;
cout<<" *** 求数组靠边元素之和 PRESS 4 ***"<<endl;
cout<<" *** 输出矩阵 PRESS 5 ***"<<endl;
cout<<" *** 退出程序 PRESS 0 ***"<<endl;
cout<<" *** ***"<<endl;
cout<<" **************************************************"<<endl;
cout<<" PRESS :";
}
// 输入矩阵
void Input(int matrix[MaxSize][MaxSize],int &row,int &line)
{
cout<<" 输入矩阵的行数: ";
cin>>row;
cout<<" 输入矩阵的列数: ";
cin>>line;
//判断输入数据是否合理
if(row*line==0)
{
cout<<" data wrong! Please input again!"<<endl;
Input(matrix,row,line);
}
cout<<" 输入矩阵: "<<endl;
for(int i=0;i<row;i++)
{
for(int j=0;j<line;j++)
{
cin>>matrix[i][j];
}
}
}
// 输出矩阵
void Output(int matrix[MaxSize][MaxSize],int row,int line)
{
cout<<" 输出矩阵: "<<endl;
for(int i=0;i<row;i++)
{
for(int j=0;j<line;j++)
{
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
int row,line;
int matrix[MaxSize][MaxSize];
bool flag=false;
while(1) // 处理函数的过程
{
menu();
int key;
cin>>key;
switch(key)
{
//输入矩阵
case 1:
Input(matrix,row,line);
flag=true;//确定每次操作开始时,总是先输入矩阵
break;
//计算矩阵对角线之和
case 2:
if(flag)
{
if(row==line)
{
cout<<GetSum(matrix,row)<<endl;
}
else
{
cout<<" m!=n "<<endl;
}
}
else
{
cout<<"还未输入矩阵!请先输入矩阵"<<endl;
}
break;
//计算从第一个数据元素开始的不相邻的数据元素之和
case 3:
if(flag)
cout<<GetInterSum(matrix,row,line)<<endl;
else
cout<<"还未输入矩阵!请先输入矩阵"<<endl;
break;
//计算数组靠边数据元素之和
case 4:
if(flag)
cout<<GetCircleSum(matrix,row,line)<<endl;
else
cout<<"还未输入矩阵!请先输入矩阵"<<endl;
break;
//退出程序
case 5:
if(flag)
Output(matrix,row,line);
else
cout<<"还未输入矩阵!请先输入矩阵"<<endl;
break;
default :
exit(0);
}
}
return 1;
}