计算器的设计课程设计含源代码可以运行
- 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<q->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<b->expn)return-1;
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;
qb=qb->next;
break;
case0://两者的指数值相等
sum=qa->coef+qb->coef;
if(sum!={//修改多项式PA中当前结点的系数值p->next=qa;
qa->coef=sum;
p=qa;
qa=qa->next;
}
else{//删除多项式PA中当前结点
q=qa;
qa=qa->next;
free(q);
}
q=qb;
qb=qb->next;
free(q);
break;
case1://多项式PB中当前结点的指数值小
p->next=qa;
p=qa;
qa=qa->next;
break;
}//switch
}//while
if(Pa)p->next=qa;//链接Pa中剩余结点
if(Pb)p->next=qb;//链接Pb中剩余结点
q=h;
h=h->next;
free(q);
returnh;
}//APolyn
term*A(term*Pa,term*Pb){
intn;
puts("再输入一一元多项式的项数");
scanf("%d",&n);
Pb=CreatPolyn(Pb,n);
Pb=selsort(Pb);
PrintfPoly(Pa);
if(Pb&&Pb->coef>0)printf("+");
PrintfPoly(Pb);
Pa=APolyn(Pa,Pb);
printf("=");
Pa=selsort(Pa);
PrintfPoly(Pa);
returnPa;
}
term*BPolyn(term*Pa,term*Pb){//算法
//多项式减法:Pa=Pa-Pb,利用两个多项式的结点构成"差多项式"。
term*p=Pb;
while(p){
p->coef*=-1;
p=p->next;
}
returnAPolyn(Pa,Pb);
}//BPolyn
term*B(term*Pa,term*Pb){
intn;
puts("再输入一一元多项式的项数");
scanf("%d",&n);
Pb=CreatPolyn(Pb,n);
Pb=selsort(Pb);
PrintfPoly(Pa);
printf("-");
putchar('(');PrintfPoly(Pb);putchar(')');
Pa=BPolyn(Pa,Pb);
printf("=");
Pa=selsort(Pa);
PrintfPoly(Pa);
returnPa;
}
term*CPolyn(term*Pa,term*Pb){//算法
//多项式乘法:Pa=Pa*Pb,利用两个多项式的结点构成"积多项式"。
if(!Pb)returnNULL;
term*pa=Pa,*p,*q,*r,*s,*t;
r=p=(term*)malloc(sizeof(term));
while(pa){
p->coef=pa->coef;
p->expn=pa->expn;
q=p;
p=p->next=(term*)malloc(sizeof(term));
pa=pa->next;
}
q->next=NULL;
free(p);
pa=Pa;
t=s=(term*)malloc(sizeof(term));
while(pa){
q=s;
s=s->next=(term*)malloc(sizeof(term));
pa=pa->next;
}
q->next=NULL;
free(s);
pa=Pa;
while(pa){
pa->coef*=Pb->coef;
pa->expn+=Pb->expn;
pa=pa->next;
}
Pb=Pb->next;
while(Pb){
p=r;
s=t;
while(p){
s->coef=p->coef*Pb->coef;
s->expn=p->expn+Pb->expn;
p=p->next;
s=s->next;
}
Pa=APolyn(Pa,t);
Pb=Pb->next;
}
returnPa;
}//CPolyn
term*C(term*Pa,term*Pb){
intn;
puts("再输入一一元多项式的项数");
scanf("%d",&n);
Pb=CreatPolyn(Pb,n);
Pb=selsort(Pb);
putchar('(');PrintfPoly(Pa);putchar(')'); printf("*");
putchar('(');PrintfPoly(Pb);putchar(')'); printf("=");
Pa=CPolyn(Pa,Pb);
Pa=selsort(Pa);
PrintfPoly(Pa);
returnPa;
}
voidmain()
{
inti;
printf("1、基本四则运算\n");
printf("2、进制转换\n");
printf("3、一元多项式运算\n");
printf("0、退出程序\n");
scanf("%d",&i);
switch(i)
{
case0://退出
break;
case1:
//调用四则运算函数
computer1();
break;
case2:
computer2();
//调用进制转换
break;
case3:
computer3();
//调用多项式运算
break;
default:
break;
}
}
voidcomputer3()
{
term*M,*N;
chars[2];
inti,n;
puts("一元多项式计算:\n输入一一元多项式的项数"); scanf("%d",&n);
M=CreatPolyn(M,n);
M=selsort(M);
PrintfPoly(M);
p:puts("\n1:加\n2:减\n3:乘\n4:退出");
getchar();
q:gets(s);
if(s[1]!='\0'||!isdigit(*s)){
puts("输入有误,请重新输入!");gotoq;
}
i=*s-48;
switch(i){
case1:M=A(M,N);gotop;;
case2:M=B(M,N);gotop;;
case3:M=C(M,N);gotop;
case4:break;
default:puts("输入有误,请重新输入!");gotoq; }
}
voidcomputer1()
{
inti;
inta,b,c;
printf("请选择需要进行的运算类型\n");
printf("1加法\n");
printf("2减法\n");
printf("3乘法\n");
printf("4除法\n");
scanf("%d",&i);
printf("请输入需要进行计算的数据\n");
scanf("%d%d",&a,&b);
switch(i)
{
case1:
c=sum(a,b);
break;
case2:
c=substract(a,b);
break;
case3:
c=multipe(a,b);
break;
case4:
c=diver(a,b);
break;
default:
break;
}
printf("计算结果是:%d\n",c);
}
voidcomputer2()
{
}
intsum(intx,inty)
{
returnx+y;
}
intsubstract(intx,inty)
{
returnx-y;
}
intmultipe(intx,inty) {
returnx*y;
}
intdiver(intx,inty)
{
if(y!=0)
{
returnx/y;
}
else
printf("输入非法!"); }
intBtoD(char*a,char*b) {
return0;
}。