我可以使用开关来保持功能吗?

时间:2010-06-02 20:50:00

标签: c++ math switch-statement

我有一个3文件程序,基本上自学c ++。我有一个问题。我做了一个开关来使用数学函数。我需要把它放在一个变量中,但由于某种原因我得到一个零。

另外一个问题,当我选择4(除)它崩溃时......有原因吗?

主档案:

#include <iostream>
#include "math.h"
#include <string>

using namespace std;

int opersel;
int c;
int a;
int b;
string test;

int main(){

cout << "Welcome to Math-matrix v.34"<< endl;
cout << "Shall we begin?" <<endl;

//ASK USER IF THEY ARE READY TO BEGIN 

string answer;
cin >> answer;

if(answer == "yes" || answer == "YES" || answer == "Yes")
{

           cout << "excellent lets begin..." << endl;

           cout << "please select a operator..." << endl  << endl;


           cout << "(1) + " << endl;
           cout << "(2) - " << endl;
           cout << "(3) * " << endl;
           cout << "(4) / " << endl;

           cin >> opersel;

           switch(opersel){

                  case 1:
                  c = add(a,b);
                  break;
                  case 2:
                  c = sub(a,b);
                  break;
                  case 3:
                  c = multi(a,b);
                  break;
                  case 4:
                  c = divide(a,b);
                  break;
                  default:
                  cout << "error... retry" << endl;

                  }// end retry


           cout << "alright, how please select first digit?" << endl;

           cin >> a;

           cout << "excellent... and your second?" << endl;

           cin >> b;

           cout << c;

           cin >> test;

           }else if (answer == "no" || answer == "NO" || answer == "No"){


                 }//GAME ENDS








}// end of int main 

这是我的math.h文件

#ifndef MATH_H
#define MATH_H

int add(int a, int b);


int sub(int a, int b);



int multi(int a, int b);


int divide(int a, int b);

#endif

这是我的math.cpp

int add(int a, int b)
{

 return a + b;   

}

int sub(int a, int b)
{

 return a - b;   

}

int multi(int a, int b)
{

 return a * b;   

}

int divide(int a, int b)
{

 return a / b;   

}






}// end of int main 

8 个答案:

答案 0 :(得分:5)

在从用户获取数据之前,您使用a和b调用函数。尝试保存他们输入时选择的数学函数,并在向他们索要a和b后将开关移到。

#include <iostream>
#include "math.h"
#include <string>

using namespace std;

int opersel;
int c;
int a;
int b;
string test;

int main(){

cout << "Welcome to Math-matrix v.34"<< endl;
cout << "Shall we begin?" <<endl;

//ASK USER IF THEY ARE READY TO BEGIN 

string answer;
cin >> answer;

if(answer == "yes" || answer == "YES" || answer == "Yes")
{

           cout << "excellent lets begin..." << endl;

           cout << "please select a operator..." << endl  << endl;


           cout << "(1) + " << endl;
           cout << "(2) - " << endl;
           cout << "(3) * " << endl;
           cout << "(4) / " << endl;

           cin >> opersel;              

           cout << "alright, how please select first digit?" << endl;

           cin >> a;

           cout << "excellent... and your second?" << endl;

           cin >> b;

           switch(opersel){

                  case 1:
                  c = add(a,b);
                  break;
                  case 2:
                  c = sub(a,b);
                  break;
                  case 3:
                  c = multi(a,b);
                  break;
                  case 4:
                  c = divide(a,b);
                  break;
                  default:
                  cout << "error... retry" << endl;

           }// end retry

           cout << c;

           cin >> test;

           }else if (answer == "no" || answer == "NO" || answer == "No"){       
                 }//GAME ENDS   
}// end of int main 

答案 1 :(得分:0)

你需要移动这些:

   cout << "alright, how please select first digit?" << endl;
   cin >> a;
   cout << "excellent... and your second?" << endl;
   cin >> b;
切换前的

。如果您正在考虑这样的函数:

int f( int x, int y ) {
   return x + y;
}

以某种方式返回表达式“x + y”,可以在以后进行评估,但不会。它返回在程序中该点评估x + y的结果。有些语言可以返回表达式,但C ++不是其中之一。

答案 2 :(得分:0)

在填充输入变量a和b之前,看起来你正在调用数学函数(在switch语句中)。将cin调用移到交换机上方,您的问题就会消失。

当你调用除(a,b)因为a和b都是0时,很可能会导致崩溃。在这种情况下,你除以零,系统就不会对此感到高兴。

答案 3 :(得分:0)

在您从用户那里读取ab之前,您正在调用switch语句中的数学函数,因此当时调用这些变量时会调用它。在输出a

之前,您需要在阅读用户bc之后移动开关

这可能会过分,但你可以使用一个函数指针数组,而不是使用开关来完成它:

typedef int (*math_function)(int, int);
math_function fns[] = {NULL, add, sub, multi, divide};

cin >> opersel;
if(opersel <= 4)
    cout << fns[opersel](a, b);
else
    cout << "You fail :(";

答案 4 :(得分:0)

在将 a b 读入其变量之前,您正在进行计算。 cin&gt;&gt; 语句位于switch语句之后。

答案 5 :(得分:0)

这是一个函数调用:

c = add(a,b);

它使用参数a和b为c分配调用add的返回值。在您调用此函数时,a和b尚未初始化。把你的开关放在这一行之后:

cin >> b;

并且事情应该如你所愿。

答案 6 :(得分:0)

switch语句中的

c = add(a,b);不存储函数,它调用函数,将其作为参数传递给ab。所有其他情况都是如此。但是在该计划的那一点上,您还没有实际设置ab。它们是未初始化的,所以它们可以是任何东西。包括0,这会在你分裂时造成问题。编辑:实际上,我刚刚意识到它们是全局的。所以它们应该为你初始化为零,这将保证除法选项失败。如果abmain范围内是本地的,那么它们将是未初始化的,您无法对其最初持有的内容做出任何假设。

可以将地址存储到指针,但它是一个相对高级的主题,我建议你等到你在进入它之前更好地掌握基础知识。现在,你最好做的是从用户那里获得所有的输入,然后立即处理它们。在伪代码中,你的循环看起来像这样:

Get Operator
If Operator < 0 or Operator > 4 Then "Error"
Get A
Get B
Switch Operator
    1: Result = Add(A, B)
    2: Result = Subtract(A, B)
    3: Result = Multiply(A, B)
    4: Result = Divide(A, B)
Output result

请注意,当涉及到用户输入时,有一个批次的“陷阱”。例如,当您要求用户输入a的值时,如果他们输入“五”怎么办?至少,您需要在输入后检查cin的状态;这将告诉您它是否从用户获得任何有效数据。 cin.good()应该告诉你以前的操作是否成功,如果不是,你可以退出,或者再试一次,或者你喜欢什么。

答案 7 :(得分:0)

这是一个想法(使用函数对象或仿函数):

#include <iostream>
using std::cin;
using std::cout;
struct Math_Operation
{
  virtual int operator()(int a, int b) = 0;
};

struct Math_Add : Math_Operation
{
  int operator()(int a, int b)
  { return a + b;}
};

struct Math_Sub : Math_Operation
{
  int operator()(int a, int b)
  { return a - b;}
};

struct Math_Mul : Math_Operation
{
  int operator()(int a, int b)
  { return a * b;}
};

struct Math_Div : Math_Operation
{
  int operator()(int a, int b)
  { return a / b;}
};


int main(void)
{
  cout << "Enter operation (+, -, *, /): ";
  cout.flush();
  char operation;
  Math_Operation * p_math_opr = NULL;
  cin >> operation;
  switch (operation)
  {
    case '+':
      p_math_opr = new Math_Add;
      break;
    case '-':
      p_math_opr = new Math_Sub;
      break;
    case '*':
      p_math_opr = new Math_Mul;
      break;
    case '/':
      p_math_opr = new Math_Div;
      break;
    default:
      p_math_opr = NULL;
  }

// ...Input numbers into A & B...
  int A = 5;
  int B = 8;

//  Perform calculation with A & B
  int Result = 0;
  if (p_math_opr)
  {
      Result = (*p_math_opr)(A, B);
      delete p_math_opr;
  }
  cout << "Result is: " << Result << "\n";
  return 0;
}

仿函数方法允许您保存操作。使用指向基类的指针允许您在不知道哪些操作“正在使用”的情况下执行仿函数。

修改
1.将 int 添加到子类中的函数定义 2.修正了仿函数的执行语法 3.添加了仿函数的删除。