C语言毕业课程设计报告简易计算器设计.docx

上传人:b****7 文档编号:24041686 上传时间:2023-05-23 格式:DOCX 页数:42 大小:20.83KB
下载 相关 举报
C语言毕业课程设计报告简易计算器设计.docx_第1页
第1页 / 共42页
C语言毕业课程设计报告简易计算器设计.docx_第2页
第2页 / 共42页
C语言毕业课程设计报告简易计算器设计.docx_第3页
第3页 / 共42页
C语言毕业课程设计报告简易计算器设计.docx_第4页
第4页 / 共42页
C语言毕业课程设计报告简易计算器设计.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

C语言毕业课程设计报告简易计算器设计.docx

《C语言毕业课程设计报告简易计算器设计.docx》由会员分享,可在线阅读,更多相关《C语言毕业课程设计报告简易计算器设计.docx(42页珍藏版)》请在冰豆网上搜索。

C语言毕业课程设计报告简易计算器设计.docx

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;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=='')

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1