0508190114 车向前 矩阵旋转反射:反射矩阵
C++ 课程设计
《矩阵的旋转反射》
指导老师: 张微
设计者: 车向前
学号 0508190114
程序功能介绍
实现矩阵的旋转反射程序
程序设计要求
1)设计一个矩阵类,将相应的函数和数据封装到类中,简化程序。
2)修改程序结构,使程序可以反复执行,直至按键退出为止。
3)本程序用数组表示5*5矩阵,将其改为根据输入矩阵的大小动态分配空间[n][n]来放置数据,其中n 为用户可输入的任意整数。
4)增加类的构造函数和成员函数,使得矩阵数据既可以用在对象初始化的赋值,也可以通过键盘赋值,还可以通过读数据文件输入。
5)用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮点型数据,执行程序时,分别定义一个整型矩阵和一个浮点型矩阵进行验证。
6)增加程序功能,除实现n*n矩阵的旋转反射外,还增加
a 求矩阵的摸;
b 可以通过键入的行号与列号,任意修改矩阵中的元素值;
c 可以给定矩阵中的某一元素值,查询其所在的行号和列号,,
关键函数说明
void Show(int k=1); //输出矩阵 void R90(); //旋转90度 void R180(); //旋转180度 void R270(); //旋转270度 void ReflectX(int k=1); //X轴反射 void ReflectY(int k=1); //Y轴反射 void ReflectO(int k=1); //对角线反射 int LookForData(); //查找 int ModifyData(); //修改 int ModefyData(int row,int column); //修改 double Range(); //求模 void InputFromFile(char *filename); //从文件中输入矩阵 void InputFromKeyboard(); //从键盘中输入矩阵
主要思路
定义出类来,紧接着把主函数弄出来,再按调用顺序把每个函数依次列出来,对教材原程序增加的很多。
个人设计心得:
坦白的说,上学期我的C++成绩其实不怎么样,有很多的地方虽然能够做出来,但深究其中的缘由,我却是一知半解的,刚开始的时候,源代码需要我来阅读,虽然花了很长的时间,但体会不是特别深。后来我把基础教材对照着源代码阅读,效果感觉好多了。
但真正上机操作时,就在很多方面上出现了问题,虽然自己的能力最后还是解决了,但
接下来的增加功能上却又感到了力不从心。在这次编程的过程中,我不断的在运行中发现自己的错误,有的检查出来的错误我一时看不出来时怎么回事,就又回归课本,深深地研究其中的关系,并问了舍友,说实话,与其他同学相比,我选的这个程序难度其实不大,但由于我上学期基础不是太好,所以大部分时间都耗在改错误上了,所以我刚开始尝试做过的四则运算课程中途无奈的放弃了。
程序的思路其实很简单明确,但问题就在于难以看明白编译查错的那一堆错误怎样改动,有时就那么几个错误,但绞尽脑汁花好长时间挨个试,不停 的翻书才能找出来,一次是减少到出现14个错误,最后实在是怎么也看不懂哪里错了,索性把标注的部分删掉重新写了一遍,居然只剩了1个错误,真是惊喜, 还有临近结束时本来已经零个错误了,但发现求模的要求根本没达到,所以只好再重新改下去。
在课程设计创新方面,由于程序的确复杂度不高,以及时间并不是很充足,所以只是尽善尽美的完成了课程设计的基本要求。在以后的时间里还需要继续完善,毕竟一个完美的程序完成需要很长的调试时间,要付出很多精力。在此,向大四的贾磊表示谢意,他借给我他的宏基笔记本,使不用再去机房抢座位了,而且我还能在晚上下了晚自习在宿舍再次修改程序,这大大增加了我的可支配时间,
看着自己费尽辛劳所编的程序最后终于开花结果能够流畅的运行并满足了所有的要求,我心中的自豪感油然而生,紧接着又把界面添加了一点,使之更完美,以喜悦的心情写下了这份报告书,这么多天的辛勤和脑力折磨终于有了成果,黄天不负有心人,可以说,这次编程使我上学期很多不太明白的地方有了新的理解,比如析构函数,数组等方面,为了能取得好成绩,我花了恒多时间来做他。
最后,对我的任课指导老师张微表示由衷的敬意,谢谢,
程序各部分主要程序的详解如下所示:
#include
#include
#include
#include
template
class CMatrix
{
int nNum;
T**Mat;
T**MatR;
T**MatRefl;
T**Matr;
T**Matre;
public:
CMatrix();
CMatrix(int n);
~CMatrix();
void Show(int k=1); //输出矩阵
void R90(); //旋转90度
void R180(); //旋转180度
void R270(); //旋转270度
void ReflectX(int k=1); //X轴反射
void ReflectY(int k=1); //Y轴反射
void ReflectO(int k=1); //对角线反射
int LookForData(); //查找
int ModifyData(); //修改
int ModefyData(int row,int column); //修改
double Range(); //求模
void InputFromFile(char *filename); //从文件中输入矩阵
void InputFromKeyboard(); //从键盘中输入矩阵
};
/****************************************************/////////////////////////////////////////////////////////////////////////////////////////////////////按照要求设计的那个矩阵类,将相应的函数和数据封装到类中,简化程序///////////////////////////////////////////
void main()/////////////////////////////////////////////////这就是主函数啦////////////////////////////////////////////////
{
int r,c,k,n;
int choice,choice1,choice2,choice3,choice4,choice5;
CMatrix M;
do
{
cout
cout
cin>>choice;
switch(choice)
择:";
{ case 1: char Filename[20]; cout>Filename; M.InputFromFile(Filename);peak; case 2: M.InputFromKeyboard();peak; case 3: cout>choice1; switch(choice1) { case 1: cout>choice2; switch(choice2) { case 1:M.R90();peak; case 2:M.R180();peak; case 3:M.R270();peak; case 4:peak; default:choice2=4;peak; }peak; case 2: cout>choice3; switch(choice3) { case 1: cout>k; if(k==1) M.ReflectX(1); else M.ReflectX(2); peak; case 2: cout>k; if(k==1) M.ReflectY(1); else M.ReflectY(2); peak;
case 3: cout>k;
if(k==1) M.ReflectO(1);
else M.ReflectO(2);
peak;
case 4: peak;
default: choice3=4; peak;
}peak;
case 3: cout
cin>>choice4;
switch(choice4)
{
case 1: M.LookForData();peak;
case 2: cout
cin>>choice5;
switch(choice5)
{
case 1: M.ModifyData();peak;
case 2: cout
cin>>r;
cout
cin>>c;
M.ModefyData(r,c);peak;
default:peak;
}peak;
case 3: cout
case 4: peak;
default:peak;
}peak;
//case 4:peak;
default:peak;//choice=4;peak;
}
}
else exit(0);
}while(choice!=4);
}
/**********************************************************************
*//////////////////////////////////以下是我的各个函数的定义//////////////////////////////////////////
template
CMatrix::~CMatrix()// ////////////////////////////////析构函数//////////////////////////////////
{
for(int i=0;i
{
if(Mat[i]) delete []Mat[i];
if(MatR[i]) delete []MatR[i];
if(MatRefl[i]) delete []MatRefl[i];
if(Matr[i]) delete []Matr[i];
if(Matre[i]) delete []Matre[i];
}
}
/*************************************************************************/ template
void CMatrix::InputFromFile(char *filename)
{
int i,j;
ifstream infile; // ////////////////////////////////从文件输入的//////////////////////////////////
infile.open(filename);
if(!infile)
{
cout
exit(0);
}
for(i=0;i
for(j=0;j
infile>>Mat[i][j];
cout
Show(1);
}
/******************************************************************************/
template// ////////////////////////////////键盘输入的//////////////////////////////////
void CMatrix::InputFromKeyboard()
{
int i,j;
cout
for(i=0;i
for(j=0;j
{
cout
cin>>Mat[i][j];
}
}
/**********************************************************************************/
template
CMatrix::CMatrix()
{
int i,j,k=0;
T n=1.0;
cout
cin>>nNum;
Mat=new T*[nNum];
MatR=new T*[nNum];
MatRefl=new T*[nNum];
for(i=0;i
{
Mat[i]=new T;
MatR[i]=new T;
MatRefl[i]=new T;
}
for(i=0;i
for(j=0;j
{
Mat[i][j]=n;
n+=1.0;
}
}
/********************************************************************************/ template
void CMatrix::Show(int k)
{
int r,c;
if(k==1) Matre=Mat;
if(k==2) Matre=MatR;
if(k==3) Matre=MatRefl;
for(r=0;r
{ for (c=0;c
{
if(Matre[r][c]
cout
else
cout
}
cout
}
}
/****************************************************************************/ template
void CMatrix::R90()
{
int r,c;
for(r=0;r
for(c=0;c
MatR[nNum-c-1][r]=Mat[r][c];
cout
Show(1);
cout
Show(2);
}
/***************************************************************************/ template
void CMatrix::R180()// ////////////////////////////////转180度 //////////////////////////////////
{
int r,c;
for(r=0;r
for(c=0;c
MatR[nNum-c-1][nNum-r-1]=Mat[r][c];
cout
Show(1);
cout
Show(2);
}
/********************************************************************************/ template
void CMatrix::R270()// ////////////////////////////////转270度//////////////////////////////////
{
int r,c;
for(r=0;r
for(c=0;c
MatR[c][nNum-r-1]=Mat[r][c];
cout
Show(1);
cout
Show(2);
}
/*********************************************************************************/
template
void CMatrix::ReflectX(int k) // ////////////////////////////////函数反射////////////////////////////////// {
int r,c;
if(k==1)
{
for(r=0;r
for(c=0;c
MatRefl[r][c]=MatR[nNum-r-1][c];
cout
Show(2);
cout
Show(3);
}
else
{
for(r=0;r
for(c=0;c
MatRefl[r][c]=Mat[nNum-r-1][c];
cout
Show(1);
cout
Show(3);
}
}
/***************************************************************************/ template
void CMatrix::ReflectY(int k)
{
int r,c;
if(k==1)
{
for(r=0;r
for(c=0;c
MatRefl[r][c]=MatR[r][nNum-c-1];
cout
Show(2);
cout
Show(3);
}
else
{
for(r=0;r
for(c=0;c
MatRefl[r][c]=Mat[r][nNum-c-1];
cout
Show(1);
cout
Show(3);
}
}
/***************************************************************************/
template
void CMatrix::ReflectO(int k)
{
int r,c;
if(k==1)
{
for(r=0;r
for(c=0;c
MatRefl[r][c]=MatR[nNum-r-1][nNum-c-1];
cout
Show(2);
cout
Show(3);
}
else
{
for(r=0;r
for(c=0;c
MatRefl[r][c]=Mat[nNum-r-1][nNum-c-1];
cout
Show(1);
cout
Show(3);
}
}
/*******************************************************************************/
template
int CMatrix::LookForData()// ////////////////////////////////函数查找//////////////////////////////////
{
int i,j,k,l,t=0;
T Data;
cout
cin>>l;
if(l==1) Matr=Mat;
if(l==2) Matr=MatR;
if(l==3) Matr=MatRefl;
cout
cin>>k;
if(k==1)
{
cout
cin>>i;
cout
cin>>j;
cout
return 1;
}
if(k==2)
{
cout
cin>>Data;
for(i=0;i
for(j=0;j
{
if(Matr[i][j]==Data)
{
cout
t++;
}
}
if(t==0)
{
cout
return 0;
}
else return 1;
}
else return 0;
}
/**************************************************************************************/ template
int CMatrix::ModifyData()
{
int i,j,k;
T value,Data;
cout
cin>>i;
if(i==1) Matr=Mat;
if(i==2) Matr=MatR;
if(i==3) Matr=MatRefl;
cout
cin>>Data;
for(i=0;i
for(j=0;j
{
if(Matr[i][j]==Data)
{
cout
cout
cin>>value;
Matr[i][j]=value;
return 1;
}
}
if(Matr[i][j]!=Data)
{
cout
return 0;
}
}
/**************************************************************************************/ template
int CMatrix::ModefyData(int row,int column)
{
int i;
T value;
cout
cin>>i;
if(i=1) Matr=Mat;
if(i=2) Matr=MatR;
if(i=3) Matr=MatRefl;
else return 0;
cout
cout
cin>>value;
Matr[row][column]=value;
cout
/***************************************************************************************/
template // ///////////////////////////////////////////////我套用的课本求模公式/////////////// ////////////////////////////////// double CMatrix::Range()
{
int i,j,k,l;
double t;
cout
cin>>l;
if(l==1)
{
Matr=Mat;
cout
}
else
{
if(l==2)
{
Matr=MatR;
cout
}
else
{
if(l==3)
{
Matr=MatRefl;
cout
}
else return 0;
}
}
for(k=0;k
for(i=k+1;i
{
t=Matr[i][k]/Matr[k][k];
for(j=k+1;j
Matr[i][j]+=-t*Matr[k][j];
}
int n=1;
for(i=0;i
n=n*Matr[i][i];
return n;
}
/***********************************************************************************/
