【问题标题】:Organisation within Menu calculator菜单计算器中的组织
【发布时间】:2021-12-26 15:15:16
【问题描述】:
#include <iostream>
#include <regex>

using namespace std;

void main_menu();
int get_user_input();
void select_menu_item(int input);
void print_main_menu();
void go_back_to_main_menu();
bool is_integer(std::string num);
void menu_item_1();
void menu_item_2();
void menu_item_3();
void menu_item_4();

int main(int argc, char const *argv[]) {
  //int num1, num2, choice, i;
  main_menu();
  return 0;
}

void main_menu() {
  char fav;
 int num1,num2,choice,i;
 cout<<"\n Enter 1st Number: ";
 cin>>num1;
 cout<<"\n Enter 2nd Number: ";
 cin>>num2;
  print_main_menu();
  int input = get_user_input();
  select_menu_item(input);
  //void menu_item_1(); 
}


int get_user_input() {
  int input;
  std::string input_string;
  bool valid_input = false;
  int menu_items = 5;

  do {
    std::cout << "\nSelect item: ";
    std::cin >> input_string;
    valid_input = is_integer(input_string);
    // if input is not an integer, print an error message
    if (valid_input == false) {
      std::cout << "Enter an integer!\n";
    } else {  // if it is an int, check whether in range
      input = std::stoi(input_string);  // convert to int
      if (input >= 1 && input <= menu_items) {
        valid_input = true;
      } else {
        std::cout << "Invalid menu item!\n";
        valid_input = false;
      }
    }
  } while (valid_input == false);

  return input;
}

void select_menu_item(int input) {
  switch (input) {
    case 1:
      menu_item_1();
       break;
    case 2:
      menu_item_2();
      break;
    case 3:
      menu_item_3();
      break;
    case 4:
      menu_item_4();
      break;
    default:
      exit(1);
      break;
  }
}

void print_main_menu() {
  
  std::cout << "\n----------- Main menu -----------\n";
  std::cout << "|\t\t\t\t\t\t|\n";
  std::cout << "|\t1. Menu item 1\t\t|\n";
  std::cout << "|\t2. Menu item 2\t\t|\n";
  std::cout << "|\t3. Menu item 3\t\t|\n";
  std::cout << "|\t4. Menu item 4\t\t|\n";
  std::cout << "|\t5. Exit\t\t\t\t|\n";
  std::cout << "|\t\t\t\t\t\t|\n";
  std::cout << "---------------------------------\n";
}

void go_back_to_main() {
  std::string input;
  do {
    std::cout << "\nEnter 'b' or 'B' to go back to main menu: ";
    std::cin >> input;
  } while (input != "b" && input != "B");
  main_menu();
}

// https://codereview.stackexchange.com/questions/162569/checking-if-each-char-in-a-string-is-a-decimal-digit
bool is_integer(std::string num) {
  return std::regex_match(num, std::regex("[+-]?[0-9]+"));
}

void menu_item_1() {
  
  int num1, num2, choice, i;
  std::cout << "\n>> Menu 1\n";
  std::cout << "\n Sum of "<< num1 <<" and "<< num2;
            cout << " = "<<num1+num2;
  //std::cin>> Menu_item 1;         
  // you can call a function from here that handles menu 1
  go_back_to_main();
}
void menu_item_2() {
  std::cout << "\n>> Menu 2\n";
  std::cout << "\nSome code here does something useful\n";
  // you can call a function from here that handles menu 2
  go_back_to_main();
}
void menu_item_3() {
  std::cout << "\n>> Menu 3\n";
  std::cout << "\nSome code here does something useful\n";
  // you can call a function from here that handles menu 3
  go_back_to_main();
}
void menu_item_4() {
  std::cout << "\n>> Menu 4\n";
  std::cout << "\nSome code here does something useful\n";
  // you can call a function from here that handles menu 4
  go_back_to_main();
}

输出:

Enter 1st Number: 56

 Enter 2nd Number: 87

----------- Main menu -----------
|                       |
|   1. Menu item 1      |
|   2. Menu item 2      |
|   3. Menu item 3      |
|   4. Menu item 4      |
|   5. Exit             |
|                       |
---------------------------------

Select item: 1

>> Menu 1

 Sum of 0 and 6596224 = 6596224
Enter 'b' or 'B' to go back to main menu: 

我觉得我已经接近让第一个菜单功能正常工作了,但是我无法弄清楚为什么菜单 1 的输出一直返回“0 和 6596224 的总和 = 6596224”。我不确定代码的哪一部分需要重新排列。

我知道我只完成了添加,但是一旦我弄清楚这里出了什么问题,我相信我将能够完成其余的。

谢谢

【问题讨论】:

    标签: c++ menu calculator


    【解决方案1】:

    main 中的num1menu_item_1() 中的num1 是两个完全不相关的变量。 num2 也一样。两者都没有在menu_item_1 中初始化。

    如果您之前已经读取过这些值,则可以将它们传递给函数:

    void menu_item_1(int num1, int num2) {
      std::cout << "\n>> Menu 1\n";
      std::cout << "\n Sum of " << num1 << " and " << num2;
      std::cout << " = " << num1+num2;
    }
    

    我不明白go_back_to_main 的目的,因为它使用户处于无限循环中,他们唯一的选择是通过输入'b''B' 来确认,因此我将其删除。

    【讨论】:

    • 好的,谢谢您的回复。当您指的是 `menu_item_1` 时,这是否属于案例 1?调整代码后,输出现在是 `/tmp/main-f98a55.o: In function select_menu_item(int)': main.cpp:(.text+0x3b2): undefined reference to menu_item_1()' clang: error: linker command退出代码 1 失败(使用 -v 查看调用)退出状态 1 `
    • @JJB 你必须学习如何将参数传递给函数,应该在任何介绍性书籍中解释。您不仅要更改函数的定义,还要更改您的声明,并且在调用时必须传递参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2020-05-11
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多