C语言课程设计报告简易计算器设计.doc

上传人:飞****2 文档编号:88930399 上传时间:2023-05-04 格式:DOC 页数:28 大小:359.50KB
返回 下载 相关 举报
C语言课程设计报告简易计算器设计.doc_第1页
第1页 / 共28页
C语言课程设计报告简易计算器设计.doc_第2页
第2页 / 共28页
点击查看更多>>
资源描述

《C语言课程设计报告简易计算器设计.doc》由会员分享,可在线阅读,更多相关《C语言课程设计报告简易计算器设计.doc(28页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、C语言课程设计报告设 计 题 目: 简单计算器设计 学 院 名 称: 电子与信息工程学院 专 业: 计算机科学与技术 班 级: 计科09-1 姓 名: 朱凯迪 学 号 1 9 指 导 教 师: 宋 宏 图 定稿日期: 2010年03月 10日一、 设计题目简单计算器设计二、 设计要求在功能上功能尽量模拟windows操作系统中的计算器,系统界面不做强制要求。三、 设计目的 通过本项课程设计,可以培养独立思考、 综合运用所学有关相应知识的能力,能更好的巩固C语言程序设计课程学习的内容,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加了解了c语言的好处和其可用性

2、!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性! 通过C语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。四、 设计思想及过程 由于需要使功能尽量模仿Windows下的计算器,而很多功能要以图形界面实现,故用Borland C+ Builder编写。所以用的是面向对象程序设计。但因为这是C语言的课程设计,所以除了面向对象的使用以外,所有语法都是按照C语言的格式编写。 采用工程模式,文件包括calc.h(

3、运算主函数头文件,包括各运算符的操作以及其辅助函数)、Main.h(窗体类的声明头文件)、Calc.cpp(工程初始化文件)、Main.cpp(代码主文件,包括各空间操作的函数)以及一些其它附属文件,包括dll动态链接库。 在参考了Windows里的计算器以后,决定在我的课程设计中实现: 09的数字输入功能(小数点除外) 实现加、减、乘、整除、取模、阶乘、位运算左移、x的y次方、与、异或、x立方、x平方运算功能,二进制、八进制、十进制、十六进制转换功能,正负转换功能,退格、归零等功能。 数字显示最多为40位,超过即用科学表示法表示(例如1E50)。 运算时因最高能对5000位的数字进行运算,故

4、所有功能建立在自行编写代码的高精度运算基础上。 在按键操作中,先判断用户按的是数字键还是功能键。功能键分运算符键、进制转换键以及清空键。然后记录下来用户当前的按键,然后对上次按的功能键键进行运算。如按了1、+、5,再按任何功能键即对1+5进行运算。如果按的是进制转换键,就记录当前进制,则在以后每次操作中,都将显示结果转换为当前进制再显示。如:以下是按5以及*号时的函数代码void _fastcall TMainForm : bt_5Click(TObject *Sender) /*输入5*/ if(_lastKey = key_sym) initNum(&actNum); /*初始化当前动作数

5、字*/ if(_lastKey = key_sym & nowSym = N) /*如果最后的按键是符号而且按的是等号*/ initNum(&ans); /*让答案等于0*/ lastSym = N; incMed(&actNum, 5); /*将活动数字加一位,并且最后一位是5*/ ShowText(actNum); /*显示当前活动数字*/ _lastKey = key_num; /*记录最后按键为数字键*/void _fastcall TMainForm : bt_mulClick(TObject *Sender) /*输入*号*/ doAns(&ans, actNum,&nowSym,

6、 *, lastSym, _lastKey); /*做出上一步答案(不是按乘号这一步)*/ ShowText(ans); /*显示答案*/ lastSym = nowSym; /*现在即将运算的符号赋值给最后的符号*/ nowSym = *; /*将*号现在即将运算*/ actNum = ans; /*将答案赋值给活动数字*/ /initNum(&actNum); _lastKey = key_sym ; /*将最后的按键转换为符号按键*/ 对于高精度,采用结构体struct highint numMAXN;的形式,数组的一个元素存一位。个位为num1,将符号存在num0之中。 对于高精度加法

7、,先判断两个数符号,如果为异号,则进行高精度减法,否则将各位逐个相加,然后逐位进位,返回答案即可。 对于高精度减法,先判断两个数符号,如果为异号,则进行高精度加法,否则用大数减小数,逐个相减,然后逐位退位,判断符号、返回答案即可。 对于高精度乘法,用第二个数的各位乘以第一个数的各位。然后错位相加,相当于小学生摆竖式。最后将各位相乘的结果相加,逐位进位,判断符号、返回答案即可。 对于高精度整除,采用各位从09枚举形式,如果此位与09相乘刚好小于等于相应数字,则为此位答案为这个数。最后返回答案即可。 对于高精度取模,则只需求出高精度整除,然后将数字减去整除的结果即可。 对于n阶乘,做n次乘法,每乘

8、一次,乘数减一。 对于左移,虽然是建立在位运算基础上,但其效果只是乘以二,所以只需高精度乘以二即可。 对于x的平方、立方、y次方,只需将x高精度相乘2次、3次或者更多次即可。 对于与运算,先将两个数转换为二进制,然后对每位进行与运算,最后转换回十进制即可。 对于异或运算,原理同与运算。 对于进制转换,采用除n取余法。将其转换为相应进制。 对于清零键,按按键功能对actNum、ans、nowSym等变量清空或者减少一位即可。 我对于程序容错性做了很大程度上的优化。对于超出位数的运算会跳出“数字太大”提示。对于各按键混合使用会导致的程序混乱用了极大程度上的优化,也就是说对于按键的随意性有很好的兼容

9、性。比如说可以直接按2再按*然后按=,就会算出2的平方。 对于显示函数,先判断当前进制数,然后再将需要显示的数字转换为当前进制数再显示。如果位数超过40,则取前几位,采用科学计数法显示。 未能实现部分:小数部分。由于时间关系,未能实现复制粘贴数字功能。五、 流程图退格键减少一位归零键退出结束清零相关其它键按键显示函数是否增加一位清零操作前一次按键是数字?设置相关后效信息显示函数运算符运算函数数字键按键开始六、 运行过程打开Calc.exe,模拟Windows下的计算器功能。 基本功能为输入数字,再输入运算符,然后输入运算符对应数字,按等号。 输入数字,再输入运算符,输入等于号的结果为“当前输入

10、的数字运算符当前输入的数字”。可以调节正负号。 输入“数字,运算符,数字,运算符.数字,运算符”亦可。七、 心得体会这次“简单计算器制作”的课程设计不仅让我对C语言的熟悉程度上升到了另一个高度,而且在一定意义上对面向对象设计的理解更加深刻了。是我在编程路途上的一次质的飞跃。而且在处理非常规数据类型的运算的锻炼下,使我对编程语言有了一个新的认识。当看着一个具有图形界面的计算器的模型成品出现在自己面前时,心中有着无限感慨,原来编程也不是非常遥不可及的,原来在编程的趣味性中能让我学到更多有意思的知识。附源程序清单: Calc.h(运算函数集头文件)#include#include#include#d

11、efine HIGH struct high#define MAXN 5000#define MAXSHOW 40#define key_num 0#define key_sym 1struct high int numMAXN;HIGH ans, actNum, nowShow;char nowSym = N, lastSym = N;bool _isincMed = true, _lastKey = key_num;int jz = 10;bool _isbig(HIGH a, HIGH b) int i; for(i = MAXN - 1; i 0; i-) if(a.numi b.nu

12、mi) return true; else if(a.numi b.numi) return false; return false;void copy(char *str, char *rstr, int op, int len) /将str的从op开始的len个字符复制到rstr中 int i = 0, j = op - 1; for(; i = len - 1 | strj = 0; i+, j+) rstri = strj; rstri = 0;void copyint(HIGH num, HIGH *rint, int op, int len) /将str的从op开始的len个字符复

13、制到rstr中 int i = 1, j = op; for(; i = len & j numi = num.numj;void initNum(HIGH *numb) /初始化 int i; HIGH tmp; memset(tmp.num, 0, sizeof(tmp.num); *numb = tmp;int absCmp(HIGH a, HIGH b) /比较绝对值大小 int i; for(i = MAXN - 1; i 0; i-) if(a.numi != b.numi) return (a.numi b.numi); return -1;int getMed(HIGH a)

14、/获取位数 int i, med; for(i = MAXN - 1; i 0; i-) if(a.numi != 0) med = i; break; if(i = 0) med = 1; return med;void turnSym(HIGH *a) /变号 a - num0 = a - num0 = 0 ? -1 : 0;void decMed(HIGH *a) /减去一位 int i, med = getMed(*a); if(med = MAXN - 1) med-; for(i = 1; i numi = a - numi + 1; a - nummed = 0;void inc

15、Med(HIGH *a, int b) /加一位 int i, med = getMed(*a); HIGH r; initNum(&r); if(med MAXSHOW) for(i = 2; i numi - 1; r.num1 = b; r.num0 = a - num0; else r = *a; *a = r;HIGH mul(HIGH a, HIGH b) /高精度乘法 int i, j, k, ma, mb; HIGH tmpr, r, zero; initNum(&zero); initNum(&r); ma = getMed(a); mb = getMed(b); for(i

16、 = 1; i = ma; i+) initNum(&tmpr); for(j = 1; j MAXN) initNum(&r); Application - MessageBox(数字太大!, 错误, MB_OKCANCEL); nowSym = N; _lastKey = key_num; lastSym = N; return r; for(k = 1; k 10) tmpMed = getMed(tmpr); if(tmpMed + i MAXN) initNum(&r); Application - MessageBox(数字太大!, 错误, MB_OKCANCEL); nowSym

17、 = N; _lastKey = key_num; lastSym = N; return r; for(j = 1; j = tmpMed; j+) r.numj + i - 1 += tmpr.numj; for(i = 1; i 9) initNum(&r); Application - MessageBox(数字太大!, 错误, MB_OKCANCEL); nowShow = zero; nowSym = N; _lastKey = key_num; lastSym = N; return r; if(a.num0 = -1 & b.num0 = -1) | (a.num0 = 0 &

18、 b.num0 = 0) r.num0 = 0; else r.num0 = -1; return r;HIGH dec(HIGH a, HIGH b) /高精度减法 int i, med; HIGH r; HIGH inc(HIGH a, HIGH b); bool m = false; initNum(&r); if(a.num0 = -1 & b.num0 = -1) m = true; else if(a.num0 = -1) b.num0 = -1; return inc(a, b); else if(b.num0 = -1) a.num0 = -1; return inc(a, b

19、); if(!absCmp(a, b) a.num0 = (a.num0 = 0) ? -1 : 0; b.num0 = (b.num0 = 0) ? -1 : 0; return dec(b, a); med = getMed(a); for(i = 1; i = med; i+) r.numi = a.numi - b.numi; for(i = 1; i = med; i+) if(r.numi 0) r.numi + 1 -= 1; r.numi = 10 + r.numi; if(m) r.num0 = -1; return r;HIGH inc(HIGH a, HIGH b) /高

20、精度加法 int i; HIGH r, zero; bool m = false, err = false; initNum(&r); initNum(&zero); if(a.num0 = -1 & b.num0 = -1) m = true; else if(a.num0 = -1) a.num0 = 0; return dec(b, a); else if(b.num0 = -1) b.num0 = 0; return dec(a, b); for(i = 1; i MAXN; i+) r.numi = a.numi + b.numi; for(i = 1; i 9) initNum(&

21、r); Application - MessageBox(数字太大!, 错误, MB_OKCANCEL); nowSym = N; _lastKey = key_num; lastSym = N; nowShow = zero; return r; if(m) r.num0 = -1; return r;HIGH div(HIGH a, HIGH b) /高精度整除 int i, j, ma = getMed(a), mb = getMed(b); HIGH r, tmpHigh, cmp, someZero, theone; initNum(&r); initNum(&theone); if

22、(a.num0 = b.num0) ; else r.num0 = -1; a.num0 = 0; b.num0 = 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.num1 = j; if(_isbig(mul(theone, b), tmpHigh) j-; r.numi = j; initNum(&someZero);

23、someZero.numi = j; someZero = mul(someZero, b); a = dec(a, someZero); return r;HIGH mod(HIGH a, HIGH b) /高精度取模 int i, j; HIGH tmpans; tmpans = div(a, b); return dec(a, mul(tmpans, b);String getHexStr(int a) /得到十六进制字符串 if(a = 10) return A; else if(a = 11) return B; else if(a = 12) return C; else if(a

24、 = 13) return D; else if(a = 14) return E; else if(a = 15) return F;int getHex(HIGH a) /十六进制取余 if(a.num2 = 0) return a.num1; else return a.num2 * 10 + a.num1;HIGH hex(HIGH a) /转化十六进制 int i = 0, j; HIGH zero, r, sixteen; initNum(&zero); initNum(&r); initNum(&sixteen); sixteen.num1 = 6; sixteen.num2 =

25、 1; if(a.num0 = -1) initNum(&r); Application - MessageBox(不能为负数!, 错误, MB_OKCANCEL); nowSym = N; _lastKey = key_num; lastSym = N; nowShow = zero; return r; while(_isbig(a, zero) i+; r.numi = getHex(mod(a, sixteen); a = div(a, sixteen); if(getMed(r) MAXSHOW) initNum(&r); Application - MessageBox(数字太大!

26、, 错误, MB_OKCANCEL); nowShow = zero; nowSym = N; _lastKey = key_num; lastSym = N; return r; return r;HIGH bajinzhi(HIGH a) /转化八进制 int i = 0, j; HIGH zero, r, eight; initNum(&zero); initNum(&r); initNum(&eight); eight.num1 = 8; if(a.num0 = -1) initNum(&r); Application - MessageBox(不能为负数!, 错误, MB_OKCAN

27、CEL); nowSym = N; _lastKey = key_num; lastSym = N; nowShow = zero; return r; while(_isbig(a, zero) i+; r.numi = mod(a, eight).num1; a = div(a, eight); if(getMed(r) MAXSHOW) initNum(&r); Application - MessageBox(数字太大!, 错误, MB_OKCANCEL); nowShow = zero; nowSym = N; _lastKey = key_num; lastSym = N; ret

28、urn r; return r;HIGH bin(HIGH a) /转化二进制 int i = 0, j; HIGH zero, r, two; initNum(&zero); initNum(&r); initNum(&two); two.num1 = 2; if(a.num0 = -1) initNum(&r); Application - MessageBox(不能为负数!, 错误, MB_OKCANCEL); nowShow = zero; nowSym = N; _lastKey = key_num; lastSym = N; return r; while(_isbig(a, ze

29、ro) i+; r.numi = a.num1 % 2; a = div(a, two); if(getMed(r) MAXSHOW) initNum(&r); Application - MessageBox(数字太大!, 错误, MB_OKCANCEL); nowShow = zero; nowSym = N; _lastKey = key_num; lastSym = N; return r; return r;HIGH binToshi(HIGH a) int i, med = getMed(a); HIGH r, tmp, the1, tmp2, two, thetwo; initN

30、um(&tmp); initNum(&tmp2); initNum(&the1); initNum(&thetwo); initNum(&two); two.num1 = 1; thetwo.num1 = 2; the1.num1 = 1; initNum(&r); for(i = 1; i medb) ? meda : medb; for(i = 1; i medb) ? meda : medb; for(i = 1; i = med; i+) r.numi = tmpa.numi tmpb.numi; r = binToshi(r); return r;void doAns(HIGH *a

31、ns, HIGH actNum, char *nowSym, char newSym, char lastSym, bool lastKey) HIGH the1, zero, tmp; initNum(&the1); the1.num1 = 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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com