#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip> //头文件,包含所需要的函数
using namespace std; //命名空间
typedef struct{ //定义矩阵结构体
int n;
int m;
int *data;
}Matrix;
void MatrixMenu(); //菜单函数
Matrix IntiMatrix(); //初始化矩阵函数
void PrintMatrix(int *p, int a, int b); //显示矩阵函数
void MatrixMultiply(Matrix p, Matrix q); //矩阵相乘函数
void MatrixTransposition(int *p, int a, int b); //矩阵转置函数
//主函数
//功能:控制整个程序的运行
int main()
{
Matrix mat; //定义矩阵结构体变量
mat.data = NULL; //结构体内的指针指向空
mat.m = mat.n = 0; //矩阵的行数和列数为0
char a; //定义辅助switch控制变量
do //do...while,控制程序运行
{
MatrixMenu(); //调用菜单函数
cin >> a;
switch (a) //用switch来控制程序
{
case ‘I‘:
mat = IntiMatrix(); //调用初始化矩阵函数
break;
case ‘M‘:
MatrixMultiply(IntiMatrix(), IntiMatrix()); //调用矩阵相乘函数
break;
case ‘T‘:
MatrixTransposition(mat.data, mat.n, mat.m); //调用矩阵转置函数
break;
case ‘P‘:
PrintMatrix(mat.data, mat.n, mat.m); //调用显示矩阵函数
break;
case ‘E‘:
cout << "您已退出!" << endl; //程序终止接口
break;
default: //错误输入提示
cout << "输入有误,请重新输入!"<< endl;
break;
}
} while (a!=‘E‘); //判断是否选择了退出
return 0; //整个程序结束
}
//菜单函数
//功能:显示菜单
void MatrixMenu()
{
cout << "----------矩---阵---运---算----------" << endl;
cout << "\tI:初 始 化 n * m 矩 阵" << endl;
cout << "\tM:求 两 个 矩 阵 相 乘" << endl;
cout << "\tT:求 转 置 矩 阵" << endl;
cout << "\tP:显 示 矩 阵" << endl;
cout << "\tE:退 出" << endl;
cout << "-------------------------------------" << endl;
cout << "请输入您的选择:";
}
//初始化矩阵函数
//功能:初始化一个矩阵,并将该矩阵结构体返回
Matrix IntiMatrix()
{
Matrix ma; //定义矩阵结构体变量
int *k; //定义辅助指针
cout << "请输入行数 n 与列数 m :";
cin >> ma.n >> ma.m; //输入矩阵的行数和列数
ma.data = (int *)malloc(sizeof(int)*ma.n*ma.m); //为结构体内的指针申请存储空间
srand(time(NULL)); //生成随机数种子
k = ma.data; //辅助指针指向搜元素
for (int i = 0; i < ma.n*ma.m; ++i)
{
*(k++) = rand() % 100 + 1; //给每一位元素赋值随机数
}
cout << endl;
cout << ma.n << "*" << ma.m << "=" << ma.n*ma.m << "随机数矩阵已成功生成!\n" << endl;
return ma; //返回矩阵机结构体
}
//矩阵相乘函数
//功能:生成两个矩阵,将其相乘
void MatrixMultiply(Matrix q,Matrix p)
{
cout << "P矩阵如下:"<<endl;
PrintMatrix(p.data, p.n, p.m); //显示生成的P矩阵
cout << "Q矩阵如下:" << endl;
PrintMatrix(q.data,q.n,q.m); //显示生成的Q矩阵
if (p.m != q.n) //判断是否符合矩阵生成的条件
{
cout << "P矩阵和Q矩阵不符合矩阵相乘的条件!请保证P矩阵的列数与Q矩阵的行数相等!" << endl;
return; //不符合则返回主函数
}
else
{
Matrix matmul; //定义新矩阵结构体
matmul.data = (int *)malloc(sizeof(int)*p.n*q.m); //申请p.n*q.m个空间
for (int s = 0; s < p.n*q.m; s++){ //初始化p.n*q.m个元素
*(matmul.data+s) = 0;
}
for (int i = 1; i <= p.n; i++){ //三个for循环实现矩阵相乘
for (int j = 1; j <= q.m; j++){
for (int k = 1; k <= p.m; k++){
*(matmul.data+j-1+(i-1)*q.m) += *(p.data + (i - 1)*p.m + k - 1)*(*(q.data + (k - 1)*q.m + j - 1));
}
}
}
cout << "P矩阵与Q矩阵乘积为:" << endl;
PrintMatrix(matmul.data,p.n,q.m); //显示矩阵相乘的新矩阵
}
}
//矩阵转置函数
//功能:将矩阵转置
void MatrixTransposition(int *p, int a, int b)
{
if (p == NULL) //判断传入该函数的矩阵是否为空
{
cout << "请先初始化矩阵!" << endl;
return ; //返回主函数
}
else
{
int *t; //定义转置矩阵的元素指针
t = (int *)malloc(sizeof(int)*a*b); //为该指针申请空间
for (int j = 1; j <= b; j++) //实现转置的算法
{
for (int i = 1; i <= a; i++)
{
*(t + (j - 1)*a + i - 1) = *(p + (i - 1)*b + j - 1); //转置赋值
}
}
cout << "转置矩阵为:" << endl;
PrintMatrix(t, b, a); //显示转置后的矩阵
}
}
//显示矩阵函数
//功能:显示矩阵
void PrintMatrix(int *p, int a, int b)
{
if (p == NULL) //判断传入该函数的矩阵是否为空
{
cout << "请先初始化矩阵!" << endl;
return; //返回主函数
}
else
{
cout << a << "*" << b << "的矩阵如下:" << endl;
for (int i = 0; i < b; i++) //显示矩阵周围的线
cout << " _ _ _";
cout << endl;
for (int i = 1; i <= a; i++){ //显示矩阵周围的线
cout << "|";
for (int j = 1; j <= b; j++){ //输出矩阵元素的循环
cout << " " << setw(4)
<< *(p + j - 1 + (i - 1) * b) << " "; //输出矩阵元素
}
cout << "|" << endl;
}
for (int i = 0; i < b; i++) //显示矩阵周围的线
cout << " _ _ _";
cout << endl;
}
}