星-三角电阻网络转换程序do while循环输入验证问题求助
修复电阻网络转换程序的输入验证循环问题
我编写了一款支持星型(Star)、三角型(Delta)电阻网络转换及退出功能的程序,希望对R_a、R_b、R_c等电阻值进行输入验证,要求输入值范围为1000到1000000。预期逻辑为:输入值在范围内时程序继续执行;输入值不在范围内时,重新提示用户输入。但当前程序的表现是:输入值合法时可正常继续,输入值不合法时虽会给出警告,但仍继续执行流程,并未回到输入提示环节。修复该问题后,我会将该验证循环应用到所有输入项。恳请帮忙排查并修复该do while循环的问题。
原代码
#include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { printf("\n\n\t\tDelta and Star Converter\n\n\n"); int choice, num, i; unsigned long int fact; while(1) { printf("1. Star \n"); printf("2. Delta\n"); printf("0. Exit\n\n\n"); printf("Enter your choice : "); scanf("%d",&choice); switch(choice) { case 1:; float R_a=0,R_b=0,R_c=0,R_ab,R_bc,R_ac; printf("Please enter the value of the Star connected resistors:\n"); do { printf("R_a = "); scanf("%f",&R_a); if (R_a > 1000000) { printf("Please"); } else if (R_a < 1000) { printf("Number to low\n"); }else { } }while(R_a = -0); printf("R_b = "); scanf("%f",&R_b); printf("R_c = "); scanf("%f",&R_c); R_ab=R_a+R_b+(R_a*R_b)/R_c; R_bc=R_b+R_c+(R_b*R_c)/R_a; R_ac=R_a+R_c+(R_a*R_c)/R_b; printf("the equivalent Delta values are: \n"); printf("R_ab = %.2f Ohms\n",R_ab); printf("R_bc = %.2f Ohms\n",R_bc); printf("R_ac = %.2f Ohms\n",R_ac); break; case 2:; printf("Please enter the values of the Delta connected resistors:\n"); printf("R_ab = "); scanf("%f",&R_ab); printf("R_bc = "); scanf("%f",&R_bc); printf("R_ac = "); scanf("%f",&R_ac); R_a = (R_ab*R_ac)/(R_ab + R_bc + R_ac); R_b = (R_ab*R_bc)/(R_ab + R_bc + R_ac); R_c = (R_ac*R_bc)/(R_ab + R_bc + R_ac); printf("the equivalent Star values are: \n"); printf("R_a = %.2f Ohms\n",R_a); printf("R_b = %.2f Ohms\n",R_b); printf("R_c = %.2f Ohms\n",R_c); break; case 0: printf("\n\nAdios!!\n\n\n"); exit(0); // terminates the complete program execution } while (0) ; } printf("\n\n\t\t\tThank you!\n\n\n"); return 0; }
问题分析
- 循环终止条件错误:原代码中
while(R_a = -0);是赋值操作(=)而非比较操作(==),且逻辑完全不符合需求。该语句会将-0赋值给R_a,由于-0等于0,循环条件为假,导致循环仅执行一次就退出,不管输入是否合法。 - 错误提示不完整:当输入值大于1000000时,仅输出
Please,用户无法明确知道错误原因。 - 未处理输入失败情况:若用户输入非数字字符,
scanf会读取失败,导致R_a的值保持不变,可能引发死循环或错误计算。
修复方案
1. 修正循环终止逻辑
将循环条件改为:当输入值不在1000~1000000范围内时,继续循环,即while(R_a < 1000 || R_a > 1000000);。
2. 完善错误提示
补充完整的错误信息,让用户清晰了解输入要求。
3. 处理输入失败
当scanf返回值不等于1时,说明输入无效,需要清空输入缓冲区,避免后续输入操作受到影响。
修复后的R_a验证代码片段
do { printf("R_a = "); // 处理输入失败,清空缓冲区 while (scanf("%f", &R_a) != 1) { // 清空输入缓冲区的无效字符 while (getchar() != '\n'); printf("输入无效,请输入数字值:"); } if (R_a > 1000000) { printf("数值过大,请输入1000到1000000之间的电阻值\n"); } else if (R_a < 1000) { printf("数值过小,请输入1000到1000000之间的电阻值\n"); } } while(R_a < 1000 || R_a > 1000000);
推广到所有输入项
你可以将上述验证逻辑封装成一个函数,方便复用在所有电阻值输入环节,例如:
float getValidResistance(const char* prompt) { float val; do { printf("%s", prompt); while (scanf("%f", &val) != 1) { while (getchar() != '\n'); printf("输入无效,请输入数字值:"); } if (val > 1000000) { printf("数值过大,请输入1000到1000000之间的电阻值\n"); } else if (val < 1000) { printf("数值过小,请输入1000到1000000之间的电阻值\n"); } } while(val < 1000 || val > 1000000); return val; }
调用示例:
R_a = getValidResistance("R_a = "); R_b = getValidResistance("R_b = "); R_c = getValidResistance("R_c = ");
内容的提问来源于stack exchange,提问作者confusionpersonified
相关产品推荐
相关产品推荐

