0
#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;
}

2つの分数を足すプログラムを作っています

メニューを使って作ろうとしています

次の 4 つのメニューがあります。

メインメニュー: 他のメニューに移動するオプションを提供

メニューの初期化: 入力 num および denom

メニューを追加: 分数まで追加

印刷メニュー: 追加された分数を印刷します

トラブル: プログラムを実行してメニューを順にたどりました: メイン > 初期化 > 追加 > 印刷しますが、印刷すると結果が間違っています。印刷すると、デフォルトのコンストラクターである0/1が返されます

私は別のプログラムを持っていて、それはうまくいきました: 2つの分数を追加します

ウェブサイトのプログラムから、同じメニューに入れたのでうまくいったと思いますが、これについては、分離したためだと思うので、クラスからnumとdenomの値を取得できませんでした

そこでお聞きしたいのですが、どうすればこれを修正できますか? そして、それらをメニューで区切ったときに実際の結果が得られなかった理由

私の貧弱な英語と非常に多くのコードで申し訳ありません

4

1 に答える 1

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() をループで実行し、他のメニューをそこに戻すことをお勧めします。それは、コール スタックを不必要に深めるだけです。

于 2012-11-05T08:42:50.240 に答える