变量始终具有默认值,而不是IN计算值

时间:2012-11-05 08:28:18

标签: c++ visual-c++

#include <iostream>
using namespace std;

class Fraction {
private:
    int num;    
    int denom;

public:
    Fraction() {
        num = 0;
        denom = 1;
    } 
    Fraction(const Fraction& ref) { 
        num = ref.num;
        denom = ref.denom;
    } 
    Fraction(int arg) {

        num = arg;

        denom = 1;
    }

    Fraction(int arg, int arg2) {
        num = arg;
        if (arg2 == 0)
            denom = 1;
        else 
            denom = arg2; 
    } 
    ~Fraction() {   
    }
    void setnum(int arg) {
        num = arg;
        return;
    }

    void setdenom(int arg) {
        if(arg) {
            denom = arg;
        } else {
            denom = 1;
            }
        return;
    }
    int getnum() const {
        return num;
    }
    int getdenom() const {
        return denom;
    }
};

int main() {  
    menu();
    return 0;
}

Fraction::Fraction add(Fraction& arg1, Fraction& arg2) {
    Fraction temp;
    temp.setnum((arg1.getnum() * arg2.getdenom()) + (arg1.getdenom() * arg2.getnum()));
    temp.setdenom(arg1.getdenom() * arg2.getdenom());   
    return temp;    
}

Fraction::Fraction init() {
    int num;
    int denom;

    cout << "num: ";
    cin >> num;

    cout << "denom: ";
    cin >> denom; 

    Fraction info(num, denom);

    return info;
}

void print(Fraction& info) {
    cout << "num: " << info.getnum() << endl;
    cout << "denom: " << info.getdenom() << endl;
    return;
} 


void menu() {
    int option;

    do {
        cout << "Select an option (use integer value only): ";
        cin >> option;  

            switch(option) {
        case 1:
            initializingMenu();
            break;

        case 2:
            addingMenu();
            break;

        case 3:
            printingMenu();
            break;

        case 4:
            cout << "Have Fun!" << endl;
            break;

        default:
            cout << "Wrong option!" << endl;
        }

} while (option != 0);
    return;
}

void initializingMenu() {

    Fraction a;
    Fraction b;
    Fraction c;
    int option;

    do {
        cout << "Select an option (1, 2, or 3): ";
        cin >> option;  

        switch(option) {
        case 1:
            cout << "\nCalling init() - Stand Alone...\n" << endl;
            a = init();
            b = init();
            break;

        case 2:
            menu();
            break;

        default:
            cout << "\nWrong option!" << endl;
            initializingMenu();
        }
} while (option != 0);
    return;
}

void addingMenu() {
    Fraction a;
    Fraction b;
    Fraction c;
    int option; 
    do {

        cout << "Select an option (1, 2, 3 or 4): ";
        cin >> option;  

        switch(option) {

        case 1:
            cout << "\nCalling add() - Stand Alone...\n" << endl;
            c = add(a,b);
            break;

        case 2:
            menu();
            break;

        default:
            cout << "\nWrong option!" << endl;
            addingMenu();
        }

} while (option != 0); 
    return;
}

void printingMenu() {

    Fraction a;
    Fraction b;
    Fraction c;
    int option;

    do {
         cout << "Select an option (1, 2, or 3): ";
         cin >> option;  

        switch(option) {
        case 1:
            cout << "\nCalling print() - Stand Alone...\n" << endl;
            print(c);
            break;

        case 2:
            menu();
            break;

        default:
            cout << "\nWrong option!" << endl;
            printingMenu();
        }  
} while (option != 0);
    return;
}

我正在制作一个程序来添加两个分数

我正在尝试使用菜单

我有四个菜单:

主菜单:提供转到其他菜单的选项

初始化菜单:输入num和denom

添加菜单:加起来分数

打印菜单:打印添加的分数

故障: 所以我运行程序并按顺序浏览菜单:main&gt; init&gt;添加&gt;打印 但是当我打印时,结果是错误的, 例如,1/2和1/2 假设给我2/2 但是当我打印时,它会给我0/1,这是默认构造函数

我有另一个程序,它的工作原理是: Add two fraction

来自网站上的程序,我觉得它很有效,因为我把它们放在同一个菜单中 但对于这个,我认为因为我分开了,所以打印没有从类中获得num和denom值

所以我想问一下,我该如何解决这个问题? 当我用菜单

分隔它们时,为什么我无法得到真实的结果

抱歉,我的英语很差,代码很多

1 个答案:

答案 0 :(得分:0)

您在每个函数中将分数声明为局部变量,它们与其他函数中声明的分数无关。最好的方法是将整个菜单框架更改为类,如下所示:

class Menus
{
  Fraction a, b, c;
public:
  void mainMenu();
  void initializingMenu();
  void addingMenu();
  void printingMenu();
};

然后,在菜单成员函数中,使用类的成员变量 - 这些将保留它们的值,正是您所需要的。

您的main()将如下所示:

int main() {
    Menus menus;
    menus.mainMenu();

    return 0;
}

我还建议让mainMenu()在循环中运行,直到退出并让其他菜单返回它而不是每次都调用它。这无疑会加深你的调用堆栈。