计算器的设计课程设计含源代码可以运行
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算器的设计课程设计含源代码可以运行
The Standardization Office was revised on the afternoon of December 13, 2020
计算器的设计
第一章需求分析
加减乘除的运算
设计一个简单的计算器,能够在有限位数内实现加、减、乘、除运算,并支持括号和小数。
进制转换
通过该计算器可以实现二进制、十进制、八进制、十六进制之间的转换和运算。
这个程序首先要求选择一种数值转换的种类,例如我们可以选择二进制输入,十进制输出,这样就要求我们把输入的二进制转换成十进制。由于按照我们要求的输入,输出,总共有6种情况。所以我们不能一一写出来每个程序的执行过程,对于不同的情况我们只需要定义不同的输入函数和输出函数,根据不同的情况,调用不同的输入函数和输出函数,这样做是为了对于多进制的情况,这样能简化程序。我定义了二进制输入,十进制输入,十六进制输入,二进制输出,十进制输出,十六进制输出,这样就能满足各种需要。
一元多项式的运算
通过C语言实现多项式的的计算功能,输入多项式的项数、每项的系数和指数,将两个多项式进行加减进行加减运算。
该内容包括输入并建立多项式、多项式相加、多项式相减、多项式求值及输出多项式。本项功能使用链式存储结构存储一元多项式,可以方便的计算简单的一元多项式的基本运算。
实现形式
要求采用链表结构进行实现
第二章功能描述
全局功能模块图
分为二进制转换为十进制、八进制转换为十进制、十六进制转换为十进制,一元多项式的计算分为加法运算和减法运算,以下是对计算器功能实现的具体说明。四则运算功能描述
计算器可以进行简单的加减乘除运算,可以判断用户的错误输入并且进行限制提示,比如:输入的左右括号不匹配,除数为0,输入非法字符时,都会有相应的提示,对用户比较友好。
在进行加减乘除的运算过程中,程序的运算部分建立了两个堆栈,分别用来存储操作符和操作数。接收的用户输入可细分为四种,分别是数字,加减乘除操作符及左括号,右括号,等号。根据个符号的优先级进行计算式的运算。
此程序调用的函数主要有<>/*数学函数的定义*/<>/*屏幕操作函数*/<>/*I/O函数*/<>/*库函数*/<>10”3.2.13.2.23.2.33.3.13.3.2据结构.北京:清华大学出版社,2010年
[2]苏士华.数据结构课程设计.机械工程出版社
附录二程序源代码
#include<>
#include<>
#include<>
voidcomputer1();
voidcomputer2();
voidcomputer3();
intsum(intx,inty);//加
intsubstract(intx,inty);
intmultipe(intx,inty);
intdiver(intx,inty);
intBtoD(char*,char*);
typedefstructterm{//项的表示,多项式的项作为LinkList的数据元素floatcoef;//系数
intexpn;//指数
structterm*next;
}term;
term*CreatPolyn(term*P,intm){//算法
//输入m项的系数和指数,建立表示一元多项式的有序链表P if(m<=0)returnNULL;
term*h=P=(term*)malloc(sizeof(term)),*q;
P->coef=;
inti;
printf("依次输入%d个非零项\n",m);
for(i=1;i<=m;++i){//依次输入m个非零项
scanf("%f%d",&P->coef,&P->expn);
if(P->coef)
q=P;
P=P->next=(term*)malloc(sizeof(term));
}
q->next=NULL;
free(P);
returnh;
}//CreatPolyn
term*selsort(term*h){
term*g,*p,*q;
if(!h)returnNULL;
floatf;
inti,fini=1;
for(g=h;g->next&&fini;g=g->next){
fini=0;
for(p=h,q=h->next;q;p=p->next,q=q->next)
if(p->expn
f=p->coef;i=p->expn;
p->coef=q->coef;p->expn=q->expn;
q->coef=f;q->expn=i;
fini=1;
}
}
for(g=h,p=g->next;p;)
if(g->expn==p->expn){
g->coef+=p->coef;
g->next=p->next;
q=p;
p=p->next;
free(q);
}
elseif(g->next){
g=g->next;
p=p->next;
}
returnh;
}
voidPrintfPoly(term*P){
term*q=P;
if(!q){
putchar('0');
return;
}
if(q->coef!=1){
printf("%g",q->coef);
if(q->expn==1)putchar('X');
elseif(q->expn)printf("X^%d",q->expn);
}
elseif(!q->expn)putchar('1');
elseif(q->expn==1)putchar('X');
elseprintf("X^%d",q->expn);
q=q->next;
while(q){
if(q->coef>0)putchar('+');
if(q->coef!=1){
printf("%g",q->coef);
if(q->expn==1)putchar('X');
elseif(q->expn)printf("X^%d",q->expn);
}
elseif(!q->expn)putchar('1');
elseif(q->expn==1)putchar('X');
elseprintf("X^%d",q->expn);
q=q->next;
}
}
Compare(term*a,term*b){
if(a->expn
if(a->expn>b->expn)return1;
return0;
}
term*APolyn(term*Pa,term*Pb){//算法
//多项式加法:Pa=Pa+Pb,利用两个多项式的结点构成"和多项式"。term*h,*qa=Pa,*qb=Pb,*p,*q;
floatsum;
h=p=(term*)malloc(sizeof(term));
p->next=NULL;
while(qa&&qb){//Pa和Pb均非空
switch(Compare(qa,qb)){
case-1://多项式PA中当前结点的指数值小
p->next=qb;
p=qb;