C语言 函数计算和返回(开关)[关闭]

nszi6y05  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(134)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
4天前关闭。
Improve this question
我已经

float AddVat(float price, int category)
float total_price=0;

我需要写函数,计算和返回包括增值税的总价(使用switch/case没有scanf,为初学者)

VAT category:
1 - 20%
2 - 20%
3 - 20%
4 - 15%
5 -  8%
6 -  0%

我试着把价格乘以一个百分比。
我想知道如何找到解决办法。

mwg9r5ms

mwg9r5ms1#

如果你想返回价格+增值税,你可以这样做:

float addVat(float price, int category) {
    float vat;
    switch(category) {
        case 1:
        case 2:
        case 3:
            vat = 0.20;
            break;
        case 4:
            vat = 0.15;
            break;
        case 5:
            vat = 0.08;
            break;
        case 6:
            vat = 0;
            break;
        default:
            // error
            return -1;
    }
    return (1 + vat) * price;
}

int main(void) {
    for(int category = 0; category < 8; category++)
        printf("%d %.2f\n", category, addVat(2, category));
}

和输出:

0 -1.00
1 2.40
2 2.40
3 2.40
4 2.30
5 2.16
6 2.00
7 -1.00

我知道这是学校的作业,但你应该知道这是一个bad idea to use float for money
Value-Added Tax (VAT)与销售税的作用不同,我们在这里只实施了后者。假设这是一家公司,所以你需要扣除他们支付的增值税,并计算净负债。它通常是一个统一的税率等。
像你的(类别,增值税百分比)表这样的比率表在现实世界中会发生变化,所以你希望它是数据而不是代码。第一步是这样的:

float addVat(float price, int category) {
    category--;
    float vat[] = { 0.20, 0.20, 0.20, 0.15, 0.08, 0 };
    if(category < 0 || category >= sizeof(vat) / sizeof *vat) return -1;
    return (1 + vat[category]) * price;
}

下一步是将vat数组存储在数据库或文件中,而不是存储在数组中,然后在需要时在运行时查找它:

float vatLookup(int category);

Category使用整数建模,因此您可以如下调用函数:

addVat(price, vat);

但是错误地交换参数非常容易,编译器甚至可能不会生成警告:

addVat(vat, price);

枚举、常量或结构体是对vat建模的更好选择。只有后者才能在运行时加载数据,因此可能和更改查找函数:

struct vat {
     float percent;
   };

   float addVat(float price, const struct vat *vat);
   struct vat *vatLookup(int category);

呼叫现在变为:

addVat(2, vatLookup(2));

最后,像我那样合并输出和误差域是有问题的。也许退款在未来的某个时间点会被表示为负值。有关讨论,请参见error handling in c

相关问题