#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 вам нужно научиться передавать параметры в функции, это должно быть объяснено в любой вводной книге. Вам нужно не только изменить определение функции, но и ваше объявление, и при вызове вы должны передавать параметры