C++ 数据结构 课程设计报告 计算表达式

2024-08-10

C++ 数据结构 课程设计报告 计算表达式(共3篇)

篇1:C++ 数据结构 课程设计报告 计算表达式

C++课程设计报告

一、题目名称:矩阵乘法计算

二、难易等级: A级

三、对题目的分析和注释:

分析:

依次建立两个矩阵空间并按照矩阵乘法规则进行运算。(矩阵的乘法规则:

1、矩阵的乘法运算必须符合m*n的矩阵与n*s的矩阵相乘。

2、第一个矩阵的第i行的元素依次乘以第二个矩阵的第j列元素后结果相加组成生成矩阵第i行第j列元素。)

注释:

(1)设计一个矩阵类,将相应的函数和数据封装在类中,简化程序。

(2)修改程序结构,使程序可以反复执行,直至按键选择退出为止。

(3)本程序用数组表示5*5矩阵,将其改为根据输入矩阵的大小动态分配空间[m][n]来放置数据,其中m,n为用户可输入的任意整数。

(4)增加类的构造函数和成员函数,使得矩阵数据既可以用在对象初始化时赋值,也可以通过键盘赋值,还可以通过读取数据文件输入。

(5)用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮点型数据,执行程序时,分别定义两个整型矩阵和两个浮点型矩阵进行乘法验证。

(6)完成矩阵的乘法运算,在运算之前判断这两个矩阵能否满足乘法运算的条件,若不满足,则给出提示信息。

四、所增加功能模块的设计

如果要说增加功能的话,自己编的程序里面不多,我只是按照题目要求,设计了一个矩阵类,同时用模板的形式改写矩阵数据类型和运算符的重载。

1、模板的使用

我使用了大量的模板,以T为模板参数,通过对T的不同类型的选择实现相应的运算处理。其中choose1()函数本是无参函数,为了方便模板化,给其赋以伪参数T,在执行时通过T的取值生成相应的函数模板。

template void choose1(T){ } 调用时:

switch(sjlx){

case 1:

{

choose1(1);

}break;

case 2:

{

choose1(0.0);

}break;

case 3:

{

choose1(1e-10);

}break;

default:cout<<“输入选择错误!!”<

2、矩阵类的构造

按照课本要求采用二级指针动态开辟内存空间,节省内存使用; 其中数据结构如下:

Mat-->Mat[0]----->Mat[0][0] Mat[0][1] ……Mat[0][j]

Mat[1]----->Mat[1][0] Mat[1][1] ……Mat[1][j]

:

:

Mat[i]----->Mat[i][0] Mat[i][1] ……Mat[i][j] 实现构造的代码为:

template CMatrix::CMatrix(int row,int col){ int i,j;nRow=row,nCol=col;Mat=new T*[nRow];for(i=0;i

Mat[i]=new T[nCol];} cout<<“请输入数据:n”;for(i=0;i

for(j=0;j

{

cout<<“第[”<

cin>>Mat[i][j];

} }

3、运算符的重载

要实现矩阵间的乘法运算,有必要对其运算符进行重载。而乘法运算符又要针对不同数据类型进行运算,所以我对运算符重载函数模板化。template CMatrix operator*(CMatrix &mat1,CMatrix &mat2){ CMatrix mat3(mat1.nRow,mat2.nCol,0);for(int i=0;i

mat3.Mat[i][j]=0;

for(int k=0;k

mat3.Mat[i][j]+=mat1.Mat[i][k]*mat2.Mat[k][j];} return mat3;}

五、设计中遇到的主要问题及解决办法

1、无法实现文件输入

主要原因是输入之前调用的是默认构造函数,只是简单赋值,并未开辟内存空间,后来调用带参构造函数就可以正常输入数据;

2、重载乘法运算的函数无法重载

经检查发现,由于重载的是友元函数,函数不存在this指针,因此必须显式地调用两个相乘的矩阵类。

六、设计中尚存的不足

1、功能还不够强大,只能做简单的矩阵乘法,我所期望的是能够做各种混合运算,具有强大处理功能的实用程序,希望在以后的深入学习中可以改进。

2、关于异常处理这方面,我觉得处理功能也不是很行,觉得还是应该建立全面的异常检测与异常处理机制。

七、对设计的感想和心得体会

经过这几周的上机编程,我体会颇多,学到了很多东西。我加强了对C++程序设计这门课程的认识,并且复习了自己上学期学习到的知识。这些都使我对计算机语言的学习有了更深入的认识。总之,通过这这几周的上机编程,我收获颇丰,相信会为自己以后的学习和工作带来很大的好处。像矩阵乘法计算问题这样的程序设计,经历了平时在课堂和考试中不会出现的问题和考验。而这些问题,这并不是我们平时只靠课本,就可以轻易解决的。所以,锻炼了我们挑战难题,学会用已掌握的知识去解决具体问题的能力,进一步培养了独立思考问题和解决问题的能力。当然,老师的指导和同学的帮助也是不可忽视的,他们给了我许多提示和帮助,教会了我编译复杂程序的方法。

实践出真知,做课程设计前,我的C++知识只是停留在理论水平,而且就算理论水平,也存在很多漏洞。有时,在做课题的时候,理论的漏洞冒了出来,我就只能在看着课本慢慢的再学习一遍,但有些东西还是没有搞懂,所以现在就又翻出课本,看着课本编程,也算是将旧的东西复习了一遍。同时,有的概念在编程过程中印象更加深刻。

成功=勤奋+合作。在课程设计这方面自己也花了好多时间,交流与合作在编程过程中给我很大的帮助,我得到了很多,每次看到解问题后大家的愉悦,我想大家应该与我一样收获很大吧。说真的,我挺喜欢这种讨论的氛围,它也让编程过程变得趣味横生,不再只是呆滞的盯着屏幕写程序。

对凡事都应当有毅力,不要中途放弃。在编程过程中,好几次遇到困难我都想再换一个别的程序或找同学拷一个程序,但我最终还是坚持下来了。永不言弃,你就一定会成功的。

磨刀不误砍柴工。在刚拿到任务时,书上的关键代码我也是看的一头雾水,后来我将上学期的课本认真研读一遍之后,感觉收获真的不少,接着编起程来就顺手好多了。

此次程序设计使我透彻地领悟到面向对象的程序设计的优点和强大生命力,特别是类和模板的使用,使程序的兼容性和扩展能力都大大加强,比如我们想要再做一个处理其他类型数据的矩阵的乘法计算,只需要添加一个相应的类型声明就可以利用模板迅速构造出来。

通过课程设计的训练,我进一步学习和掌握了对程序的设计和编写,从中体会到了面向对象程序设计的方便和巧妙。懂得了在进行编写一个程序之前,要有明确的目标和整体的设计思想。另外某些具体的细节内容也是相当的重要。这些宝贵的编程思想和从中摸索到的经验都是在编程的过程中获得的宝贵财富。这些经验对我以后的编程会有很大的帮助的,我要好好利用。

这次矩阵乘法计算问题课程设计让我充分认识到了自己的不足,认识到了动手能力的重要性。我会在以后的学习中更加努力锻炼自己,提高自己,让自己写出更好更完善的程序,为以后的编程打好基础!

篇2:C++ 数据结构 课程设计报告 计算表达式

设计题目:

院: 专业班级: 学生姓名: 学生学号: 指导教师:

计算机技术与科学

3班 樊冠男 40912140 马军亮

提交时间:

2011/1/12 成绩:

目录

C++课程设计报告

第一章 引言

C++课程设计报告

第二章 概要设计

C++课程设计报告

第三章 软件实现

C++课程设计报告

篇3:C++ 数据结构 课程设计报告 计算表达式

多项式计算

班级: 学号: 姓名: 指导老师:

多项式计算

1、问题描述

能够按照指数降序排列建立多项式;能够完成两个多项式的相加、相减和相乘,并将结果输出。

2、设计思路

这个程序的关键是多项式的创建和排列,以及相乘时系数相乘和指数相加、相加时相同指数的系数相加、相减时相同指数的系数相减。由于多项式拥有指数和系数(假设基数已定),所以可以定义一个包含指数系数的结构体,用单链表存储多项式的数据,所以结构体包含next指针。数据插入时比较两数的指数,按照降序排序,从表头的next开始,直至找到合适的位置,然后开始链表中数值的插入,如果相等则直接将指数相加,如果大于就将新数据插入到当前指向的前面,否则将新数据插入到最后。输入完数据后选择计算方式(相乘、相加、相减),多项式运算时要循环遍历整个多项式,多项式的每一组数据都要和另一个多项式整组数据相运算(每一个运算值都存储到新建的“多项式”链表中),直到两个多项式都遍历完结束。

3、数据结构设计

在模拟多项式对象时,为了简化处理,只取最核心的两个数据:多项式的系数和指数。前面提到,要用单链表操作,所以要加上个next指针,再由该结构体定义一个结点类型和指针类型。具体数据结构定义如下:

typedef struct node{ int xs;/*系数*/ int zs;

/*指数*/ struct node * next;/*next指针*/ }Dnode,* Dnodelist;

4、功能函数设计

(1)链表初始化函数Creat_node()

带有头结点的头指针指向空(NULL)。(2)多项式数据的创建函数Creat_Dmeth()

当链表初始化成功后,开始创建多项式。分别循环输入两个多项式的系数和指数,其中要用到插入函数。

(3)数据的插入函数Insert_node()当创建多项式时,要用到此函数,即利用插入的方式将多项式的数据连接起来。再输入一组数据后,程序自动调用此函数,插入时也进行着排序,从表头的next开始,一一比较指数大小,直到大于或等于当前指向的数据或遍历完所有数据时停止,然后开始链表中数值的插入,如果相等则直接将指数相加,如果大于就将新数据插入到当前指向的前面,否则将新数据插入到最后。

(4)多项式的显示函数Show()从多项式表头的next开始,直到指向空(NULL),将系数与指数一一显示。

(5)选择运算方式的函数select()三种选择:1为相乘,2为相加,3为相减;每一种选择调用相应的运算函数。

(6)多项式的运算函数:新建链表存储计算后的多项式

1、多项式相乘Mulresult()创建两个指针分别指向两个多项式表头的next,使用两个while函数嵌套循环,遍历每一组数据,每遍历一次都将两组数据的系数相乘,指数相加,再利用插入函数将系数与指数存储到新建多项式的链表中。

2、多项式相加Addresult()创建两个指针分别指向两个多项式表头的next,分别使用两个while函数独自循环,遍历各自的每一组数据,每遍历一次都将系数与指数存储到新建多项式的链表中。因为存储时利用到插入函数,而插入函数中有相同指数的系数相加功能,所以直接将两个多项式的数据依次插入到新的多项式中即可完成多项式相加。

3、多项式相减Subresult()创建两个指针分别指向两个多项式表头的next,以两个指针同时不为空为条件循环遍历,如果当前多项式1的指数小于多项式2,则将当前多项式2的系数置负,指数不变,存入新建多项式中,指向多项式2的指针指向下一个;如果如果当前多项式1的指数大于多项式2,则将当前多项式1的系数指数不变,存入新建多项式中,指向多项式1的指针指向下一个;否则将多项式1的系数减去2的系数后存入新建多项式中,指数不变存入,再将两个指针同时指向下一个。结束循环后判断是哪一个多项式遍历完了,将未遍历完的多项式剩下的数据全部插入到新建多项式中。

(7)主函数main()创建两个多项式的链表并且初始化,分别调用相应的多项式创建函数,创建成功后选择运算方式,再将运算结果输出显示。

5、程序代码

#include #include typedef struct node{ int xs;int zs;struct node * next;}Dnode,* Dnodelist;/*定义结构体*/

Dnodelist Creat_node(void)/*链表初始化*/ { Dnodelist D;D=(Dnodelist)malloc(sizeof(Dnode));if(D)

D->next=NULL;return D;}

int Insert_node(Dnodelist D,int xs,int zs)/*插入函数*/ { Dnodelist p;Dnodelist q;Dnodelist r;p=D;while(p->next){

r=p;

p=p->next;

if(zs==p->zs)/*指数相等,系数直接相加,结束*/

{

p->xs=p->xs+xs;

return 1;

}

else if(zs>p->zs)/*指数大于当前数据的,将数据插入当前数据之前,结束*/

{

q=Creat_node();

q->xs=xs;

q->zs=zs;

r->next=q;

q->next=p;

return 1;

} }/*while(p->next)*/ q=Creat_node();/*要插入的数据指数最小,直接插入至链表最后*/ q->xs=xs;q->zs=zs;q->next=p->next;p->next=q;return 1;free(p);free(q);free(r);} Dnodelist Creat_Dmeth(int length)/*创建多项式*/ { int i,m,n;Dnodelist D;D=Creat_node();for(i=0;i

scanf(“%d,%d”,&m,&n);

Insert_node(D,m,n);/*调用插入函数,将输入的系数指数插入链表*/ } return D;}

Dnodelist Mulresult(Dnodelist D1,Dnodelist D2)/*多项式相乘*/ { Dnodelist D;Dnodelist p,q;int x,z;D=Creat_node();p=D1->next;q=D2->next;while(q){

while(p)

{

x=p->xs*q->xs;/*系数相乘,指数相加*/

z=p->zs+q->zs;

Insert_node(D,x,z);

p=p->next;

}

p=D1->next;

q=q->next;} return D;} Dnodelist Addresult(Dnodelist D1,Dnodelist D2)/*多项式相加*/ { Dnodelist D;Dnodelist p,q;int x,z;D=Creat_node();p=D1->next;q=D2->next;while(q){

x=q->xs;

z=q->zs;

Insert_node(D,x,z);

q=q->next;} while(p){

x=p->xs;

z=p->zs;

Insert_node(D,x,z);

p=p->next;/*直接插入数据,利用插入函数可完成该功能*/ } return D;} Dnodelist Subresult(Dnodelist D1,Dnodelist D2)/*多项式相减*/ { Dnodelist D;Dnodelist p,q;int x,z;D=Creat_node();p=D1->next;q=D2->next;while(p&&q){

if((p->zs)<(q->zs))/*指数小(1的数据在2中不存在),直接插入*/

{

x=-(q->xs);/*由于是式1减式2,所以系数置负*/

z=q->zs;

Insert_node(D,x,z);

q=q->next;

}

else if((p->zs)>(q->zs))/*直接插入*/

{

x=p->xs;

z=p->zs;

Insert_node(D,x,z);

p=p->next;

}

else /*入*/

{

z=q->zs;

x=(p->xs)-(q->xs);

Insert_node(D,x,z);

p=p->next;

q=q->next;

} }/*while(p&&q)*/ while(p){

x=p->xs;

z=p->zs;

Insert_node(D,x,z);

p=p->next;} while(q){

x=-(q->zs);

z=q->zs;

Insert_node(D,x,z);

q=q->next;

指数大(2的数据在1中不存在),指数相同的先将系数相减,再插 } /*将未遍历完的数据直接插入*/ return D;} Dnodelist select(Dnodelist D1,Dnodelist D2)/*选择函数*/ { Dnodelist D;int s;printf(“请选择:n1:相乘n2:相加n3:相减n”);scanf(“%d”,&s);switch(s){ case 1: D=Mulresult(D1,D2);/*调用相乘函数*/

printf(“相乘结果(系数,指数):n”);

break;case 2: D=Addresult(D1,D2);/*调用相加函数*/

printf(“相加结果(系数,指数):n”);

break;case 3: D=Subresult(D1,D2);/*调用相减函数*/

printf(“相减结果(系数,指数):n”);

break;default:

printf(“无此选项n”);

break;} return D;} void Show(Dnodelist D)/*显示(输出)函数*/ { Dnodelist r;r=D->next;while(r){

printf(“(%d,%d)+”,r->xs,r->zs);

r=r->next;} printf(“n”);} void main(){ Dnodelist D1,D2,D;int length;D1=Creat_node();D2=Creat_node();/*D1为多项式1,D2为多项式2,初始化*/

} printf(“输入多项式1的组数:n”);scanf(“%d”,&length);printf(”输入多项式1系数,指数:(%d组)n“,length);D1=Creat_Dmeth(length);/*创建多项式1*/ printf(”输入多项式2的组数:n”);scanf(“%d”,&length);printf(“输入多项式2系数,指数:(%d组)n”,length);D2=Creat_Dmeth(length);/*创建多项式2*/ D=select(D1,D2);/*选择运算方式*/ Show(D);/*输出显示*/ getch();

6、运行与测试

程序运行时,先提示第一个多项式的组数,确定组数后才可输入相应的数据,之后是多项式2;输入完数据后,程序提示选择运算方式。选择错误则提示“无此选项”,运行结束,选择正确的选项将进行相应的运算并输出显示。错误选择:

相乘:

相加:

相减:

7、设计心得

上一篇:作文闪亮结尾五绝招下一篇:初三学生入团志愿书800字