1、课程设计目的
1.1、本次课程设计的主要目的是设计一个一元多项式简单计算器,体会链
式存存储结构和顺序存储结构各自的优缺点和适用性;
1.2、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计
能力;
1.3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基
本方法和技
1.4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
1.5、加深对常用数据结构的理解,强化学生的逻辑思维能力和动手能力,巩
固良好的编程习惯,掌握工程软件设计的基本方法,为后续课程的学习打下坚实基础。
2、课程设计的准备和功能要求
2.1、需求环境
本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:
①硬件要求:一台计算机。
②软件配置:windows XP或windows 7、VC++6.0。
2.2、目标程序的功能要求
集合链式存储结构和顺序存储结构实现一元多项式计算器的设计,并使该计算器具有以下功能:
①能够按照多项式变量的指数降序创建一个多项式;
②能够对已创建的多项式进行显示;
③能够对已创建的多项式之间的加法运算;
④能够对已创建的多项式之间的减法运算;
⑤能够对已创建的多项式进行删除;
⑥能够实现计算器退出操作;
2.3、系统总框图
3、课程设计过程3.1、菜单界面设计
考虑到计算器的操作应具备简易性,我们采取用户和计算机的
对话方式执行,即程序运行时,在计算机终端上显示该计算器的功能菜单栏,其中包括对应的选项共用户选择输入;当用户根据选项中的“提示信息”在键盘上输入多项式的项数及各项的系数和指数,然后进行显示、相加运算、相减运算、多项式删除以及计算器退出操作。
如下所示:
用户菜单
多项
式的
显示
多项
式的
相加
多项
式的
相减
多项
式的
删除
退出
菜单
多项
式的
建立
3.2、菜单选项的实现
对于计算器菜单中各选项的设计处理,我们采用了switch (menu) 语句并将各选项前的数字定义为字符型。然后根据所输入的不同的memu列出对应的6种case分支情况。
3.3、数据类型和数据存储结构的选择
(1)结构体:
当许多项都与某一项相关联时(如本程序:多项式的项数,项的系数和指数都与某多项式的名称有关联),如果将系数,指数分别定义为互相独立的简单变量,则难以反映他们之间的关系,于是便利用数据结构中的结构体把他们组织成一个组合项,这种方法相当于高级语言的“记录”。
其中,声明一个结构体类型的一般形式为:
typedef struct PolyNode
{
float coef;(各项系数)
int expn; (各项指数)
struct PolyNode *next;(各项的后一项所对应的下一项的地址)
};
(2)指针数组:(顺序存储结构)
考虑到指针数组比较适合用来指向若干个字符串,使字符串处理更加方便更加灵活,因此我们选择用顺序结构的指针数组来描述一个多项式。分别定义一些多项式头指针而头指针后面可以根据需要创建并接上更多单项,如果想对已经创建的各个头指针进行随机存取,不必改动各头指针的位置,只需改动指针数组中各元素的指向(即改变各元素的值,这些值都是各头指针的首地址)。这样,各多项式的长度可以不同,而且移动指针变量的值(地址)要比移动字符串所花的
时间要少得多。采用自定义类型typedef,同时建立一个新的结构体类型名和结构体指针类型名。
代码表示为:
typedef struct PolyNode
{
float coef;
int expn;
PolyNode *next;
}Poly,*P_Poly;
定义结构体指针数组:
P_Poly PolyHead[26]={0};//定义结构体指针数组,一元多项式的名称
结构体指针数组的应用:
READ_CHAR(name);
printf (" *\n");
if (NULL!=PolyHead[name-'a']) { //限制多项式名称只能为26个小写字母之一
printf (" * 此多项式名不合法! *\n");
break;
}
(3)线性链表
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这存储单元可以是连续的,也可以是不连续的)。用线性链表表示线性表的时候,数据元素之间的逻辑关系是由结点中的指针指示的。也就是说,指针为数据元素中间的逻辑关系的映像,则逻辑上相邻的两个数据元素其存储的物理位置不要求相邻。
考虑到一元多项式的项数不确定性,我们放弃采用顺序结构线性表大量初始化存储单元的方式,而选择线性链表从而能够使设计的程序灵活的对多项式进行加项、减项、删除等操作。
实现代码如下:
for (i=0;i { p=(Poly*)malloc(sizeof(Poly)); //(创建新链结,添加新单项式) printf (" * 请输入第%d项(系数,指数)(输完按空格):",i+1); cscanf ("%f,%d",&(p->coef),&(p->expn)); printf (" *"); printf (" "); tail->next=p; tail=p; } 3.4、多项式创建功能的设计 (1)多项式创建功能的实现,采用函数: int CreatPoly(P_Poly*,int); (2)多项式输出功能的实现,采用函数: void OutP_Poly(P_Poly PolyHead) (3)求多项式和的功能的实现,采用函数: void AddPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) (4)求多项式差的功能的实现,采用函数: void DecPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) (5)删除多项式功能的实现,采用函数: void DelPoly(P_Poly* P_PolyHead) (6)计算器退出操作,实现代码: case '6': { tuichu=1;break; //选择退出*** } } if(tuichu==1)break; } return OK; } 4、程序设计问题的解决 程序设计过程中遇到的*号输入问题 case '1': { int n; printf (" * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); printf (" * 请输入要创建的多项式的名称(单个小写字母表示)"); cscanf("%c",&name); printf (" *\n"); if (NULL!=PolyHead[name-'a']) //限制多项式名称只能为26个小写字母之一 { printf (" * 此多项式名不合法! *\n"); break; } printf (" * 请输入项数(输入数字后按空 格):"); cscanf ("%d",&n); printf (" *\n"); if(CreatPoly(&PolyHead[name-'a'],n)) printf (" * 多项式%c创建完毕! *\n",name); printf (" * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); break; } case '2': { printf (" * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); printf (" * 请输入要输出的多项式的名称:"); cscanf("%c",&name); printf (" *\n"); printf (" * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); if (NULL==PolyHead[name-'a']) { printf ("此多项式不存在!\n"); break; } OutP_Poly(PolyHead[name-'a']); break; } 4.1、按照我们的设计方案,该多项式计算器的菜单栏是被我们用 多个*号框起来显示的,而同时我们也试图在选定每一个菜单选项后 所出现的该选项的下一步输入提示(以及提示后的输入)也会被自动 包含在*型框中。但是如果在出现下一步输入提示后,当代码采用 READ(name)替代上文代码中的 cscanf("%c",&name); 输入时,输入后会出现自动换行,而不能将输入数据也包含在*型框 中,如: 所以为解决这个问题我们通过网络找到了cscanf函数并改用: cscanf("%c",&name); 这样上面的问题得到解决。 4.2、但是这样新的问题又出现了。采用cscanf函数后当执行菜单选项1,创建完成一个多项式后,下一步菜单操作的执行中无论选择那个操作选项,运行操作会自动跳过cscanf操作,而出现乱码输出,但是接下来继续从菜单中选择操作选项后却可以顺利执行出来。 如:情况一, 继续再次操作2却可以顺利进行: 情况二类似: 首先创建好一个多项式后,再创建一个则出现: 总之,问题就是:只有当创建完第一个多项式后,接下来的第一个操作中的cscanf函数会被跳过,但是继续选择菜单操作则不再出现。这就是我们一直苦恼的地方。 为了解决这个问题,我们通过资料查找和咨询老师, 最后得出问题的症结在于: 因为宏定义RADE()中的getchar函数是从stdio读数据,而cscanf是从console 读数据,混合使用出现了问题。 因而我们通过建立一个新函数: void READ_CHAR (char& c) { do{ cscanf("%c",&c); }while(c=='\n' || c==' ' || c=='\t'); } 在case2 中读入字符的地方都调用函数READ_CHAR(name)代替cscanf("%c",&name); ,以去掉空白符。 5、调试总结与心得体会 经过半个学期对数据结构的学习,我们对C语言编译调试程序的过程和方法有了更深刻的了解,一个完整的,健壮的程序需要有合理的算法和数据结构作为基础,算法是程序的灵魂,是程序的主线,是实现问题的方法和基本步骤的描述,而一个好的算法的实现要建立在合理熟练的逻辑结构和存储结构上 调试程序之前要对所要编译的程序有个整体的了解,需要用什么样的逻辑结构和存储结构,用什么样的算法去实现。要重视对结构体变量的运用,因为无论是线形结构还是链式结构都难免用到结构体变量,结构体中要包含所要描述问题的各个数据域和指针域的指向;使用外部变量的时候要注意它的范围是整个函数,使用的时候要考虑到从上一个函数下来之后所带回的值,要小心使用;程序设计中最重要的也是最容易出错的地方是指针,因此要熟练掌握指针的使用方法,对整个程序中指针的指向,什么时候为空,有确切的了解,否则很容易出错,但要是能将指针用好的话程序设计也就简单了许多;关于数组,在调用函数实参时也容易出错,因为在用数组做实参时传递的是数组指针。 要想编译出一个好的程序真不是一件简单的事情,这次的作业又花了我们大量的时间,但是无论是C语言还是数据结构,在学习过程中收获最大的还是最后的大作业,通过大作业,对一些实际操作中算法的描述,数据结构的使用才有了更深一层的了解,同时也积累了一些在解决实际问题中的经验,处理一般的编译,连接错误的方法,并能够一步一步的进行调试,编程的过程确实很辛苦,但是有了成果之后又觉得很轻松。所以感觉要是投入进去的话编程还不是很难的,只要能够把基础的知识学好,多在操作中练习,多积累些解决实际问题的经验,以后再做这方面的工作就简单多了。 课题设计使得我对这学期所学的专业课有了更为深刻的认识,对于我们来说这不仅仅是一次课程设计,更重要的是使我们明白了在学习的过程中,所有的问题要 一个人去面对,有问题要想尽各种办法解决,克服困难,在解决这些困难的过程中提高了我们学习的能力、解决问题的能力和实际工作的能力,学到了许多书本以外的认识。通过这次课程设计我们觉得我们学习《数据结构》的方法存在一定的弊端,《数据结构》的效果直接影响到我们对其它专业课的学习和今后业务的成长。我们觉得我们对于《数据结构》的学习不仅包括理论部分的学习,还要让我们勤动手,多实践。最后我们要衷心的感谢所有给予我们帮助和指导的老师和同学,没有他们的帮助我们的课程设计也不会完成得这么顺利! 最后,通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正学以致用,从而提高自己的实际动手能力和独立思考的能力。而且,编程非常考验人的耐心和信心,这也在性格方面给了我很多磨练。通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍,可以说是收获不少。 参考文献 [1] 李春葆.数据结构(C语言版)习题与解析[M]. 清华大学出版社,2000.5:47-51 [2] 严蔚敏,吴伟民数据结构(C语言版) [M]. 清华大学出版社2007:27-63 [3] 陈文博,朱青. 数据结构与算法[M]. 机械工业出版社,1996.5:3:47-51 [4] 李邦几,王敬华. 最新C语言实用教程[M]. 化学工业出版社,1996.3:66-68 [5] 杨明:数据结构知识点与典型例题解析[M]. 清华大学出版社,2005.9:19-76 [6] 徐孝凯,魏荣.数据结构 [M]. 机械工业出版社, 1996.1:26-103 [7] 陆松年.数据结构教程 [M].北京:科学出版社,2002:121-124. [8] 苏小红, 陈惠鹏, 温东新,李秀坤.C语言程序设计教程[M].北京:电子工业出版社,2004.1(3):123-133. 代码清单: //一元多项式计算器 #include #include #include #define OK 1; #define READ(I) while ((I=getchar())=='\n'); //读入合法字符** typedef int status; typedef struct PolyNode { float coef; int expn; struct PolyNode *next; }Poly,*P_Poly; void READ_CHAR (char& c) { do{ cscanf("%c",&c); }while(c=='\n' || c==' ' || c=='\t'); } status CreatPoly(P_Poly*,int); //创建多项式链表 void OutP_Poly(P_Poly); //输出多项式 void AddPoly(P_Poly*,P_Poly,P_Poly); //求和 void DecPoly(P_Poly*,P_Poly,P_Poly); //求差 void DelPoly(P_Poly*); //删除并释放多项式 status main() { P_Poly PolyHead[26]={0};//定义结构体指针数组,一元多项式的名称 char menu,name; int tuichu=0,j; for (j=0;;j++) { if(j!=0)printf("\n\n\n再次选择:\n"); printf (" 请注意:为确保其他子函数正常运行,入口参数要求不含同类项、指数递减.\n"); printf (" * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); printf (" * 1.建立多项式 *\n"); printf (" * 2.输出多项式 *\n"); printf (" * 3.求两个多项式之和(必须先创建),建立和式并输出 *\n"); printf (" * 4.求两个多项式之差(必须先创建),建立差式并输出 *\n"); printf (" * 5.删除多项式 *\n"); printf (" * 6.退出 *\n"); printf (" * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); printf (" 请选择指令:"); READ(menu); printf("\n"); switch (menu) { case '1': { int n; printf (" * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); printf (" * 请输入要创建的多项式的名称(单个小 写字母表示)"); cscanf("%c",&name); printf (" *\n"); if (NULL!=PolyHead[name-'a']) { //限制多项式名称只能为26个小写字母 之一 printf (" * 此多项式名不合法! *\n"); break; } printf (" * 请输入项数(输入数字后按空格):"); cscanf ("%d",&n); printf (" *\n"); if(CreatPoly(&PolyHead[name-'a'],n)) printf (" * 多项式%c创建完毕! *\n",name); printf (" * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); break; } case '2': { printf (" * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); printf (" * 请输入要输出的多项式的名称:"); READ_CHAR(name); printf (" *\n"); printf (" * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); if (NULL==PolyHead[name-'a']) { printf ("此多项式不存在!\n"); break; } OutP_Poly(PolyHead[name-'a']); break; } case '3': { char name1,name2; printf ("请输入加式一的名称:"); READ(name1); if (NULL==PolyHead[name1-'a']) { printf ("此多项式不存在!请先创建\n"); break; } printf ("请输入加式二的名称:"); READ(name2); if (NULL==PolyHead[name2-'a']) { printf ("此多项式不存在!请先创建\n"); break; } printf ("请输入要创建的和式的名称:"); READ(name); if (NULL!=PolyHead[name-'a']) { printf ("此多项式名不合法!\n"); break; } AddPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']); OutP_Poly(PolyHead[name-'a']); break; } case '4': { char name1,name2; printf ("请输入被减式的名称:"); READ(name1) ; if (NULL==PolyHead[name1-'a']) { printf ("此多项式不存在!请先创建\n"); break; } printf ("请输入减式的名称:"); READ(name2) ; if (NULL==PolyHead[name2-'a']) { printf ("此多项式不存在!请先创建\n"); break; } printf ("请输入要创建的差式的名称:"); READ(name) ; if (NULL!=PolyHead[name-'a']) { printf ("此多项式已经存在!\n"); break; } DecPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']); OutP_Poly(PolyHead[name-'a']); break; } case '5': { printf ("请输入要删除的多项式名称:"); READ(name) ; if (NULL==PolyHead[name-'a']) { printf ("此多项式不存在!\n"); break; } DelPoly(&PolyHead[name-'a']); printf ("多项式%c已删除!\n",name); break; } case '6': { tuichu=1;break; //选择退出*** } } if(tuichu==1)break; } return OK; } //1 一元多项式链表创建函数 status CreatPoly(P_Poly* P_PolyHead,int n)// P_PolyHead是指向指针的指针*** { //为确保其他子函数正常运行,入口参数要求不含同类项、指数递减 **** int i; P_Poly p,tail; *P_PolyHead=(Poly*)malloc(sizeof(Poly)); (*P_PolyHead)->expn=n; tail=*P_PolyHead; printf (" * 请按照指数递减序输入最简形式的多项式 *\n"); for (i=0;i { p=(Poly*)malloc(sizeof(Poly)); printf (" * 请输入第%d项(系数,指数)(输完按空格):",i+1); cscanf ("%f,%d",&(p->coef),&(p->expn)); printf (" *"); printf (" "); tail->next=p; tail=p; } tail->next=NULL; //确定链尾指针 return OK; } //2 多项式输出函数 void OutP_Poly(P_Poly PolyHead) { int i; P_Poly p; printf ("\n总项数为:%d\n ",PolyHead->expn);//链表头数据域** p=PolyHead->next; for (i=0;i { if(i==0) printf ("%f*x^%d",p->coef,p->expn); else if(p->coef>=0) printf ("+%f*x^%d",p->coef,p->expn); else printf ("%f*x^%d",p->coef,p->expn); p=p->next; } printf ("\n"); } //3 求多项式的和的函数 void AddPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) { int i=0; P_Poly p1,p2,p,tail; p1=PolyHead1->next; p2=PolyHead2->next; *P_PolyHead=(P_Poly)malloc(sizeof(Poly)); //给新创建的链表分配动态存储空间做链头 p=tail=*P_PolyHead; while(p1&&p2) { int e1,e2; e1=p1->expn; e2=p2->expn; if (e1>e2) { p=(P_Poly)malloc(sizeof(Poly)); tail->next=p; tail=p; *p=*p1; p1=p1->next; i++; } else if(e1==e2) { float sum_c=p1->coef+p2->coef; if (sum_c!=0.0) { p=(P_Poly)malloc(sizeof(Poly)); tail->next=p; tail=p; p->coef=sum_c; p->expn=e1; i++; } p1=p1->next; p2=p2->next; } else if (e1 { p=(P_Poly)malloc(sizeof(Poly)); tail->next=p; tail=p; *p=*p2; p2=p2->next; i++; } } while (p1) //将p1中p2多出的想补充道新建多项式链表的后面 { p=(Poly*)malloc(sizeof(Poly)); *p=*p1; tail->next=p; tail=p; p1=p1->next; i++; } while (p2) //将p2中p1多出的想补充道新建多项式链表的后面 { p=(Poly*)malloc(sizeof(Poly)); *p=*p2; tail->next=p; tail=p; p2=p2->next; i++; } (*P_PolyHead)->expn=i; tail->next=NULL; //确定链尾指针 } //4 求多项式差的函数 void DecPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) { int i=0; P_Poly p1,p2,p,tail; p1=PolyHead1->next; p2=PolyHead2->next; *P_PolyHead=(P_Poly)malloc(sizeof(Poly)); //给新创建的链表分配动态存储空间做链头 p=tail=*P_PolyHead; while(p1&&p2) { int e1,e2; e1=p1->expn; e2=p2->expn; if (e1>e2) { p=(P_Poly)malloc(sizeof(Poly)); tail->next=p; tail=p; *p=*p1; p1=p1->next; i++; } else if(e1==e2) { float dif_c=p1->coef-p2->coef; if (dif_c!=0.0) { p=(P_Poly)malloc(sizeof(Poly)); tail->next=p; tail=p; p->coef=dif_c; p->expn=e1; i++; } p1=p1->next; p2=p2->next; } else if (e1 { p=(P_Poly)malloc(sizeof(Poly)); tail->next=p; tail=p; p->coef=-p2->coef; p->expn=p2->expn; p2=p2->next; i++; } } while (p1) { p=(Poly*)malloc(sizeof(Poly)); *p=*p1; tail->next=p; tail=p; p1=p1->next; i++; } while (p2) //*** { p=(Poly*)malloc(sizeof(Poly)); p->coef=-p2->coef; p->expn=p2->expn; tail->next=p; tail=p; p2=p2->next; i++; } (*P_PolyHead)->expn=i; tail->next=NULL; } //5 多项式删除操作函数 void DelPoly(P_Poly* P_PolyHead) { P_Poly p,prior; p=prior=*P_PolyHead; while (p->next) { p=p->next; free(prior); prior=p; } *P_PolyHead=NULL; } 雷提示改进版代码: (改进:在32行添加了清屏功能。可使单次菜单操作使用完毕后,清屏上次的显示情况,重 新进行选择。) #include #include #include #include #define OK 1; #define READ(I) while ((I=getchar())=='\n'); //读入合法字符** typedef int status; typedef struct PolyNode { float coef; int expn; struct PolyNode *next; }Poly,*P_Poly; void READ_CHAR (char& c) { do{ cscanf("%c",&c); }while(c=='\n' || c==' ' || c=='\t'); } status CreatPoly(P_Poly*,int); //创建多项式链表 void OutP_Poly(P_Poly); //输出多项式 void AddPoly(P_Poly*,P_Poly,P_Poly); //求和 void DecPoly(P_Poly*,P_Poly,P_Poly); //求差 void DelPoly(P_Poly*); //删除并释放多项式 status main() { P_Poly PolyHead[26]={0};//定义结构体指针数组,一元多项式的名称 char menu,name; int tuichu=0,j; for (j=0;;j++) { if(j!=0){ //清屏功能 fflush(stdin); getchar(); system("cls"); // printf("\n\n\n再次选择:\n"); } printf (" 请注意:为确保其他子函数正常运行,入口参数要求不含同类项、指数递减.\n"); printf (" * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); printf (" * 1.建立多项式 *\n"); printf (" * 2.输出多项式 一元稀疏多项式计数器预习报告 :刘茂学号0062 一、实验要求 (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。序列按指数降序排列; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b。 (5)多项式求值; (6)多项式求导; (7)求多项式的乘积。 二、测试数据: 1、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7); 2、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15 )=(-7.8x^15-1.2x^9+12x^-3-x); 3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5); 4、(x+x^3)+(-x-x^3)=0; 5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200); 6、(x+x^2+x^3)+0=x+x^2+x^3. 7、互换上述测试数据中的前后两个多项式。 三、思路分析 用带表头结点的单链表存储多项式。 本程序要求输入并建立多项式,能够降幂显示出多项式,实现多项式相加相减的计算问题,输出结果。 采用链表的方式存储链表,定义结点结构体。运用尾差法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b。 为实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q 结点的指数项。 ①若p->expn 实习一线性表、栈和队列及其应用 ——一元稀疏多项式的加法运算 【问题描述】 设计一个实现一元稀疏多项式相加运算的演示程序。 【基本要求】 (1)输入并建立两个多项式; (2)多项式a与b相加,建立和多项式c; (3)输出多项式a,b,c。输出格式:比如多项式a为:A(x)=c1xe1+ c2xe2+…+ cmxem,其中,ci和ei分别为第i项的系数和指数,且各项按 指数的升幂排列,即0≤e1<e2<…<em。多项式b,c类似输出。 【测试数据】 (1)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5) (2)(x+x100)+(x100+x200)=(x+2x100+x200) (3)(2x+5x8-3x11)+(7-5x8+11x9)=(7+2x+11x9-3x11) 一.需求分析 1.输入的形式和输入值的范围: 输入是从键盘输入的,输入的内容为多项式的系数和指数,其中多项式的每一项分别以一个系数和指数的形式输入,不带未知数X,系数为任意的实数,指数为任意的整数。 要结束该多项式的输入时,输入的指数和系数都为0. 2. 输出的形式 从屏幕输出,显示用户输入的多项式,并显示多项式加减以后的多项式的值,并且多项式中将未知数X表示了出来. 形式为:+c1X^e1+c2X^e2+…+ciX^ei+…(ci和ei分别是第i项的系数和指数,序列按指数升序排列。) 当多项式的某一项的系数为+1或者-1时侧该项多项式的输出形式为X^ei或-X^ei; 当该项的系数为正时输出+ciX^ei,当为负数时则输出ciX^ei 3. 程序所能达到的功能 输入并建立多项式,实现一元稀疏多项式的相加并输出。 4. 注意:所有多项式都必须以指数升密形式输入。 5. 测试数据为(1)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5) (2)(x+x100)+(x100+x200)=(x+2x100+x200) (3)(2x+5x8-3x11)+(7-5x8+11x9)=(7+2x+11x9-3x11) 二.设计 1.设计思路 华北水利水电学院一元稀疏多项式计算器实验报告 2010~2011学年第一学期 09 级计算机科学与技术专业班级: 2009119 学号: 200911902 姓名:万婷婷 一、实验目的 设计一个医院稀疏多项式简单计算器 熟练掌握线性表的基本操作在两种存储结构上的实现,其中以各种链表的操作和应用 二、实验要求 a)输入并建立多项式 b)输出多项式,输出形式为整数序列:n,c 1,e 1 ,c 2 ,e 2 ……c n ,e n ,其中n是多 项式的项数,c i ,e i 分别为第i项的系数和指数。序列按指数降序排列。 c)多项式a和b相加,建立多项式a+b,输出相加的多项式。 d)多项式a和b相减,建立多项式a-b,输出相减的多项式。 用带表头结点的单链表存储多项式。 测试数据: (1) (2x+5x8-3.1x11)+(7-5x8+11x9) (2) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2+7.8x15) (3)(1+x+x2 +x3 +x4 +x5)+( -x3- x4) (4)(x+x2+x3)+0 (5)(x+x3)-(-x-x-3) (6) (x+x2 +x3 )+0 三、实验内容 主要算法设计 typedef struct Node { float coef; int index; struct Node *next; }LinkList; 本程序涉及到多项式的建立、多项式的输出、两个多项式的相加减。用带头结点的单链表存储多项式; 程序中共定义了5个函数: void Insert(LinkList *p,LinkList *h)//把节点p插入到链表h中LinkList *Creat_L(LinkList *head,int m)//创建一个链表,项数为m void Printf(LinkList *L) LinkList *ADDlist(LinkList *head,LinkList *pb) LinkList *MinusList(LinkList *head,LinkList *pb) 四、程序源代码 #include #include"stdio.h" #include"stdlib.h" #include"conio.h" typedef struct Item{ double coef;//系数 int expn;//指数 struct Item *next; }Item,*Polyn; #define CreateItem(p) p=(Item *)malloc(sizeof(Item)); #define DeleteItem(p) free((void *)p); /************************************************************/ /* 判断选择函数 */ /************************************************************/ int Select(char *str) { char ch; printf("%s\n",str); printf("Input Y or N:"); do{ ch=getch(); }while(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n'); printf("\n"); if(ch=='Y'||ch=='y') return(1); else return(0); } /************************************************************/ /* 插入位置定位函数 */ /**************************************************************/ int InsertLocate(Polyn h,int expn,Item **p) { Item *pre,*q; pre=h; q=h->next; while(q&&q->expn 云南大学软件学院数据结构实验报告 (本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □ 学期:2012秋季学期 任课教师: 实验题目: 一元稀疏多项式计算器 小组长: 联系电话: 电子邮件: 完成提交时间:2012 年 11 月 10 日 云南大学软件学院2012学年秋季学期 《数据结构实验》成绩考核表 学号: 20111120 姓名:本人承担角色:算法设计整体流程控制 综合得分:(满分100分) 指导教师: 年月日 云南大学软件学院2010学年秋季学期 《数据结构实验》成绩考核表 学号: 20111120 姓名:本人承担角色:函数实现整体流程控制 综合得分:(满分100分) 指导教师: 年月日 (下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%) 多项式计算器的呈现方式是用控制台程序呈现,;多项式的加减乘以及求导的函数中利用链表保存头结点以及循环结构保存和输出数据;还有利用一个简单的降序排列的函数,在输出时更加明了。 二、【实验设计(Design)】(20%) 在头文件中申明变量,源文件中创建指数和系数的指针的头结点,并为此申请空间。首先考虑指数为0,1和系数为0,1时的特殊情况的表示;然后利用SORT函数对输出时进行降序排列;其次就是加减乘以及求导函数的实现;最后是一个输出界面的设计。 三、【实现描述(Implement)】(30%) //--------函数原型说明-------- typedef struct Node { double xishu; int zhishu;//数据域 //int data; struct Node* pnext;//指针域 }Node,*pNode; pNode phead=(pNode)malloc(sizeof(Node));//创建头节点 pNode creat_list(void);创建链表 void traverse_list(pNode phead);//遍历链表 pNode sort(pNode phead);//对链表进行降序排列 pNode add(pNode phead1,pNode phead2);//两个多项式相加 pNode hebing(pNode phead)//合并同类项 pNode multi(pNode phead1,pNode phead2);//多项式相乘 pNode sub(pNode phead1,pNode phead2);//多项式相减 //多项式求导没有声明和定义函数,而是直接卸载程序里了 2014-2015学年第二学期学号1308210115 《软件工程》 课程设计报告 题目:一元稀疏多项式计算器 专业:计算机科学与技术 班级:计算机科学与技术(2)班 姓名: 指导教师: 成绩: 一、问题描述 (3) 二、需求分析 (3) 三、概要设计 (4) 四、详细设计 (5) 五、源代码 (6) 六、程序测试 (18) 七、使用说明 (24) 八、课设总结 (25) 一、问题描述 1.1基本要求 (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1, c2,e2,,,,,,, cn,en,其中n是多项式的项数,ci,ei,分别是第i项的系数和指数,序列按指数降序排序; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b; (5)计算多项式在x处的值。 (6)计算器的仿真界面。 1.2设计目的 数据结构是实践性很强的课程。课程设计是加强学生实践能力的一个强有力手段。课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用 二、需求分析 2.1 设计开发环境: 软件方面:系统windows 7 编程软件:VC++ 6.0 2.2思路分析: ①一般情况下的一元n次多项式可写成 pn(x)=p1xe1+p2xe2+……+pmxem 其中,p1是指数为ei的项的非零系数,且满足0≦e1 实验题目:多项式运算器 实验内容:1、熟悉编程环境 2、用链式存储结构实现稀疏一元多项式运算器 实验目的和要求: 1、通过本实验,掌握VC++6.0的基本使用,包括源程序的输入,编译运行及调 试。调试的目的是找程序的运行错误,通过DEBUG菜单设置断点实现。 2、用链式存储结构实现一元多项式的运算。 熟练掌握指针和链表的基本操作,利用菜单进行功能选择。 功能基本要求:创建、显示、求和、求差、求值、销毁、清空、修改 实验算法: 1、数据结构描述: 输入的稀疏每一个多项式用一个链表存储,链表的每一个节点存储多项式的一个非零项。定义为LNode型结构体,其中保存该项的系数和指数。主 函数中用一个数组存储每一个多项式的第一项的头指针以调用多项式。 2、函数和算法描述: 主函数main定义LNode*数组a[]存储每一个多项式头节点的地址,并构建菜单以选择调用函数进行多项式的操作,对多项式进行操作的函数返回新 改动的多项式头结点地址。 Createpolyn函数用以创建一个多项式,在用户输入结束指令之前,不断的申请空间,构建LNode型结点并加至构建的链表的表尾,输入结束指令之 后,表尾设NULL并返回表头指针。 Printpolyn函数用以在屏幕上打印多项式,接收需要打印的多项式链表的头结点,构造循环体在表尾之前,不断以mx^n格式打印对应结点中的数 据。 Copypolyn函数用以复制多项式,接收需要复制的多项式a和复制位置b 的指针,构造循环体,在a到表尾之前循环,在b对应的链表中构建新的结 点,结点上的数据赋值为a中对应的值,返回b的头结点地址。 Addpolyn函数用以求两个已知多项式a、b的和存入c,先构建循环体,在a、b链表都未进行到表尾时,比较两个结点中的次数值,如果相同,将 系数相加赋于c的当前结点,如果不同,将次数较小多项式y(a或b)的结 点赋值给c当前结点,在将y链表向后推。 Subtract函数用以求两多项式的差,类似求和算法。 Value函数用以求一个多项式的值,接收x的值,构建循环体,在表尾之前循环以遍历多项式链表。内置循环体,以次数n为限循环,求出x^n的 值,乘以系数并将每一项的值叠加得值。 Destroypolyn函数用以销毁已有的多项式,将此多项式链表的空间FREE 掉,返回空指针。 Clearpolyn函数用以清空多项式,构建循环体,将多项式的各项的系数、指数置零。 3、时空分析: L= sizeof(struct LNode) 一个含有N项的多项式占用的储存空间为NL+1 【问题描述】 设计一个一元稀疏多项式简单计算器 【基本要求】 一元多项式简单计算器的基本功能是: 1,输入并建立多项式; 2,输出多项式,输出形式为整数序列:n,c1,e1,c2,c2,...,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; 3,多项式a和b相加,建立多项式a+b; 4,多项式a和b相减,建立多项式a-b. 【测试数据】 1,(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7) 【实现提示】 用带表头结点的单链表存储多项式。 #include 武汉理工大学华夏学院课程设计报告书 课程名称:数据结构 题目:用C语言实现多项式简单计算器的设计 系名:信息工程系 专业班级:软件工程1121班 姓名:邓燕蓉 指导教师:王绪梅 2013 年 6月 28日 课程设计任务书 学生姓名:邓燕蓉专业班级:软件工程1121班 指导教师:王绪梅工作单位:华夏学院计算机教研室设计题目:用C语言实现多项式简单计算器的设计 设计目的 1.巩固和加深课堂所学知识、学会分析研究数据对象的特性及数据的组织方法; 2.选择合适的数据的逻辑结构和存储结构以及相应操作,实现简单的多项式计算; 3.提高程序设计能力、加强查阅、运用资料的能力、算法分析与程序设计素质培养; 设计任务(在规定的时间内完成下列任务) 〔问题描述〕输入并建立两个多项式并输出多项式 设计一个程序:对两个多项式进行加、减法及乘法运算,建立一个新多项式并输出. 或设计一个程序对其中一个多项式求导。 〔实现提示〕 选择带头结点的单链表或循环链表存储多项式,头结点中存放多项式的参数及单链表的数据具体要完成的任务是: A.编制完成上述问题的C语言程序、进行程序调试并能得出正确的运行结果。 B.写出规范的课程设计报告书; 时间安排:6月24日---28日 具体要求 1. 课程设计报告按统一通用格式书写,具体内容如下: ①设计任务与要求 ②总体方案与说明 ③软件主要模块的流程图 ④源程序清单与注释 ⑤问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法 及改进设想); ⑥小结与体会 附录:①源程序(必须有简单注释)②使用说明③参考资料 2.每位学生应独立完成各自的任务且每天至少在设计室工作半天; 指导教师签名:王绪梅2013 年6月22日 教研室主任(或责任教师)签名:2013年6月24日 一元稀疏多项式计数器预习报告 姓名:刘茂学号2220 一、实验要求 (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。序列按指数降序排列; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b。 (5)多项式求值; (6)多项式求导; (7)求多项式的乘积。 二、测试数据: 1、(2x+5x^^11)+(7-5x^8+11x^9)=^11+11x^9+2x+7); 2、(6x^-3-x+^^9+^9)-(-6x^-3+^2-x^2+^15 )=^^9+12x^-3-x); 3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5); 4、(x+x^3)+(-x-x^3)=0; 5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200); 6、(x+x^2+x^3)+0=x+x^2+x^3. 7、互换上述测试数据中的前后两个多项式。 三、思路分析 用带表头结点的单链表存储多项式。 本程序要求输入并建立多项式,能够降幂显示出多项式,实现多项式相加相减的计算问题,输出结果。 采用链表的方式存储链表,定义结点结构体。运用尾差法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b。 为实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q 结点的指数项。 ① 若p->expn 院系:计算机科学学院 专业:软件工程 年级: 2013级 课程名称:数据结构 姓名:韦宜(201321092034)指导教师:宋中山 2015年 12 月 15日 题目:设计一个一元稀疏多项式简单计算器 班级:软件工程1301 姓名:韦宜学号:201321092034 完成日期:12月15日 一、需求分析 问题描述:设计一个一元多项式加法器 基本要求: 输入并建立多项式; (2)两个多项式相加; (3)输出多项式:n, c1, e1, c2, e2, …cn , en, 其中,n是多项式项数,ci和ei分别是第i 项的系数和指数,序列按指数降序排列。 (4)计算多项式在x处的值; (5)求多项式的导函数。 软件环境:Windows,UNIX,Linux等不同平台下的Visual C++ 6.0 硬件环境: 512MB内存,80Gb硬盘,Pentium4 CPU,CRT显示器。 二、概要分析 本程序有五个函数: PolyNode *Input()(输入函数); PolyNode *Deri(PolyNode *head)(求导函数); PolyNode * Plus(PolyNode *A,PolyNode *B)(求和函数); void Output(PolyNode*head)(输出函数); int main()(主函数) 本程序可使用带有附加头结点的单链表来实现多项式的链表表示,每个链表结点表示多项式的一项,命名为node,它包括两个数据成员:系数coef和指数exp,他们都是公共数据成员,*next为指针域,用链表来表示多项式。适用于不定的多项式,特别是对于项数再运算过程中动态增长的多项式,不存在存储溢出的问题。其次,对于某些零系数项,在执行加法运算后不再是零系数项,这就需要在结果多项式中增添新的项;对于某些非零系数项,在执行加法运算后可能是零系数项,这就需要在结果多项式中删去这些项,利用链表操作,可以简单的修改结点的指针以完成这种插入和删除运算(不像在顺序方式中那样,可能移动大量数据项)运行效率高。 一元稀疏多项式简单计算器 一、设计课题 设计一元稀疏多项式简单计算器。 二、需求分析 2.1 输入的形式和输入值的范围: 输入是从键盘输入的,输入的内容为多项式的系数和指数,数为任意的整数,指数为大于等于0的整数 2.2 输出的形式 从屏幕输出,显示用户输入的多项式,并显示多项式加减以后的多项式的值。 2.3 程序所能达到的功能 a:输入并建立多项式; b:输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei 分别是第i项的系数和指数,序列按指数降序排列; c:多项式a和b相加,建立多项式a+b; d:多项式a和b相减,建立多项式a-b; 2.4 测试数据 (1)(2x+5x^8-3.1x^11)+(7-5x^8+11x^9) = (-3.1x^11+11X^9+2X+7) (2)(X+X^3)+(-X-X^3)=0 (3)(X+X^2+X^3)+0= X+X^2+X^3 三、概要设计 3.1 设计思路 A:数据结构的选用 为了实现任意多项式的加法、减法,因此选择单链表的结构体,它有一个系数,指数,下一个指针3个元属;单链表抽象结构类型定义见附录2。 B:多项式的输入 采用头节点插法的方式,输入多项式中一个项的系数和指数,就产生一个新的节点,建立起它的右指针,并用头节点指向它;为了判断一个多项式是否输入结束,定义一个结束标志,当输入非00时就继续,当输入00时,就结束一个多项式的输入; C:2个多项式的加法 它从2个多项式的头部开始,2个多项式的某一项都不为空时,如果指数相等的话,系数就应该相加;相加的和不为0的话,用头插法建立一个新的节点。p的系数小于q的系数的话,就应该复制q接点到多项式中。p的系数大于q的系数的话,就应该复制p接点到多项式中。当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生。当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生 D:2个多项式的减法 它从2个多项式的头部开始,2个多项式的某一项都不为空时,如果指数相等的话,系数就应该相减;相加的和不为0的话,用头插法建立一个新的节点。 p的系数小于q的系数的话,就应该复制q接点到多项式中。p的系数大于q的系数的话,就应该复制p接点到多项式中,并且建立的接点的系数为原来的相反数;当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生。当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生,并且建立的接点的系数为原来的相反数。 武汉工业学院 数学与计算机学院 《数据结构》 课程设计说明书 题目:一元多项式计算器 专业:计算机 班级:计算机类1305班 学号: 1305110053 姓名:杨钦 指导老师:左翠华 2014年12月25日 一、 设计题目 一元稀疏多项式计算器 【问题描述】 设计一个一元稀疏多项式简单计算器。 【基本要求】 一元稀疏多项式简单计算器的基本功能是: (1) 输入并建立多项式 ; (2) 输出多项式,输出形式为整数序列:n ,c l ,e l ,c 2,e 2,…,c n ,e n ,其中n 是多项式的项数,c i 和e i ,分别是第 i 项的系数和指数,序列按指数降序排列; (3) 多项式a 和b 相加,建立多项式a +b ; (4) 多项式a 和b 相减,建立多项式a -b 。 【测试数据】 (1)(2x+5x 8-3.1x 11) + (7-5x 8+11x 9)=(-3.lx 11+11x 9+2x+7) (2)(6x -3-x+4.4x 2-1.2x 9) -(-6x -3+5.4x 2-x 2+7.8x 15)=(-7.8x 15-1.2x 9+12x -3-x) (3)(1 +x + x 2+x 3+x 4+x 5)+(-x 3-x 4)=(1+x+x 2+x 5) (4)(x+x 3)+(-x -x 3)=0 (5)(x+x 100)+(x 100 +x 200)=(x+2x 100+x 200) (6)(x+x 2+x 3)+0=x+x 2+x 3 (7) 互换上述测试数据中的前后两个多项式 【实现提示】 用带表头结点的单链表存储多项式。 【选作内容】 (1) 计算多项式在x 处的值。 (2) 求多项式 a 的导函数a ' 。 (3) 多项式a 和b 相乘,建立乘积多项式ab 。 (4) 多项式的输出形式为类数学表达式。例如,多项式 -3x8+6x3-18 的输出形式为183683-+-∧∧x x ,x15+(-8)x7-14的输出形式为147815--∧∧x x 。注意,数值为1的非零次项的输出形式中略去系数1,如项1x8的输出形式为x8,项 -1x3的输出形式为-x3。 实习1、一元稀疏多项式计算器 一、需求分析 1. 问题描述 设计一个一元稀疏多项式简单计算器。 2. 基本要求 一元稀疏多项式简单计算器的基本功能是: (1)输入并建立多项式。 (2)输出多项式,输出形式为整数序列:n, c1, e1, c2, e2, ········,c n, e n,其中n是多项式的项数,c i,e i分别是第i项的系数和指数,序列按指数降序排列。 (3)多项式a和b想加,建立多项式a+b 。 (4)多项式a和b想减,建立多项式a-b 。 3. 测试数据 (1) (2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7) (2) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9+12x-3-x) (3) (1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5) (4) (x+x3)+(-x-x3)=0 (5) (x+x100)+(x100+x200)=(x+2x100+x200) (6) (x+x2+x3)+0=(x+x2+x3) (7) 互换测试数据的前后两个多项式。 4. 实现提示 用带表头结点的单链表存储多项式。 二、概要设计 为实现上述程序功能,应用带头结点的单链表存储多项式。为此需要一个抽象数据类型:一元多项式。 1.抽象数据类型一元多项式定义为: ATD Ploynomial{ 数据对象:D={ai|ai∈Termset, i=1,2,3···,m,m≥0Termset中的每个元素包含一个表示系数的实数和表示指数的整数} 数据关系:R1={ 课程设计说明书 设计题目:数据结构课程设计专业:班级: 设计人: 一、 需求分析 1. 演示程序以用户和计算机的对话方式执行,即在计算机终端上 显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。 2. 程序执行的命令包括: 1) 创建一元多项式1; 2) 创建一元多项式2; 3) 输出一元多项式 4) 计算多项式1和多项式2的和; 5) 计算多项式1和多项式2的差 注意:输出形式为整数序列n,c1,e1,c2,e2,…,cn,en ,其中n 是多项式的项数,ci 和ei 分别是第I 项的系数和指数,序列指指数降序排列 3.测试数据 1) ) 72111.3()1157()1.352(91198118+++-=+-+-+x x x x x x x x ; 2) )1()()1(25435432+++=--++++++x x x x x x x x x x ; 3) 0)()(33=--++x x x x 4) )(0)(2332x x x x x x ++=+++ 二、 概要设计 为实现上述程序功能,应以带头结点的单链表存储多项式 1. 多项式的抽象数据类型为: ADT Polynmial{ 数据对象:D={a i |ai ∈TermSet ,i=1,2,3,…,m ,TermSet 中的每一个元素包含一个表示系数的实数和表 示指数的整数} 数据关系:R1={a i-1,a i∈D,且a i-1中的指数 实习报告 题目:设计一个一元稀疏多项式计算器 班级: 姓名学号__________完成日期:__ 一、课程题目 一元稀疏多项式计算器 二、需求分析 1、一元稀疏多项式简单计算器的功能是: 1.1 输入并建立多项式; 1.2 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,………cn,en, 其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; 1.3 求多项式a、b的导函数; 1.4 计算多项式在x处的值; 1.5多项式a和b相加,建立多项式a+b; 1.6 多项式a和b相减,建立多项式a-b。 2、设计思路: 2.1 定义线性表的动态分配顺序存储结构; 2.2 建立多项式存储结构,定义指针*next 2.3利用链表实现队列的构造。每次输入一项的系数和指数,可以输出构 造的一元多项式 3、测试数据: (1)、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7); (2)、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15 )=(-7.8x^15-1.2x^9+12x^-3-x); (3)、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5); (4)、(x+x^3)+(-x-x^3)=0; (5)、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200); (6)、(x+x^2+x^3)+0=x+x^2+x^3. 三、概要设计 1.有序表的抽象数据类型定义为: ADT List{ 数据对象:D={a i| a i∈R,i=1,2,…,n,n≧0} 一元稀疏多项式计算器 C语言编写 悬赏分:120 |提问时间:2008-6-23 20:33 |提问者:骑着单车的熊 一元稀疏多项式计算器: 用C语言编写程序,实现一元稀疏多项式计算器。具体要求如下: (1) 演示程序以用户与计算机对话的形式输入输出数据; (2) 实现两个一元稀疏多项式的加、减、乘运算; (3) 求一个多项式a的导函数a’; (4) 结果以类数学表达式的形式输出。 看清题目的要求我只要C语言的不要其他语言的还有解释一下编程的思路和过程谢谢了大家 请大家传给我能够使用的程序谢谢了 推荐答案 datastruct.h typedef struct list { int c; //多项式的项数 int e; //多项式的指数 struct list *next; //下一结点 }; typedef struct list *LinkList; typedef struct list Node; 下面是线性表的操作相关函数声明,对应文件ListOper.h: //File: ListOper.h #ifndef DATASTRUCT #define DATASTRUCT #include "datastruct.h" #endif //some functions declaretioin bool CreateList(LinkList &L); Node *CreateNode(int e, int c); void FreeList(LinkList &L); void SortList(LinkList &L); void DeleteNextNode(Node *d); void SweepNextNode(Node *s); 一元稀疏多项式的表示及加法运算 一、需求分析 1.程序的功能 (1).按照指数升序顺序,输入并建立多项式M与N。 (2).计算多项式M与N的和 (3).输出多项式M、N、M+N。 2.输入输出的要求 多项式按指数递增顺序输入;设计的数据结构应有利于表示任意一元稀释多项式;多项式的输出采用数学多项式的表示形式。 3.测试数据 (1)7+3x+9x8+5x17, 8x+22x7-9x8 (2) 0, 8x+22x7-9x8 (3)8x10+22x7-9x8 , -1 二、概要设计 1.通过建立链表来实现多项式的输入 在多项式输入之前,要先定义一个带有头结点的单链表,紧接着以指数递增的顺序输入多项式中系数不为零的项,其中每一项对应一个结点,每项对应的结点依次插入直至遇到结束标志,这样结完成了多项式的输入。 2. 两个多项式相加 两个多项式中如果指数相同则系数相加,构成和多项式的一项;如果指数不同,则直接构成和多项式的一项。 3. 多项式的输出 采用数学多项式的表达方式 三、详细设计 1.定义数据类型: typedef struct pnode { float coef; //系数 int exp; //指数 struct pnode *next; //指针,指向下一个系数不为的子项 }PNode, *PLink; PLink M,N,P; //多项式M、N、P 2.通过建立链表来实现多项式的输入 在多项式输入之前,要先定义一个带有头结点的单链表,先输入多项式项数,紧接着以指数递增的顺序输入多项式中系数不为零的项,其中每一项对应一个结点,每项对应的结点依次插入,当项数达到时结束,这样完成了多项式的输入。 PNode *createList(PNode *p) //建立多项式链表 { float a; int b; int c; int d; p=new PNode; 数据结构课程设计 系别电子信息系 专业计算机科学与技术 班级学号4090113 姓名王健 指导教师党群 成绩 2011年7 月14 日 目录 一、课程题目 (1) 二、需求分析 (1) 三、测试数据 (2) 四、概要设计 (2) 五、调用关系图 (3) 六、程序代码 (3) 七、心得体会及总结 (12) 数据结构课程设计 一、课程题目 一元稀疏多项式计算器 二、需求分析 1、一元稀疏多项式简单计算器的功能是: 1.1 输入并建立多项式; 1.2 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,………cn,en, 其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; 1.3 求多项式a、b的导函数; 1.4 计算多项式在x处的值; 1.5多项式a和b相加,建立多项式a+b; 1.6 多项式a和b相减,建立多项式a-b。 2、设计思路: 2.1 定义线性表的动态分配顺序存储结构; 2.2 建立多项式存储结构,定义指针*next 2.3利用链表实现队列的构造。每次输入一项的系数和指数,可以输出构 造的一元多项式 2.4演示程序以用户和计算机的对话方式执行,即在计算机终站上显示 “提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的输入数据(滤去输入中的非法字符)建立的多项式以及多项式相加的运行结果在屏幕上显示。多项式显示的格式为:c1x^e1+c2x^e2+… +cnx^en 3、设计思路分析 要解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为 运用尾插法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b,a+b的求和运算等同于单链表的插入问题(将单链表polyn p中的结点插入到单链表polyn h中),因此“和多项式”中的结点无须另生成。 为了实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则: ① 若p->expn一元稀疏多项式计算器实验(报告+程序)
一元稀疏多项式的加法运算(数据结构实习)
实验报告——2 一元稀疏多项式计算器
多项式的运算(c语言实现)
(整理)一元稀疏多项式计算器
一元稀疏多项式计算器C语言课程设计
数据结构实验,多项式计算器
一元稀疏多项式计算器(数据结构)
用C语言实现多项式简单计算器的设计
一元稀疏多项式计算器实验
一元稀疏多项式计算器(数据结构)
一元多项式计算器设计与实现
一元多项式计算器程序设计实验报告
数据结构课程设计-一元多项式计算器
数据结构课程设计——一元稀疏多项式
一元稀疏多项式计算器实习报告
一元稀疏多项式计算器 C语言编写
一元稀疏多项式的表示及加法运算
数据结构课程设计___一元稀疏多项式计算器(报告+代码)__完整版.