计算器的设计课程设计含源代码可以运行.docx
- 文档编号:21018193
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:28
- 大小:137.90KB
计算器的设计课程设计含源代码可以运行.docx
《计算器的设计课程设计含源代码可以运行.docx》由会员分享,可在线阅读,更多相关《计算器的设计课程设计含源代码可以运行.docx(28页珍藏版)》请在冰豆网上搜索。
计算器的设计课程设计含源代码可以运行
计算器的设计
第一章需求分析
1.1加减乘除的运算
设计一个简单的计算器,能够在有限位数内实现加、减、乘、除运算,并支持括号和小数。
1.2进制转换
通过该计算器可以实现二进制、十进制、八进制、十六进制之间的转换和运算。
这个程序首先要求选择一种数值转换的种类,例如我们可以选择二进制输入,十进制输出,这样就要求我们把输入的二进制转换成十进制。
由于按照我们要求的输入,输出,总共有6种情况。
所以我们不能一一写出来每个程序的执行过程,对于不同的情况我们只需要定义不同的输入函数和输出函数,根据不同的情况,调用不同的输入函数和输出函数,这样做是为了对于多进制的情况,这样能简化程序。
我定义了二进制输入,十进制输入,十六进制输入,二进制输出,十进制输出,十六进制输出,这样就能满足各种需要。
1.3一元多项式的运算
通过C语言实现多项式的的计算功能,输入多项式的项数、每项的系数和指数,将两个多项式进行加减进行加减运算。
该内容包括输入并建立多项式、多项式相加、多项式相减、多项式求值及输出多项式。
本项功能使用链式存储结构存储一元多项式,可以方便的计算简单的一元多项式的基本运算。
1.4实现形式
要求采用链表结构进行实现
第二章功能描述
2.1全局功能模块图
图1全局功能图
全局功能模块图说明:
该计算器主要实现四则运算、进制的转换以及一元多项式的加减运算。
在四则运算中主要功能有整型数据的加减乘除运算,进制转换分为二进制转换为十进制、八进制转换为十进制、十六进制转换为十进制,一元多项式的计算分为加法运算和减法运算,以下是对计算器功能实现的具体说明。
2.2四则运算功能描述
计算器可以进行简单的加减乘除运算,可以判断用户的错误输入并且进行限制提示,比如:
输入的左右括号不匹配,除数为0,输入非法字符时,都会有相应的提示,对用户比较友好。
在进行加减乘除的运算过程中,程序的运算部分建立了两个堆栈,分别用来存储操作符和操作数。
接收的用户输入可细分为四种,分别是数字,加减乘除操作符及左括号,右括号,等号。
根据个符号的优先级进行计算式的运算。
此程序调用的函数主要有
基本使用:
用→←↑↓控制鼠标图形移动,当*变量长度参数表*/
加法:
输入一个被加数数,按“+”,输入被加数,按“=”,输出结果。
乘法:
输入一个数,按“*”,输入另个数,按“=”,输出结果。
除法:
输入一个被除数,按“+”,输入另个除数,按“=”,输出结果。
求余:
输入一个数,按“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 { if(str7[i]=='1') num=num+1*pow(16,cd1-j); else if(str7[i]=='2') num=num+2*pow(16,cd1-j); else if(str7[i]=='3') num=num+3*pow(16,cd1-j); else if(str7[i]=='4') num=num+4*pow(16,cd1-j); else if(str7[i]=='5') num=num+5*pow(16,cd1-j); else if(str7[i]=='1') num=num+1*pow(16,cd1-j); else if(str7[i]=='6') num=num+6*pow(16,cd1-j); else if(str7[i]=='7') num=num+7*pow(16,cd1-j); else if(str7[i]=='8') num=num+8*pow(16,cd1-j); else if(str7[i]=='9') num=num+9*pow(16,cd1-j); else if(str7[i]=='A') num=num+10*pow(16,cd1-j); else if(str7[i]=='B') num=num+11*pow(16,cd1-j); else if(str7[i]=='C') num=num+12*pow(16,cd1-j); else if(str7[i]=='D') num=num+13*pow(16,cd1-j); else if(str7[i]=='E') num=num+14*pow(16,cd1-j); else if(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 #include #include typedefstructterm{//项的表示,多项式的项作为LinkList的数据元素 floatcoef;//系数 intexpn;//指数 structterm*next;}term term*CreatPolyn(term*P,intm){//算法2.22//输入m项的系数和指数,建立表示一元多项式的有序链表P if(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;}//CreatPolyn 3.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 }//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);//输入n Pb=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);}//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;} 第四章程序流程图 图2流程图 程序流程图的说明: 首先开始后输出功能选择菜单,在选择菜单中1代表四则运算,2代表进制转换,3代表一元多项式的计算,0表示退出。 当选择1时,调用四则运算程序,在四则运算程序中输出子菜单,根据提示选择要进行的算法,输入数据得到运行结果出现问句是否结束运行是: 结束,否: 回到开始;当选择2时,调用进制转换程序,输出子菜单,根据提示选择进制转换,操作步骤同上;当选择3时,调用一元多项式的计算程序,在子菜单中输入要计算的多项式,选择要进行的加减运算,运行。 当选择0时,结束程序。 第五章程序运行结果图 5.1四则运算运行结果 图3四则运算结果 图3是四则运算运行结果,在主菜单中选择1基本四则运算,然后选择2减法基本运算输入数据3426即得到运行结果为8 5.2一元多项式加减运行结果 图4一元多项式结果 图4是一元多项式运算结果,在主菜单中选3一元多项式运算,在提示下输入3个非零项,得出运算结果,若还要继续运算则输入要输入的项数4,再输入4个非零项: 34564523得出运算结果。 5.3运行初始状态 图5初始菜单 图5为程序的初始状态及主菜单,在该对话框中选择要进行的功能。 第六章总结 附录 附录一参考文献 [1]严蔚敏.数据结构.北京: 清华大学出版社,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){//算法2.22 //输入m项的系数和指数,建立表示一元多项式的有序链表P if(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; }//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){//算法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 }//while if(Pa)p->next=qa;//链接Pa中剩余结点 if(Pb)p->next=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算器 设计 课程设计 源代码 可以 运行