1、C 语言课程设计报告设 计 题 目: 简单计算器设计 学 院 名 称: 电子与信息工程学院 专 业: 计算机科学与技术 班 级: 计科 姓 名: 学 号 指 导 教 师: 定稿日期: 2013-5-28 2一、 设计题目简单计算器设计二、 设计要求在功能上功能尽量模拟 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制转换功能,正负转换功能,退格、归零等功能。3 数字显示最多为 40 位,超过即用科学表示法表示(例如 1E50) 。4 运算时因
4、最高能对 5000 位的数字进行运算,故所有功能建立在自行编写代码的高精度运算基础上。 在按键操作中,先判断用户按的是数字键还是功能键。功能键分运算符键、进制转换键以及清空键。然后记录下来用户当前的按键,然后对上次按的功能键键进行运算。如按了 1、+、5,再按任何功能键即对 1+5 进行运算。如果按的是进制转换键,就记录当前进制,则在以后每次操作中,都将显示结果转换为当前进制再显示。如:以下是按 5 以及*号时的函数代码 对于高精度,采用结构体 struct highint numMAXN;的形式,数组的一个元素存一位。个位为 num1,将符号存在 num0之中。1 对于高精度加法,先判断两个
5、数符号,如果为异号,则进行高精度减法,否则将各位逐个相加,然后逐位进位,返回答案即可。void _fastcall TMainForm : bt_5Click(TObject *Sender) /*输入 5*/if(_lastKey = key_sym) initNum( /*初始化当前动作数字*/if(_lastKey = key_sym /*让答案等于 0*/lastSym = N;incMed( /*将活动数字加一位,并且最后一位是 5*/ShowText(actNum); /*显示当前活动数字*/_lastKey = key_num; /*记录最后按键为数字键*/void _fastc
6、all TMainForm : bt_mulClick(TObject *Sender) /*输入*号*/doAns(/*做出上一步答案(不是按乘号这一步) */ShowText(ans); /*显示答案*/lastSym = nowSym; /*现在即将运算的符号赋值给最后的符号*/nowSym = *; /*将*号现在即将运算*/actNum = ans; /*将答案赋值给活动数字*/initNum(_lastKey = key_sym ; /*将最后的按键转换为符号按键 */42 对于高精度减法,先判断两个数符号,如果为异号,则进行高精度加法,否则用大数减小数,逐个相减,然后逐位退位,判
7、断符号、返回答案即可。3 对于高精度乘法,用第二个数的各位乘以第一个数的各位。然后错位相加,相当于小学生摆竖式。最后将各位相乘的结果相加,逐位进位,判断符号、返回答案即可。4 对于高精度整除,采用各位从 09 枚举形式,如果此位与 09 相乘刚好小于等于相应数字,则为此位答案为这个数。最后返回答案即可。5 对于高精度取模,则只需求出高精度整除,然后将数字减去整除的结果即可。6 对于 n 阶乘,做 n 次乘法,每乘一次,乘数减一。7 对于左移,虽然是建立在位运算基础上,但其效果只是乘以二,所以只需高精度乘以二即可。8 对于 x 的平方、立方、y 次方,只需将 x 高精度相乘 2 次、3 次或者更
8、多次即可。9 对于与运算,先将两个数转换为二进制,然后对每位进行与运算,最后转换回十进制即可。10 对于异或运算,原理同与运算。 对于进制转换,采用除 n 取余法。将其转换为相应进制。 对于清零键,按按键功能对 actNum、ans、nowSym 等变量清空或者减少一位即可。 我对于程序容错性做了很大程度上的优化。对于超出位数的运算会跳出“数字太大”提示。对于各按键混合使用会导致的程序混乱用了极大程度上的优化,也就是说对于按键的随意性有很好的兼容性。比如说可以直接按 2 再按*然后按=,就会算出 2 的平方。 对于显示函数,先判断当前进制数,然后再将需要显示的数字转换为当前进制数再显示。如果位
9、数超过 40,则取前几位,采用科学计数法显示。 未能实现部分:小数部分。由于时间关系,未能实现复制粘贴数字功能。5五、 流程图开始按键前一次按键是数字?增加一位清零操作数字键是否 运算函数运算符显示函数显示函数设置相关后效信息按键其它键退格键减少一位清零相关归零键结束退出6六、 运行过程打开 Calc.exe,模拟 Windows 下的计算器功能。 基本功能为输入数字,再输入运算符,然后输入运算符对应数字,按等号。 输入数字,再输入运算符,输入等于号的结果为“当前输入的数字运算符当前输入的数字” 。可以调节正负号。 输入“数字,运算符,数字,运算符.数字,运算符”亦可。七、 心得体会这次“简单
10、计算器制作”的课程设计不仅让我对 C 语言的熟悉程度上升到了另一个高度,而且在一定意义上对面向对象设计的理解更加深刻了。是我在编程路途上的一次质的飞跃。而且在处理非常规数据类型的运算的锻炼下,使我对编程语言有了一个新的认识。当看着一个具有图形界面的计算器的模型成品出现在自己面前时,心中有着无限感慨,原来编程也不是非常遥不可及的,原来在编程的趣味性中能让我学到更多有意思的知识。7附源程序清单: Calc.h(运算函数集头文件)#include#include#include#define HIGH struct high#define MAXN 5000#define MAXSHOW 40#de
11、fine 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) return true;elseif(a.numi numi = num.numj;void initNum(HIGH
12、*numb) /初始化int i;HIGH tmp;memset(tmp.num, 0, sizeof(tmp.num);8*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, med;for(i = MAXN - 1; i 0; i-)if(a.numi != 0)med = i;break;if(i = 0) med =
13、 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) /加一位int i, med = getMed(*a);HIGH r;initNum(if(med numi - 1;r.num1 = b;r.num0 =
14、 a - num0;else r = *a;*a = r;HIGH mul(HIGH a, HIGH b) /高精度乘法9int i, j, k, ma, mb;HIGH tmpr, r, zero;initNum(initNum(ma = getMed(a);mb = getMed(b);for(i = 1; i MAXN)initNum(Application - MessageBox(“数字太大!“, “ 错误“, MB_OKCANCEL);nowSym = N;_lastKey = key_num;lastSym = N;return r;for(k = 1; k 10)tmpMed
15、= getMed(tmpr);if(tmpMed + i MAXN)initNum(Application - MessageBox(“数字太大!“, “ 错误“, MB_OKCANCEL);nowSym = N;_lastKey = key_num;lastSym = N;return r;for(j = 1; j 9)initNum(Application - MessageBox(“数字太大!“, “ 错误“, MB_OKCANCEL);nowShow = zero;nowSym = N;_lastKey = key_num;lastSym = N;10return r;if(a.num
16、0 = -1 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(if(a.num0 = -1 elseif(a.num0 = -1)b.num0 = -1;return inc(a, b);elseif(b.num0 = -1)a.num0 = -1;return inc(a, b);if(!absCmp(a, b)a.num0 = (a.num0 = 0) ? -1 : 0;b.num0 = (b.
17、num0 = 0) ? -1 : 0;return dec(b, a);med = getMed(a);for(i = 1; i 9)initNum(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
18、, tmpHigh, cmp, someZero, theone;initNum(initNum(if(a.num0 = b.num0) ;else r.num0 = -1;a.num0 = 0;b.num0 = 0;for(i = ma - mb + 1; i 0; i-)initNum(copyint(a, initNum(for(j = 0; !_isbig(cmp, tmpHigh); j+)12cmp = inc(cmp, b);theone.num1 = j;if(_isbig(mul(theone, b), tmpHigh) j-;r.numi = j;initNum(someZ
19、ero.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“;elseif(a = 11) return “B“;elseif(a = 12) return “C“;elseif(a = 13) return
20、 “D“;elseif(a = 14) return “E“;elseif(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(initNum(initNum(sixteen.num1 = 6;sixteen.num2 = 1;if(a.num0 = -1)initNum(13Application -
21、 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(Application - MessageBox(“数字太大!“, “ 错误“, MB_OKCANCEL);nowShow = zero;nowSym = N;_lastKe
22、y = key_num;lastSym = N;return r;return r;HIGH bajinzhi(HIGH a) /转化八进制int i = 0, j;HIGH zero, r, eight;initNum(initNum(initNum(eight.num1 = 8;if(a.num0 = -1)initNum(Application - MessageBox(“不能为负数!“, “ 错误“, MB_OKCANCEL);nowSym = N;_lastKey = key_num;lastSym = N;nowShow = zero;return r;while(_isbig(a
23、, zero)i+;r.numi = mod(a, eight).num1;a = div(a, eight);if(getMed(r) MAXSHOW)14initNum(Application - MessageBox(“数字太大!“, “ 错误“, MB_OKCANCEL);nowShow = zero;nowSym = N;_lastKey = key_num;lastSym = N;return r;return r;HIGH bin(HIGH a) /转化二进制int i = 0, j;HIGH zero, r, two;initNum(initNum(initNum(two.nu
24、m1 = 2;if(a.num0 = -1)initNum(Application - MessageBox(“不能为负数!“, “ 错误“, MB_OKCANCEL);nowShow = zero;nowSym = N;_lastKey = key_num;lastSym = N;return r;while(_isbig(a, zero)i+;r.numi = a.num1 % 2;a = div(a, two);if(getMed(r) MAXSHOW)initNum(Application - MessageBox(“数字太大!“, “ 错误“, MB_OKCANCEL);nowSho
25、w = zero;nowSym = N;_lastKey = key_num;lastSym = N;return r;return r;HIGH binToshi(HIGH a)int i, med = getMed(a);15HIGH r, tmp, the1, tmp2, two, thetwo;initNum(initNum(initNum(initNum(initNum(two.num1 = 1;thetwo.num1 = 2;the1.num1 = 1;initNum(for(i = 1; i medb) ? meda : medb;for(i = 1; i medb) ? med
26、a : medb;for(i = 1; i #pragma hdrstop /-USEFORM(“Main.cpp“, MainForm);/-WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)try Application - Initialize();Application - CreateForm(_classid(TMainForm), Application - Run();catch(Exception 18catch(.)try throw Exception(“);catch(Exceptionreturn 0;/- Main.h
27、/*由 BCB 生成*/#ifndef MainH#define MainH/-#include #include #include #include #include #include /-class TMainForm : public TForm_published: / IDE-managed ComponentsTMainMenu *MainMenu1;TMenuItem *E1;TMenuItem *N1;TMenuItem *H1;TEdit *Show_Editor;TButton *bt_bkspace;TButton *bt_ce;TButton *bt_Leftc;TBu
28、tton *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 *bt_5;TButton *bt_6;TButton *bt_mul;TButton *bt_xor;TButton *bt_7;TButton *bt_8;TButton *bt_9;TButton *bt_div;19TButton *bt_mod;TButton *bt_and;
29、TButton *bt_xpf;TButton *bt_xlf;TButton *bt_xycf;TButton *bt_njc;TButton *sljz;TButton *sjz;TButton *bjz;TButton *ejz;void _fastcall FormCreate(TObject *Sender);void _fastcall bt_7Click(TObject *Sender);void _fastcall bt_8Click(TObject *Sender);void _fastcall bt_0Click(TObject *Sender);void _fastcal
30、l bt_1Click(TObject *Sender);void _fastcall bt_2Click(TObject *Sender);void _fastcall bt_3Click(TObject *Sender);void _fastcall bt_4Click(TObject *Sender);void _fastcall bt_5Click(TObject *Sender);void _fastcall bt_6Click(TObject *Sender);void _fastcall bt_9Click(TObject *Sender);void _fastcall bt_i
31、AndmClick(TObject *Sender);void _fastcall bt_incClick(TObject *Sender);void _fastcall bt_eqClick(TObject *Sender);void _fastcall bt_decClick(TObject *Sender);void _fastcall bt_mulClick(TObject *Sender);void _fastcall Show_EditorKeyPress(TObject *Sender, char void _fastcall bt_divClick(TObject *Sende
32、r);void _fastcall bt_LeftcClick(TObject *Sender);void _fastcall bt_ceClick(TObject *Sender);void _fastcall bt_bkspaceClick(TObject *Sender);void _fastcall bt_xpfClick(TObject *Sender);void _fastcall bt_xlfClick(TObject *Sender);void _fastcall bt_xycfClick(TObject *Sender);void _fastcall bt_lshClick(
33、TObject *Sender);void _fastcall bt_modClick(TObject *Sender);void _fastcall bt_njcClick(TObject *Sender);void _fastcall sjzClick(TObject *Sender);void _fastcall ejzClick(TObject *Sender);void _fastcall sljzClick(TObject *Sender);void _fastcall bjzClick(TObject *Sender);void _fastcall bt_andClick(TOb
34、ject *Sender);void _fastcall bt_xorClick(TObject *Sender);private: / User declarationspublic: / User declarations_fastcall TMainForm(TComponent* Owner);void _fastcall TMainForm:ShowText(HIGH a);/-extern PACKAGE TMainForm *MainForm;/-#endif Main.cpp#include#include20#pragma hdrstop #include “Main.h“
35、/-#pragma package(smart_init)#pragma resource “*.dfm“ using namespace std ;TMainForm*MainForm ;/-_fastcall TMainForm : TMainForm(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);els
36、e if(jz=16)a=hex(a);med=getMed(a);bool m=(a.num0=-1)?true:false ;if(med9)?getHexStr(a.numj):IntToStr(a.numj);Show_Editor-Text=str ;else if(m)i=1 ;str=“-“ ;else i=0 ;int e=med-1 ;21for(j=med;(m)?(iText=str ;void _fastcall TMainForm : FormCreate(TObject*Sender) /*窗体创建*/initNum(initNum(/-void _fastcall
37、 TMainForm : bt_7Click(TObject*Sender)if(_lastKey=key_sym)initNum(if(_lastKey=key_symlastSym=N ;incMed(ShowText(actNum);_lastKey=key_num ;/-void _fastcall TMainForm : bt_8Click(TObject*Sender)if(_lastKey=key_sym)initNum(if(_lastKey=key_symlastSym=N ;incMed(ShowText(actNum);_lastKey=key_num ;/-void _
38、fastcall TMainForm : bt_0Click(TObject*Sender)if(_lastKey=key_sym)initNum(if(_lastKey=key_symlastSym=N ;incMed(ShowText(actNum);_lastKey=key_num ;/-void _fastcall TMainForm : bt_1Click(TObject*Sender)22if(_lastKey=key_sym)initNum(if(_lastKey=key_symlastSym=N ;incMed(ShowText(actNum);_lastKey=key_num
39、 ;/-void _fastcall TMainForm : bt_2Click(TObject*Sender)if(_lastKey=key_sym)initNum(if(_lastKey=key_symlastSym=N ;incMed(ShowText(actNum);_lastKey=key_num ;/-void _fastcall TMainForm : bt_3Click(TObject*Sender)if(_lastKey=key_sym)initNum(if(_lastKey=key_symlastSym=N ;incMed(ShowText(actNum);_lastKey
40、=key_num ;/-void _fastcall TMainForm : bt_4Click(TObject*Sender)if(_lastKey=key_sym)initNum(if(_lastKey=key_symlastSym=N ;incMed(ShowText(actNum);_lastKey=key_num ;/-void _fastcall TMainForm : bt_5Click(TObject*Sender)if(_lastKey=key_sym)initNum(if(_lastKey=key_symlastSym=N ;23incMed(ShowText(actNum
41、);_lastKey=key_num ;/-void _fastcall TMainForm : bt_6Click(TObject*Sender)if(_lastKey=key_sym)initNum(if(_lastKey=key_symlastSym=N ;incMed(ShowText(actNum);_lastKey=key_num ;/-void _fastcall TMainForm : bt_9Click(TObject*Sender)if(_lastKey=key_sym)initNum(if(_lastKey=key_symlastSym=N ;incMed(ShowTex
42、t(actNum);_lastKey=key_num ;/-void _fastcall TMainForm : bt_iAndmClick(TObject*Sender)turnSym(ShowText(actNum);/-void _fastcall TMainForm : bt_incClick(TObject*Sender)doAns(ShowText(ans);lastSym=nowSym ;nowSym=+ ;actNum=ans ;/initNum(_lastKey=key_sym ;/-void _fastcall TMainForm : bt_eqClick(TObject*Sender)doAns(if(nowSym!=N)lastSym=nowSym ;ShowText(ans);nowSym=N ;24/actNum = ans;/i