C语言课程设计(简易计算器设计)带所有代码_第1页
C语言课程设计(简易计算器设计)带所有代码_第2页
C语言课程设计(简易计算器设计)带所有代码_第3页
C语言课程设计(简易计算器设计)带所有代码_第4页
C语言课程设计(简易计算器设计)带所有代码_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

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

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

5、m);/* 初始化当前动作数字 */if(_lastKey = key_sym & nowSym = N)/*如果最后的按键是符号而且按的是等号*/-initNum(&ans);/*让答案等于 0*/lastSym = N;in cMed(&actNum, 5);/*将活动数字加一位,并且最后一位是5*/ShowText(actNum);/*显示当前活动数字*/_lastKey = key_ num;/*记录最后按键为数字键 */void _fastcall TMai nForm : bt_mulClick(TObject *Se nder) /*输入 * 号 */ -doA ns(&ans,

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

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

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

9、大”提示。对于各按键混合使用会导致的程序混乱用了极大程度上的 优化,也就是说对于按键的随意性有很好的兼容性。比如说可以直接按 2 再按*然后按=,就会算出 2 的平方。 对于显示函数,先判断当前进制数,然后再将需要显示的数字转换为当前 进制数再显示。如果位数超过 40,则取前几位,采用科学计数法显示。 未能实现部分:小数部分。由于时间关系,未能实现复制粘贴数字功能五、流程图六、 运行过程打开Calc.exe,模拟 Windows下的计算器功能。 基本功能为输入数字,再输入运算符,然后输入运算符对应数字,按等号 输入数字,再输入运算符,输入等于号的结果为“当前输入的数字一运算 符一当前输入的数字

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

11、ne HIGH struct high#define MAXN 5000#define MAXSHOW 40#define key_num 0#define key_sym 1struct highint 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.numi) ret

12、urn true;elseif(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)/获取位数int i

14、, 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 incMed(HIGH *a, int b)/

15、加一位 int i, med = getMed(*a); HIGH r; initNum(&r); if(med numi - 1;for(i = 2; i 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 = 1; i = ma; i+) initNum(&tmpr); for(j = 1; j MAXN) initN

16、um(&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 = N; _lastKey = key_num; lastSym = N; return r;for(j = 1;

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

18、, 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; elseif(a.num0 = -1) b.num0 = -1; return inc(a, b); else if(b.num0 = -1) a.num0 = -1; return inc(a, b);if(!absCmp(a, b)a.num0 = (a.num0 = 0) ? -1 : 0;b.num0 = (b.num0 = 0)

19、? -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)/ 高精度加法 int i;HIGH r, zero; bool m = false, err = false; initNum(&r); initNum(&z

20、ero);if(a.num0 = -1 & b.num0 = -1) m = true; elseif(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(&r);Application - MessageBox( 数字太大! , 错误, MB_OKCANCEL); nowSym = N;_lastKey = key_n

21、um; 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(a.num0 = b.num0) ; else r.num0 = -1;a.num0 = 0;b.num0 = 0;for(i = ma - mb + 1; i 0; i-)

22、 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); someZero.numi = j; someZero = mul(someZero, b); a = dec(a, someZero);return r;HIGH mod(HIGH a,

23、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; elseif(a = 11) return B; elseif(a = 12) return C; elseif(a = 13) return D; elseif(a = 14) return E; elseif(a = 15) return F; /得到十六进制字符串int getHex(HIGH a)/ 十六进制取余if(a.num2 =

24、 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 = 1;/转化十六进制if(a.num0 = -1) initNum(&r);Application - MessageBox( 不能为负数! , 错误 , MB_OKCANCEL); nowSym = N;_lastKey = ke

25、y_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( 数字太大! , 错误, MB_OKCANCEL); nowShow = zero;nowSym = N;_lastKey = key_num; lastSym = N;return r;return r;HIGH bajinzhi(HIG

26、H 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_OKCANCEL); nowSym = N;_lastKey = key_num; lastSym = N;nowShow = zero; return r; while(_isbig(a, zero)i+;r.numi = mod(a, eight

27、).num1; a = div(a, eight);if(getMed(r) MAXSHOW) initNum(&r);Application - MessageBox( 数字太大! nowShow = zero;nowSym = N;_lastKey = key_num;lastSym = N;return r;, 错误, MB_OKCANCEL);return r;HIGH bin(HIGH a)int i = 0, j;HIGH zero, r, two; initNum(&zero); initNum(&r); initNum(&two); two.num1 = 2;/转化二进制if(

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

29、astKey = key_num; lastSym = N; return r;, 错误, MB_OKCANCEL);return r;HIGH binToshi(HIGH a)int i, med = getMed(a);HIGH r, tmp, the1, tmp2, two, thetwo; initNum(&tmp);initNum(&tmp2); initNum(&the1); initNum(&thetwo); initNum(&two); two.num1 = 1;thetwo.num1 = 2; the1.num1 = 1; initNum(&r);for(i = 1; i m

30、edb) ? meda : medb; for(i = 1; i medb) ? meda : medb;for(i = 1; i = med; i+)r.nu mi = tmpa .nu mi A tmpb .nu mi; r = binToshi(r); return r;void doAns(HIGH *ans, HIGH actNum, char *nowSym, char newSym, char lastSym, bool lastKey)HIGH the1, zero, tmp; initNum(&the1);the1.num1 = 1; if(lastKey = key_sym

31、)if(newSym = N)/if(*nowSym != N) doAns(ans, *ans, nowSym, N, lastSym, key_num); /elseif(*nowSym != N) doAns(ans, actNum, nowSym, N, lastSym, key_num); elseif(lastSym != N) doAns(ans, actNum, &lastSym, N, lastSym, key_num); else*ans = actNum;else*nowSym = newSym;else if(lastKey = key_num)if(*nowSym =

32、 N)if(lastSym != N) doAns(ans, actNum, &lastSym, N, lastSym, lastKey); else *ans = actNum;elseif(*nowSymelse= +) *ans= inc(actNum, *ans);if(*nowSymelse= -) *ans =dec(*ans, actNum);if(*nowSymelse= *) *ans =mul(*ans, actNum);if(*nowSymelse= /) *ans =div(*ans, actNum);if(*nowSymelse= 2) *ans= mul(*ans,

33、 *ans);if(*nowSym *ans =else= 3)mul(mul(*ans, *ans), *ans);if(*nowSym= Y) initNum(&zero); if(actNum.num0 = -1 | !_isbig(actNum, zero) *ans = the1; return ; zero.num1 = 2; tmp = *ans; for(; !_isbig(zero, actNum); zero = inc(zero, the1) *ans = mul(*ans, tmp);elseif(*nowSym = L) initNum(&zero); zero.nu

34、m1 = 2; if(*nowSym = 2) *ans = mul(*ans, zero);elseif(*nowSym = M) *ans = mod(*ans, actNum);elseif(*nowSym = !)actNum = dec(*ans, the1); initNum(&zero);while(_isbig(actNum, zero)*ans = mul(*ans, actNum); actNum = dec(actNum, the1);elseif(*nowSym = A) *ans = and(*ans, actNum);else if(*nowSym = X) *an

35、s = xor(*ans, actNum); Calc.cpp /* 由 BCB 生成 */#include#pragma hdrstop/USEFORM(Main.cpp, MainForm);/WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)tryApplication - Initialize();Application - CreateForm(_classid(TMainForm), &MainForm); Application - Run(); catch(Exception &exception)Application - Sho

36、wException(&exception); catch(.)trythrow Exception(); catch(Exception&exception)Application - ShowException(&exception); return 0;/ Main.h /* 由 BCB 生成 */#ifndef MainH#define MainH/#include #include #include #include #include #include /class TMainForm : public TForm_published: / IDE-managed Component

37、sTMainMenu *MainMenu1; TMenuItem *E1; TMenuItem *N1; TMenuItem *H1;TEdit *Show_Editor;TButton *bt_bkspace;TButton *bt_ce;TButton *bt_Leftc;TButton *bt_0;TButton *bt_iAndm;TButton *bt_inc;TButton *bt_eq;TButton *bt_1;TButton *bt_2;TButton *bt_3;TButton *bt_dec;TButton *bt_lsh;TButton *bt_4;TButton *b

38、t_5;TButton *bt_6;TButton *bt_mul;TButton *bt_xor;TButton *bt_7;TButton *bt_8;TButton *bt_9;TButton *bt_div;TButton *bt_mod; TButton *bt_and; TButton *bt_xpf; TButton *bt_xlf; TButton *bt_xycf; TButton *bt_njc; TButton *sljz; TButton *sjz; TButton *bjz; TButton *ejz; void _fastcall FormCreate(TObjec

39、t *Sender); void _fastcall bt_7Click(TObject *Sender); void _fastcall bt_8Click(TObject *Sender); void _fastcall bt_0Click(TObject *Sender); void _fastcall bt_1Click(TObject *Sender); void _fastcall bt_2Click(TObject *Sender); void _fastcall bt_3Click(TObject *Sender); void _fastcall bt_4Click(TObje

40、ct *Sender); void _fastcall bt_5Click(TObject *Sender); void _fastcall bt_6Click(TObject *Sender); void _fastcall bt_9Click(TObject *Sender); void _fastcall bt_iAndmClick(TObject *Sender); void _fastcall bt_incClick(TObject *Sender); void _fastcall bt_eqClick(TObject *Sender); void _fastcall bt_decC

41、lick(TObject *Sender); void _fastcall bt_mulClick(TObject *Sender); void _fastcall Show_EditorKeyPress(TObject *Sender, char &Key); void _fastcall bt_divClick(TObject *Sender);void _fastcall bt_LeftcClick(TObject *Sender); void _fastcall bt_ceClick(TObject *Sender); void _fastcall bt_bkspaceClick(TO

42、bject *Sender); void _fastcall bt_xpfClick(TObject *Sender); void _fastcall bt_xlfClick(TObject *Sender); void _fastcall bt_xycfClick(TObject *Sender); void _fastcall bt_lshClick(TObject *Sender); void _fastcall bt_modClick(TObject *Sender); void _fastcall bt_njcClick(TObject *Sender); void _fastcal

43、l sjzClick(TObject *Sender); void _fastcall ejzClick(TObject *Sender); void _fastcall sljzClick(TObject *Sender); void _fastcall bjzClick(TObject *Sender); void _fastcall bt_andClick(TObject *Sender); void _fastcall bt_xorClick(TObject *Sender);private: / User declarations public:/ User declarations

44、_fastcall TMainForm(TComponent* Owner); void _fastcall TMainForm:ShowText(HIGH a);/extern PACKAGE TMainForm *MainForm;/#endif Main.cpp#include#include#pragma hdrstop#include Main.h/#pragma package(smart_init)#pragma resource *.dfm using namespace std ;TMainForm*MainForm ;/_fastcall TMainForm : TMain

45、Form(TComponent*Owner)TForm(Owner)/void _fastcall TMainForm : ShowText(HIGH a)/* 显示函数 */ nowShow=a ; AnsiString str ; int med,i,j ; if(jz=2)a=bin(a); else if(jz=8)a=bajinzhi(a); else if(jz=16)a=hex(a); med=getMed(a); bool m=(a.num0=-1)?true:false ; if(med=MAXSHOW)if(m)i=1 ; str=- ;else i=0 ;for(j=me

46、d;(m)?(i=med):(i9)?getHexStr(a.numj):IntToStr(a.numj); Show_Editor-Text=str ;elseif(m)i=1 ; str=- ;else i=0 ;int e=med-1 ; for(j=med;(m)?(i=40):(iText=str ;/* 窗体创建 */void _fastcall TMainForm : FormCreate(TObject*Sender) initNum(&actNum); initNum(&ans);/void _fastcall TMainForm : bt_7Click(TObject*Se

47、nder) if(_lastKey=key_sym)initNum(&actNum); if(_lastKey=key_sym&nowSym=N) initNum(&ans); lastSym=N ; incMed(&actNum,7); ShowText(actNum);_lastKey=key_num ;/void _fastcall TMainForm : bt_8Click(TObject*Sender) if(_lastKey=key_sym)initNum(&actNum); if(_lastKey=key_sym&nowSym=N) initNum(&ans); lastSym=N ; incMed(&actNum,8); ShowText(actNum);_lastKey=key_num ;/void _fastcall TMainForm : bt_0Click(TObject*Sender) if(_lastKey=key_sym)initNum(&actNum); if(_lastKey=key_sym&nowSym=N) initNum(&ans); lastSym=N ; incMed(&actNum,0); ShowText(actNum);_lastKey=key_num ;/void _fastcall TMainForm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论