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&&jnum[i]=num.num[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;ifor(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=='')