用指针和数组解决矩阵多项式加减法

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

1 引言
1.1数据结构简介
数据结构是计算机存储、组织数据的方式。

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

数据结构往往同高效的检索算法和索引技术有关[1]。

一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。

对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示[2,3];此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。

在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。

许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。

许多时候,确定了数据结构后,算法就容易得到了。

有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。

不论哪种情况,选择合适的数据结构都是非常重要的[1,4]。

选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。

这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。

1.2课程设计目的
本次课程设计目的是让同学更加熟悉一门计算机重要的课程数据结构。

数据结构是计算机科学专业的一门考研科目,又直接涉及计算机的编程语言以及软件设计,因此数据结构这门课程的重要性可见一斑[2],在大二下学期开设了这门课是为了让广大的同学更好的学习设计软件的思想甚至为更深层次的算法打好基础,运用不同的数据结构以及各种算法解决实际问题,并且在学习的途中还可以达到熟练编程语言以及计算机存储结构的目的,对以后的软件工程、编译原理、算法学习都是一个很好的铺垫[4],所以本次课程设计的意义显得尤为重要。

1.3课程设计内容
此次课程设计的题目是运用指针数组解决矩阵多项式的加减法。

矩阵多项式的运算一直以来是数据结构的一个经典问题,解决此问题需要充分的利用到指针、结构体、链
表的知识,然后加入了矩阵多项式这个限制把难度提升了,解决矩阵的幂需要利用到数组的这一概念。

而且在做多项式的加减法时又必须充分考虑到符号问题、系数问题、指数问题的特殊情况,在编写程序同时需要多方面考量设计是否合理,输出是否美观界面是否友好,解决此问题的同时又是对自己的程序语言以及数据结构的一次学习。

本次课程设计共分为五章。

第一章:引言部分,1.1主要是介绍数据结构总体的概念,重要性,1.2是简介此次课程设计的目的,1.3主要是提出此次课程设计的内容。

第二章:开发工具简介,主要是针对我所使用的开发工具Visual Studio 2010,做一个简单的介绍,以及最基础的工程创建编译,让读者对此款工具有个大致的了解。

第三章:系统分析与设计,3.1主要是针对该题目进行需求分析,提及所需要的理论知识,数据结构以及需要输出的结果3.2是概要设计,主要是简略的介绍了各功能函数的作用给出系统的总框架图。

第四章:算法与数据结构,4.1主要介绍算法思想,以及如何利用该算法解决本次课程设计内容。

4.2节介绍关键算法给出核心代码的解析和数据流程图。

第五章:系统分析及测试,给出具体测试示例及理论结果,而后比对运行结果,由此说明系统的可靠、正确性。

2 开发工具简介
本课程设计采用了微软最新的开发工具,功能极其强大的Visual Studio 2010,无论是从功能上还是界面上都完胜很多教材使用的VC6,或者是VS前几个版本。

所以本人也把各个工程投入这个更新的平台上来,的确是提高了工作的效率。

Visual Studio 是微软公司推出的开发环境。

是目前最流行的 Windows 平台应用程序开发环境。

目前已正式发布的是 9.0 版本,也就是 Visual Studio 2008,而在2008年12月份,一个振奋人心的信息传来:微软公布了下一代开发工具和平台“Visual Studio Team System 2010”以及.NET Framework 4.0的相关信息,并透露他们将在2009年底或者2010年正式发布。

于是Visual Studio2010正式版在今年与我们见面了,我是一个喜欢新鲜事物的人,于是Visual Studio2010便出现在我的机器上。

Visual Studio 2010 与 2008 版本的对比:自从微软于1998年发布Visual Studio 6以来,Visual Studio的IDE已经成为软件开发工具的标杆,很多其他的开发工具,甚至是其他用途的应用程序,都在模仿Visual Studio的IDE。

但是,就像我们前面讲过的那样,从Visual Studio 6到Visual Studio 2008,虽然IDE 的功能越来越多,但是并没有什么革命性的变化,反倒因为功能太多带来了使用上的不便,导致开发效率低下。

程序员们都在期盼一个全新的IDE的出现。

现在,程序员们的梦想在Visual Studio 2010中成为了现实。

在Visual Studio 2010中,微软用全新的WPF技术重新打造了它的编辑器,借助WPF的强大功能,新的编辑器可以实现很多以前Visual Studio 2008的IDE根本无法想象的功能,比如代码的无级缩放,多窗口即时更新,文档地图,代码的自动产生等等,这些新的IDE特性都会极大地提高程序员的开发效率。

Visual Studio 2010界面友好,以下我来简单的介绍Visual Studio 2010对C++程序的开发过程,当然首先你必须安装好Visual Studio 2010,以及Framework4.0,这些都可以从微软的官方下载,并且微软近期发布了Visual Studio 2010的汉化版,更适合英语水平较弱的程序员使用。

打开Visual Studio 2010你会看到以下界面,我的版本是微软发布的中文旗舰版,初始界面如图2.1所示。

图2.1 Visual Studio 2010初始界面
怎么样,是不是界面非常美观,接下来你需要创建一个工程。

这里与VC6.0略有不同,VC6.0可以直接建立CPP文件并且编译,但是VS的后续版本都是基于工程的。

所以我们双击->文件->新建->项目,出现创建项目窗口如图2.2所示。

图2.2创建项目窗口
选中Visual C++,并且选中一个空项目,输入项目名称。

因为我们简单的数据结构并不需要MFC等内容的支持,单纯的控制台输出就足够了,然后出现了你建立的空项目,我们注意右边的解决方案资源管理器的内容如图2.3所示。

图2.3 解决方案资源管理器
我们双击源文件->右键添加->新建项如图2.4所示。

图2.4 添加源文件新建项
在新建项中选中C++文件并且输入名字,单击确定,如图2.5所示。

图2.5 添加CPP文件
这样你就可以在新建的工程中写入你的C++代码了,如图2.6所示。

当然如果有需要你也可以在资源管理器的头文件中添加.h的文件写入头文件的内容,相比VC6.0更加符合逻辑,也相当美观。

图2.6 建立CPP文件后添加代码界面
当所有代码都添加完毕后你可以单击编译的按钮如图2.7所示,同时编译器会对你的代码进行编译并反馈结果如图2.8所示,然后出现控制台应用程序。

图2.7 编译程序按钮
图2.8 错误信息反馈
当然通过Visual Studio2010你也可以编写C#,VB,VC++的代码,因为本课程设计没有涉及便不作介绍。

我们看到了Visual Studio2010全面的功能和华丽的界面,自此我们的强大的开发工具Visual Studio2010介绍完毕。

3 系统分析与设计
3.1需求分析
例如矩阵多项式的题目如下:(已知 f(x)= x^3 + x , g(x)= 5x^7 + 3x^3 + 7x +8 和A=⎥⎦⎤⎢⎣⎡53
42, 求f(A)+g(A), 即 (A^3 + A )+(5A^7 + 3A^3 + 7A +8E). 这里 E=⎥⎦
⎤⎢⎣⎡11。

我需要解决的是矩阵多项式的加,(当然减法也可以同时得到解决),我们必须考虑的问题有两个,首先抛弃矩阵问题单纯的考虑多项式加减,多项式加减实现并不困难,只需要把指数相同的合并系数,指数不同的就按指数的降(升)幂依次排列。

就如上文的f(x)= x^3 + x , g(x)= 5x^7 + 3x^3 + 7x +8,相加的结果即为k(x)=5x^7+4x^3+8x+8。

问题的难点在加入矩阵之后,需要充分利用到我们线性代数的内容,加入的矩阵必须有一个约束条件,那就是方阵,不然便无法完成乘幂的运算。

譬如将矩阵A 定义成: ⎥⎦⎤⎢⎣⎡5342
,取指数为2则乘幂后的结果为 ⎥⎦⎤⎢⎣⎡37212816,然后用矩阵代替多项式中的x 的n
此幂,系数保持不变,减法可以使用同样的思想进行处理,我们所做的工作就是要完成这个目的。

3.2概要设计
为了达成此次课程设计的目的我们需要如下的函数:
1)建立多项式函数:
Polyn CreatePolyn(Polyn head,int m)
主要是为了多项式创建一个链表,在结点中写入数据。

2)插入功能函数:
void Insert(Polyn p,Polyn h)
主要是为了实现为结点在指定链表中寻找插入的位置。

3)销毁多项式函数:
void DestroyPolyn(Polyn p)
当前多项式链表使用之后,销毁链表,释放空间。

4)多项式输出功能函数:
void PrintPolyn(Polyn P)
按照一定的规则输出矩阵多项式。

4 算法与数据结构
4.1算法思想
多项式的运算多次在数据结构问题中出现,需要以链表的知识为基础,只要内存中还有空间,就期望能够存储任意数目的不同多项式。

通常情况下我们需要存储的多项式为:
A(x)=ax^n+bx^m+cx^o……
其中a、b、c等为系数,m、n、o为指数,所以我们需要系数域coef和指数域expn,以及指向下一项的指针link,Node结点可以表示为如图4.1所示。

图4.1 Node结点结构示意图
以多项式加法情况为例,为了将a,b两个多项式相加,得对多项式进行比较。

如果这两项的指数相同,那么把它们的系数相加,并生成一个结果项,然后移动这两个指针,分别指向下一个结点[3,6],如图4.2所示。

图4.2 a.expn=b.expn示意图
如果a的当前项指数小于b的当前项指数,那么生成b的副本项,加入到结果d中,并移动指针指向b的下一项。

而a的情况采取同样的操作[6],如图4.3所示。

图4.3 a.expn<b.expn示意图
每次生成一个新结点,设置它的coef域和expn域,并将它加入到d的尾端。

等a 或b其中一个多项式读完之后,扫描另外一多项式情况。

如果没读完则加入d的尾端,释放a和b。

减法的过程与之相似。

这个基本算法很直观,就是使用流的方法在多项式上移动,要么是复制项,要么就是将其加入到结果中。

因此,根据下一对指数是=、<、还是>的关系,while循环具有三个case语句,可以轻松实现比较的功能。

关于矩阵的幂问题,需要用到3个数组,matrix、answer、tempmatrix,matrix用来录入矩阵,answer用来记录矩阵计算结果,tempmatrix协助上述两个矩阵完成矩阵幂运算并把值传入answer,矩阵幂所用到的算法需要参考线性代数关于矩阵的内容。

4.2关键数据结构及数据流程图
矩阵的幂问题是被大家认为的难点,需要利用到线性代数的知识,也被我认为是我本次课程设计最精华的部分,所以我在此也对我这段代码做出一个详细的讲解,其代码如下:
void MatrixPlus(int power,int line)//定义matrixplus函数
{
//answer初始化
for(int i=0;i<line;i++)
{
for(int j=0;j<line;j++)
answer[i][j]=matrix[i][j]; //为了清空answer原有内容而赋上matrix
} //初始内容不然运算会出错
while(power>1)//赋值的循环
{
power--; //每执行一次幂数自减
for(int z=0;z<line;z++)//行循环
{
for(int y=0;y<line;y++)//列循环
{
tempmatrix[z][y]=answer[z][y]; //把answer的内容赋值给中间数组} //之后就可以用tempmatrix用作每次的乘幂运算}
for(int i=0;i<line;i++)//自乘的循环
{
for(int k=0;k<line;k++)
{
int temp=0;//定义中间变量并初始化
for(int j=0;j<line;j++)
{
temp=temp+tempmatrix[i][j]*matrix[j][k];//运用线性代数的知识计算每行的元素answer[i][k]=temp;//将计算的结果赋值给answer
}
}
}
}
用到的算法思想就是线性代数矩阵乘法的内容。

我们给出两个矩阵,然后把第一个矩阵按行划分,第二个矩阵按列划分。

然后用行的元素乘以对应列的元素并相加作为新矩阵的一个元素,temp=temp+tempmatrix[i][j]*matrix[j][k];这条语句就是为了实现这个作用,行元素与列元素相乘后存在temp变量中,然后经过循环把temp的结果加进新的行元素乘以列元素,几次累加后就是得出新矩阵的一个元素。

然后经过多次循环得出最终的新矩阵,由answer数组记录,然后由循环的方式输出。

本来在做这个功能的时候answer输出的数据一直只有第一次的计算是正确的,百思不得其解,为了解决这个问题我用了断点来检测temp,和answer[100][100],后来发现是每次从输出函数调用matrixplus函数的时候answer没有清空造成的,还保留着上次的数据,所以引入了answer清空的循环,和中间变量tempmatrix来保存中间变量,问题得到解决。

此程序的重要数据流程在如下的3个图中列出:
1)矩阵的幂
(1)功能:矩阵按给定幂指数乘幂。

(2)数据流入:输入矩阵以及调用乘幂函数。

(3)数据流出:矩阵乘幂后的结果。

(4)程序流程图:矩阵乘幂流程图如图4.4所示。

(5)测试要点:乘幂结果是否计算正确。

图4.4 矩阵幂运算流程图
(2)数据流入:输入函数。

(3)数据流出:多项式相加后的结果。

(4)程序流程图:多项式的加法运算流程图如图4.5所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,运算。

(2)数据流入:调用输入函数。

(3)数据流出:多项式相减后的结果。

(4)程序流程图:多项式的减法运算流程图如图4.6所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

图4.6 多项式减法运算流程图
5 系统分析及测试
为了方便我的验证我只去一个2*2的方阵,因为乘幂运算的运算量非常巨大,这种规格的方阵才在我们人的计算范围。

实际上该系统可以运算100*100的方阵,计算能力可见一斑。

我选取了矩阵A
为⎥⎦

⎢⎣⎡62
43
,则A^2=⎥⎦⎤⎢
⎣⎡4418
3617
,A^3=⎥⎦

⎢⎣⎡336142
216123,A^4=⎥⎦


⎣⎡25841098
2196937
而多项式我们选取f(x)= x^4+13x^2 +3x , g(x)= 8x^3 + 3x^2,理论得到的k(x)=f(x)+g(x)=x^4+8x^3+16x^2+3x 。

h(x)= f(x)-g(x)=x^4-8x^3+10x^2+3x 。

然后用A 的乘幂代替文中x 的乘幂部分即可。

我们运行程序来看看理论结果与实际结果是否相符,该程序界面友好使用简单,使用中只需要按提示完成操作即可,运行情况如下。

1)进入程序,开始界面如图5.1所示。

图5.1 开始界面
2)按要求输入矩阵的行数,以及每行的元素如图5.2所示。

图5.2 输入矩阵的行数及元素
3)按系统提示输入多项式a,b的项数以及各项指数和系数,如图5.3所示。

图5.3 输入多项式a,b项数以及各项指数系数
4)按系统提示输入1,则输出两个矩阵多项式,如图5.4所示:
图5.4 输出矩阵多项式a,b
5)根据提示按2号操作键则输出多项式a+b,如图5.5所示。

图5.5 多项式a+b输出结果
6)输入3号操作,则出现多项式a-b的结果,如图5.6所示。

图5.6 多项式a-b输出结果
8)按4号键则程序退出。

经过运行和调试,各部分功能正常,结果输出与理论预测结果一致,则证明了该程序的正确性,界面整洁美观。

并能用此程序进行更庞大的方阵计算。

6 结束语
这次课程设计何老师给我定的题目是矩阵多项式的运算,何老师细致的给我们分析了每个课题用何种数据结构去完成,开始只让我完成加法运算,但是由于时间充裕并且减法在加法的基础上容易实现,所以我同时完成了矩阵多项式的加法以及减法运算。

这次课程设计程序编写方面给我感觉最麻烦的在于求矩阵的幂运算上面,多项式的加法和减法编程并不难实现,关键在于如何编好矩阵的幂这个函数并且加到多项式里面并输出出来,为此我查阅了国外的经典教材,从矩阵的乘法加以改进简化就成了我自己的矩阵的幂功能函数,我是分别在VS2010下建立了两个工程,分别通过了多项式的运算以及矩阵的幂两种运算,然后再提取矩阵的幂的运算函数稍加修改,插入到多项式的输出函数中去。

当然其间也遇到了不少麻烦。

比如:在矩阵的自乘我的answer数组每次忘记清零所以造成了之前的结果一直不正确。

然而我利用端点监视几个重点变量的值终于发现了矛盾的所在。

当然我此次写的程序也存在很多的不足,就拿输入来说,系统并不能直接识别一个标准多项式的输入,需要你人为的划分指数系数等等,如果想改善此功能必须要加入一个函数,此函数读入一个字符串然后判断,然后分离出指数系数,这当然是不容易实现的,所以本次课设从简了。

然后再数组的定义方面只定义了[100][100]这样规格的二维数组,超过此规格的矩阵计算无法处理。

另外一个问题是在结果输出中存在不美观的问题,并不能像矩阵多项式的标准格式那么输出,而是采用了一个近似的方式,这个问题可以加入Visual C++的控件予以处理,并且这样一来界面就更美观。

但是利用到窗口设计必然涉及更深层次的可视化设计,由于本人技术有限没有进行此类开发,便导致了此程序的缺憾。

致谢
本次课程设计得到了何锫老师的大力帮助,首先何锫老师为我讲解了为了解决此问题需要涉及到的数据结构,以及解决方案。

之后何锫老师又详细审阅了我的初稿,给了我十几条修改意见,然后又单独给我讲解了如何改进,才促使我完成本次课程设计。

在此对何锫老师致谢,感谢何锫老师不遗余力的帮助。

另外我的同学们也在课程设计期间给予了我参考意见,在此表示感谢。

………………………………………... 用指针和数组解决矩阵多项式加减法
第 21 页
共 21 页
参考文献
[1] [美]巴斯,朱洪翻译.《计算机算法:设计和分析引论》 上海:复旦大学出版社. 1985
[2] 严蔚敏,吴伟民. 《数据结构(C 语言版)》北京:清华大学出版社.2010
[3] Frank M.Carrano 《数据结构和问题求解(C++)》 北京:清华大学出版社.2005
[4] Stanley Lippman. 《C++Primer 中文版》北京:人民邮电出版社.2009
[5] [美]阿霍. 《数据结构与算法》 北京:清华大学出版社.2005
[6] Ellis Horowitz ,Sartaj Samhni.《数据结构(C 语言版)》 北京:机械工业出版社. 2007。

相关文档
最新文档