我的节目显示了电影票的价格。价格是根据客户的年龄而定的。如果用户输入负数,程序将显示“无效年龄”消息。
#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;
}发布于 2021-10-07 03:42:04
您的整体代码运行良好,但也有一些改进。
使用
您正在将年龄与0, 4, 64, 65进行无意义的比较,它只能是一个。在这种情况下,我们可以使用else if。
一旦你确定了价格,你不需要再检查年龄,你可以直接打印输出。当然,在重组你的if-else if阶梯之后。
使用命名空间std的
您应该避免使用using namespace std;,因为这是一种糟糕的实践。请参考这个StackOverflow答案以获得更多的光。
在代码中的某些地方,您留下了空格,这使它看起来很好。而有些地方你不知道。与您的空白保持一致。
除非您想刷新缓冲区,否则不要使用std::endl;使用"\n"。
如果用户进入"One",那么您的程序将永远不会改变价格,它将保持为0。因此,在接受用户输入后,您应该检查输入流。
if (!std::cin)
{
std::cerr << "Input error\n";
return 0;
}休息对我来说很好。我希望你和C++在一起过得愉快。
编码愉快!
发布于 2021-10-07 07:49:45
我们有一些流行的初学者问题:
using namespace std --这样就很难区分哪些标识符是您自己的,哪些来自标准库。我们有名称空间可以帮助我们,而这只是放弃了所有的好处。不幸的是,许多教程都把这看作是一个很好的实践!std::cerr,而不是std::cout。EXIT_FAILURE在中定义)。std::endl。我建议永远不要使用std::endl --而是使用\n和std::flush,以便在您想要刷新的时候非常清楚。return 0;的末尾省略main() (但不包括任何其他函数)。写它没有错,只是没有必要。目前,一切都在一个大的main()中,它有几个职责:读取输入、计算价格和打印。为了使代码更容易测试,我建议为计算创建一个单独的函数。我们可以从大纲开始:
int price(int age)
{
return 9;
}并编写一些简单的测试:
#include
int main()
{
for (int age: {0, 3, 4, 64, 65}) {
std::cout << "Price for someone aged " << age
<< " is " << price(age) << "\n";
}
}显然,这给了所有年龄的9。但我们现在可以开始填写price()的正文,以给出正确的结果:
int price(int age)
{
if (age < 4) { return 0; }
if (age < 65) { return 9; }
// else age >= 65
return 6;
}这就只剩下如何处理age < 0的问题了。为此,我将抛出一个异常:
#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()中测试它:
try {
price(-1);
std::cerr << "Expected exception not thrown!";
} catch (const std::invalid_argument &e) {
std::cout << "Caught exception: " << e.what() << '\n';
}一旦我们感到满意,就可以将我们的测试main()替换为读取输入并打印结果的测试:
#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;
}
}发布于 2021-10-07 14:40:39
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 ;不管情况如何,你似乎都在做同样的事情!我认为,也许您重构了代码以将计算与打印分开,但在进行替换后从未清理过旧代码。我建议你自己读一遍代码,然后再给别人看一遍。在编辑的时候,你通常不会重读整件事--休息一会儿,然后在称之为“完成”之前,先从上到下阅读代码。这是一个很好的习惯。即使是经验丰富的开发人员也会发现有趣的间距和注释,这些都是需要删除的注释或需要更新的注释。
https://codereview.stackexchange.com/questions/268742
复制相似问题