c++矩阵简单的计算器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

for (int j=0;j<width; j++) { *(num+i*width+j)=*(jz.num+i*jz.width+j); } } return *this; } 说明: 实际上为矩阵的简单拷贝。
9、转置函数Matrix Matrix::zhuanzhi() 实现: Matrix Matrix::zhuanzhi() { flag=1; int *n=new int[length*width]; for(int i=0;i<length;i++) { for(int j=0;j<width;j++) { *(n+j*length+i)=*(num+i*width+j); } } Matrix temp(width,length,n);
11、析构函数析构函数Matrix ::~Matrix() 实现: Matrix ::~Matrix() { if(length*width==1) { delete num; //删除由new创建的对象,释放指针所指向的
内存空间
} else { delete [] num; //删除由new创建的数组,释放指针所指向
的内存空间
} 说明: 用来删除给矩阵分配的内存。
}
12、提示输入矩阵行列数的函数void getmn (int &m,int &n) 实现: void getmn ( int &m, int &n) //引用做形参,实现双向传递 { while(1) { cout<<"请输入矩阵维数:"<<endl; cout<<"行数:"; cin>>m; cout<<"列数:"; cin>>n; if(m>0&&n>0) { return; } } } 说明:用来提示用户输入矩阵的各元素。
(1)UML图
num: int* length: int width: int flag: int=0
Matrix
+ Matrix (int l :int, w: int, n: int*) + Matrix () + Matrix (jz :Matrix &) + setnum (l :int, w : int) :void + operator+ (const jz: Matrix &): Matrix + operator-(const jz: Matrix &):Matrix + operator*(const jz :Matrix &): Matrix + zhuanzhi ():Matrix + show() :void + ~Matrix() <<static>> +getflag ():int
(2)主函数中的书写 1、主函数中首先用矩阵类Matrix定义要计算的矩阵对象,j1与 j2的运算结果是j3。
2、运用switch语句实现一个选择菜单,按照菜单提示来选择相 应要进行的运算功能。
3、在选择一个要进行的运算后,用getmn()函数获取输入提示; 再书写要进行的功能运算式,当静态函数getflag()==1时,说 明可以进行运算;然后执行if条件句,分别输出要进行运算矩 阵j1和j2运算结果j3;当执行完switch语句一个选择分支功能 后就break跳出该条件句。 4、用while语句进行整个switch语句实现的菜单一个选择循环, 当输入要运算功能的选择字符时,while语句执行。输入Q时退 出矩阵计算器。
(2)流程图
开始
定义

Q?

百度文库
switc h
A

M

S

F

T

fla g 真 +运算
fla g -运算

fla g

fla g 真 =运算
fla g 转置

*运算
输出
输出
输出
输出
输出
break
break
break
break
break
退出
(1)类中的函数成员定义及其实现 1、有参数构造函数Matrix (int l, int w, int *n); 实现: Matrix ::Matrix (int l, int w, int *n) { length=l; width=w; num=new int [length*width]; int *p=num; for (int i=0;i<length*width ;i++) { *p++=*n++; } } //为有参数的对象初始化。
5、加法运算符重载函数Matrix Matrix ::operator+(const Matrix &jz) 实现: Matrix Matrix ::operator +(const Matrix &jz) { if (length==jz .length && width==jz .width) { flag=1; int *n=new int [length*width]; for (int i=0;i<length*width; i++) { *(n+i)=*(num+i)+*(jz .num+i); } Matrix temp (length, width, n); if (length*width>1) { delete []n; }
if(length*width==1) { delete n; } else { delete [] n; } return temp; } 说明:
对矩阵进行转置运算。
10、显示结果函数void Matrix::show() 实现: void Matrix::show() { if(length*width!=0) { for(int i=0;i<length*width;i++) { cout.width(5); cout<<*(num+i); if((i+1)%width==0) { cout<<endl; } } } } 说明:显示矩阵的各元素和矩阵的格式。
cout <<"请输入第"<<i+1<<"行元素:"<<endl ; for (int j=0;j<width;j++) { cout <<"第"<<j+1<<"列元素:"; cin >>*(p+I *width +j); }
} } }
说明: 矩阵输入函数主要读进去需要进行计算的原始矩阵,要注 意的是矩阵的行列数不能为1,所以应该用选择语句排除一 行一列的矩阵出现。首先用动态内存分配,给要录入的矩 阵开辟需要录入的空间length*width,创建元素个数为 length*width的对象数组。然后运用循环语句,将矩阵的 每个元素录入。
1、本程序中函数模块相对独立,可以进行单个运算 符重载函数的书写及其测试,将每种重载运算符函数 写好,并且测试成功后再进行合并到一个类中,这样 感觉会很清晰的写完这个相对比较大的程序。
2、给要计算的矩阵开辟空间,最后一定要用析构函 数进行空间的释放,否则程序再运行几次后可能会因 为内存不足而不能运行。
2、无参构造函数(默认形式的构造函数)Matrix() 实现: Matrix ::Matrix() { length=1; width=1; num=new int(1); } 说明:为无参数的对象进行初始化。
3、矩阵的拷贝构造函数Matrix ::Matrix (Matrix & jz) 实现: Matrix ::Matrix (Matrix & jz) { length= jz. length; width= jz. width; num=new int [length*width]; for (int i=0;i<length*width; i++) { *(num +i)=*(jz. num+i); } } 说明: 使用拷贝构造函数的目的,是用已存在的对象jz去初始化 新建立的对象。
1、熟练掌握和运用c++编写程序代码的能力。 2、初步了解矩阵加法、减法、乘法、赋值和 转置的算法设计。 3、掌握基本的运算符重载函数的书写。 4、掌握静态数据成员和静态成员函数的具体 声明和实现,体会它们的特殊作用。 5、掌握并体会动态内存分配的实际应用。 6、运用简单的循环实现简单的菜单程序。
for(i=0;i<length;i++) { for(j=0;j<width;j++) { for(t=0;t<jz.width;t++) { *(n+i*jz.width+t)+=*(num+i*width+j)**(jz.num +j*jz.width+t); } } } Matrix temp(length,jz.width,n); if(length*jz.width==1) { delete n; }
else { delete [] n;
} return temp;
} }
说明: 矩阵乘法要求第一个矩阵的列数等于第二个 矩阵的行数。
8、赋值运算符重载函数Matrix Matrix::operator=(const Matrix &jz )
实现: Matrix Matrix::operator =(const Matrix &jz) { if(width*length==1) { delete num; } else { delete [] num; } flag=1; length=jz.length; width=jz.width; num=new int[jz.length*jz.width]; for(int i=0;i<length;i++) {
else { delete []n; } return temp;
} else {
flag=0; Matrix temp; return temp; } } 说明: 减法运算符重载为类的成员函数,可以通过类的每个对象访问重 载的运算符。 减法矩阵运算,也要求两个矩阵的行列数分别相等。
7、乘法运算符重载函数Matrix Matrix::operator*(const Matrix &jz ) 实现: Matrix Matrix::operator*(const Matrix &jz) { if(width==jz.length) { flag=1; int *n=new int[length*jz.width]; int i=0; int j=0; int t=0; for(i=0;i<length;i++) { for(j=0;j<jz.width;j++) { *(n+i*jz.width+j)=0; }
4、矩阵输入函数void Matrix ::setnum (int l, int w)
实现:
void Matrix ::setnum (int l, int w) { length=l; width=w; if (l==0||w==0) { cout<<“矩阵行列不能为0!"<<endl; return ; } else { delete []num; num=NULL; num=new int[length*width]; //动态分配length*width大小的 空间,创建对象数组 int *p=num; cout<<length<<"*"<<width<<"矩阵:"<<endl; for(int i=0;i<length;i++) {
else
{
delete n; } return temp;
} else {
Matrix temp; flag=0; return temp; }
} 说明: 加法运算符重载为类的成员函数,可以通过类的每个对象访问重 载的运算符。 加法矩阵运算,要求两个矩阵的行列数分别相等。
6、减法运算符重载函数Matrix Matrix ::operator -(const Matrix &jz) 实现:Matrix Matrix ::operator -(const Matrix &jz) { if (length==jz .length && width==jz .width) { flag=1; int *n=new int [length*width]; for (int i=0;i<length*width; i++) { *(n+i)=*(num+i)-*(jz.num+i); } Matrix temp (length,width,n); if (length*width==1) { delete n; }
相关文档
最新文档