C语言 嵌套开关案例中的案例将无法运行

2ledvvac  于 2023-05-16  发布在  其他
关注(0)|答案(3)|浏览(162)

这个程序是计算菜的价格。用户需要输入项目编号,它会根据他们选择的大小计算出菜的总价。但是,第二个开关案例(开关内部的案例(item_number))并没有按预期工作。它只适用于情况1,其他情况2-4不起作用,因此程序无法显示准确的价格。我绝对不能用if... else来做这个赋值,它必须用switch case。

#include <stdio.h>
int main()
{
    int item_number, dish_quantity;
    char dish_size;
    float price, total;

    //Display the menu

    printf("\t\t\t\tMenu\t\t\t\t\n");
            printf("--------------------------------------------------------------------\n");
            printf("Item Number   Dish\t\t\t Dish Size              \n");
            printf("\t\t\t\tSmall(RM)   Medium(RM)   Large(RM)\n");
            printf("--------------------------------------------------------------------\n");
            printf("     1        Ikan Tenggiri       10.00      20.00        30.00\n");
            printf("     2        Ikan Pari            8.00      15.00        25.00\n");
            printf("     3        Ikan Jenahak         9.00      17.00        28.00\n");
            printf("     4        Daging              10.00      20.00        30.00\n");
            printf("--------------------------------------------------------------------\n\n");

    // Input from user

    printf("Enter item number        : ");
    scanf("%d", &item_number);
    printf("Enter dish size (S/M/L)  : ");
    scanf("%s", &dish_size);
    printf("Enter dish quantity      : ");
    scanf("%d", &dish_quantity);

    switch (item_number){
    case 1: switch (dish_size){
                case 's': case 'S': price = 10.00; break;
                case 'm': case 'M': price = 20.00; break;
                case 'l': case 'L': price = 30.00; break;}

        case 2: switch (dish_size){
                case 's': case 'S': price = 8.00; break;
                case 'm': case 'M': price = 15.00; break;
                case 'l': case 'L': price = 25.00; break;}

        case 3: switch (dish_size){
                case 's': case 'S': price = 9.00; break;
                case 'm': case 'M': price = 17.00; break;
                case 'l': case 'L': price = 28.00; break;}

        case 4: switch (dish_size){
                case 's': case 'S': price = 10.00; break;
                case 'm': case 'M': price = 20.00; break;
                case 'l': case 'L': price = 30.00; break;}

        }

    printf("Price per dish size      : RM %.2f\n", price);

    total = dish_quantity * price;

    printf("Total charge             : RM %.2f", total);

    return 0;


}
hl0ma9xz

hl0ma9xz1#

break语句只会中断最里面的switch,而不会中断最外面的switch。因此,外部switch语句还需要break语句:

switch (item_number)
{
    case 1:
        switch (dish_size)
        {
            case 's': case 'S': price = 10.00; break;
            case 'm': case 'M': price = 20.00; break;
            case 'l': case 'L': price = 30.00; break;
        }
        break;

    case 2:
        switch (dish_size)
        {
            case 's': case 'S': price = 8.00; break;
            case 'm': case 'M': price = 15.00; break;
            case 'l': case 'L': price = 25.00; break;
        }
        break;

    case 3:
        switch (dish_size)
        {
            case 's': case 'S': price = 9.00; break;
            case 'm': case 'M': price = 17.00; break;
            case 'l': case 'L': price = 28.00; break;
        }
        break;

    case 4:
        switch (dish_size)
        {
            case 's': case 'S': price = 10.00; break;
            case 'm': case 'M': price = 20.00; break;
            case 'l': case 'L': price = 30.00; break;
        }
        break;
}

另一个问题是

scanf("%s", &dish_size);

将导致buffer overflow,因为&dish_size只有存储单个字符的空间,包括终止空字符。因此,只有足够的空间来存储空字符串。
出于这个原因,我建议您将该行更改为以下内容:

scanf(" %c", &dish_size);

这样,scanf将只尝试写入单个字符,而不是以null结尾的字符串。

u0njafvf

u0njafvf2#

你错过了休息时间;语句在外部大小写块中。

switch (item_number){
    case 1: switch (dish_size){
                case 's': case 'S': price = 10.00; break;
                case 'm': case 'M': price = 20.00; break;
                case 'l': case 'L': price = 30.00; break;}
            break; // add this at the end of each case.
eanckbw9

eanckbw93#

你需要一个break语句:

case 1: switch (dish_size){
                case 's': case 'S': price = 10.00; break;
                case 'm': case 'M': price = 20.00; break;
                case 'l': case 'L': price = 30.00; break;
        } break;                                      //here for every case

对于每个switch都包含一个default案例总是一个好主意。

相关问题