您的当前位置:首页正文

C++课程设计___简单计算器的设计 2

来源:画鸵萌宠网
简单科学计算器设计

C++ 课程设计报告

学生姓名 : 刘建军 专 业 : 计算机应用技术 班 级 : 1240301 指导教师 : 阳红星

简单科学计算器设计

目 录

一、设计任务 ...................................................................... 错误!未定义书签。

1.1 选题意义 ............................................................ 错误!未定义书签。 1.2 设计目标 .............................................................................................. 1 1.3 关于virtualc++ .................................................................................... 2 1.4 可行性及需求分析 .............................................................................. 3 二、程序设计与实现 .......................................................... 错误!未定义书签。

2.1 程序结构 ............................................................ 错误!未定义书签。 2.2 详细设计 .............................................................................................. 4

2.2.1 程序流程图 ............................................................................. 4 2.2.2 程序设计具体步骤 ................................................................. 5 2.2.3 程序运行界面 ....................................................................... 23

三、设计难点与解决方法 .................................................................................. 24

四、设计效果与不足之处 .................................................................................. 24

4.1程序效果图 ........................................................................................... 24 4.2 不足之处 ............................................................................................ 27 五、参考资料 ...................................................................................................... 27

六、课程设计总结 .............................................................................................. 27

简单科学计算器设计

一、 设计任务

1.1选题意义

此题选择意义在于引导学生学会设计简单的科学计算器,进一步掌握Visual C++应用程序。统地学习面向对象编程思想,了解MFC架构,逐步熟悉可视化编程环境Visual C++,并在此环境下设计并实现一个简单计算器系统。

该计算器应能实现如下功能:

1)、数的加、减、乘、除、乘方等简单计算

2)、科学计算函数,包括正弦、余弦、正切、余切、开方、对数、指数等函数运算 3)、具备历史计算的记忆功能。

1.2 设计目标

使计算器含有以下功能:

(1)、基本运算功能:可以进行加、减、乘、除等基本运算。

(2)、三角函数运算功能:可以一次完成三角函数之间的计算,求正弦函数(sin)、余弦函数(cos)、正切函数(tan)、余切函数(cot)等函数的值。

(3)、对数、指数运算功能:可以一次求的对数函数(log、ln)、指数函数(exp)等函数的运算。

(4)、删除功能:可以在输入错误时删除已输入的数值。 (5)、归零功能:可以在计算完成后清空编辑框中的已有数值。

- 1 -

简单科学计算器设计

1.3关于virtualc++

关于Visual C++

Visual C++6.0 是Microsoft公司在1998年推出的基于Windows 9X和Windows NT的优秀集成开发环境。该环境为用户提供了良好的可视化编程环境,程序员可以里利用该开发环境轻松地访问C++源代码编辑器,资源编辑器和使用内部调试器,并且可以创建项目文件。Visual C++6.0不仅包括编译器,而且它还包括许多有用组件,通过这些组件的协同工作,可以在Visual C++6.0集成环境中轻松地完成创建源文件,编辑资源,以及对程序的编译,连接和调试等各项工作。

VC++6.0是Windows 95/98、XP或Windows NT下的一个应用程序,本身对软硬件没有特殊要求。就是说它对环境的要求与Windows 95/98、Windows NT要求是一致的。硬件要求:一般在586以上的处理器、16MB以上内存、100MB以上的硬盘。软件要求:Windows 95/98或Windows NT3.51以上版本。

VC++ 6.0系统可以在一张CD盘上,也可以在“Visual Studio( Visual C++、Visual Foxpro)”等产品的第一张CD盘上。一般都有一个VC的自动安装程序,也可以执行VC6目录下的setup.exe,在安装包的提示下进行,对初学者可采用“典型安装”方式。在安装好VC 6.0系统后,有时根据需要添加或删除某些部件,可插入CD盘重新执行setup.exe安装程序,安装程序会检测当前系统安装VC6的足件,用户单击“添加/删除”按钮后,在“安装维护”对话框中选定要添加的部件或撤消选定要删除的部件。与一般的应用软件一样,有以下两种启动方式:

(1)通过“开始”按钮,选择“程序”菜单,然后打开“Microsoft Visual studio 6.0中文版”子菜单中的“Microsoft Visual C++ 6.0 中文版”程序。

(2)用户也可以使用命令行启动VC。单击“开始”按钮后选择“运行”命令,在“运行”对话框中输入c:\\Program Files\\Microsoft Visual Studio\\VC98\\VC6.exe(按默认盘符和路径安装)即可。

- 2 -

简单科学计算器设计

1.4 可行性及需求分析

本设计是简单计算器。日常计算机使用中,常常涉及到一些有关计算的问题,一个小型的计算器软件变得非常有用,该校型计算器需要空间资源较少,对电脑其他程序的应用影响较小。它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和较好的健壮性;醒目美观的软件封面。使用人员能快捷简单地进行操作。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。

本软件主要用于计算机windows 2000/XP以上版本的用户的使用,这次课程设计一般是实现简单计算器的功能。要程序能实现:加,减,乘,除,开方,倒数等运算功能;还要实现数据的输入,输出,计算,显示及程序退出等功能。另外还可以实现多种科学计算的功能,如:三角函数的计算,弧度与角度间的转换,对数指数的计算等等。

二、 程序设计与实现

2.1程序结构

本计算器首先是通过在计算器的界面上按下相应的按钮,来进行基本的加,减,乘,除等基本运算,计算器还能够进行平方运算,求平方根运算,乘方运算,三角函数运算(包括正弦函数(sin)、余弦函数(cos)、正切函数(tan)、余切函数(cot)),对数函数(ln、log),指数函数(exp),幂函数(x~)等运算。

- 3 -

简单科学计算器设计

2.2详细步骤

2.2.1程序的流程图

加法运算 减法运算 乘法运算 除法运算 正弦运算 余弦运算 正切运算 乘方运算 反三角运算 开始 输入数据 归零功能 平方运算 根式运算 指数运算 对数运算 输入数据 输出结果结束

- 4 -

简单科学计算器设计

2.2.2程序设计具体步骤

1) 总体功能:

整个计算器除了基本的加、减、乘、除运算外,另外还有7个功能可以实现七大运算:三角函数运算功能、对数函数运算功能、指数函数运算功能、乘方运算功能、平方运算功能、根式运算功能、归零功能。各个运算功能的详细设计说明分别如下:

a、基本运算功能

主要实现数据的加、减、乘、除运算,提供简单的科学计算! b、三角函数运算功能

用来执行三角函数的运算,包括正弦函数(sin)、余弦函数(cos)和正切函数(tan)

c、对数函数运算功能

用来执行对数函数的运算,包括以e为底ln函数和以10为底的lg函数。 d、指数函数运算功能 用来执行指数函数的运算。 e、乘方运算功能

用来执行乘方的运算,进行数值的成倍计算。 f、平方运算功能

用来执行平方运算,说到底它也属于乘方运算的范畴。 g、根式运算功能用来执行根式的运算。

h.归零、删除功能主要实现数据的清零,当用户输入数据出错时,使用此功能可以清除已输入的内容并重新输入新的运算内容。

正弦运算 余弦运算 正切运算 三角函数 - 5 -

简单科学计算器设计

具体程序如下:

double operate(double y, char c, double x) //对两个数计算 (含是双目运

算符:如 *, / 等等)

{

double r; if(c == '-') r = x - y; else if(c == '+') r = x + y;

else if(c == '/' && y != 0) r = x / y; else if(c == '*') r = x * y; else if(c == '^') { r = 1;

for(int i = 1; i <= y; i++) }

else if(c == '%') {

int r0 = (int)x % (int)y; r = double(r0); } return r; }

double operate_one(double one, char cc) //对一个数运算(含单目运算符:如log(L),

sin(S) 等等)

{

double r; if(cc == 'Q')

r *= x;

- 6 -

简单科学计算器设计

r = sqrt(one); else if(cc == 'C') r = cos(one); else if(cc == 'S') r = sin(one); else if(cc == 'T') r = tan(one); else if(cc == 'c') r = acos(one); else if(cc == 's') r = asin(one); else if(cc == 't') r = atan(one); return r; }

double operate_L(double a, double b, char dian)//求对数的值 {

double r = log(b) / log(a); return r; }

2) 运算符的比较等级 具体程序如下:

typedef struct node //为了处理符号而建立的链表(如: 1+(-2)) {

char data; node *next;

- 7 -

简单科学计算器设计

}node;

typedef struct stack_num //存储 数 的栈 {

double *top; double *base; }stack_num;

typedef struct stack_char //存储 运算符号 的栈 {

char *top; char *base; }stack_char;

stack_num S_num;//定义 stack_char S_char;//定义

char fu[18] = {'\\n', ')', '+', '-', '*', '/', '%', '^', 'Q', 'L', 'C', 'S', 'T', 'c', 's', 't', '('}; int compare[1000]; //表现出各运算符号的优先级 double shu[1000];//存储 \"数\" 的数组

double dai_result;//运算的结果,是为了处理 M 运算(简介函数里有M的定义) int biao = 0;//和dia_result 一样,为了处理 M 运算 char line[SIZE];//输入的所要计算的表达式 void init()//初始化 {

compare[fu[0]] = -2;//用数字的大小表现出符号的优先级 compare[fu[1]] = -1; compare[fu[2]] = 2; compare[fu[3]] = 2; compare[fu[4]] = 4; compare[fu[5]] = 4; compare[fu[6]] = 4;

- 8 -

简单科学计算器设计

compare[fu[7]] = 5; for(int i = 8; i <= 15; i++) compare[fu[i]] = 6; compare[fu[16]] = 7;

S_num.base = (double*)malloc(sizeof(double)*SIZE);//为栈开辟空间 S_char.base = (char*)malloc(sizeof(char)*SIZE);//同上 S_num.top = S_num.base; S_char.top = S_char.base; }

void push_num(double n)//数字进栈 {

* ++S_num.top = n; }

void push_char(char c)//运算符号进栈 {

* ++S_char.top = c; }

double pop_num()//数字出栈 {

double m = *S_num.top; S_num.top--; return m; }

char pop_char()//运算符号出栈 {

char cc = *S_char.top; S_char.top--;

- 9 -

简单科学计算器设计

return cc; }

char get_top_char()//得到运算符号的栈中最顶端的运算符号 {

return *S_char.top; }

3) 整个表达式具体运算程序:

double compute() //对整个表达式的计算 {

char c; //表示运算符号 int p = 0;//用于shu[++p], 先初始化 int i, j;

init();//进行初始化 push_char('\\n'); line[strlen(line)] = '\\n'; line[strlen(line)+1] = '\\0'; if(biao)

push_num(dai_result);//把运算的结果先进栈, 在这个结果的基础上继续进行运算 biao = 0;

for(i = 0; line[i] != '\\0';)//把表达式中的数字字符串转化成可计算的数字 {

int flag = 0;

int flag1 = 1;//标记是否是运算符号 //

int flag2 = 1;//标记是否出现'_';

double h = 0; int ge;//位数

int biao_dian = 0;//是否是小数的类型

- 10 -

简单科学计算器设计

while(1) { flag1 = 1;

for(j = 0; j <= 16; j++) { if(line[i] == fu[j]) { flag1 = 0; break;

}

}

if(line[i] == '_') { break;

}

if(line[i] == '.') { i++; ge = 0; biao_dian = 1;

}

if(line[i] == 'P') { shu[++p] = pi; i++; break;

}

if(line[i] == 'E') { shu[++p] = e; i++; break;

}

- 11 -

简单科学计算器设计

}

if(flag1) { } else

break;

h = h * 10 + (line[i] - '0'); flag = 1; i++; if(biao_dian)

ge++;

if(flag) { }

if(line[i] == '+')

shu[++p] = -1; shu[++p] = -2; shu[++p] = -3; shu[++p] = -4; shu[++p] = -5; else if(line[i] == '-') else if(line[i] == '*') else if(line[i] == '/') else if(line[i] == '%') else if(line[i] == '^')

- 12 -

if(biao_dian) { }

shu[++p] = h;//把转化而来的数字存于数组

int r = 1;

for(int k = 1; k <= ge; k++)

r *= 10; h /= r;

简单科学计算器设计

}

shu[++p] = -6; shu[++p] = -7; shu[++p] = -8; shu[++p] = -9; shu[++p] = -10; shu[++p] = -11; shu[++p] = -12; shu[++p] = -13; shu[++p] = -14; shu[++p] = -15; shu[++p] = -16; shu[++p] = -17;

else if(line[i] == 'Q') else if(line[i] == 'L') else if(line[i] == 'C') else if(line[i] == 'S') else if(line[i] == 'T') else if(line[i] == 'c') else if(line[i] == 's') else if(line[i] == 't') else if(line[i] == '(') else if(line[i] == ')') else if(line[i] == '\\n') i++; i = 1;

while(shu[i] != -17 || get_top_char() != '\\n') {

double m = shu[i];

if(m >= 0) {

push_num(m);

- 13 -

简单科学计算器设计

i++;

}

else { if(m == -1) c = '+'; else if(m == -2) c = '-'; else if(m == -3) c = '*'; else if(m == -4) c = '/'; else if(m == -5) c = '%'; else if(m == -6) c = '^'; else if(m == -7) c = 'Q'; else if(m == -8) c = 'L'; else if(m == -9) c = 'C'; else if(m == -10) c = 'S'; else if(m == -11) c = 'T'; else if(m == -12) c = 'c'; else if(m == -13) c = 's'; else if(m == -14)

c = 't';

else if(m == -15)

- 14 -

简单科学计算器设计

c = '('; c = ')'; c = '\\n';

else if(m == -16) else if(m == -17)

char ch = get_top_char();//得到最顶端运算符号 if(compare[ch] < compare[c])//运算符号级别的比较 { }

else if(ch == '(' && c == ')') { }

else if(compare[ch] >= compare[c] && ch != '(' && ch != '\\n') {

if(ch == 'Q' || ch == 'C' || ch == 'S'|| ch == 'T' { }

else if(ch == 'L') { }

double one_L = pop_num(); double two_L = pop_num(); char dian = pop_char();

push_num(operate_L(two_L, one_L, dian)); double one = pop_num(); char dian = pop_char();

push_num(operate_one(one, dian)); || ch == 'c' || ch == 's' || ch == 't') pop_char(); i++;

push_char(c); i++;

- 15 -

简单科学计算器设计

} }

}

else { }

double x = pop_num(); double y = pop_num(); char dian = pop_char();

if(dian == '/' && x == 0)//判断是否除了\"零\" { }

push_num(operate(x, dian, y));//把进行一次计算的结果入栈

cout<<\"由于您除了零,结果将是错误的\"<else { }

push_char(c); i++;

double result = pop_num();//得到结果

return result; }

4) 检查表达式的书写错误:

int check_kuohao()//检查表达式括号是否匹配 {

int i, f = 0;

int kuo[SIZE], key = 1;

memset(kuo, 0, sizeof(kuo)); for(i = 0; line[i] != '\\0'; i++)

- 16 -

简单科学计算器设计

{

if(line[i] == '(') { } }

if(key && f == 0) return 1; else return 0; }

int check_char()//检查运算符号是否合法(如: 1 +* 4) { int i, ge;

for(i = 0; line[i] != '\\0'; ) { ge = 0;

while(line[i] == '+' || line[i] == '-' || line[i] == '*'

|| line[i] == '/' || line[i] == '%' || line[i] == '^' || line[i] == 'Q' || line[i] == 'L' || line[i] == 'S' || line[i] == 'C' || line[i] == 'T' || line[i] == 's'

- 17 -

kuo[++f] = 1;

else if(line[i] == ')')

if(kuo[f] == 1) { } else { }

key = 0; break; kuo[f] = 0; f--;

简单科学计算器设计

{ }

|| line[i] == 'c' || line[i] == 't') ge++; i++;

i++; }

if(ge >= 3) return 0; else return 1; }

void output(double result)//打出结果 {

printf(\"所得结果是: \"); cout<void check()//检查表达式是否合法 {

void introduce();

char cc;//决定计算器按哪种功能进行计算 double result;//结果 void input();//定义

if( check_kuohao() && check_char() )//看是否合法, 合法则计算 {

result = compute(); output(result);

cout<<\"输入一个字符'M'或'D'或'F', 决定是否继续: \"<>cc) {

- 18 -

简单科学计算器设计

if(cc == 'M') { }

else if(cc == 'D') { }

else if(cc == 'F') { } else {

cout<<\"所输入字符无效, 请输入一个字符'M'或'D'或'F'!\"<cout<<\"计算器关闭, 谢谢使用!\"<cout<<\"计算器已清零, 请输入您所要计算的表达式\"<system(\"cls\"); introduce();

printf(\"您上次所得结果为: \"); cout<cout<<\"在上次计算结果的基础上, 请继续输入想计算的表达式\"<dai_result = result; biao = 1;

input();//输入表达式 break;

- 19 -

简单科学计算器设计

} }

}

else//不合法,分两种不合法 {

if(check_kuohao() == 0 && check_char() == 1) { } else { } } }

5) 负号的处理方式: void tackle_fuhao()//处理负号 {

node *root, *head, *p, *q, *p1; root = head = new node; head->next = NULL; int i;

for(i = 0; line[i] != '\\0'; i++)//建立链表 {

p = new node; p->data = line[i]; p->next = head->next; head->next = p; head = p;

- 20 -

cout<<\"您所输入的表达式括号不匹配, 请重新输入:\"<cout<<\"您所输入的表达式不合法, 请重新输入:\"<简单科学计算器设计

}

// delete p;

q = (node*)malloc(sizeof(node)); head = root;

if(root->next->data == '+' || root->next->data == '-')//处理第一个字符 {

p = new node; p->data = '0';

p->next = head->next; head->next = p; }

if(root->next != NULL) {

for(q = root->next; q; q = q->next) { } }

// delete q; p1 = new node; int qi = -1;

for(p1 = root->next; p1; p1 = p1->next) {

line[++qi] = p1->data; }

line[++qi] = '\\0'; }

- 21 -

if(q->data == '(' && (q->next->data == '-' || q->next->data == '+')) { }

p = new node; p->data = '0'; p->next = q->next; q->next = p;

简单科学计算器设计

void input()//输入 {

cin>>line; if(biao == 0)

tackle_fuhao();//处理负号 check();//检查表达式是否合法 }

6) 程序主界面的设计:

void introduce()//对计算器的符号功能的简要介绍 {

cout<<\" ***的计算器简要介绍\"<cout<<\"|C(cos)| S(sin) | T(tan) | a(arccos) | c(arcsin) | t(arctan) |\"<cout<<\"| 7 | 8 | 9 | / | on | L(log) |\"<cout<<\"|------|---------|----------|-----------|------------|------------|\"<cout<<\"| 4 | 5 | 6 | * | % | Q(sqrt) |\"<cout<<\"|------|---------|----------|-----------|------------|------------|\"<cout<<\"| 1 | 2 | 3 | - | M(M+) | Enter(=) |\"<cout<<\"|------|---------|----------|-----------|------------|------------|\"<cout<<\"| 0 | . | + | ^(乘方) | F(off) | |\"<cout<<\"------------------------------------------------------------------\"<cout<<\"M(在前面结果的基础上继续计算,如:上次结果为10,现输入+10.5*2)\"<cout<<\"D(清零并继续输入)\"<- 22 -

简单科学计算器设计

cout<<\"F(计算机关闭)\"<cout<<\"输入 P 就代表输入圆周率, 输入 E 代表输入自然对数\"<2.2.3程序运行界面:

三、 设计难点与解决方法

设计难点1:遇到一些复杂的函数计算时,设计的代码不能很好的反映出该有的功能。

解决策略:通过看书、上网查资料和与同学讨论,自己再反复修改代码,运行程序,直到实际效果满意为止。

设计难点2:在编译程序时,出现类型不匹配的错误,查找是Cstring和double类型之间没有转换。

解决策略:查找到Format()和atof()函数可以进行他们之间的转换

- 23 -

简单科学计算器设计

四、 设计效果与不足之处

4.1程序运行结果图

(1)计算机主界面:

(2)输入表达式计算结果:

(3)按M继续输入表达式进行简单计算:

- 24 -

简单科学计算器设计

关闭计算器:

- 25 -

简单科学计算器设计

4.2 程序的不足之处:

计算器的计算功能还不是很多,设计效果也不是很理想,只能进行简单的运算。

五、 参考文献

严华峰. Visual C++课程设计案例精编.

六、 课程设计总结

经过对VC++课程设计的编写设计,加深了我对《VC++程序设计》课程所学知识的进一步理解,掌握了各种函数的应用和调用。

这次的课程设计,让我更加了解VC++程序的内部结构和资源使用。

总之,完成这次课程设计之后,使我更加掌握了编程的基本要素,学会了用编程思想解决生活中的常见问题,用所学知识解决实际问题。

对于C++,我们还有许多需要学习

- 26 -

因篇幅问题不能全部显示,请点此查看更多更全内容

Top