首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算电影票价格

计算电影票价格
EN

Code Review用户
提问于 2021-10-07 01:27:33
回答 3查看 1.5K关注 0票数 3

我的节目显示了电影票的价格。价格是根据客户的年龄而定的。如果用户输入负数,程序将显示“无效年龄”消息。

代码语言:javascript
复制
#include

using namespace std;

int main(){
    
    int age = 0;
    int price = 0;
    
    
    cout << " What is your age?: ";
    cin>> age;
    
    
    if (age >= 0 && age < 4)
        price = 0;
        if( age >= 4 && age <= 64 )
            price = 9;
   
    if( age > 65)
        price = 6;
    
    if (age<0)
        cout<< " Invalid Age "<< endl;
    
    else
        if(age >= 0 && age <= 3)
            cout << " The price of your ticket is: $ " << price << endl ;
    
    if( age >= 4 && age <= 64)
        cout<< " The price of your ticket is: $ " << price << endl ;
    
    if (age > 65)
        cout<< " The price of your ticket is: $ " << price << endl ;
    
    return 0;

}
EN

回答 3

Code Review用户

发布于 2021-10-07 03:42:04

您的整体代码运行良好,但也有一些改进。

使用

的if's

您正在将年龄与0, 4, 64, 65进行无意义的比较,它只能是一个。在这种情况下,我们可以使用else if

重复代码

一旦你确定了价格,你不需要再检查年龄,你可以直接打印输出。当然,在重组你的if-else if阶梯之后。

使用命名空间std的

您应该避免使用using namespace std;,因为这是一种糟糕的实践。请参考这个StackOverflow答案以获得更多的光。

不一致空格

在代码中的某些地方,您留下了空格,这使它看起来很好。而有些地方你不知道。与您的空白保持一致。

法拉盛

除非您想刷新缓冲区,否则不要使用std::endl;使用"\n"

检查输入

如果用户进入"One",那么您的程序将永远不会改变价格,它将保持为0。因此,在接受用户输入后,您应该检查输入流。

代码语言:javascript
复制
if (!std::cin) 
{
    std::cerr << "Input error\n";
    return 0;
}

休息对我来说很好。我希望你和C++在一起过得愉快。

编码愉快!

票数 7
EN

Code Review用户

发布于 2021-10-07 07:49:45

我们有一些流行的初学者问题:

  • 不要使用using namespace std --这样就很难区分哪些标识符是您自己的,哪些来自标准库。我们有名称空间可以帮助我们,而这只是放弃了所有的好处。不幸的是,许多教程都把这看作是一个很好的实践!
  • 错误消息应该转到标准错误流std::cerr,而不是std::cout
  • 从流读取时,必须检查读取成功: std::cin >> age;if (!std::cin) { std::cerr <<“无效输入(预期整数)\n”;返回EXIT_FAILURE;} (EXIT_FAILURE在中定义)。
  • 除非您真的想刷新输出,否则不要使用std::endl。我建议永远不要使用std::endl --而是使用\nstd::flush,以便在您想要刷新的时候非常清楚。
  • 我们可以从return 0;的末尾省略main() (但不包括任何其他函数)。写它没有错,只是没有必要。

目前,一切都在一个大的main()中,它有几个职责:读取输入、计算价格和打印。为了使代码更容易测试,我建议为计算创建一个单独的函数。我们可以从大纲开始:

代码语言:javascript
复制
int price(int age)
{
    return 9;
}

并编写一些简单的测试:

代码语言:javascript
复制
#include

int main()
{
    for (int age: {0, 3, 4, 64, 65}) {
        std::cout << "Price for someone aged " << age
                  << " is " << price(age) << "\n";
    }
}

显然,这给了所有年龄的9。但我们现在可以开始填写price()的正文,以给出正确的结果:

代码语言:javascript
复制
int price(int age)
{
    if (age < 4) { return 0; }
    if (age < 65) { return 9; }
    // else age >= 65
    return 6;
}

这就只剩下如何处理age < 0的问题了。为此,我将抛出一个异常:

代码语言:javascript
复制
#include 

int price(int age)
{
    if (age < 0) { throw std::invalid_argument("Invalid Age"); }
    if (age < 4) { return 0; }
    if (age < 65) { return 9; }
    // else age >= 65
    return 6;
}

我们可以在我们的main()中测试它:

代码语言:javascript
复制
try {
    price(-1);
    std::cerr << "Expected exception not thrown!";
} catch (const std::invalid_argument &e) {
    std::cout << "Caught exception: " << e.what() << '\n';
}

一旦我们感到满意,就可以将我们的测试main()替换为读取输入并打印结果的测试:

代码语言:javascript
复制
#include 

int price(int age)
{
    if (age < 0) { throw std::invalid_argument("Invalid Age"); }
    if (age < 4) { return 0; }
    if (age < 65) { return 9; }
    return 6;
}


#include 
#include 

int main()
{
    int age;
    std::cout << "What is your age?: ";
    if (!(std::cin >> age)) {
          std::cerr << "Invalid input (expected integer)\n";
          return EXIT_FAILURE;
    }

    try {
        auto p = price(age);
        std::cout << "The price of your ticket is: $"
                  << p << "\n";
    }
    catch (const std::invalid_argument &e) {
        std::cerr << e.what() << '\n';
        return EXIT_FAILURE;
    }
}
票数 4
EN

Code Review用户

发布于 2021-10-07 14:40:39

代码语言:javascript
复制
    else
        if(age >= 0 && age <= 3)
            cout << " The price of your ticket is: $ " << price << endl ;
    
    if( age >= 4 && age <= 64)
        cout<< " The price of your ticket is: $ " << price << endl ;
    
    if (age > 65)
        cout<< " The price of your ticket is: $ " << price << endl ;

不管情况如何,你似乎都在做同样的事情!我认为,也许您重构了代码以将计算与打印分开,但在进行替换后从未清理过旧代码。我建议你自己读一遍代码,然后再给别人看一遍。在编辑的时候,你通常不会重读整件事--休息一会儿,然后在称之为“完成”之前,先从上到下阅读代码。这是一个很好的习惯。即使是经验丰富的开发人员也会发现有趣的间距和注释,这些都是需要删除的注释或需要更新的注释。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/268742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档