我正在尝试用C编写一个程序,该程序使用switch语句来确定使用哪个调用函数来转换各种值。我的指示如下:
“创建一个程序,将华氏温度转换为摄氏温度,将摄氏温度转换为华氏温度,将英寸转换为厘米,将厘米转换为英寸。将您的选择放入switch语句中,这样它们将显示在屏幕上,如下所示:
Select from the menu below to covert temperature or linear menus:
1 Convert Fahrenheit to Celsius
2 Convert Celsius to Fahrenheit
3 Convert Inches to Centimes
4 Convert Centimeters to Inches
5 Exit the program
Enter your selection:
为每个转换例程提供一个函数,您将从主程序中调用该函数。每个选择都应该在switch语句中为例。确保根据编码标准注释所有代码。
当我运行程序并输入选择,然后输入要转换的值时,会出现一个奇怪的数字,然后显示
ProgramExiting.ProgramExiting.
这是我的代码:
#include <stdio.h>
void FahrenheitToCelsiusConversion (double conversionValue) {
double output;
output = conversionValue / (9.0 / 5.0) - 32;
printf("%d", output);
}
void CelsiusToFahrenheitConversion (double conversionValue) {
double output;
output = conversionValue * (9.0 / 5.0) + 32;
printf("%d", output);
}
void InchesToCentimetersConversion (double conversionValue) {
double output;
output = conversionValue * 2.54;
printf("%d", output);
}
void CentimetersToInchesConversion (double conversionValue) {
double output;
output = conversionValue / 2.54;
printf("%d", output);
}
int main(void) {
int conversionChoice;
double conversionValue;
printf("Select from the menu below to convert temperature or linear\n");
printf("menus:");
printf("\n");
printf("1 Convert Fahrenheit to Celsius\n");
printf("2 Convert Celsius to Fahrenheit\n");
printf("3 Convert Inches to Centimeters\n");
printf("4 Convert Centimeters to Inches\n");
printf("5 Exit the Program\n");
scanf("%d", &conversionChoice);
printf("Enter the value you wish to convert:\n");
scanf("%d", &conversionValue);
switch (conversionChoice) {
case 1:
FahrenheitToCelsiusConversion(conversionValue);
case 2:
CelsiusToFahrenheitConversion(conversionValue);
case 3:
InchesToCentimetersConversion(conversionValue);
case 4:
CentimetersToInchesConversion(conversionValue);
case 5:
printf("Program exiting.");
default:
printf("Program exiting.");
}
return 0;
}
答案 0 :(得分:1)
您一开始就缺少break
个。 (因此,如果您选择选项1,它还将执行选项2 3 4和5)
conversionValue
是double
,但是您用%d
对其进行了扫描。这意味着您没有在转换自己认为的价值。基本调试(打印您的输入值)会突出显示这一点。
您所有的印刷品都尝试使用%d
来打印双打(双打应该为%lf
)
将输出与计算相结合是不好的。也就是说,您的convert
例程应返回转换后的值,并且打印结果应位于转换函数之外。
答案 1 :(得分:0)
作为对您评论的后续内容,请了解printf
默认情况下将使用doubles
打印"%f"
,但是要用double
阅读scanf
您必须使用l
length-modifier ,例如"%lf"
。格式说明符不匹配会导致未定义行为。
此外,您发现F->C
转换逻辑需要...帮助。 32
在错误的点被减去,应该是:
void FahrenheitToCelsiusConversion (double conversionValue) {
double output;
output = (conversionValue - 32) / (9.0 / 5.0);
printf ("%.2f\n", output);
}
(注意:printf
格式也有所更改)
此外,在main()
中,您只需要一次调用printf
(或fputs
,因为不涉及转换)就可以打印整个菜单。当您以双引号终止一行,而下一条以双引号开头时,C将连接字符串,例如
printf ("\nSelect from the menu below to convert temperature or linear\n"
"menus:\n\n"
" 1 Convert Fahrenheit to Celsius\n"
" 2 Convert Celsius to Fahrenheit\n"
" 3 Convert Inches to Centimeters\n"
" 4 Convert Centimeters to Inches\n"
" 5 Exit the Program\n\n"
"choice: ");
始终始终验证所有 User Input ,这意味着至少要验证scanf
的 return (并且如果没有匹配 / em>失败-您必须读取并丢弃stdin
中保留的所有令人反感的字符,因为当发生 matching 失败时,不会再从输入缓冲区中删除任何字符,也不会删除那些导致 matching 失败仍然无法读取,只是在下次尝试从输入缓冲区读取时再次咬住您。
至少要检查一下预期的转换次数是否成功完成(如果适用,还应进一步检查数字输入是否在范围内),例如
if (scanf ("%d", &conversionChoice) != 1 || conversionChoice < 1 ||
conversionChoice > 5) {
fputs ("error: invalid input, or value out of range.\n", stderr);
return 1;
}
printf ("\nEnter the value you wish to convert: ");
if (scanf ("%lf", &conversionValue) != 1) {
fputs ("error: invalid value input.\n", stderr);
return 1;
}
您表示您已经在break
语句中添加了switch
语句,但是在我们讨论了默认的 fall-through 行为之后,您了解以下原因的原因吗?
switch (conversionChoice) {
case 1:
FahrenheitToCelsiusConversion(conversionValue);
break;
case 2:
CelsiusToFahrenheitConversion(conversionValue);
break;
case 3:
InchesToCentimetersConversion(conversionValue);
break;
case 4:
CentimetersToInchesConversion(conversionValue);
break;
case 5: /* here you CAN use fall-through */
default:
printf("Program exiting.");
break;
}
将所有部分放在一起,您可以执行以下操作:
#include <stdio.h>
void FahrenheitToCelsiusConversion (double conversionValue) {
double output;
output = (conversionValue - 32) / (9.0 / 5.0);
printf ("%.2f\n", output);
}
void CelsiusToFahrenheitConversion (double conversionValue) {
double output;
output = conversionValue * (9.0 / 5.0) + 32;
printf ("%.2f\n", output);
}
void InchesToCentimetersConversion (double conversionValue) {
double output;
output = conversionValue * 2.54;
printf ("%.2f\n", output);
}
void CentimetersToInchesConversion (double conversionValue) {
double output;
output = conversionValue / 2.54;
printf ("%.2f\n", output);
}
int main (void) {
int conversionChoice;
double conversionValue;
printf ("\nSelect from the menu below to convert temperature or linear\n"
"menus:\n\n"
" 1 Convert Fahrenheit to Celsius\n"
" 2 Convert Celsius to Fahrenheit\n"
" 3 Convert Inches to Centimeters\n"
" 4 Convert Centimeters to Inches\n"
" 5 Exit the Program\n\n"
"choice: ");
if (scanf ("%d", &conversionChoice) != 1 || conversionChoice < 1 ||
conversionChoice > 5) {
fputs ("error: invalid input, or value out of range.\n", stderr);
return 1;
}
printf ("\nEnter the value you wish to convert: ");
if (scanf ("%lf", &conversionValue) != 1) {
fputs ("error: invalid value input.\n", stderr);
return 1;
}
switch (conversionChoice) {
case 1:
FahrenheitToCelsiusConversion(conversionValue);
break;
case 2:
CelsiusToFahrenheitConversion(conversionValue);
break;
case 3:
InchesToCentimetersConversion(conversionValue);
break;
case 4:
CentimetersToInchesConversion(conversionValue);
break;
case 5: /* here you CAN use fall-through */
default:
printf("Program exiting.");
break;
}
return 0;
}
使用/输出示例
$ ./bin/tempconv
Select from the menu below to convert temperature or linear
menus:
1 Convert Fahrenheit to Celsius
2 Convert Celsius to Fahrenheit
3 Convert Inches to Centimeters
4 Convert Centimeters to Inches
5 Exit the Program
choice: 1
Enter the value you wish to convert: 212
100.00
始终在启用了警告的情况下进行编译,并且在进行无警告的干净编译之前,不接受的代码。要启用警告,请在您的-Wall -Wextra
或gcc
编译字符串中添加clang
。 (添加-pedantic
以获得其他一些警告)。对于clang
,您可以使用-Weverything
。对于 VS (在windoze上为cl.exe
),添加/W3
(或使用/Wall
,但您会收到很多无关的与代码无关的警告)。阅读并理解每个警告。他们将确定任何问题以及发生问题的确切路线。通过听编译器告诉您的内容,您可以学到很多东西。
虽然不是错误,但C通常避免使用camelCase
或MixedCase
变量名,而保留所有小写字母,而使用小写字母 / em>用于宏和常量的名称。这是风格问题-因此完全取决于您,但是如果不遵循它,可能会在某些圈子中导致错误的第一印象。参见例如NASA - C Style Guide, 1994与C标准以外的其他内容一样,您一定会发现禁忌症,但通常camelCase
或MixedCase
留给Java或C ++。
如果您还有其他疑问,请告诉我。