我的书说要制作一个程序来跟踪高级用户仅使用switch语句欠公司的金额

问题描述 投票:-2回答:3

它在标有双正斜杠的所有位置都有相同的语法错误,语法错误是“大小写标签不会减少为整数常量”

我不能使用if语句,因为我的书很愚蠢而且讨厌if语句(但仅在switch语句章节中)

#include <stdio.h>

int main()
{
double price;
int power;
char user,hrs;

printf("Enter what kind of consumer (R for residential, C for commercial, I for industrial): ");
scanf("%c",user);
printf("Enter amount of kilowatt hours used: ");
scanf("%d",power);

    switch(user)
    {
    case 'R':
    case 'r':
        price=6.00+.052*power;
        break;

    case 'C':
    case 'c':
        switch(power)
        {
        case (power>1000):    //
            price=60.00+(power-1000)*.045;
        case power<=1000:    //
            price=60.00;
        }
        break;

    case 'I':
    case 'i':
        {
        printf("Hours (P for peak, O for off-peak):");
        scanf("%c",hrs);

            switch(hrs)
            {
            case 'P':
            case 'p':
                switch(power)
                {
                case power>1000:    //
                    price=76.00+.065*(power-1000);
                    break;

                case power<=1000:    //
                    price=76.00;
                    break;
                } 

            case 'O':
            case 'o':
                switch(power)
                {
                case power>1000:    //
                    price=40.00+.028*(power-1000);
                    break;

                case power<=1000:    //
                    price=40.00;
                    break;
                }
                break;    
            default:
                printf("Business hour ID not recognized; try again");
                break;
            }
        }
        break;

        default:
            printf("Consumer ID not recognized; try again");
            break;
    }

printf("Price is %f", price);

return(0);
}
c switch-statement
3个回答
1
投票

你的case语句中的表达式必须是'p'之类的常量,而不是像power>1000这样的表达式。

如果你需要做像power>1000这样的表达式,你应该使用if / else结构来处理所有适当的情况。


0
投票

case语句的值必须是常量整数。

您可以自由使用字符(例如'a','x'等),因为它们将由编译器(使用其ASCII代码)转换为整数。

使用任何其他类型的常量将产生意外的并且可能令人不愉快的结果。

此外,如果在两个不同的case语句中使用相同的值,编译器会抱怨(并且正确)。这可能比看起来更棘手。例如 :

#define WHATEVER 1
switch (xxx)
{
case        1 : return 1;
case WHATEVER : return 10; // error: duplicate case value
}

坦率地说,我认为你的练习不能很好地说明案例陈述的实际用法。

99%的情况下,案例值将来自枚举类型,例如:

typedef enum {
   CMD_START,
   CMD_STOP
} Command;

function process_command (Command c)
{
    switch (c)
    {
    case CMD_START:
        do_start();
        break;
    case CMD_STOP:
        do_stop();
        break;
    default:
        panic ("unknown command %d", c);
    }
}

0
投票

当你在switchpower时,case目标必须是常数。

由于您实际上只对power>1000的二进制结果感兴趣,您可以将switch应用于:

            switch(power>1000)
            {
            case 1:
                price=76.00+.065*(power-1000);
                break;
            default:
                price=76.00;
                break;
            } 

练习是为了让你明白使用switch这种方式非常接近if-else。但是,这只是为了满足学术活动。实际上没有人愿意维护以这种方式编写的代码。使用if-else更自然:

            if(power>1000)
            {
                price=76.00+.065*(power-1000);
            }
            else
            {
                price=76.00;
            } 
© www.soinside.com 2019 - 2024. All rights reserved.