使用switch语句调用函数

时间:2018-10-02 02:45:48

标签: c

我正在尝试用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;   

}

2 个答案:

答案 0 :(得分:1)

您一开始就缺少break个。 (因此,如果您选择选项1,它还将执行选项2 3 4和5)

conversionValuedouble,但是您用%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 -Wextragcc编译字符串中添加clang。 (添加-pedantic以获得其他一些警告)。对于clang,您可以使用-Weverything。对于 VS (在windoze上为cl.exe),添加/W3(或使用/Wall,但您会收到很多无关的与代码无关的警告)。阅读并理解每个警告。他们将确定任何问题以及发生问题的确切路线。通过听编译器告诉您的内容,您可以学到很多东西。

虽然不是错误,但C通常避免使用camelCaseMixedCase变量名,而保留所有小写字母,而使用小写字母 / em>用于宏和常量的名称。这是风格问题-因此完全取决于您,但是如果不遵循它,可能会在某些圈子中导致错误的第一印象。参见例如NASA - C Style Guide, 1994与C标准以外的其他内容一样,您一定会发现禁忌症,但通常camelCaseMixedCase留给Java或C ++。

如果您还有其他疑问,请告诉我。