C++课程设计(计算器)报告

课程设计报告

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。经过多次修改还是未能完成。不过不影响主程序的测试,所以还要继续完善程序。

总的说来,几个星期的努力还是很有成效的,锻炼了整体的能力,并且通过一次次的调试来读懂程序,程序更加完善。

相关推荐