c++ 有没有办法在输入有效数字时不打印else语句?[closed]

watbbzwu  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(148)

**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答案。

这个问题是由一个打字错误或一个无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
17小时前就关门了。
Improve this question
这是我需要用C++ The question/problem编码的问题
我似乎不能知道我的代码的问题。
代码如下:

#include <iostream>

using namespace std;

int main(void)
{
    cout << "Total Purchase Cost: Php ";
    double total;
    cin >> total;
    
    cout << "Loyalty Card Type: ";
    int cardType;
    cin >> cardType;
    double discount = 0;
    double type1 = 0.10;
    double type2 = 0;
    double type3 = 0.15;
    if (cardType == 1)
        discount = total * type1;
    if (cardType == 2)
        discount = total * type2;
    if (cardType == 3)
        discount = total * type3;
    else 
    cout << "Invalid Card";
    cout << "Discounted Cost: Php \n" << discount;
    
    
    return 0;
}

当我尝试运行它时,折扣价格是正确的,计算也是正确的,输出文本“Discounted Cost:Php ---”看起来工作得很完美。但是当我开始添加一个else语句,这样当我在if语句中输入一个无效的数字时,它会输出一个“Invalid Card”消息。但是当我输入一个有效的数字时,else语句仍然会打印出来,即使它不应该打印出来。

qltillow

qltillow1#

为了解决当前的问题,我建议您将除第一条之外的所有if语句替换为else if

if (cardType == 1)
    discount = total * type1;
else if (cardType == 2)
    discount = total * type2;
else if (cardType == 3)
    discount = total * type3;
else
    cout << "Invalid Card" << '\n';
cout << "Discounted Cost: Php \n" << discount << '\n';

但是,上面的逻辑仍然存在问题,即行

cout << "Discounted Cost: Php \n" << discount;

即使卡片是无效的,也会被打印出来,这可能是您不希望看到的。因此,最好添加一个变量bool valid,并且只在该变量为true时打印"Discounted Cost"

bool valid = false;

if (cardType == 1)
{
    discount = total * type1;
    valid = true;
}
else if (cardType == 2)
{
    discount = total * type2;
    valid = true;
}
else if (cardType == 3)
{
    discount = total * type3;
    valid = true;
}
else
{
    cout << "Invalid Card" << '\n';
}

if ( valid )
{
    cout << "Discounted Cost: Php \n" << discount << '\n';
}

除了使用if ... else if语句链,还可以使用switch语句:

bool valid = false;

switch ( cardType )
{
    case 1:
        discount = total * type1;
        valid = true;
        break;
    case 2:
        discount = total * type2;
        valid = true;
        break;
    case 3:
        discount = total * type3;
        valid = true;
        break;
    default:
        cout << "Invalid Card" << '\n';
}

if ( valid )
{
    cout << "Discounted Cost: Php \n" << discount << '\n';
}

这个逻辑可以通过使用一个指针来简化一点,该指针可以被设置为nullptr以指示该卡是无效的。

double *type = nullptr;

switch ( cardType )
{
    case 1:
        type = &type1;
        break;
    case 2:
        type = &type2;
        break;
    case 3:
        type = &type3;
        break;
    default:
        cout << "Invalid Card" << '\n';
}

if ( type != nullptr )
    cout << "Discounted Cost: Php \n" << total * *type << '\n';
}

然而,编写整个程序的更简单的方法是:

#include <iostream>

using namespace std;

int main()
{
    cout << "Total Purchase Cost: Php ";
    double total;
    cin >> total;
    
    cout << "Loyalty Card Type: ";
    int cardType;
    cin >> cardType;

    constexpr double types[3] = { 0.10, 0, 0.15 };
    
    if ( 1 <= cardType && cardType <= 3 )
    {
        cout << "Discounted Cost: Php \n" << total * types[cardType-1] << '\n';
    }
    else
    {
        cout << "Invalid Card" << '\n';
    }

    return 0;
}

你的代码中的另一个问题(也是我上面的代码中的问题)是你似乎在计算折扣,但是你却把这个值打印出来作为“折扣成本”。这是不正确的。正确的数学公式是:

discounted cost = full price - discount

要解决此问题,请将行

constexpr double types[3] = { 0.10, 0, 0.15 };

应改为:

constexpr double types[3] = { 0.90, 1.00, 0.85 };

相关问题