数据结构课程设计一元稀疏多项式计算器.docx
- 文档编号:25157561
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:16
- 大小:76.45KB
数据结构课程设计一元稀疏多项式计算器.docx
《数据结构课程设计一元稀疏多项式计算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计一元稀疏多项式计算器.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构课程设计一元稀疏多项式计算器
实习报告:
1.5题一元稀疏多项式计算器
题目:
设计一个一元稀疏多项式简单计算器
班级:
计科一班姓名:
康宇学号:
完成日期:
2013.4.15
一、需求分析
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)求多项式a、b的导函数;
2、测试数据:
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.
二、概要设计
为实现上述程序功能,应以有序链表来表示多项式的系数和指数。
定义线性表的动态分配顺序存储结构;建立多项式存储结构,定义指针*next利用链表实现队列的构造。
每次输入一项的系数和指数,可以输出构造的一元多项式
演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的输入数据(滤去输入中的非法字符)建立的多项式以及多项式相加的运行结果在屏幕上显示。
1、元素类型、结点类型和指针类型:
typedefstructLNode
{
floatxishu;//系数
intzhishu;//指数
structLNode*next;
}LNode,*Linklist;
2、建立两个全局链表指针,
LinklistList1=NULL;
LinklistList2=NULL;
用来存放两个多项式,然后在main()函数里调用输入函数。
3、本程序包括7个模块
1)主程序:
Voidmain()
{
While
(1)
{
输出菜单;
接受命令;
处理命令;
If(命令==退出)
则程序退出;
}
释放链表;
}
2)输入函数:
VoidInput()
{
调用插值函数In(List1)处理链表一;
调用插值函数In(List2)处理链表二;
}
3)输出函数:
VoidOutput()
{
调用输值函数Out(List1)处理链表一;
调用输值函数Out(List2)处理链表一;
}
4)相加函数:
VoidAdd()
{
if(List1节点指数>List2节点指数)
输出List1节点;
指针后移;
elseif(List1节点指数 输出List2节点; 指针后移; else 输出两节点相加后的值; 两链表指针都后移; if(链表1到头) 输出链表2剩余的节点; else(即链表二到头) 输出链表1剩余的节点; } 5)相减函数: VoidSub() { if(List1节点指数>List2节点指数) 输出List1节点; 指针后移; elseif(List1节点指数 输出List2节点;(系数要取负再输出) 指针后移; Else 两链表指针都后移; if(链表1到头) 输出链表2剩余的节点; else(即链表二到头) 输出链表1剩余的节点; } 6)求值函数: voidCalc() { 输入x的值; 依次调用链表一的节点,求出单项式的值相加后输出; } 7)求导函数: voidDaohanshu() { 输出多项式一的导函数; } 三、详细设计 #include #include #include typedefstructLNode//元素类型 { floatxishu; intzhishu; structLNode*next; }LNode,*Linklist; LinklistList1=NULL; LinklistList2=NULL; LinklistIn(LinklistL)//依次往链尾插 { Linklistp; floata; intb; Linklisthead=(Linklist)malloc(sizeof(LNode)); L=head; head->zhishu=0;//head->zhishu头结点放的是多项式的项数 p=head; p->next=NULL; printf("请输入一个多项式: \n"); while(scanf("%f%d",&a,&b)&&(a||b))//默认多项式是按指数由小到大输入 { //printf("%f%d\n",a,b); (head->zhishu)++; //printf("%3d\n",L->zhishu); Linklistq=(Linklist)malloc(sizeof(LNode)); q->xishu=a; q->zhishu=b; if(p->next==NULL) { p->next=q; q->next=NULL; p=head; } else { if(p->next->zhishu<=q->zhishu) { q->next=p->next; p->next=q; p=head; } else { p=p->next; } } } printf("您已成功输入一个多项式! ! \n"); returnL; } voidInput() { List1=In(List1); List2=In(List2); } voidOut(LinklistL) { Linklistp; p=L->next; printf("此多项式有%3d项",L->zhishu); while(p! =NULL)//按指数由大到小输出 { printf("%0.1f%3d",p->xishu,p->zhishu); p=p->next; } printf("\n"); } voidOutput() { printf("第一个多项式为: \n"); Out(List1); printf("第二个多项式为: \n"); Out(List2); } voidAdd() { Linklistp1,p2; p1=List1->next; p2=List2->next; printf("相加后的多项式为: \n"); while(p1&&p2) { if(p1->zhishu>p2->zhishu) { printf("%0.1f%3d",p1->xishu,p1->zhishu); p1=p1->next; } elseif(p1->zhishu { printf("%0.1f%3d",p2->xishu,p2->zhishu); p2=p2->next; } else { printf("%0.1f%3d",p1->xishu+p2->xishu,p1->zhishu); p1=p1->next; p2=p2->next; } } if(p1==NULL) { while(p2) { printf("%0.1f%3d",p2->xishu,p2->zhishu); p2=p2->next; } } else { while(p1) { printf("%0.1f%3d",p1->xishu,p1->zhishu); p1=p1->next; } } printf("\n"); } voidSub() { Linklistp1,p2; p1=List1->next; p2=List2->next; printf("相减后的多项式为: \n"); while(p1&&p2) { if(p1->zhishu>p2->zhishu) { printf("%0.1f%3d",p1->xishu,p1->zhishu); p1=p1->next; } elseif(p1->zhishu { printf("%0.1f%3d",-p2->xishu,p2->zhishu); p2=p2->next; } else { if(p1->xishu-p2->xishu! =0) { printf("%0.1f%3d",p1->xishu-p2->xishu,p1->zhishu); } p1=p1->next; p2=p2->next; } } if(p1==NULL) { while(p2) { printf("%0.1f%3d",-p2->xishu,p2->zhishu); p2=p2->next; } } else { while(p1) { printf("%0.1f%3d",p1->xishu,p1->zhishu); p1=p1->next; } } printf("\n"); } voidCalc() { intx; doublesum=0; Linklistp; printf("请输入x的值: "); scanf("%d",&x); p=List1->next; while(p) { sum+=p->xishu*pow(x,p->zhishu); p=p->next; } printf("多项式1在x处的值为: %0.1lf",sum); printf("\n"); } voidDaohanshu() { Linklistp; p=List1->next; printf("多项式1的导函数为: \n"); while(p) { printf("%0.1f%3d",p->xishu*p->zhishu,p->zhishu-1); p=p->next; } printf("\n"); } intmain() { intnum; while (1) { printf("-----------------------------------------------\n"); printf("1-------输入并建立多项式;\n"); printf("2-------输出其指系数排列;\n"); printf("3-------多项式相加;\n"); printf("4-------多项式相减;\n"); printf("5-------计算多项式在x处的值;\n"); printf("6-------求多项式a的导函数a';\n"); printf("0-------退出\n"); printf("-----------------------------------------------\n"); printf("请输入您要选择的功能: "); scanf("%d",&num); switch(num) { case1: Input();break;//输入函数 case2: Output();break;//输出函数 case3: Add();break;//函数相加 case4: Sub();break;//函数相减 case5: Calc();break;//计算函数在x处的值 case6: Daohanshu();break;//求函数的导函数 case0: exit (1); default: printf("输入错误,请重新输入"); } } free(List1); free(List2); return0; } 四、调试分析 1.由于链表是设置成为全局变量,所以任意函数都可以修改它,存在一定风险性。 但这也为后来的函数方便了,所有的函数统一没有参数。 2.刚开始时曾忽略了一些变量的类型以及没有考虑到指针的返回问题,使调试程序浪费了一定的时间。 今后应重视确定参数的变量和赋值属性的区分和标识。 3.本程序模块简洁,在main()函数里得到充分体现; 4.链表默认用户输入是按指数从小到大的顺序输入的,而默认输出时按指数从大到小;输入时,依次把节点插在链表的末端。 五、用户手册 1.本程序运行环境为Windows操作系统,执行文件为: std.exe 2.进入演示程序后显示的界面: 六、测试结果 中南民族大学 数据结构课程设计报告 姓名: 康宇 年级: 2010 学号: 专业: 计算机科学与技术 指导老师: 宋中山 2013年4月15日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 一元 稀疏 多项式 计算器