版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算器的设计第一章需求分析1.1加减乘除的运算 设计一个简单的计算器,能够在有限位数内实现加、减、乘、除运算,并支持括号和小数。1.2进制转换通过该计算器可以实现二进制、十进制、八进制、十六进制之间的转换和运算。这个程序首先要求选择一种数值转换的种类,例如我们可以选择二进制输入,十进制输出,这样就要求我们把输入的二进制转换成十进制。由于按照我们要求的输入,输出,总共有6种情况。所以我们不能一一写出来每个程序的执行过程,对于不同的情况我们只需要定义不同的输入函数和输出函数,根据不同的情况,调用不同的输入函数和输出函数,这样做是为了对于多进制的情况,这样能简化程序。我定义了二进制输入,十进制输入,十六进制输入,二进制输出,十进制输出,十六进制输出,这样就能满足各种需要。1.3一元多项式的运算通过C语言实现多项式的的计算功能,输入多项式的项数、每项的系数和指数,将两个多项式进行加减进行加减运算。该内容包括输入并建立多项式、多项式相加、多项式相减、多项式求值及输出多项式。本项功能使用链式存储结构存储一元多项式,可以方便的计算简单的一元多项式的基本运算。1.4实现形式要求采用链表结构进行实现第二章功能描述2.1全局功能模块图计算器计算器二级制十进制八进制十六进制的转换和运算二级制十进制八进制十六进制的转换和运算加减乘除的运算一元多项式的计算减加加减乘除八到十二到十十六到十减加加减乘除八到十二到十十六到十图1全局功能图全局功能模块图说明:该计算器主要实现四则运算、进制的转换以及一元多项式的加减运算。在四则运算中主要功能有整型数据的加减乘除运算,进制转换分为二进制转换为十进制、八进制转换为十进制、十六进制转换为十进制,一元多项式的计算分为加法运算和减法运算,以下是对计算器功能实现的具体说明。2.2四则运算功能描述计算器可以进行简单的加减乘除运算,可以判断用户的错误输入并且进行限制提示,比如:输入的左右括号不匹配,除数为0,输入非法字符时,都会有相应的提示,对用户比较友好。在进行加减乘除的运算过程中,程序的运算部分建立了两个堆栈,分别用来存储操作符和操作数。接收的用户输入可细分为四种,分别是数字,加减乘除操作符及左括号,右括号,等号。根据个符号的优先级进行计算式的运算。此程序调用的函数主要有<math.h>/*数学函数的定义*/<conio.h>/*屏幕操作函数*/<stdio.h>/*I/O函数*/<stdlib.h>/*库函数*/<stdarg.h>//<ctype.h>/*字符操作函数*/。基本使用:用→←↑↓控制鼠标图形移动,当*变量长度参数表*/<graphics.h>/*图形函数*/<string.h>/*字符串函数*移动到相应得按钮时按回车键输入当前数字或执行对应的函数。加法:输入一个被加数数,按“+”,输入被加数,按“=”,输出结果。乘法:输入一个数,按“*”,输入另个数,按“=”,输出结果。除法:输入一个被除数,按“+”,输入另个除数,按“=”,输出结果。求余:输入一个数,按“mod”,按“=”,输出结果。取整:输入一个数,按“int”,按“=”,输出结果。2.3进制转换功能描述输入一个八进制数,按“8->10”,按“=”,输出十进制结果。十六进制转十进制:输入一个十六进制数,按下“jz”+“16->10”按“=”2.4一元多项式运算功能描述一元多项式的计算是常用的数学计算,在计算机计算中是非常普遍的,为了更加方便的进行此类运算,在此设计了一个简单的一元多项式计算器,用于对一元多项式进行创建,输出,以及一元多项式之间的相加,相减。该程序简单,清晰,明了,用户易懂易用,能较好得实现一元多项式的计算功能[2]。程序的基本功能:(1)建立多项式(2)输出多项式(3)两个多项式相加,建立并输出和多项式(4)两个多项式相减,建立并输出差多项式(5)两个多项式相乘,建立并输出乘多项式第三章功能的设计3.1四则运算设计思路系统在进行加减乘除的运算时,程序中主要运用堆栈这一数据逻辑结构。并建立了两个堆栈,当遇到数字时直接压入操作数堆栈;当遇到加减乘除或左括号时进行优先级判断:如果传入的操作符优先级大于栈顶操作符的优先级则操作符入栈,如果传入的操作符优先级小于等于栈顶操作数的优先级则将栈顶操作符弹出,另外从操作数堆栈弹出两操作数进行运算,运算结果压入操作数堆栈;当遇到右括号时从两堆栈中弹出数据进行运算(每次结果压入操作数堆栈),直至遇到左括号从堆栈中弹出为止;当遇到等号时从两堆栈中弹出数据进行运算,直至操作符堆栈为空。switch(act)/*根据运算符号计算*/{case1:result=num1+num2;break;/*做加法*/case2:result=num1-num2;break;/*做减法*/case3:result=num1*num2;break;/*做乘法*/case4:result=num1/num2;break;/*做除法*/3.2进制转换设计思路在进行十六进制转化为十进制或八进制时,需要注意的是:先输入一个十六进制数据,再输入“sft”然后输入“16->10”或“16->8”,最后输入“=”,输出转换后的结果。3.2.1十六进制转换为十进制本段程序的作用是将十六进制转化为十进制,该程序是作为十六进制转化为其他进制的桥梁。十六进制向十进制的转换分成两个大的步骤,一是从十六进制向二进制的转换,由于十六进制和二进制的特殊关系,它们之间的转换非常简单。二是从二进制转换为十进制,相对而言,这种转换复杂一些。所以该模块的核心是实现二进制数向十进制数的转换。方法是将要转换的二进制数预先放到AX寄存器中,判断AX中数的符号,若为负数,则将负号送入输出缓冲区,并求AX的绝对值;若AX中的数为正数,则不做其他处理,此时AX中即为无符号二进制数。然后将无符号二进制数转换成十进制数,可采用将AX除以10,得到第一个商和第一个余数,第一个余数就是所求十进制数的个位:将第一个商除以10,得到第二个商和余数,第二个余数就是所求十进制数的十位数,重复以上过程,一直循环到商为0时,得到的余数就是所求十进制数的最高位数。这就是数制转换中常用的“除模留余倒排列”法则。cd1=strlen(str7);for(i=0,j=1;i<cd1;i++,j++){if(str7[i]=='1')num=num+1*pow(16,cd1-j);elseif(str7[i]=='2')num=num+2*pow(16,cd1-j);elseif(str7[i]=='3')num=num+3*pow(16,cd1-j);elseif(str7[i]=='4')num=num+4*pow(16,cd1-j);elseif(str7[i]=='5')num=num+5*pow(16,cd1-j);elseif(str7[i]=='1')num=num+1*pow(16,cd1-j);elseif(str7[i]=='6')num=num+6*pow(16,cd1-j);elseif(str7[i]=='7')num=num+7*pow(16,cd1-j);elseif(str7[i]=='8')num=num+8*pow(16,cd1-j);elseif(str7[i]=='9')num=num+9*pow(16,cd1-j);elseif(str7[i]=='A')num=num+10*pow(16,cd1-j);elseif(str7[i]=='B')num=num+11*pow(16,cd1-j);elseif(str7[i]=='C')num=num+12*pow(16,cd1-j);elseif(str7[i]=='D')num=num+13*pow(16,cd1-j);elseif(str7[i]=='E')num=num+14*pow(16,cd1-j);elseif(str7[i]=='F')num=num+15*pow(16,cd1-j);}3.2.2二进制转换为十进制由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。本段程序的作用是将二进制转化为十进制,可作为二进制转化为其他进制的桥梁。zj=num1;result=0;for(i=0;i<=cd;i++){result=result+fmod((int)(zj),10)*pow(2,i);zj=(int)(zj/10);}3.2.3八进制转换为十进制本段程序的作用是将八进制转化为十进制,可作为八进制转化为其他进制的桥梁。zj=num1;result=0;for(i=0;i<=cd;i++){result=result+fmod((int)(zj),10)*pow(8,i);zj=(int)(zj/10);}3.3一元多项式运算设计思路输入多项式采用头插法的方式,输入多项式中一个项的系数和指数,就产生一个新的节点,建立起它的右指针,并用头节点指向它;为了判断一个多项式是否输入结束,定义一个结束标志,当输入非0时就继续,当输入0时,就结束一个多项式的输入。创建一元多项式的关键程序如下,由用户决定一元多项式的项数,项数系数和指数。#include<stdlib.h>#include<stdio.h>#include<ctype.h>typedefstructterm{//项的表示,多项式的项作为LinkList的数据元素floatcoef;//系数intexpn;//指数structterm*next;}termterm*CreatPolyn(term*P,intm){//算法2.22//输入m项的系数和指数,建立表示一元多项式的有序链表Pif(m<=0)returnNULL;term*h=P=(term*)malloc(sizeof(term)),*q;P->coef=0.0;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;}//CreatPolyn3.3.1一元多项式的相加它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就应该相加;相加的和不为0的话,用头插法建立一个新的节点。p的指数小于q的指数的话,就应该复制q节点到多项式中。p的指数大于q的指数的话,就应该复制p节点到多项式中。当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。当第一个多项式空,第二个多项式不为空时,将第二多项式用新节点产生。一元多项式加法的关键程序如下:term*APolyn(term*Pa,term*Pb){//算法2.23//多项式加法: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!=0.0){//修改多项式PA中当前结点的系数值p->next=qa;qa->coef=sum;p=qa;qa=qa->next;}else{//删除多项式PA中当前结点q=qa;qa=qa->next;ree(q);}q=qb;qb=qb->next;free(q);break;case1://多项式PB中当前结点的指数值小p->next=qa;p=qa;qa=qa->next;break;}//switch}//whileif(Pa)p->next=qa;//链接Pa中剩余结点if(Pb)p->next=qb;//链接Pb中剩余结点q=h;h=h->next;free(q);returnh;}//APolynterm*A(term*Pa,term*Pb){intn;puts("再输入一一元多项式的项数");scanf("%d",&n);//输入nPb=CreatPolyn(Pb,n);Pb=selsort(Pb);PrintfPoly(Pa);//输出Poly(Pa)if(Pb&&Pb->coef>0)printf("+");PrintfPoly(Pb);Pa=APolyn(Pa,Pb);printf("=");//输出“=”Pa=selsort(Pa);PrintfPoly(Pa);returnPa;}3.3.2一元多项式的相减它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就应该相减;相加的和不为0的话,用头插法建立一个新的节点。p的指数小于q的指数的话,就应该复制q节点到多项式中。p的指数大于q的指数的话,就应该复制p节点到多项式中,并且建立的节点的系数为原来的相反数;当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生,并且建立的节点的系数为原来的相反数。一元多项式减法关键程序如下:term*BPolyn(term*Pa,term*Pb){//多项式减法:Pa=Pa-Pb,利用两个多项式的结点构成"差多项式"。term*p=Pb;//创建指针while(p){p->coef*=-1;p=p->next;}returnAPolyn(Pa,Pb);}//BPolynterm*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;}第四章程序流程图图2流程图程序流程图的说明:首先开始后输出功能选择菜单,在选择菜单中1代表四则运算,2代表进制转换,3代表一元多项式的计算,0表示退出。当选择1时,调用四则运算程序,在四则运算程序中输出子菜单,根据提示选择要进行的算法,输入数据得到运行结果出现问句是否结束运行是:结束,否:回到开始;当选择2时,调用进制转换程序,输出子菜单,根据提示选择进制转换,操作步骤同上;当选择3时,调用一元多项式的计算程序,在子菜单中输入要计算的多项式,选择要进行的加减运算,运行。当选择0时,结束程序。第五章程序运行结果图5.1四则运算运行结果图3四则运算结果图3是四则运算运行结果,在主菜单中选择1基本四则运算,然后选择2减法基本运算输入数据3426即得到运行结果为85.2一元多项式加减运行结果图4一元多项式结果图4是一元多项式运算结果,在主菜单中选3一元多项式运算,在提示下输入3个非零项,得出运算结果,若还要继续运算则输入要输入的项数4,再输入4个非零项:34564523得出运算结果。5.3运行初始状态图5初始菜单图5为程序的初始状态及主菜单,在该对话框中选择要进行的功能。第六章总结附录附录一参考文献[1]严蔚敏.数据结构.北京:清华大学出版社,2010年[2]苏士华.数据结构课程设计.机械工程出版社附录二程序源代码#include<stdlib.h>#include<stdio.h>#include<ctype.h>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){//算法2.22//输入m项的系数和指数,建立表示一元多项式的有序链表Pif(m<=0)returnNULL;term*h=P=(term*)malloc(sizeof(term)),*q;P->coef=0.0;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;}//CreatPolynterm*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){//算法2.23//多项式加法: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!=0.0){//修改多项式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}//whileif(Pa)p->next=qa;//链接Pa中剩余结点if(Pb)p->next=qb;//链接Pb中剩余结点q=h;h=h->next;free(q);returnh;}//APolynterm*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){//算法2.23//多项式减法:Pa=Pa-Pb,利用两个多项式的结点构成"差多项式"。term*p=Pb;while(p){p->coef*=-1;p=p->next;}returnAPolyn(Pa,Pb);}//BPolynterm*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){//算法2.23//多项式乘法: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;}//CPolynterm*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;pri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 亲子田园活动策划案
- 培训费用预算管理
- 《全球互动网招商》课件
- 易制爆化学品购销使用制度
- 《汽车文化之沃尔沃》课件
- 小学四年级数学三位数乘两位数水平练习练习题
- 子宫全切术后护理
- 行业等级评价信息的收集的方法渠道
- 新大陆云服务平台的使用网关管理智慧养老技术概论
- 现代办公事务处理缮印
- 历史幽愤的现代回响——《记念刘和珍君》课堂实录
- 英语单词分类大全-20170913
- 信息技术课课堂教学评价表
- 施工进度计划书
- 35KV集电线路铁塔组立专项方案
- 不锈钢管规格表大全以及理论重量表大全
- 公司保密制度-附保密分类表
- 滑雪场管理手册
- 人类养生长寿的新方法---“中枢平衡”健体强身模式
- 胸外科技术操作规范
- 环氧树脂胶配制方法
评论
0/150
提交评论