Do-While循环在main_menu正常运行,admin_menu等菜单失效问题求助
问题分析与解决方案
核心错误:admin_menu的合法性判断逻辑完全错误
你代码中admin_menu里的输入校验条件if (option != 1 || option != 2 || option != 3 || option != 4 || option != 5)逻辑彻底错误:
逻辑或||的特性是只要有一个条件为真,整个表达式就为真。对于任意整数option,它不可能同时等于1、2、3、4、5,所以这个条件永远成立——不管你输入有效选项(1-5)还是0,都会打印"无效选项"提示。当输入0时,循环条件while(option !=0)不满足,循环直接退出回到main_menu,导致你误以为程序直接终止。
修复方法
将判断条件改为当输入既不是0,也不是1-5时才提示错误,使用逻辑与&&连接所有不等于的条件,或者用范围判断简化:
// 写法1:明确判断所有非法值 if (option != 0 && option != 1 && option != 2 && option != 3 && option != 4 && option != 5) printf("Insira uma opcao valida!!! \n"); // 写法2:更简洁的范围判断 if (!(option >= 1 && option <= 5) && option != 0) printf("Insira uma opcao valida!!! \n");
其他需要修复的问题
main_menu同样存在逻辑错误
main_menu里的校验条件if (option != 1 || option != 2 || option != 3 || option != 4 || option != 99)和admin_menu犯了同样的错误,会导致输入有效选项时也弹出错误提示,修正为:if (option != 0 && option != 1 && option != 2 && option != 3 && option != 4 && option != 99) printf("Insira uma opcao valida!!! \n");patient_menu和doctor_menu的scanf语法错误
这两个菜单中的scanf("%d", option);缺少取地址符&,会导致未定义行为(比如程序崩溃、变量值异常),必须修正为:scanf("%d", &option);可选优化:添加switch的case 0分支
在admin_menu的switch中明确处理0选项,让代码逻辑更清晰:switch(option){ case 1: printf("Working\n");/*funtion to print queue */break; case 2: printf("Working\n");/*funtion to edit a patient */break; case 3: printf("Working\n");/*funtion to edit a doctor */break; case 4: printf("Working\n");/*funtion to remove a patient */break; case 5: printf("Working\n");/*funtion to remove a doctor */break; case 0: printf("Saindo do menu admin...\n"); break; }
修正后的admin_menu完整代码
void admin_menu(){ int option; do{ printf("\n1: Verificar lista de utentes"); printf("\n2: Alterar informacoes utentes"); printf("\n3: Alterar informacoes medicos"); printf("\n4: Remover utente"); printf("\n5: Remover medico"); printf("\n0: Sair\n"); scanf("%d", &option); switch(option){ case 1: printf("Working\n");/*funtion to print queue */break; case 2: printf("Working\n");/*funtion to edit a patient */break; case 3: printf("Working\n");/*funtion to edit a doctor */break; case 4: printf("Working\n");/*funtion to remove a patient */break; case 5: printf("Working\n");/*funtion to remove a doctor */break; case 0: printf("Saindo do menu admin...\n"); break; } // 修正后的合法性判断 if (option != 0 && option != 1 && option != 2 && option != 3 && option != 4 && option != 5) printf("Insira uma opcao valida!!! \n"); }while(option != 0); system("cls"); }
内容的提问来源于stack exchange,提问作者Matias04_
相关产品推荐
相关产品推荐

