课程设计报告
Visual C++ 课程设计
题目:计算器
题目:计算器
1.程序功能简介
实现计算器功能。用户根据程序提示,输入数字,选择要进行的运算,可以进行加,减,乘,除,开方、温度单位的换算。
2.课程设计要求
(1)完善计算器程序,改写成可对实数操作。
(2)完善程序,改为多个操作数基本四则运算,遇到0为止
(3)增加函数、完成四则混合运算,注意算法要考虑优先级,对应增加主菜单选项。
(4)添加语句,使四则运算具有测试功能,即计算器出题目,并要求用户计算,同时计算机判断用户对错并打分,要求十题为一个单元,加减运算时最高为两位数运算,乘除法为两位数乘一位数,除法是两位数或三位数除以一位数,且没有余数。
3.设计思路
将原函数的int型数据改为float型数据。
仿照类设计四则混合运算的程序,四则混合运算的分函数主要有double eval_exp(char *exp);//运算四则运算表达式的主函数,返回结果、 void oopcalc::sizeyunsuan();//四则运算调用的主函数、double oopcalc::eval_exp(char *exp)//计算表达式函数并返回结果、get_token();//取表达式函数等。
利用类的结构编写一个void test()//测试函数,并给出选项选择测试的内容。并参考资料改写随机数生成器源代码,使之符合类的结构能够被调用,添加有关头文件。
4.程序结构图
5.添加的主要函数代码
添加四则运算主要代码
oopcalc::parser()
{
exp_ptr = NULL;
}
// 将exp_prt赋值为空指针
double oopcalc::eval_exp(char *exp)//计算表达式函数并返回结果
{
double result;
exp_ptr = exp;//将指针指向表达式
get_token();//取表达式函数
if(!*token)//取得链表为空时,显示错误警告,并返回0值
{
serror(2);
return 0.0;
}
eval_exp2(result);
if(*token) serror(0);
return result;
}
void oopcalc::eval_exp2(double &result)//识别加减符号
{
register char op;
double temp;
eval_exp3(result);
while((op = *token) == '+' || op == '-')//判断指针指向的符号
{
get_token();
eval_exp3(temp);
switch(op) //通过switch语句实现判断
{
case '-':
result = result - temp;
break;
case '+':
result = result + temp;
break;
}
}
}
void oopcalc::eval_exp3(double &result)//识别乘除号与百分号,方法同加减号
{
register char op;
double temp;
eval_exp4(result);
while((op = *token) == '*' || op == '/' || op == '%')
{
get_token();
eval_exp4(temp);
switch(op) {
case '*':
result = result * temp;
break;
case '/':
result = result / temp;
break;
case '%':
result = (int) result % (int) temp;
break;
}
}
}
void oopcalc::eval_exp4(double &result)
{
double temp, ex;
register int t;
eval_exp5(result);
if(*token== '^')
{
get_token();
eval_exp4(temp);
ex = result;
if(temp==0.0)
{
result = 1.0;
return;
}
for(t=(int)temp-1; t>0; --t) result = result * (double)ex;
}
}
void oopcalc::eval_exp5(double &result)
{
register char op;
op = 0;
if((tok_type == DELIMITER) && *token=='+' || *token == '-')
{
op = *token;
get_token();
}
eval_exp6(result);
if(op=='-') result = -result;
}
void oopcalc::eval_exp6(double &result)
{
if((*token == '('))
{
get_token();
eval_exp2(result);
if(*token != ')')
serror(1);
get_token();
}
else atom(result);
}
void oopcalc::atom(double &result)
{
switch(tok_type)
{
case NUMBER:
result = atof(token);
get_token();
return;
default:
serror(0);
}
}
void oopcalc::serror(int error)//输入空时显示输入错误
{
static char *e[]= //将一组字符串赋值给指针
{
"Syntax Error",
"Unbalanced Parentheses",
"目前没有表达式"
};
cout << e[error] << endl;//输出字符串
}
void oopcalc::get_token()//
{
register char *temp;
tok_type = 0;
temp = token;
*temp = '\0';
if(!*exp_ptr) return;
while(isspace(*exp_ptr)) ++exp_ptr;
if(strchr("+-*/%^=()", *exp_ptr))
{
tok_type = DELIMITER;
*temp++ = *exp_ptr++;
}
else if(isalpha(*exp_ptr))
{
while(!isdelim(*exp_ptr)) *temp++ = *exp_ptr++;
tok_type = VARIABLE;
}
else if(isdigit(*exp_ptr))
{
while(!isdelim(*exp_ptr)) *temp++ = *exp_ptr++;
tok_type = NUMBER;
}
*temp = '\0';
}
int oopcalc::isdelim(char c)
{
if(strchr(" +-/*%^=()", c) || c==9 || c=='\r' || c==0)
return 1;
return 0;
}
void oopcalc::sizeyunsuan()//——————————————————————————————四则运算
{
char expstr[80];
cout << "输入0使计算终止。\n";
oopcalc ob;
for(;;)
{
cout << "输入表达式: ";
cin.getline(expstr, 79);//保存输入的表达式
if(*expstr=='0') break;//判断输入是否为空
cout << "结果是: " << ob.eval_exp(expstr) << "\n\n";
};
/* return 0;*/
cout << "按任意键继续\n";
getch();
menu();
}
添加的测试主要程序
void oopcalc::test()//测试选择程序
{ char input;
oopcalc a;
system("cls");
cout<<"***选择你测试的题目的类型***\n";
cout << "1: 加法运算\n";
cout << "2: 减法运算\n";
cout << "3: 除法运算\n";
cout << "4: 乘法运算\n";
cout << "选择: ";
cout << "=====================================\n";
cin >> input;
switch(input)
{
case '1': a.calcaddtest();
break;
case '2': a.calcsubtest();
break;
case '3': a.calcdivtest();
break;
case '4': a.calcmulttest();
break;
default: a.badinput2();
break;
}
cout<<"是否继续测试其他题目:1是,2否!\n";
int d=0;
cin>>d;
if(d==1)
{
system("cls");
a.test() ;
}
cout << "按任意键继续\n";
getch();
menu();
}
void oopcalc::badinput2()
{
cout << "错误输入!\n";
cout << "按任意键继续\n";
system("cls");
getch();
test();
}
void oopcalc::calcaddtest()
{ float answer1=0,input=0;
double x1,x2;
for(int i=0,count1=0;i<10;i++)
{
x1=gaussrand()*10;
x2=gaussrand()*10;
answer1=add(x1,x2);
cout<<"题目"<<i+1<<' '<<x1<<" + "<<x2<<" = ";
cin>>input;
if(input==answer1)
{
count1++;
cout<<"结果正确!\n";
}
else cout<<"结果错误!\n"<<"正确答案为:"<<answer1<<'\n';
cout<<"你现在的得分为: \n"<<count1<<'\n';
}
}
void oopcalc::calcsubtest()
{float answer2=0,input;
double x1,x2;
for(int i=0,count2=0;i<10;i++)
{
x1=gaussrand()*10;
x2=gaussrand()*10;
answer2=sub(x1,x2);
cout<<"题目"<<i+1<<'\t'<<x1<<" - "<<x2<<" = ";
cin>>input;
if(input==answer2)
{
count2++;
cout<<"结果正确!\n";
}
else cout<<"结果错误!\n"<<"正确答案为:"<<answer2<<'\n';
cout<<"你现在的得分为: \n"<<count2<<'\n';
}
}
void oopcalc::calcdivtest()
{float answer3,input;
double x1,x2;
for(int i=0,count3=0;i<10;i++)
{
x1=gaussrand()*10;
x2=gaussrand()*10;
answer3=div((x1*x2),x2);
cout<<"题目"<<i+1<<'\t'<<x1*x2<<" / "<<x2<<" = ";
cin>>input;
if(input==answer3)
{
count3++;
cout<<"结果正确!\n";
}
else cout<<"结果错误!\n"<<"正确答案为:"<<answer3<<'\n';
cout<<"你现在的得分为: \n"<<count3<<'\n';
}
}
void oopcalc::calcmulttest()
{float answer4,input;
double x1,x2;
for(int i=0,count4=0;i<10;i++)
{
x1=gaussrand()*10;
x2=gaussrand()*10;
answer4=mult(x1,x2);
cout<<"题目"<<i+1<<'\t'<<x1<<" * "<<x2<<" = ";
cin>>input;
if(input==answer4)
{
count4++;
cout<<"结果正确!\n";
}
else cout<<"结果错误!\n"<<"正确答案为:"<<answer4<<'\n';
cout<<"你现在的得分为: \n"<<count4<<'\n';
}
}
6.程序测试
打开程序显示如下:
选择1并输入一个加法算式,显示如下:
再按任意键返回菜单栏:
输入一个四则运算式78+5*(58-45)-12/3:
再输入0返回菜单:
温度之间的转换:
求方根:
测试四则运算(举例加法)输入9并选择:
选择1:
最后选择2“否”,退出测试,按任意键返回菜单:
测试完毕。
7.总结
此次通过对计算器程序的设计:
首先,我对自身的知识掌握度加大了,以前只是单纯的课本掌握,现在通过编写,修改,测试程序,对c++中的一些知识更加了解了,特别是类的使用,以前没有真正去接触过,当然,对类的运用,对多态性也更加了解了。
当然编辑过程中也遇到了很多问题,比如四则混合运算的编写,由于个人的能力问题,独立编写实在无从下手。后来通过查找资料,并且模仿前人的成果加以修改,最终在计算器程序中可以使用。
程序测试运行都很成功,主要遇到的问题就是,未能实现加减乘除测试的随机生成测试,后来改成4选项的测试。还有就是主菜单,输入选择错误时,如输入21,就显示:输入第二个数,系统理解为:选2,第一个数输入为1。经过多次修改还是未能完成。不过不影响主程序的测试,所以还要继续完善程序。
总的说来,几个星期的努力还是很有成效的,锻炼了整体的能力,并且通过一次次的调试来读懂程序,程序更加完善。
华东交通大学课程设计华东交通大学课程设计课程设计题目计算器设计课程题目年级专业学号姓名组员指导教师Java程序设计信息一班1华东交…
计算机综合课程设计报告小组编号06课题名称趣味贪吃蛇小组成员20xx年10月计算机综合课程设计报告目录目录11项目背景112系统目…
MFC计算器课程设计报告计算机应用3班黄锦湫罗洁饶益指导老师蒋鹏20xx315一题目利用MFC框架编写简易计算器要求使用MFC框架…
计算机网络课程设计报告一.课程设计的题目、目的及要求.......................................…
武汉理工大学专业课程设计2课程设计说明书目录1基本功能描述12设计思路13软件设计431设计步骤44结论与心得体会127附设计中的…
中南大学本科生课程设计(实践)任务书、设计报告(大学计算机基础)计算机实践过程与体会题目学生姓名指导教师学院专业班级学生学号祁彦翔…
武汉理工大学专业课程设计2课程设计说明书目录1基本功能描述12设计思路13软件设计431设计步骤44结论与心得体会127附设计中的…
MFC计算器课程设计报告计算机应用3班黄锦湫罗洁饶益指导老师蒋鹏20xx315一题目利用MFC框架编写简易计算器要求使用MFC框架…
MFC表达式计算器课程设计报告班级5班学生姓名及学号丁健华020xx507李晓奇020xx513吴继超020xx516完成日期20…
计算机网络课程设计报告一.课程设计的题目、目的及要求.......................................…