C语言毕业课程设计报告简易计算器设计.docx
- 文档编号:24041686
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:42
- 大小:20.83KB
C语言毕业课程设计报告简易计算器设计.docx
《C语言毕业课程设计报告简易计算器设计.docx》由会员分享,可在线阅读,更多相关《C语言毕业课程设计报告简易计算器设计.docx(42页珍藏版)》请在冰豆网上搜索。
C语言毕业课程设计报告简易计算器设计
(此文档为word格式,下载后您可任意编辑修改!
)
《C语言课程设计》报告
设计题目:
简单计算器设计
学院名称:
电子与信息工程学院
专业:
计算机科学与技术
班级:
计科09-1
姓名:
朱凯迪学号19
指导教师:
宋宏图
定稿日期:
2010年03月10日
一、设计题目
简单计算器设计
二、设计要求
在功能上功能尽量模拟windows操作系统中的计算器,系统界面不做强制要求。
三、设计目的
1通过本项课程设计,可以培养独立思考、综合运用所学有关相应知识的能力,能更好的巩固《C语言程序设计》课程学习的内容,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!
更加了解了c语言的好处和其可用性!
同时增加了同学之间的团队合作精神!
更加也体会到以后在工作中团队合作的重要性和必要性!
2通过C语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。
为后续各门计算机课程的学习和毕业设计打下坚实基础。
四、设计思想及过程
1由于需要使功能尽量模仿Windows下的计算器,而很多功能要以图形界面实现,故用BorlandC++Builder编写。
所以用的是面向对象程序设计。
但因为这是C语言的课程设计,所以除了面向对象的使用以外,所有语法都是按照C语言的格式编写。
2采用工程模式,文件包括calc...cpp(代码主文件,包括各空间操作的函数)以及一些其它附属文件,包括dll动态链接库。
3在参考了Windows里的计算器以后,决定在我的课程设计中实现:
10~9的数字输入功能(小数点除外)
2实现加、减、乘、整除、取模、阶乘、位运算左移、x的y次方、与、异或、x立方、x平方运算功能,二进制、八进制、十进制、十六进制转换功能,正负转换功能,退格、归零等功能。
3数字显示最多为40位,超过即用科学表示法表示(例如1E50)。
4运算时因最高能对5000位的数字进行运算,故所有功能建立在自行编写代码的高精度运算基础上。
4在按键操作中,先判断用户按的是数字键还是功能键。
功能键分运算符键、进制转换键以及清空键。
然后记录下来用户当前的按键,然后对上次按的功能键键进行运算。
如按了1、+、5,再按任何功能键即对1+5进行运算。
如果按的是进制转换键,就记录当前进制,则在以后每次操作中,都将显示结果转换为当前进制再显示。
如:
以下是按5以及*号时的函数代码
对于高精度,采用结构体structtrue;
else
if(a.num[i] } returnfalse; } voidcopy(char*str,char*rstr,intop,intlen)将str的从op开始的len个字符复制到rstr中 { inti=0,j=op-1; for(;i<=len-1||str[j]=='\0';i++,j++)rstr[i]=str[j]; rstr[i]='\0'; } voidcopyint(HIGHnum,HIGH*rint,intop,intlen)将str的从op开始的len个字符复制到rstr中 { inti=1,j=op; for(;i<=len&&j } voidinitNum(HIGH*numb)初始化 { inti; HIGHtmp; memset(tmp.num,0,sizeof(tmp.num)); *numb=tmp; } intabsCmp(HIGHa,HIGHb)比较绝对值大小 { inti; for(i=MAXN-1;i>0;i--) { if(a.num[i]! =b.num[i])return(a.num[i]>b.num[i]); } return-1; } intgetMed(HIGHa)获取位数 { inti,med; for(i=MAXN-1;i>0;i--) if(a.num[i]! =0) { med=i; break; } if(i==0)med=1; returnmed; } voidturnSym(HIGH*a)变号 { a->num[0]=a->num[0]==0? -1: 0; } voiddecMed(HIGH*a)减去一位 { inti,med=getMed(*a); if(med==MAXN-1)med--; for(i=1;i<=med;i++)a->num[i]=a->num[i+1]; a->num[med]=0; } voidincMed(HIGH*a,intb)加一位 { inti,med=getMed(*a); HIGHr; initNum(&r); if(med { for(i=2;i<=med+1;i++)r.num[i]=a->num[i-1]; r.num[1]=b; r.num[0]=a->num[0]; } elser=*a; *a=r; } HIGHmul(HIGHa,HIGHb)高精度乘法 { inti,j,k,ma,mb; HIGHtmpr,r,zero; initNum(&zero); initNum(&r); ma=getMed(a); mb=getMed(b); for(i=1;i<=ma;i++) { initNum(&tmpr); for(j=1;j<=mb;j++) { tmpr.num[j]=a.num[i]*b.num[j]; } inttmpMed=getMed(tmpr); if(tmpMed+i>MAXN) { initNum(&r); Application->MessageBox("数字太大! ","错误",MB_OKCANCEL); nowSym='N'; _lastKey=key_num; lastSym='N'; returnr; } for(k=1;k { tmpr.num[k+1]+=(tmpr.num[k]10); tmpr.num[k]%=10; } if(tmpr.num[tmpMed]>10) tmpMed=getMed(tmpr); if(tmpMed+i>MAXN) { initNum(&r); Application->MessageBox("数字太大! ","错误",MB_OKCANCEL); nowSym='N'; _lastKey=key_num; lastSym='N'; returnr; } for(j=1;j<=tmpMed;j++)r.num[j+i-1]+=tmpr.num[j]; } for(i=1;i { r.num[i+1]+=(r.num[i]10); r.num[i]%=10; } if(r.num[MAXN-1]>9) { initNum(&r); Application->MessageBox("数字太大! ","错误",MB_OKCANCEL); nowShow=zero; nowSym='N'; _lastKey=key_num; lastSym='N'; returnr; } if((a.num[0]==-1&&b.num[0]==-1)||(a.num[0]==0&&b.num[0]==0)) r.num[0]=0; elser.num[0]=-1; returnr; } HIGHdec(HIGHa,HIGHb)高精度减法 { inti,med; HIGHr; HIGHinc(HIGHa,HIGHb); boolm=false; initNum(&r); if(a.num[0]==-1&&b.num[0]==-1)m=true; else if(a.num[0]==-1) { b.num[0]=-1; returninc(a,b); } else if(b.num[0]==-1) { a.num[0]=-1; returninc(a,b); } if(! absCmp(a,b)) { a.num[0]=(a.num[0]==0)? -1: 0; b.num[0]=(b.num[0]==0)? -1: 0; returndec(b,a); } med=getMed(a); for(i=1;i<=med;i++)r.num[i]=a.num[i]-b.num[i]; for(i=1;i<=med;i++) { if(r.num[i]<0) { r.num[i+1]-=1; r.num[i]=10+r.num[i]; } } if(m)r.num[0]=-1; returnr; } HIGHinc(HIGHa,HIGHb)高精度加法 { inti; HIGHr,zero; boolm=false,err=false; initNum(&r); initNum(&zero); if(a.num[0]==-1&&b.num[0]==-1)m=true; else if(a.num[0]==-1) { a.num[0]=0; returndec(b,a); } else if(b.num[0]==-1) { b.num[0]=0; returndec(a,b); } for(i=1;i for(i=1;i { r.num[i+1]+=(r.num[i]10); r.num[i]%=10; } if(r.num[MAXN-1]>9) { initNum(&r); Application->MessageBox("数字太大! ","错误",MB_OKCANCEL); nowSym='N'; _lastKey=key_num; lastSym='N'; nowShow=zero; returnr; } if(m)r.num[0]=-1; returnr; } HIGHdiv(HIGHa,HIGHb)高精度整除 { inti,j,ma=getMed(a),mb=getMed(b); HIGHr,tmpHigh,cmp,someZero,theone; initNum(&r); initNum(&theone); if(a.num[0]==b.num[0]); elser.num[0]=-1; a.num[0]=0; b.num[0]=0; for(i=ma-mb+1;i>0;i--) { initNum(&tmpHigh); copyint(a,&tmpHigh,i,ma); initNum(&cmp); for(j=0;! _isbig(cmp,tmpHigh);j++) { cmp=inc(cmp,b); } theone.num[1]=j; if(_isbig(mul(theone,b),tmpHigh))j--; r.num[i]=j; initNum(&someZero); someZero.num[i]=j; someZero=mul(someZero,b); a=dec(a,someZero); } returnr; } HIGHmod(HIGHa,HIGHb)高精度取模 { inti,j; HIGHtmpans; tmpans=div(a,b); returndec(a,mul(tmpans,b)); } StringgetHexStr(inta)得到十六进制字符串 { if(a==10)return"A"; else if(a==11)return"B"; else if(a==12)return"C"; else if(a==13)return"D"; else if(a==14)return"E"; else if(a==15)return"F"; } intgetHex(HIGHa)十六进制取余 { if(a.num[2]==0)returna.num[1]; elsereturna.num[2]*10+a.num[1]; } HIGH; initNum(&zero); initNum(&r); initNum(&sixteen); sixteen.num[1]=6; sixteen.num[2]=1; if(a.num[0]==-1) { initNum(&r); Application->MessageBox("不能为负数! ","错误",MB_OKCANCEL); nowSym='N'; _lastKey=key_num; lastSym='N'; nowShow=zero; returnr; } while(_isbig(a,zero)) { i++; r.num[i]=getHex(mod(a,sixteen)); a=div(a,sixteen); if(getMed(r)>MAXSHOW) { initNum(&r); Application->MessageBox("数字太大! ","错误",MB_OKCANCEL); nowShow=zero; nowSym='N'; _lastKey=key_num; lastSym='N'; returnr; } } returnr; } HIGHbajinzhi(HIGHa)转化八进制 { inti=0,j; HIGHzero,r,eight; initNum(&zero); initNum(&r); initNum(&eight); eight.num[1]=8; if(a.num[0]==-1) { initNum(&r); Application->MessageBox("不能为负数! ","错误",MB_OKCANCEL); nowSym='N'; _lastKey=key_num; lastSym='N'; nowShow=zero; returnr; } while(_isbig(a,zero)) { i++; r.num[i]=mod(a,eight).num[1]; a=div(a,eight); if(getMed(r)>MAXSHOW) { initNum(&r); Application->MessageBox("数字太大! ","错误",MB_OKCANCEL); nowShow=zero; nowSym='N'; _lastKey=key_num; lastSym='N'; returnr; } } returnr; } HIGHbin(HIGHa)转化二进制 { inti=0,j; HIGHzero,r,two; initNum(&zero); initNum(&r); initNum(&two); two.num[1]=2; if(a.num[0]==-1) { initNum(&r); Application->MessageBox("不能为负数! ","错误",MB_OKCANCEL); nowShow=zero; nowSym='N'; _lastKey=key_num; lastSym='N'; returnr; } while(_isbig(a,zero)) { i++; r.num[i]=a.num[1]%2; a=div(a,two); if(getMed(r)>MAXSHOW) { initNum(&r); Application->MessageBox("数字太大! ","错误",MB_OKCANCEL); nowShow=zero; nowSym='N'; _lastKey=key_num; lastSym='N'; returnr; } } returnr; } HIGHbinToshi(HIGHa) { inti,med=getMed(a); HIGHr,tmp,the1,tmp2,two,thetwo; initNum(&tmp); initNum(&tmp2); initNum(&the1); initNum(&thetwo); initNum(&two); two.num[1]=1; thetwo.num[1]=2; the1.num[1]=1; initNum(&r); for(i=1;i<=med;i++,tmp=inc(tmp,the1)) { tmp2.num[1]=a.num[i]; r=inc(r,mul(tmp2,two)); two=mul(two,thetwo); } returnr; } HIGHand(HIGHa,HIGHb)与 { HIGHtmpa,tmpb,r; intmed,meda,medb,i; initNum(&r); tmpa=bin(a); tmpb=bin(b); meda=getMed(tmpa); medb=getMed(tmpb); med=(meda>medb)? meda: medb; for(i=1;i<=med;i++) r.num[i]=tmpa.num[i]&tmpb.num[i]; r=binToshi(r); returnr; } HIGHxor(HIGHa,HIGHb)异或 { HIGHtmpa,tmpb,r; intmed,meda,medb,i; initNum(&r); tmpa=bin(a); tmpb=bin(b); meda=getMed(tmpa); medb=getMed(tmpb); med=(meda>medb)? meda: medb; for(i=1;i<=med;i++) r.num[i]=tmpa.num[i]^tmpb.num[i]; r=binToshi(r); returnr; } voiddoAns(HIGH*ans,HIGHactNum,char*nowSym,charnewSym,charlastSym,boollastKey) { HIGHthe1,zero,tmp; initNum(&the1); the1.num[1]=1; if(lastKey==key_sym) { if(newSym=='N') { if(*nowSym! ='N')doAns(ans,*ans,nowSym,'N',lastSym,key_num); else if(*nowSym! ='N')doAns(ans,actNum,nowSym,'N',lastSym,key_num); else if(lastSym! ='N')doAns(ans,actNum,&lastSym,'N',lastSym,key_num); else *ans=actNum; } else { *nowSym=newSym; } } else if(lastKey==key_num) { if(*nowSym=='N') { if(lastSym! ='N')doAns(ans,actNum,&lastSym,'N',lastSym,lastKey); else*ans=actNum; } else if(*nowSym=='+')*ans=inc(actNum,*ans); else if(*nowSym=='-')*ans=dec(*ans,actNum); else if(*nowSym=='*')*ans=mul(*ans,actNum); else if(*nowSym=='')
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 毕业 课程设计 报告 简易 计算器 设计