使用 switch 语句调用函数
Posted
技术标签:
【中文标题】使用 switch 语句调用函数【英文标题】:Using switch statements to call functions 【发布时间】:2018-10-02 02:45:48 【问题描述】:我正在尝试用 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;
【问题讨论】:
Cswitch
语句提供自动 fall-through 除非在每个语句中都提供了 break;
语句。例如,您的 case 1
将在失败时执行 1,2,...default
。
我已经修复了我的 switch 语句语法,并在打印语句中使用了正确的扫描标识符。我现在的问题是,当我想要小数时,我的输出都是整数。
您修复了所有printf("%d", output);
语句吗?应该是printf("%f", output);
(我可能会将其限制为理智的"%.2f"
,只是为了减少默认的小数位数5或6)
@DavidC.Rankin 我将它们更正为 %ld,但仍然得到整数。将它们全部更改为 %.2f,但是当我尝试将 5 英寸转换为厘米时,我得到了 0.00;当我试图将 35 华氏度转换为摄氏度时,我得到了 -32。出于某种原因,在将 %ld 更改为 %.2f 后,所有乘法和除法都会导致 0
什么都不应该是%ld
。 %lf
(关于扫描和打印)——先搞定,然后再担心漂亮的格式。
【参考方案1】:
您首先缺少break
s。 (因此,如果您选择选项 1,它还将执行选项 2 3 4 和 5)
conversionValue
是 double
,但您使用 %d
扫描它。这意味着您没有转换您认为的价值。基本调试(打印您的输入值)会突出显示这一点。
您所有的打印件都在尝试使用 %d
打印双精度(双精度应为 %lf
)
将输出与计算相结合是不好的。即您的convert
例程应该返回转换后的值,并且打印应该在转换函数之外。
【讨论】:
如果编译器警告被正确启用,则意味着编译器会发出被忽略的警告……(格式说明符的不匹配可能会导致未定义的行为。 ) @John3136 感谢您的帮助。对这一切还是陌生的。我没想过要调试,我现在每次都在这样做。我现在的问题是程序总是为结果输出整数,即使我在所有内容中都使用双精度数。我可以改变什么?【参考方案2】:作为您的 cmets 的后续操作,请了解 printf
将默认使用 "%f"
打印 doubles
,但是,要读取带有 scanf
的 double
,您必须使用 l
长度修饰符,例如"%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: ");
始终,始终验证所有用户输入,这意味着至少验证scanf
的返回(如果在匹配后没有退出 失败 - 您必须读取并丢弃留在stdin
中的所有违规字符,因为当发生 匹配 失败时,不会从输入缓冲区中删除更多字符以及导致 匹配失败仍然未读,只是在等待下次尝试从输入缓冲区读取时再次咬你)。
至少检查预期的转换次数是否成功完成(如果适用,您应该进一步检查任何数字输入是否在范围内),例如
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
变量名,而保留所有 小写 名称,同时保留 大写 名称用于宏和常量。这是一个风格问题——所以这完全取决于你,但不遵循它可能会在某些圈子中导致错误的第一印象。参见例如NASA - C Style Guide, 1994 与 C 标准之外的任何内容一样,您一定会发现禁忌症,但通常 camelCase
或 MixedCase
留给 java 或 C++。
如果您还有其他问题,请告诉我。
【讨论】:
这是超级信息。我已经上交了我的作业,但我会将所有这些合并到我本地的版本中,以便我可以参考。谢谢!! 很高兴它有帮助。请记住,C 不是您在一个学期甚至一年内就能学到的东西。这更像是一个持续学习的旅程,你慢慢地增加你的知识。关键是尽早建立良好的实践和习惯,密切关注所有变量的输入验证和初始化,并学会启用和使用编译器警告——与 30 年前相比,它们今天已经相当不错了。以上是关于使用 switch 语句调用函数的主要内容,如果未能解决你的问题,请参考以下文章