C语言课程设计报告简易计算器设计Word文件下载.docx

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

C语言课程设计报告简易计算器设计Word文件下载.docx

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

C语言课程设计报告简易计算器设计Word文件下载.docx

10~9的数字输入功能(小数点除外)

2实现加、减、乘、整除、取模、阶乘、位运算左移、x的y次方、与、异或、x立方、x平方运算功能,二进制、八进制、十进制、十六进制转换功能,正负转换功能,退格、归零等功能。

3数字显示最多为40位,超过即用科学表示法表示(例如1E50)。

4运算时因最高能对5000位的数字进行运算,故所有功能建立在自行编写代码的高精度运算基础上。

4在按键操作中,先判断用户按的是数字键还是功能键。

功能键分运算符键、进制转换键以及清空键。

然后记录下来用户当前的按键,然后对上次按的功能键键进行运算。

如按了1、+、5,再按任何功能键即对1+5进行运算。

如果按的是进制转换键,就记录当前进制,则在以后每次操作中,都将显示结果转换为当前进制再显示。

如:

以下是按5以及*号时的函数代码

void__fastcallTMainForm:

:

bt_5Click(TObject*Sender)/*输入5*/

{

if(_lastKey==key_sym)initNum(&

actNum);

/*初始化当前动作数字*/

if(_lastKey==key_sym&

&

nowSym=='

N'

)/*如果最后的按键是符号而且按的是等号*/

{

initNum(&

ans);

/*让答案等于0*/

lastSym='

;

}

incMed(&

actNum,5);

/*将活动数字加一位,并且最后一位是5*/

ShowText(actNum);

/*显示当前活动数字*/

_lastKey=key_num;

/*记录最后按键为数字键*/

}

bt_mulClick(TObject*Sender)/*输入*号*/

doAns(&

ans,actNum,&

nowSym,'

*'

lastSym,_lastKey);

/*↑做出上一步答案(不是按乘号这一步)*/

ShowText(ans);

/*显示答案*/

lastSym=nowSym;

/*现在即将运算的符号赋值给最后的符号*/

nowSym='

/*将*号现在即将运算*/

actNum=ans;

/*将答案赋值给活动数字*/

//initNum(&

_lastKey=key_sym;

/*将最后的按键转换为符号按键*/

5对于高精度,采用结构体structhigh{intnum[MAXN];

};

的形式,数组的一个元素存一位。

个位为num[1],将符号存在num[0]之中。

1对于高精度加法,先判断两个数符号,如果为异号,则进行高精度减法,否则将各位逐个相加,然后逐位进位,返回答案即可。

2对于高精度减法,先判断两个数符号,如果为异号,则进行高精度加法,否则用大数减小数,逐个相减,然后逐位退位,判断符号、返回答案即可。

3对于高精度乘法,用第二个数的各位乘以第一个数的各位。

然后错位相加,相当于小学生摆竖式。

最后将各位相乘的结果相加,逐位进位,判断符号、返回答案即可。

4对于高精度整除,采用各位从0~9枚举形式,如果此位与0~9相乘刚好小于等于相应数字,则为此位答案为这个数。

最后返回答案即可。

5对于高精度取模,则只需求出高精度整除,然后将数字减去整除的结果即可。

6对于n阶乘,做n次乘法,每乘一次,乘数减一。

7对于左移,虽然是建立在位运算基础上,但其效果只是乘以二,所以只需高精度乘以二即可。

8对于x的平方、立方、y次方,只需将x高精度相乘2次、3次或者更多次即可。

9对于与运算,先将两个数转换为二进制,然后对每位进行与运算,最后转换回十进制即可。

10对于异或运算,原理同与运算。

6对于进制转换,采用除n取余法。

将其转换为相应进制。

7对于清零键,按按键功能对actNum、ans、nowSym等变量清空或者减少一位即可。

8我对于程序容错性做了很大程度上的优化。

对于超出位数的运算会跳出“数字太大”提示。

对于各按键混合使用会导致的程序混乱用了极大程度上的优化,也就是说对于按键的随意性有很好的兼容性。

比如说可以直接按2再按*然后按=,就会算出2的平方。

9对于显示函数,先判断当前进制数,然后再将需要显示的数字转换为当前进制数再显示。

如果位数超过40,则取前几位,采用科学计数法显示。

10未能实现部分:

小数部分。

由于时间关系,未能实现复制粘贴数字功能。

五、

流程图

六、运行过程

打开Calc.exe,模拟Windows下的计算器功能。

1基本功能为输入数字,再输入运算符,然后输入运算符对应数字,按等号。

2输入数字,再输入运算符,输入等于号的结果为“当前输入的数字→运算符→当前输入的数字”。

可以调节正负号。

3输入“数字,运算符,数字,运算符...数字,运算符”亦可。

七、心得体会

这次“简单计算器制作”的课程设计不仅让我对C语言的熟悉程度上升到了另一个高度,而且在一定意义上对面向对象设计的理解更加深刻了。

是我在编程路途上的一次质的飞跃。

而且在处理非常规数据类型的运算的锻炼下,使我对编程语言有了一个新的认识。

当看着一个具有图形界面的计算器的模型成品出现在自己面前时,心中有着无限感慨,原来编程也不是非常遥不可及的,原来在编程的趣味性中能让我学到更多有意思的知识。

附源程序清单:

1Calc.h(运算函数集头文件)

#include<

stdio.h>

string>

string.h>

#defineHIGHstructhigh

#defineMAXN5000

#defineMAXSHOW40

#definekey_num0

#definekey_sym1

structhigh{

intnum[MAXN];

HIGHans,actNum,nowShow;

charnowSym='

lastSym='

bool_isincMed=true,_lastKey=key_num;

intjz=10;

bool_isbig(HIGHa,HIGHb)

inti;

for(i=MAXN-1;

i>

0;

i--)

if(a.num[i]>

b.num[i])returntrue;

else

if(a.num[i]<

b.num[i])returnfalse;

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]='

voidcopyint(HIGHnum,HIGH*rint,intop,intlen)//将str的从op开始的len个字符复制到rstr中

inti=1,j=op;

=len&

j<

MAXN;

i++,j++)rint->

num[i]=num.num[j];

voidinitNum(HIGH*numb)//初始化

HIGHtmp;

memset(tmp.num,0,sizeof(tmp.num));

*numb=tmp;

intabsCmp(HIGHa,HIGHb)//比较绝对值大小

if(a.num[i]!

=b.num[i])return(a.num[i]>

b.num[i]);

return-1;

intgetMed(HIGHa)//获取位数

inti,med;

=0)

med=i;

break;

if(i==0)med=1;

returnmed;

voidturnSym(HIGH*a)//变号

a->

num[0]=a->

num[0]==0?

-1:

voiddecMed(HIGH*a)//减去一位

inti,med=getMed(*a);

if(med==MAXN-1)med--;

for(i=1;

=med;

i++)a->

num[i]=a->

num[i+1];

num[med]=0;

voidincMed(HIGH*a,intb)//加一位

HIGHr;

r);

if(med<

MAXSHOW)

for(i=2;

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

zero);

ma=getMed(a);

mb=getMed(b);

=ma;

i++)

tmpr);

for(j=1;

=mb;

j++)

tmpr.num[j]=a.num[i]*b.num[j];

inttmpMed=getMed(tmpr);

if(tmpMed+i>

MAXN)

Application->

MessageBox("

数字太大!

"

"

错误"

MB_OKCANCEL);

returnr;

for(k=1;

k<

tmpMed;

k++)

tmpr.num[k+1]+=(tmpr.num[k]/10);

tmpr.num[k]%=10;

if(tmpr.num[tmpMed]>

10)

tmpMed=getMed(tmpr);

=tmpMed;

j++)r.num[j+i-1]+=tmpr.num[j];

MAXN-1;

r.num[i+1]+=(r.num[i]/10);

r.num[i]%=10;

if(r.num[MAXN-1]>

9)

nowShow=zero;

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;

HIGHdec(HIGHa,HIGHb)//高精度减法

HIGHinc(HIGHa,HIGHb);

boolm=false;

if(a.num[0]==-1&

b.num[0]==-1)m=true;

if(a.num[0]==-1)

b.num[0]=-1;

returninc(a,b);

if(b.num[0]==-1)

a.num[0]=-1;

if(!

absCmp(a,b))

a.num[0]=(a.num[0]==0)?

b.num[0]=(b.num[0]==0)?

returndec(b,a);

med=getMed(a);

i++)r.num[i]=a.num[i]-b.num[i];

if(r.num[i]<

0)

r.num[i+1]-=1;

r.num[i]=10+r.num[i];

if(m)r.num[0]=-1;

HIGHinc(HIGHa,HIGHb)//高精度加法

HIGHr,zero;

boolm=false,err=false;

a.num[0]=0;

b.num[0]=0;

returndec(a,b);

i++)r.num[i]=a.num[i]+b.num[i];

HIGHdiv(HIGHa,HIGHb)//高精度整除

inti,j,ma=getMed(a),mb=getMed(b);

HIGHr,tmpHigh,cmp,someZero,theone;

theone);

if(a.num[0]==b.num[0]);

for(i=ma-mb+1;

tmpHigh);

copyint(a,&

tmpHigh,i,ma);

cmp);

for(j=0;

!

_isbig(cmp,tmpHigh);

cmp=inc(cmp,b);

theone.num[1]=j;

if(_isbig(mul(theone,b),tmpHigh))j--;

r.num[i]=j;

someZero);

someZero.num[i]=j;

someZero=mul(someZero,b);

a=dec(a,someZero);

HIGHmod(HIGHa,HIGHb)//高精度取模

inti,j;

HIGHtmpans;

tmpans=div(a,b);

returndec(a,mul(tmpans,b));

StringgetHexStr(inta)//得到十六进制字符串

if(a==10)return"

A"

if(a==11)return"

B"

if(a==12)return"

C"

if(a==13)return"

D"

if(a==14)return"

E"

if(a==15)return"

F"

intgetHex(HIGHa)//十六进制取余

if(a.num[2]==0)returna.num[1];

elsereturna.num[2]*10+a.num[1];

HIGHhex(HIGHa)//转化十六进制

inti=0,j;

HIGHzero,r,sixteen;

sixteen);

sixteen.num[1]=6;

sixteen.num[2]=1;

不能为负数!

while(_isbig(a,zero))

i++;

r.num[i]=getHex(mod(a,sixteen));

a=div(a,sixteen);

if(getMed(r)>

HIGHbajinzhi(HIGHa)//转化八进制

HIGHzero,r,eight;

eight);

eight.num[1]=8;

r.num[i]=mod(a,eight).num[1];

a=div(a,eight);

r

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

当前位置:首页 > 工程科技 > 机械仪表

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

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