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<<\"由于您除了零,结果将是错误的\"< 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 introduce(); char cc;//决定计算器按哪种功能进行计算 double result;//结果 void input();//定义 if( check_kuohao() && check_char() )//看是否合法, 合法则计算 { result = compute(); output(result); cout<<\"输入一个字符'M'或'D'或'F', 决定是否继续: \"< - 18 - 简单科学计算器设计 if(cc == 'M') { } else if(cc == 'D') { } else if(cc == 'F') { } else { cout<<\"所输入字符无效, 请输入一个字符'M'或'D'或'F'!\"< printf(\"您上次所得结果为: \"); cout< 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<<\"您所输入的表达式括号不匹配, 请重新输入:\"< } // 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<<\"F(计算机关闭)\"< 三、 设计难点与解决方法 设计难点1:遇到一些复杂的函数计算时,设计的代码不能很好的反映出该有的功能。 解决策略:通过看书、上网查资料和与同学讨论,自己再反复修改代码,运行程序,直到实际效果满意为止。 设计难点2:在编译程序时,出现类型不匹配的错误,查找是Cstring和double类型之间没有转换。 解决策略:查找到Format()和atof()函数可以进行他们之间的转换 - 23 - 简单科学计算器设计 四、 设计效果与不足之处 4.1程序运行结果图 (1)计算机主界面: (2)输入表达式计算结果: (3)按M继续输入表达式进行简单计算: - 24 - 简单科学计算器设计 关闭计算器: - 25 - 简单科学计算器设计 4.2 程序的不足之处: 计算器的计算功能还不是很多,设计效果也不是很理想,只能进行简单的运算。 五、 参考文献 严华峰. Visual C++课程设计案例精编. 六、 课程设计总结 经过对VC++课程设计的编写设计,加深了我对《VC++程序设计》课程所学知识的进一步理解,掌握了各种函数的应用和调用。 这次的课程设计,让我更加了解VC++程序的内部结构和资源使用。 总之,完成这次课程设计之后,使我更加掌握了编程的基本要素,学会了用编程思想解决生活中的常见问题,用所学知识解决实际问题。 对于C++,我们还有许多需要学习 - 26 - 因篇幅问题不能全部显示,请点此查看更多更全内容