毕业设计论文——基于C的简易计算器程序设计

引言

根据毕业设计论文——“基于C的简易计算器程序设计”这个课题所需涉及到的知识以及如何用这些知识完成需要达到的任务或目标,我决定将毕业设计论文(以下简称“论文”)分为2章,即

论文内容包括:

?

? 第1章:将大致介绍“基于C的”知识即C语言的基础知识和在本课题中的应用。 第2章:根据论文所涉到的具体任务或目标,将介绍如何把第1篇的知识具体应用到“计算器程序设计”中。

对于论文课题的实现,可以大致归纳为以下几个方面的关键词,即

论文相关:

? 设计目的: 设计一个基于C的简易计算器程序,在功能上尽量模拟windows操作系统中的计算器,系统界面不做强制要求。

? 所需知识:全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、选择、循环三种结构及数组、函数、指针和文件的操作,把编程和实际结合起来,对不同的问题运用和灵活选择合适的数据结构以及算法描述,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法。

? 一般步骤: a、确定数据结构 b、确定算法 c、 编程 d、 调试 e、 总结。 ? 采用工程模式即模块化,文件包括四个重要组成部分:

? calc.h(运算主函数头文件,包括各运算符的操作以及其辅助函数)。

? Main.h(窗体类的声明头文件)。

? Calc.cpp(工程初始化文件)。

? Main.cpp(代码主文件,包括各空间操作的函数)以及一些其它附属文件,包括dll动态链接库。

? 计算器程序实现功能:在参考了Windows里的计算器以后,决定在我的课程设计中实②①

- 1 -

现:0~9的数字输入功能(小数点除外);实现:加、减、乘、整除、取模、阶乘、位运算左移、x的y次方、与、异或、x立方、x平方运算功能;二进制、八进制、十进制、十六进制转换功能;正负转换功能;退格、归零等功能。

① 说明:由于需要使功能尽量模仿Windows下的计算器,而很多功能要以图形界面实现,

故用Borland C++ Builder编写。所以用的是面向对象程序设计。但因为这是C语言的课程设计,所以除了面向对象的使用以外,所有语法都是按照C语言的格式编写。 ② 说明:这里所说的“四个重要组成部分”即为“程序设计”的核心内容。

- 2 -

目录

引言............................................................................................................................- 1 -

第一章........................................................................................................................- 5 -

1.1数据类型与算法描述 ..................................................................................- 6 -

1.1.1数据类型 ............................................................................................- 6 -

1.1.2算法描述 ............................................................................................- 6 -

1.2程序的3种基本结构 ..................................................................................- 6 -

1.2.1顺序结构 ............................................................................................- 6 -

1.2.2选择结构 ............................................................................................- 6 -

1.2.3循环结构 ............................................................................................- 6 -

1.3数组、函数、指针和文件 ..........................................................................- 6 -

1.3.1数组 ....................................................................................................- 6 -

1.3.2函数 ....................................................................................................- 6 -

1.3.3指针 ....................................................................................................- 7 -

1.3.4文件 ....................................................................................................- 7 -

第二章........................................................................................................................- 8 -

2.1具体操作及原理流程图 ..............................................................................- 9 -

2.1.1具体操作 .........................................................................................- 9 -

2.1.2原理流程图 .....................................................................................- 9 -

2.2文件的四个组成部分即具体实现 ............................................................- 10 -

2.2.1Calc.h(运算函数集头文件) ...............................................................- 10 -

2.2.1.1高精度乘法的实现 ................................................................- 12 -

2.2.1.2高精度减法的实现 ................................................................- 14 -

2.2.1.3高精度加法的实现 ................................................................- 15 -

2.2.1.4高精度整除的实现 ................................................................- 16 -

2.2.1.5高精度取模的实现 ................................................................- 17 -

- 3 -

2.2.1.6进制间的转换(先得到十六进制,再转换成相应进制) - 17 -

2.2.2 Calc.cpp /*由BCB生成*/.............................................................- 25 -

2.2.3 Main.h(/*由BCB生成*/)...........................................................- 26 -

2.2.4 Main.cpp ...........................................................................................- 28 - 附录..........................................................................................................................- 39 - 参考文献..................................................................................................................- 40 - 致谢..........................................................................................................................- 41 -

- 4 -

第一章

第1节 数据类型、算法描述的简要介绍 第2节 程序的3种基本结构 第3节 数组、函数、指针、文件简要介绍

- 5 -

1.1数据类型与算法描述

1.1.1数据类型

程序在运行时要做的内容就是处理数据。程序要解决复杂的问题,就要处理不同的数据。不同的数据都是以自己本身的一种特定形式存在的,不同的数据类型占用不同存储空间。C语言中有多种不同的数据类型,其中包括几个大的方向:基本类型、构造类型、指针类型和空类型。

1.1.2算法描述

算法包含算法设计和算法分析两方面内容。算法设计主要研究怎样针对某一特定类型的问题设计出求解步骤,算法分析则要讨论所设计出来的算法步骤的正确性和复杂性。对于一些问题的求解步骤,需要一种表达方式,即算法描述。常用的算法描述有自然语言、流程图、N-S流程图等。

1.2程序的3种基本结构

1.2.1顺序结构

顺序结构的语句是自顶向下依次执行的。

1.2.2选择结构

选择结构中的语句是根据条件判断来控制执行的。

1.2.3循环结构

循环结构中的语句执行是根据判断条件是真是假来控制某些操作是否反复执行。

1.3数组、函数、指针和文件

1.3.1数组

数组是用以存储数列中数据的集合。

1.3.2函数

定义的函数包括函数头和函数体两部分。函数头包括返回值类型、函数名、参数表。函数体包括局部变量的声明和函数的可执行代码。

- 6 -

1.3.3指针

通过地址能访问指定的内存存储单元,地址可以形象的称为指针。

1.3.4文件

文件是指一组相关数据的有序集合。

- 7 -

第1节 具体操作及原理流程图 第2节 文件的四个组成部分即具体实现 第二章

- 8 -

毕业设计论文基于C的简易计算器程序设计

2.1具体操作及原理流程图

具体操作将描述在使用本编程软件对输入的要求以及几种常见的输入情况;原理流程图将描述编程软件的运行机制及其细节。

2.1.1具体操作

打开Calc.exe,模拟Windows下的计算器功能。基本功能为输入数字,再输入运算符,然后输入运算符对应数字,按等号;输入数字,再输入运算符,输入等于号的结果为“当前输入的数字→运算符→当前输入的数字”,可以调节正负号;输入“数字,运算符,数字,运算符...数字,运算符…”。

2.1.2原理流程图

2.2文件的四个组成部分即具体实现

本章将说明构成本软件的源代码部分即四个重要组成部分:calc.h(运算主函数头文件,包括各运算符的操作以及其辅助函数)、Main.h(窗体类的声明头文件)、

Calc.cpp(工程初始化文件)、Main.cpp(代码主文件,包括各空间操作的函数)以及一些其它附属文件。

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

包括实现运算所需的头文件;实现软件各种运算(加、减、乘、除、取模等)的源代码的编程部分。

#include<stdio.h>

#include<string>

#include<string.h>

#define HIGH struct high

#define MAXN 5000

#define MAXSHOW 40

#define key_num 0

#define key_sym 1

struct high{

int num[MAXN];

};

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.num[i] > b.num[i]) return true;

else

if(a.num[i] < b.num[i]) return false;

}

return false;

}

- 10 -

void copy(char *str, char *rstr, int op, int len) //将str的从op开始的len个字符复制到rstr中

{

int i = 0, j = op - 1;

for(; i <= len - 1 || str[j] == '\0'; i++, j++) rstr[i] = str[j];

rstr[i] = '\0';

}

void copyint(HIGH num, HIGH *rint, int op, int len) //将str的从op开始的len个字符复制到rstr中

{

int i = 1, j = op;

for(; i <= len && j < MAXN; i++, j++) rint -> num[i] = num.num[j];

}

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.num[i] != b.num[i]) return (a.num[i] > b.num[i]);

}

return -1;

}

int getMed(HIGH a) //获取位数

{

int i, med;

for(i = MAXN - 1; i > 0; i--)

if(a.num[i] != 0)

{

med = i;

break;

}

if(i == 0) med = 1;

- 11 -

return med;

}

void turnSym(HIGH *a) //变号

{

a -> num[0] = a -> num[0] == 0 ? -1 : 0;

}

void decMed(HIGH *a) //减去一位

{

int i, 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;

}

void incMed(HIGH *a, int b) //加一位

{

int i, med = getMed(*a);

HIGH r;

initNum(&r);

if(med < MAXSHOW)

{

for(i = 2; i <= med + 1; i++) r.num[i] = a -> num[i - 1];

r.num[1] = b;

r.num[0] = a -> num[0];

}

else r = *a;

*a = r;

2.2.1.1高精度乘法的实现

MUL函数介绍:

MUL AB乘法指令的功能是将A和B中两个无符号8位二进制数相乘,所得的16位积的低8位存于A中,高8位存于B中。如果乘积大于256,即高位B不为0,则OV置1;否则OV清0,CY总是清0。

HIGH mul(HIGH a, HIGH b) //高精度乘法

{

int i, j, k, ma, mb;

HIGH tmpr, r, zero;

initNum(&zero);

initNum(&r);

- 12 -

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

}

int tmpMed = getMed(tmpr);

if(tmpMed + i > MAXN)

{

initNum(&r);

Application -> MessageBox("数字太大!", "错误", MB_OKCANCEL); nowSym = 'N';

_lastKey = key_num;

lastSym = 'N';

return r;

}

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

if(tmpMed + i > MAXN)

{

initNum(&r);

Application -> MessageBox("数字太大!", "错误", MB_OKCANCEL); nowSym = 'N';

_lastKey = key_num;

lastSym = 'N';

return r;

}

for(j = 1; j <= tmpMed; j++) r.num[j + i - 1] += tmpr.num[j];

}

for(i = 1; i < MAXN - 1; i++)

{

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

r.num[i] %= 10;

- 13 -

}

if(r.num[MAXN - 1] > 9)

{

initNum(&r);

Application -> MessageBox("数字太大!", "错误", MB_OKCANCEL); nowShow = zero;

nowSym = 'N';

_lastKey = key_num;

lastSym = 'N';

return r;

}

if((a.num[0] == -1 && b.num[0] == -1) || (a.num[0] == 0 && b.num[0] == 0)) r.num[0] = 0;

else r.num[0] = -1;

return r;

}

2.2.1.2高精度减法的实现

DEC函数介绍:

英文全称为Decimal,简称DEC

表示a:=a-1 dec(a,b):=a:=a-b;

在pascal中,dec(a)表示a:=a-1 dec(a,b):=a:=a-b;

HIGH dec(HIGH a, HIGH b) //高精度减法

{

int i, med;

HIGH r;

HIGH inc(HIGH a, HIGH b);

bool m = false;

initNum(&r);

if(a.num[0] == -1 && b.num[0] == -1) m = true;

else

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

{

b.num[0] = -1;

return inc(a, b);

}

else

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

{

- 14 -

a.num[0] = -1;

return inc(a, b);

}

if(!absCmp(a, b))

{

a.num[0] = (a.num[0] == 0) ? -1 : 0;

b.num[0] = (b.num[0] == 0) ? -1 : 0;

return dec(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;

return r;

}

2.2.1.3高精度加法的实现

INC函数介绍:

inc(i,n)是自增函数

相应的等同于 i := i+n ;(n指相应的增量) Dec(i,n)是自减函数

只针对整数(inc同)

HIGH inc(HIGH a, HIGH b) //高精度加法

{

int i;

HIGH r, zero;

bool m = false, err = false;

initNum(&r);

initNum(&zero);

if(a.num[0] == -1 && b.num[0] == -1) m = true; else

- 15 -

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

{

a.num[0] = 0;

return dec(b, a);

}

else

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

{

b.num[0] = 0;

return dec(a, b);

}

for(i = 1; i < MAXN; i++) r.num[i] = a.num[i] + b.num[i];

for(i = 1; i < MAXN - 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;

return r;

}

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

return r;

}

2.2.1.4高精度整除的实现

DIV函数介绍:

对于A DIV B 中当A,B同号时按一般除法即A/B(取整)计算,若A,B异号则先按一般除法计算,商为负

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

- 16 -

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

else r.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);

}

return r;

}

2.2.1.5高精度取模的实现

毕业设计论文基于C的简易计算器程序设计

HIGH mod(HIGH a, HIGH b) //高精度取模

{

int i, j;

HIGH tmpans;

tmpans = div(a, b);

return dec(a, mul(tmpans, b));

2.2.1.6进制间的转换(先得到十六进制,再转换成相应进制)

{

- 17 -

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

}

int getHex(HIGH a) //十六进制取余

{

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

else return a.num[2] * 10 + a.num[1];

}

2.2.1.6.1转化为十六进制

HIGH hex(HIGH a) //转化十六进制

{

int i = 0, j;

HIGH zero, r, sixteen;

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;

return r;

}

while(_isbig(a, zero))

{

- 18 -

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

return r;

}

}

return r;

}

2.2.1.6.2转化为八进制

HIGH bajinzhi(HIGH a) //转化八进制

{

int i = 0, j;

HIGH zero, 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;

return r;

}

while(_isbig(a, zero))

{

i++;

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

- 19 -

a = div(a, eight);

if(getMed(r) > MAXSHOW)

{

initNum(&r);

Application -> MessageBox("数字太大!", "错误", MB_OKCANCEL); nowShow = zero;

nowSym = 'N';

_lastKey = key_num;

lastSym = 'N';

return r;

}

}

return r;

}

2.2.1.6.3转化为二进制

HIGH bin(HIGH a) //转化二进制

{

int i = 0, j;

HIGH zero, 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';

return r;

}

while(_isbig(a, zero))

{

i++;

r.num[i] = a.num[1] % 2;

a = div(a, two);

- 20 -

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;

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

}

return r;

}

2.2.1.6.4与运算的实现 AND函数介绍:

用于对两个表达式进行逻辑与运算[1]。

与运算,二进制运算.可逆运算.1 and 1=1,1 and 0=0,0 and 0=0,0 and 1=0.

- 21 -

a and b 的运算方法:将a和b转换成2进制后,一位一位地去比较,两个数位上只相同,那么就是1,否则为0.最后再把它转换成十进制就可以了.

HIGH and(HIGH a, HIGH b) //与

{

HIGH tmpa, tmpb, r;

int med, 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);

return r; }

2.2.1.6.5异或运算的实现

XOR函数介绍:

Visual Basic中式一种逻辑运算符,用来连接两个或多个关系式,组成一个。其运算方法是:如果两个表达式同时为True或同时为False,则结果为False;否则为True。

HIGH xor(HIGH a, HIGH b) //异或

{

HIGH tmpa, tmpb, r;

int med, meda, medb, i;

initNum(&r);

tmpa = bin(a);

tmpb = bin(b);

meda = getMed(tmpa);

medb = getMed(tmpb);

med = (meda > medb) ? meda : medb;

- 22 -

for(i = 1; i <= med; i++)

r.num[i] = tmpa.num[i] ^ tmpb.num[i];

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.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);

- 23 -

else

if(*nowSym == '*') *ans = mul(*ans, actNum); else

if(*nowSym == '/') *ans = div(*ans, actNum); else

if(*nowSym == '2') *ans = mul(*ans, *ans); else

if(*nowSym == '3')

{

*ans = mul(mul(*ans, *ans), *ans);

}

else

if(*nowSym == 'Y')

{

initNum(&zero);

if(actNum.num[0] == -1 || !_isbig(actNum, zero)) {

*ans = the1;

return ;

}

zero.num[1] = 2;

tmp = *ans;

for(; !_isbig(zero, actNum); zero = inc(zero, the1)) {

*ans = mul(*ans, tmp);

}

}

else

if(*nowSym == 'L')

{

initNum(&zero);

zero.num[1] = 2;

if(*nowSym == '2') *ans = mul(*ans, zero); }

else

if(*nowSym == 'M') *ans = mod(*ans, actNum); else

if(*nowSym == '!')

{

actNum = dec(*ans, the1);

initNum(&zero);

while(_isbig(actNum, zero))

{

*ans = mul(*ans, actNum);

- 24 -

actNum = dec(actNum, the1);

}

}

else

if(*nowSym == 'A') *ans = and(*ans, actNum); else

if(*nowSym == 'X') *ans = xor(*ans, actNum);

}

}

2.2.2 Calc.cpp /*由BCB生成*/

本节为软件的工程初始化头文件,由VC++中的BCB自动生成。

#include<vcl.h>

#pragma hdrstop

//-------------------------------------------------------------

USEFORM("Main.cpp", MainForm);

//-------------------------------------------------------------

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application -> Initialize();

Application -> CreateForm(__classid(TMainForm), &MainForm); Application -> Run();

}

catch(Exception &exception)

{

Application -> ShowException(&exception);

}

catch(...)

{

try

{

throw Exception("");

}

catch(Exception&exception)

{

Application -> ShowException(&exception); }

}

return 0;

- 25 -

}

//-------------------------------------------------------------

2.2.3 Main.h(/*由BCB生成*/)

窗体类的声明头文件 ,由VC++中的BCB自动生成 。

#ifndef MainH

#define MainH

//--------------------------------------------------------------------------- #include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Menus.hpp>

#include <ExtCtrls.hpp>

//--------------------------------------------------------------------------- class TMainForm : public TForm

{

__published: // IDE-managed Components

TMainMenu *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 *bt_5;

TButton *bt_6;

TButton *bt_mul;

TButton *bt_xor;

TButton *bt_7;

- 26 -

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(TObject *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(TObject *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_decClick(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(TObject *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 __fastcall sjzClick(TObject *Sender);

void __fastcall ejzClick(TObject *Sender);

void __fastcall sljzClick(TObject *Sender);

void __fastcall bjzClick(TObject *Sender);

- 27 -

void __fastcall bt_andClick(TObject *Sender); void __fastcall bt_xorClick(TObject *Sender); private: // User declarations

public: // User declarations

__fastcall TMainForm(TComponent* Owner); void __fastcall TMainForm::ShowText(HIGH a); };

//--------------------------------------------------------------------------- extern PACKAGE TMainForm *MainForm;

//--------------------------------------------------------------------------- #endif

2.2.4 Main.cpp

窗体类源代码

#include<vcl.h>

#include<calc.h>

#pragma hdrstop

#include "Main.h"

//--------------------------------------------------------------------------- #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);

- 28 -

else

if(jz==16)a=hex(a);

med=getMed(a);

bool m=(a.num[0]==-1)?true:false ;

if(med<=MAXSHOW)

{

if(m)

{

i=1 ;

str="-" ;

}

else i=0 ;

for(j=med;(m)?(i<=med):(i<med);i++,j--)

{

str+=(a.num[j]>9)?getHexStr(a.num[j]):IntToStr(a.num[j]); }

Show_Editor->Text=str ;

}

else

{

if(m)

{

i=1 ;

str="-" ;

}

else i=0 ;

int e=med-1 ;

for(j=med;(m)?(i<=40):(i<40);i++,j--)

{

str+=IntToStr(a.num[j]);

if((m)?i==1:i==0)str+='.' ;

}

str+="E+"+IntToStr(e);

Show_Editor->Text=str ;

}

}

void __fastcall TMainForm :: FormCreate(TObject*Sender) /*窗体创建*/ {

initNum(&actNum);

initNum(&ans);

- 29 -

}

//--------------------------------------------------------------------------- void __fastcall TMainForm :: bt_7Click(TObject*Sender) {

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 :: bt_1Click(TObject*Sender) {

if(_lastKey==key_sym)initNum(&actNum);

- 30 -

if(_lastKey==key_sym&&nowSym=='N')

{

initNum(&ans);

lastSym='N' ;

}

incMed(&actNum,1);

ShowText(actNum);

_lastKey=key_num ;

}

//--------------------------------------------------------------------------- void __fastcall TMainForm :: bt_2Click(TObject*Sender) {

if(_lastKey==key_sym)initNum(&actNum); if(_lastKey==key_sym&&nowSym=='N')

{

initNum(&ans);

lastSym='N' ;

}

incMed(&actNum,2);

ShowText(actNum);

_lastKey=key_num ;

}

//--------------------------------------------------------------------------- void __fastcall TMainForm :: bt_3Click(TObject*Sender) {

if(_lastKey==key_sym)initNum(&actNum); if(_lastKey==key_sym&&nowSym=='N')

{

initNum(&ans);

lastSym='N' ;

}

incMed(&actNum,3);

ShowText(actNum);

_lastKey=key_num ;

}

//--------------------------------------------------------------------------- void __fastcall TMainForm :: bt_4Click(TObject*Sender) {

if(_lastKey==key_sym)initNum(&actNum); if(_lastKey==key_sym&&nowSym=='N')

{

initNum(&ans);

lastSym='N' ;

}

- 31 -

incMed(&actNum,4);

ShowText(actNum);

_lastKey=key_num ;

}

//--------------------------------------------------------------------------- void __fastcall TMainForm :: bt_5Click(TObject*Sender) {

if(_lastKey==key_sym)initNum(&actNum); if(_lastKey==key_sym&&nowSym=='N')

{

initNum(&ans);

lastSym='N' ;

}

incMed(&actNum,5);

ShowText(actNum);

_lastKey=key_num ;

}

//--------------------------------------------------------------------------- void __fastcall TMainForm :: bt_6Click(TObject*Sender) {

if(_lastKey==key_sym)initNum(&actNum); if(_lastKey==key_sym&&nowSym=='N')

{

initNum(&ans);

lastSym='N' ;

}

incMed(&actNum,6);

ShowText(actNum);

_lastKey=key_num ;

}

//--------------------------------------------------------------------------- void __fastcall TMainForm :: bt_9Click(TObject*Sender) {

if(_lastKey==key_sym)initNum(&actNum); if(_lastKey==key_sym&&nowSym=='N')

{

initNum(&ans);

lastSym='N' ;

}

incMed(&actNum,9);

ShowText(actNum);

_lastKey=key_num ;

}

//---------------------------------------------------------------------------

- 32 -

void __fastcall TMainForm :: bt_iAndmClick(TObject*Sender) {

turnSym(&actNum);

ShowText(actNum);

}

//--------------------------------------------------------------------------- void __fastcall TMainForm :: bt_incClick(TObject*Sender) {

doAns(&ans,actNum,&nowSym,'+',lastSym,_lastKey);

ShowText(ans);

lastSym=nowSym ;

nowSym='+' ;

actNum=ans ;

//initNum(&actNum);

_lastKey=key_sym ;

}

//--------------------------------------------------------------------------- void __fastcall TMainForm :: bt_eqClick(TObject*Sender) {

doAns(&ans,actNum,&nowSym,'N',lastSym,_lastKey);

if(nowSym!='N')lastSym=nowSym ;

ShowText(ans);

nowSym='N' ;

//actNum = ans;

//initNum(&actNum);

_lastKey=key_sym ;

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_decClick(TObject*Sender) {

doAns(&ans,actNum,&nowSym,'-',lastSym,_lastKey);

ShowText(ans);

lastSym=nowSym ;

nowSym='-' ;

actNum=ans ;

//initNum(&actNum);

_lastKey=key_sym ;

}

//---------------------------------------------------------------------------

- 33 -

void __fastcall TMainForm :: bt_mulClick(TObject*Sender)

{

doAns(&ans,actNum,&nowSym,'*',lastSym,_lastKey);

ShowText(ans);

lastSym=nowSym ;

nowSym='*' ;

actNum=ans ;

//initNum(&actNum);

_lastKey=key_sym ;

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_divClick(TObject*Sender)

{

doAns(&ans,actNum,&nowSym,'/',lastSym,_lastKey);

ShowText(ans);

lastSym=nowSym ;

nowSym='/' ;

actNum=ans ;

//initNum(&actNum);

_lastKey=key_sym ;

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: Show_EditorKeyPress(TObject*Sender,char&Key) {

if(Key>='0'&&Key<='9')

{

if(_lastKey==key_sym)initNum(&actNum);

if(_lastKey==key_sym&&nowSym=='N')initNum(&ans);

incMed(&actNum,Key-'0');

ShowText(actNum);

_lastKey=key_num ;

}

else

if(Key=='+')bt_incClick(Sender);

else

if(Key=='-')bt_decClick(Sender);

else

if(Key=='*')bt_mulClick(Sender);

else

- 34 -

if(Key=='/')bt_divClick(Sender);

else

if(Key=='^')bt_xycfClick(Sender);

else

if(Key=='!')bt_njcClick(Sender);

else

if(Key==13)bt_eqClick(Sender);

else

if(Key==8)bt_bkspaceClick(Sender);

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_LeftcClick(TObject*Sender) {

initNum(&actNum);

ShowText(actNum);

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_ceClick(TObject*Sender) {

initNum(&ans);

initNum(&actNum);

_lastKey=key_num ;

nowSym='N' ;

lastSym='N' ;

ShowText(actNum);

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_bkspaceClick(TObject*Sender) {

decMed(&actNum);

ShowText(actNum);

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_xpfClick(TObject*Sender) {

doAns(&ans,actNum,&nowSym,'2',lastSym,_lastKey);

- 35 -

lastSym=nowSym ;

nowSym='2' ;

doAns(&ans,actNum,&nowSym,'N',lastSym,_lastKey); ShowText(ans);

actNum=ans ;

//initNum(&actNum);

_lastKey=key_sym ;

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_xlfClick(TObject*Sender) {

doAns(&ans,actNum,&nowSym,'3',lastSym,_lastKey);

lastSym=nowSym ;

nowSym='3' ;

doAns(&ans,actNum,&nowSym,'N',lastSym,_lastKey); ShowText(ans);

actNum=ans ;

//initNum(&actNum);

_lastKey=key_sym ;

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_xycfClick(TObject*Sender) {

doAns(&ans,actNum,&nowSym,'Y',lastSym,_lastKey);

ShowText(ans);

lastSym=nowSym ;

nowSym='Y' ;

actNum=ans ;

//initNum(&actNum);

_lastKey=key_sym ;

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_lshClick(TObject*Sender) {

doAns(&ans,actNum,&nowSym,'L',lastSym,_lastKey);

- 36 -

ShowText(ans);

lastSym=nowSym ;

nowSym='L' ;

actNum=ans ;

//initNum(&actNum);

_lastKey=key_sym ;

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_modClick(TObject*Sender) {

doAns(&ans,actNum,&nowSym,'M',lastSym,_lastKey);

ShowText(ans);

lastSym=nowSym ;

nowSym='M' ;

actNum=ans ;

//initNum(&actNum);

_lastKey=key_sym ;

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_njcClick(TObject*Sender) {

doAns(&ans,actNum,&nowSym,'!',lastSym,_lastKey);

lastSym=nowSym ;

nowSym='!' ;

doAns(&ans,actNum,&nowSym,'N',lastSym,_lastKey); ShowText(ans);

actNum=ans ;

//initNum(&actNum);

_lastKey=key_sym ;

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: sjzClick(TObject*Sender) {

jz=10 ;

ShowText(nowShow);

- 37 -

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: ejzClick(TObject*Sender) {

jz=2 ;

ShowText(nowShow);

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: sljzClick(TObject*Sender) {

jz=16 ;

ShowText(nowShow);

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bjzClick(TObject*Sender) {

jz=8 ;

ShowText(nowShow);

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_andClick(TObject*Sender) {

doAns(&ans,actNum,&nowSym,'A',lastSym,_lastKey);

ShowText(ans);

lastSym=nowSym ;

nowSym='A' ;

actNum=ans ;

//initNum(&actNum);

_lastKey=key_sym ;

}

//---------------------------------------------------------------------------

void __fastcall TMainForm :: bt_xorClick(TObject*Sender) {

doAns(&ans,actNum,&nowSym,'X',lastSym,_lastKey);

ShowText(ans);

lastSym=nowSym ;

nowSym='X' ;

- 38 -

actNum=ans ;

//initNum(&actNum);

_lastKey=key_sym ;

}

//---------------------------------------------------------------------------

附录

- 39 -

毕业设计论文基于C的简易计算器程序设计

毕业设计论文基于C的简易计算器程序设计

参考文献

[1]科 钦.C语言程序设计.北京:电子工业出版社,1987:56-58

[2]徐君毅.C语言程序设计基础.上海:复旦大学出版社,1992:87-98

[3]李成付.C语言程序设计基础.北京:科学出版社,1992:42-67

[4]郝玉洁.C语言程序设计.北京:机械工业出版社,2000:63-88

[5]钱启平.C语言程序设计基础.北京:中国铁道出版社,2000:91-99

[6]李大友.C语言程序设计基础.北京:清华大学出版社,1999:58-98

[7]黄迪明.C语言程序设计.北京:电子科技大学出版社,1998:78-98

[8]姜仲秋.C语言程序设计基础.南京:南京大学出版社,1998:16-100

[9]李国昌.C语言程序设计基础.北京:科学出版社,1998:78-120

[10]谭浩强.C语言程序设计.北京:清华大学出版社,2000:74-129

部分内容来自于:电子驿站www.Ourmpt.com、 电子烧友、百度搜索、21世纪电子网等。

- 40 -

致谢

1.本课题在选题及研究过程中得到黄睿老师的悉心指导。黄老师多次询问设计进程,关注设计结果,并为我指点迷津,帮助我开拓设计思路,精心点拨、热忱鼓励。黄老师一丝不苟的作风,严谨求实的态度,踏踏实实的精神,不仅授我以文,而且教会我怎样做人。对黄老师的感激之情是无法用言语表达的。

2. 感谢张华敏、张林生、蔡运富、黄睿、林涛、徐雪刚等老师对我的悉心教育和培养。他们的细心指导使我在学业上有一个更大的成长和突破,让我在大学里度过了一个有意义的时间段,在此,我要向诸位老师深深地鞠上一躬。祝以诚挚的谢意!

3.在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无限的帮助,给了我走下去的勇气,在这里请你们接受我诚挚的谢意!最后我还要感谢培养我长大含辛茹苦的父母,谢谢你们!

- 41 -

相关推荐