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

时间:2014-01-01 07:18:56

标签: c switch-statement

在标有双正斜杠的所有地方都有相同的语法错误,语法错误是“案例标签不会减少为整数常量”

我不能使用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);
}

3 个答案:

答案 0 :(得分:1)

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

如果您需要执行power>1000之类的表达式,则应使用if / else结构来处理所有适当的案例。

答案 1 :(得分: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);
    }
}

答案 2 :(得分: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;
            }