我有一个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
答案 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)
在您从用户那里读取a
和b
之前,您正在调用switch语句中的数学函数,因此当时调用这些变量时会调用它。在输出a
b
和c
之后移动开关
这可能会过分,但你可以使用一个函数指针数组,而不是使用开关来完成它:
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)
c = add(a,b);
不存储函数,它调用函数,将其作为参数传递给a
和b
。所有其他情况都是如此。但是在该计划的那一点上,您还没有实际设置a
和b
。它们是未初始化的,所以它们可以是任何东西。包括0
,这会在你分裂时造成问题。编辑:实际上,我刚刚意识到它们是全局的。所以它们应该为你初始化为零,这将保证除法选项失败。如果a
和b
在main
范围内是本地的,那么它们将是未初始化的,您无法对其最初持有的内容做出任何假设。
可以将地址存储到指针,但它是一个相对高级的主题,我建议你等到你在进入它之前更好地掌握基础知识。现在,你最好做的是从用户那里获得所有的输入,然后立即处理它们。在伪代码中,你的循环看起来像这样:
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.添加了仿函数的删除。