1、一元n次实验报告程序设计实习报告( 2012-4-8 )姓名: 秦炜杰 学号: 110520021 日期: 2011-4-8一、题目编出程序,在键盘上输入两个一元n次多项式,按指数减少的形式输出,求出两个一元n次多项式的和,化简后并按指数减少的形式输出。我们可以利用数组来表示一个一元多项式。例如多项式: 3X9-6X4+2X+7可表示为 (指数和系数均为0表示结束) 设每个一元多项式项数都不会超过十项。 编出程序实现如下功能:在键盘上输入指数ne和系数nf,分别生成两个一元多项式HA和HB;输出亿元多项式HA和HB;把一元多项式HA和HB相加,生成新的一元多项式HC(HC可能超过十项);输出新
2、形成的一元多项式HC(原HA、HB不变);询问“Continue(n)?”,当输入回答字符n时结束,否则回到第一点继续执行;注意:进行多项式相加时,只有该两项的指数相同时才能相加,若相加后系数为0,则取消该项; 建立多项式,可以严格按指数从大到小的次序输入,此时,当发现当前项的指数比前一项的指数大时,则要求多项式各项依照指数重新输入; 若建立多项式时可以不按指数由大到小的次序输入时,则应在输入结束后用程序进行调整,使数组内多项式各项依照指数从大到小次序存放; 在一个多项式中若发现有两项(或两项以上)的指数相等时,应进行合并,或合并后系数为0则取消该项;多项式输出形式:设有多项式 3X8-2X+
3、7,则输出形式为: 3X8-2X1+7X0 或 3X8-2X1+7X0【进一步要求】:以链表形式,编程实现上述功能。二、基本要求1链表的基本操作要熟练,在建立链表的同时要进行排序,避免把整条链进行排序。2输入和输出要清晰,输入提示要清楚。三、实习报告1实习题:编出程序使用户输入两个一元n次多项式,按指数减小的形式输出键入的两条链,并把两条链进行求和合并同类项,然后按指数减少的形式输出。2解题的基本算法:(1)根据题意,先输入一个多项式的指数,再输入该项的系数,以指数和系数为0结束该多项式的输入,再以同样的输入形式第二个多项式,最后进行相加,合并同类项,最后输出该结果。所以,程序的主要结构应如下
4、: 1. 输出提示后依次输入对应的指数和系数; 2. 在不改变两个多项式的情况下进行相加化简; 3. 最后输出最后结果。(2)从程序的结构上看,输出并不难,边输入边排序和两个多项式的相加后化简比较难(3)进一步讨论两个多项式的相加和化简:先把两条链的头指针赋给HA和HB;先看分别HA和HB的第一项,看是否都为空,若是,则结果为0;若HA为空,HB不为空,则把HA中第一项赋给第三条结果链HC,再把HA后移一位;若HB为空,HA不为空,则把HA中第一项赋给第三条结果链HC,再把HB后移一位;若HA和HB都不为空,则再进一步比较指数的大小,然后再把HA和HB后移一位:若HA的指数大于HB的指数,则把
5、HA写入HC;若HA的指数小于HB的指数,则把HB写入HC;若两项的指数相同,则把两项相加后看是否为0,如果为0,则不写入HC,如果不为0,则写入HC中。(4)进一步讨论创建链表时是按顺序插入的: 在插入第二个节点前先扫描一次链表,在刚好的位置插入。3程序流程图(为了更直观地反映出程序的逻辑关系,我们仍采用了传统的表示方法(注意:HA和HB分别为两条链的头指针。)4.源程序代码。/ 一元n次多项式的链表形式#include#include#includestruct duo_xiang_shi / 建立结构体 float zi_shu; / 指数 float xi_shu; / 系数 duo_
6、xiang_shi* next; / 指向下一个节点; int n;duo_xiang_shi* creat_order( void ) / 建立链表并且按指数从大到小插入 duo_xiang_shi* head; duo_xiang_shi *p,*p0,*point; float t; n=0; p0=new duo_xiang_shi; coutnPlease Input the (n+1)p0-zi_shu; coutnPlease Input the (n+1)p0-xi_shu; head=NULL; while( (p0-zi_shu!=0|p0-xi_shu!=0) & (nn
7、ext=NULL; else p=head; while( p0-zi_shuzi_shu & p-next!=NULL ) /插入第一个节点 point=p; p=p-next; if( p0-zi_shu=p-zi_shu ) if( p=head ) / 插入第二个节点,第二个节点大于第一个节点 p0-next=head; head=p0; else / 插入节点 p0-next=point-next; point=p0-next; else / 尾节点后插入 p-next=p0; p0-next=NULL; p0=new duo_xiang_shi; coutnPlease Input
8、 the (n+1)p0-zi_shu; coutnPlease Input the (n+1)p0-xi_shu; return(head);duo_xiang_shi* make( duo_xiang_shi *head,duo_xiang_shi *node) / 形成HC链 duo_xiang_shi *temp; static duo_xiang_shi *last; temp=new duo_xiang_shi; if( NULL=temp ) coutzi_shu=node-zi_shu; temp-xi_shu=node-xi_shu; temp-next=NULL; if(
9、NULL=head ) head=temp; last=temp; temp-next=NULL; else last-next=temp; last=temp; temp-next=NULL; return head;/ 两个多项式求和并化简duo_xiang_shi* add( duo_xiang_shi* HA,duo_xiang_shi* HB) duo_xiang_shi *HC,*head_HC=NULL; do HC=new duo_xiang_shi; if( HA=NULL & HB=NULL ) / 两个链表都为空 HC=NULL; head_HC=make( head_H
10、C, HC ); if( HA!=NULL & HB=NULL ) / HA为空,HB不为空 HC-zi_shu=HA-zi_shu; HC-xi_shu=HA-xi_shu; HA=HA-next; head_HC=make( head_HC, HC ); if( HA=NULL & HB!=NULL ) / HA不为空,HB为空 HC-zi_shu=HB-zi_shu; HC-xi_shu=HB-xi_shu; HB=HB-next; head_HC=make( head_HC , HC); if( HA!=NULL & HB!=NULL ) / HA,HB都不为空 if( HA-zi_s
11、hu=HB-zi_shu ) / HA的指数大于HB HC-xi_shu=HA-xi_shu + HB-xi_shu; HC-zi_shu=HA-zi_shu; if( HC-xi_shu != 0 ) / 相加后系数不为0 head_HC=make( head_HC, HC ); HA=HA-next; HB=HB-next; if( HA-zi_shuHB-zi_shu ) / HA的指数大于HB HC-zi_shu=HA-zi_shu; HC-xi_shu=HA-xi_shu; head_HC=make( head_HC, HC ); HA=HA-next; if( HB-zi_shuH
12、A-zi_shu ) / HB的指数大于HA HC-zi_shu=HB-zi_shu; HC-xi_shu=HB-xi_shu; head_HC=make( head_HC, HC ); HB=HB-next; while( HA!=NULL | HB!=NULL ); / 当HA,HB都为空时,跳出循环 return head_HC;void print( duo_xiang_shi* head) / 输出链表 duo_xiang_shi* p; int flag=0; p=head; if( p=NULL) coutxi_shu!=0) coutxi_shuXzi_shu; flag+;
13、p=p-next; if(p-xi_shu0 & p!=NULL) cout+; if( flag=0) cout0; int main() char ch;do duo_xiang_shi *head_1,*head_2,*head_3; clrscr(); coutn Please Input the first shi_zi ; head_1=creat_order(); / 建立链表一 coutn Please Input the second shi_zi ; head_2=creat_order(); / 建立链表二 coutn*; coutnThe first shizhi is
14、:; print( head_1); / 输出链表一 coutnThe second shizhi is:; print( head_2); / 输出链表二 head_3=add(head_1,head_2); / 合并一二成链表三 coutnThe Last shizhi is:; print(head_3); / 输出链表三 coutntContinue(Yes_any key/No_n)?; ch=getche(); if(ch=N) ch=n; if(ch!=n) coutn;while(ch!=n); return 0;5调试:第一组:输入:(A) 9x8-7x3+3x-5 (B)
15、-5x9+6x5-4x4+x2 输出:(C) -5X9+9X8+6X5-4X4-7X3+X2+3X1-5 第二组:输入:(A)9x8-7x3+3x-5 (B)x6+5x3-2x+3 输出: (C) 9X8+X6-2X3+X1-2第三组:输入:(A)9x8-7x3+3x-5 (B)-9x8+7x3-3x 输出:(C) -5 第四组:输入:(A)9x8-7x3+3x-5 (B)2x10-8x8+7x3-3x-5 输出:(C) 2X10+X8-10第五组:输入:(A)9x8-7x3+3x-5 (B)-9x10+x7-5x4+3x2 输出:(C) -9X10+9X8+X7-5X4-7X3+3X2+3X
16、1-5 第六组:输入:(A)9x8-7x3+3x-5 (B)-9x8+7x3-3x+5 输出: (C) 0第七组:输入:(A)9x8-7x3 (B)7x9-9x8+6x4+7x3+2x-5 输出: (C) 7X9+6X4+2X1-5第八组:输入:(A)9x8-7x3+3x-5 (B)0输出: (C) 9X8-7X3+3X1-5第九组:输入:(A)0 (B)9x8-7x3+3x-5 输出: (C) 9X8-7X3+3X1-5第十组:输入:(A)0(B)0输出: (C) 0 6、主要的体会和教训。 1)在插入链表时就要按顺序插入,即不用再对链表进行排序,减少运行时间。2)考虑的情形要具体一些,比如输出函数中要考虑相加后为0的情形。 3)函数,链表,指针应十分熟悉,不到掌握,而且会运用。7.主要参考资料。 1.面向对象程序设计基础(第二版)(作者:李师贤等)2.C+程序设计实验(作者:李宏新等)3.C程序设计(第三版)(作者:谭浩强)
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2