⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 VC++ 写的一个矩阵计算器程序
💻 CPP
字号:
#include<iostream.h>
#include<stdlib.h>
#include<conio.h>
#include"rank.cpp"
#include"qiuli.cpp"
#include"change.cpp"
#include"add.cpp"
#include"det.cpp"
#include"multiply.cpp"

//******************************以下是定义矩阵类****************************************
class Matrix
{
public:	
	double*q;
	int n;
	//**************************************************
    Matrix()//构造函数
	{
		n=0;
	}
	//**************************************************
	void input()//输入函数
	{
		cout<<"请输入矩阵的阶数:"<<endl;
		cin>>n;
	    q=new double[n*n];   
        for(int m1=0;m1<n;m1++)
		{
		    for(int n1=0;n1<n;n1++)
			{
			    int x1=m1+1;
			    int y1=n1+1;
			    cout<<"请输入第"<<x1<<"行第"<<y1<<"列的数据"<<endl;
			    cin>>q[m1*n+n1];//输入第m1+1行第n1+1列的数
				while(!cin)//当输入的数据类型与定义的变量类型不一致
				{
					char str[20];
					cin.clear();  //清空输入缓冲区
					cin.getline(str,20);//接收原输入数据
					cout<<"非法的输入,请输入一个整数或小数!"<<endl;
					cin>>q[m1*n+n1];//重新输入
				}
			}
		}
	}
	//**************************************************
    void output(double *r,int n1)//输出函数
	{
        for(int m2=0;m2<n1;m2++)
		{
		    for(int n2=0;n2<n1;n2++)
			{
			    cout.precision(6); 
                cout.setf(ios::scientific,ios::floatfield); //用科学记数法输出
                cout<<r[m2*n1+n2]<<" ";
			}
			cout<<endl;
		}
	}
};
//*************************以上是定义矩阵类************************************

//*****************************************************************************
void copy(double*q1,Matrix ma)//复制函数,复制矩阵
	{
		for(int m3=0;m3<ma.n;m3++)
		{
		    for(int n3=0;n3<ma.n;n3++)
			{ 
				q1[m3*ma.n+n3]=ma.q[m3*ma.n+n3];
			}
		}
	}
//*****************************************************************************

void check(Matrix &ma1)//用户输入矩阵并要求用户进行确认
{
	char choice2;
	int hang,lie;
	cout<<"输入矩阵:"<<endl;
	ma1.input();
	system("cls");
	do
	{
	cout<<"你输入的矩阵是:"<<endl;
	ma1.output(ma1.q,ma1.n);
	cout<<"确定吗?Y=确定,N=重新输入"<<endl;
	cin>>choice2;
	if(choice2=='N'||choice2=='n')       //如果出现错误,可以输入错误的行列数,进行修改
	{
		do
		{
			cout<<"请输入出错的数所在的行"<<endl;
			cin>>hang;
			cout<<"请输入出错的数所在的列"<<endl;
			cin>>lie;
			if(hang>ma1.n||lie>ma1.n)//如果行列超限,输出出错提示
			{
				cout<<"错误的行列数!"<<endl<<endl;
			}
		}while(hang>ma1.n||lie>ma1.n);//重新输入出错的数所在的行列数
		cout<<"请输入正确的数!"<<endl;
		int m=(hang-1)*ma1.n+lie-1;
		double num=ma1.q[m];
		cin>>ma1.q[m];
		system("cls");
		cout<<"已将第"<<hang<<"行第"<<lie<<"列的数据"<<num<<"修改为"<<ma1.q[m]<<endl<<endl;		
	}//if
	}while(choice2!='y'&&choice2!='Y');
}
//*****************************************************************************

void main()//主函数
{
	Matrix ma2;//ma2用来做单矩阵运算(转置,求逆,求秩,求行列式的值)
	Matrix ma3;
	Matrix ma4;//ma3,ma4用来做双矩阵运算(相加,相乘)
	double*p0;
	double*p1;
    double*p2;
    double*p3;
	double*p4;//p0,p1,p2,p3,p4用来做单矩阵运算(p1,p3转置,p0求逆,p2求秩,p4求行列式的值)
	double*p5;
	double*p6;//p5,p6用来做双矩阵运算
    int choice1;
	do
	{
		system("cls");
		cout<<endl;
		cout<<"1.单矩阵运算(转置,求逆,求秩,求行列式的值)"<<endl;//输出选择菜单
		cout<<"2.双矩阵运算(相加,相乘)"<<endl;
		cout<<"3.退出系统"<<endl;
		cout<<"请选择,并在选择后按ENTER键:";//输出选择菜单
		cin>>choice1;
		switch(choice1)
		{
		    case 1:
				{
					system("cls");
					cout<<"单矩阵运算"<<endl;
	                cout<<endl;					
					check(ma2);//输入要进行运算的矩阵
					system("cls");
					//**************************************************
					p0=new double[ma2.n*ma2.n];
					p1=new double[ma2.n*ma2.n];
					p2=new double[ma2.n*ma2.n];
					p3=new double[ma2.n*ma2.n];
					p4=new double[ma2.n*ma2.n];	//动态分配数组
					//**************************************************
					copy(p0,ma2);
					copy(p1,ma2);
					copy(p2,ma2);
					copy(p4,ma2);
					//**************************************************
					cout<<"原矩阵是:"<<endl;
					ma2.output(ma2.q,ma2.n);//输出原矩阵
					cout<<endl;
					//**************************************************
					cout<<"转置矩阵是:"<<endl;
					change(p3,p1,ma2.n);//完成转置运算
					ma2.output(p3,ma2.n);//输出转置结果
					cout<<endl;
    				//**************************************************
					cout<<"矩阵的秩是:"<<rank(p2,ma2.n,ma2.n)<<endl;//求秩并输出矩阵的秩
                    cout<<endl;
					//**************************************************
					cout<<"原矩阵的逆矩阵是:"<<endl;//求原矩阵的逆矩阵
					int i=rinv(p0,ma2.n);
					if(i==1){ma2.output(p0,ma2.n);}
					//**************************************************
					double detnum=sdet(p4,ma2.n);
					cout<<"\n原矩阵行列式的值是:"<<detnum<<endl;//求行列式的值
					//**************************************************
					delete[ma2.n*ma2.n]p4;
					delete[ma2.n*ma2.n]p3;
					delete[ma2.n*ma2.n]p2;
					delete[ma2.n*ma2.n]p1;
					delete[ma2.n*ma2.n]p0;
					delete[ma2.n*ma2.n]ma2.q;//删除动态申请的空间
					//**************************************************
					cout<<"\n\n按任意键继续."<<endl;
	                getch();
					break;
				}
		    case 2:	
				{
					system("cls");
					cout<<"双矩阵运算:"<<endl;
					cout<<endl;
					//**************************************************
					cout<<"请输入第一个矩阵:"<<endl;//输入两个矩阵
					check(ma3);
					system("cls");
					cout<<"请输入第二个矩阵:"<<endl;
					check(ma4);
					//**************************************************
					p6=new double[ma3.n*ma4.n];
					p5=new double[ma3.n*ma4.n];
					system("cls");
					//**************************************************
					cout<<"第一个矩阵是:"<<endl;//输出两个矩阵
					ma3.output(ma3.q,ma3.n);
					cout<<endl;
					cout<<"第二个矩阵是:"<<endl;
					ma4.output(ma4.q,ma4.n);
					cout<<endl;
					//**************************************************
					if(ma3.n!=ma4.n)//判断是否符合相乘的条件
					{
						cout<<"不符合矩阵的乘法规则,无法相乘!"<<endl;
					}
					else
					{
                        cout<<"第一个矩阵乘以第二个矩阵的结果是:"<<endl;
						multiply(ma3.q,ma4.q,p6,ma3.n);//相乘
						ma3.output(p6,ma3.n);//输出相乘结果
					}
					cout<<endl;
					//**************************************************
					if(ma3.n==ma4.n)//判断是否符合相加的条件
					{
						add(ma3.q,ma4.q,p5,ma3.n);//相加
						cout<<"第一个矩阵加上第二个矩阵的结果是:"<<endl;
						ma3.output(p5,ma3.n);//输出相加结果
					}
					else
					{
						cout<<"不符合矩阵的加法规则,无法相加!"<<endl;
					}
					//**************************************************
					delete[ma4.n*ma4.n] ma4.q;
					delete[ma3.n*ma3.n] ma3.q;
					delete[ma3.n*ma4.n] p5;
					delete[ma3.n*ma4.n] p6;//删除动态申请的空间
					//**************************************************
					cout<<"\n\n按任意键继续."<<endl;
	                getch();
					break;		
				}//case2	
		}//switch
	}while(choice1!=3);
}//main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -