Организация в калькуляторе меню

#c #menu #calculator

Вопрос:

 #include lt;iostreamgt; #include lt;regexgt;  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;  coutlt;lt;"n Enter 1st Number: ";  cingt;gt;num1;  coutlt;lt;"n Enter 2nd Number: ";  cingt;gt;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 lt;lt; "nSelect item: ";  std::cin gt;gt; input_string;  valid_input = is_integer(input_string);  // if input is not an integer, print an error message  if (valid_input == false) {  std::cout lt;lt; "Enter an integer!n";  } else { // if it is an int, check whether in range  input = std::stoi(input_string); // convert to int  if (input gt;= 1 amp;amp; input lt;= menu_items) {  valid_input = true;  } else {  std::cout lt;lt; "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 lt;lt; "n----------- Main menu -----------n";  std::cout lt;lt; "|tttttt|n";  std::cout lt;lt; "|t1. Menu item 1tt|n";  std::cout lt;lt; "|t2. Menu item 2tt|n";  std::cout lt;lt; "|t3. Menu item 3tt|n";  std::cout lt;lt; "|t4. Menu item 4tt|n";  std::cout lt;lt; "|t5. Exittttt|n";  std::cout lt;lt; "|tttttt|n";  std::cout lt;lt; "---------------------------------n"; }  void go_back_to_main() {  std::string input;  do {  std::cout lt;lt; "nEnter 'b' or 'B' to go back to main menu: ";  std::cin gt;gt; input;  } while (input != "b" amp;amp; 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 lt;lt; "ngt;gt; Menu 1n";  std::cout lt;lt; "n Sum of "lt;lt; num1 lt;lt;" and "lt;lt; num2;  cout lt;lt; " = "lt;lt;num1 num2;  //std::cingt;gt; Menu_item 1;   // you can call a function from here that handles menu 1  go_back_to_main(); } void menu_item_2() {  std::cout lt;lt; "ngt;gt; Menu 2n";  std::cout lt;lt; "nSome code here does something usefuln";  // you can call a function from here that handles menu 2  go_back_to_main(); } void menu_item_3() {  std::cout lt;lt; "ngt;gt; Menu 3n";  std::cout lt;lt; "nSome code here does something usefuln";  // you can call a function from here that handles menu 3  go_back_to_main(); } void menu_item_4() {  std::cout lt;lt; "ngt;gt; Menu 4n";  std::cout lt;lt; "nSome code here does something usefuln";  // 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  gt;gt; Menu 1   Sum of 0 and 6596224 = 6596224 Enter 'b' or 'B' to go back to main menu:    

Я чувствую, что близок к тому, чтобы заставить работать первую функцию меню, однако я не могу понять, почему вывод для меню 1 продолжает возвращать «Сумму 0 и 6596224 = 6596224». Я не уверен, какая часть кода нуждается в перестановке.

Я знаю, что завершил только добавление, но как только я выясню, что здесь происходит не так, я уверен, что смогу завершить все остальное.

Спасибо

Ответ №1:

num1 in main и num1 in menu_item_1() -это две совершенно не связанные переменные. То же самое для num2 . Оба они не инициализированы в menu_item_1 .

Если вы уже читали значения раньше, вы можете передать их в функцию:

 void menu_item_1(int num1, int num2) {  std::cout lt;lt; "ngt;gt; Menu 1n";  std::cout lt;lt; "n Sum of " lt;lt; num1 lt;lt; " and " lt;lt; num2;  std::cout lt;lt; " = " lt;lt; num1 num2; }  

Я не понимаю цели go_back_to_main , потому что это держит пользователя в бесконечном цикле , и единственный выбор, который у них есть, — это подтвердить, введя 'b' «или 'B' «, поэтому я удалил его.

Комментарии:

1. Хорошо, спасибо за ответ. Когда вы ссылаетесь на «menu_item_1″, относится ли это к случаю 1? После корректировки кода теперь выводится » /tmp/main-f98a55.o: В функции select_menu_item(int)»: main.cpp:(.текст 0x3b2): неопределенная ссылка на menu_item_1 () » лязг: ошибка: команда компоновщика не удалась с кодом выхода 1 (используйте-v, чтобы увидеть вызов) статус выхода 1 `

2. @JJB вам нужно научиться передавать параметры в функции, это должно быть объяснено в любой вводной книге. Вам нужно не только изменить определение функции, но и ваше объявление, и при вызове вы должны передавать параметры