【问题标题】:C++ program to calculate the factorial of even numbers between 5 and 15C++程序计算5到15之间偶数的阶乘
【发布时间】:2021-03-14 16:12:07
【问题描述】:

当我为小于 5 的偶数运行程序时,它会打印出错误消息,但它也给了我阶乘。我不想要阶乘。这是代码,我该如何更正?

#include <iostream>
using namespace std;

int main()
{
    int number, factorial = 1;

    cout << "Enter an even number between 5 & 15 to find it's factorial: ";
    cin >> number;

    if(number % 2 == 0) {
        while(number < 5) {
            cout << "Error! Enter an even number greater than five: ";
            break;
        }

        while(number > 15) {
            cout << "Error! Enter an even number less than fifteen: ";
            break;
        }

        for(int a = 1; a <= number; a++) {
            factorial = factorial * a;
        }

        cout << "factorial of " << number << " is " << factorial;
    }
    else {
        cout << "Error!Enter an even number between 5 & 15 to find it's "
                "factorial: ";
    }

    return 0;
}

【问题讨论】:

  • 用你自己的话来说,你认为break 是做什么的?你认为return 会做什么?
  • break ,好吧,我想它会阻止程序在(在我的情况下)打印后继续执行,如果我删除 break 并运行程序,输出将继续一遍又一遍地打印相同的消息。作为回报,我的理解是它是一个退出代码,用于判断程序执行是否成功。
  • @Baibulu 您对 KarlKnechtel 问题的回答是错误的。我正要输入正确的答案,但实际上你应该在一些教程中阅读这些内容。另外,请注意您没有在回答中提到他,因此他不会收到您回复的通知。我在这条评论中向您致意,以便您了解它是如何完成的(但是由于您是写这篇文章的,所以无论如何您都会看到它)。

标签: c++ loops break factorial


【解决方案1】:

此答案显示了您的代码中的一些更正,并提供了一段工作代码。

更正:

  1. 将所有内容都写在 main 函数中并不是一个好主意。尝试遵循 S 代表单一职责的 SOLID 原则。这说明函数必须很小并且只做一件事。在你的代码中,你定义了一个非常大的函数,它做了很多事情。

  2. 避免嵌套循环。在你的例子中,你有一个 if ,里面有 while , while 和 inside while 你有 for 。这看起来很乱,不可读。 尽量清晰地表达代码,以便人们在阅读时理解数据流。

  3. Break 是从 while 循环中出来的东西,但这并不意味着它会退出函数。所以在你的例子中,

    而(数字

从这个循环出来后,它会进入下一行,这是另一个while循环,然后继续计算函数。

  1. 尝试使用统一初始化。代替 int i = 0 使用 int i{0}。您可以在 google 上阅读有关统一初始化的更多信息。

  2. 尽量不要使用“使用命名空间 std 或其他任何东西”。非常糟糕的做法。

工作代码:

bool check_value(int number){
int range = (number < 5 || number > 15) ? false : true;
int even = (number % 2 == 0) ? true : false;
if(range & even){
    return true;
}
else{
    std::cout << "Error! Please input even number between 5 & 15\n";
    return false;
}}

int main(){   
int number,factorial=1;
std::cout<<"Enter an even number between 5 & 15 to find it's factorial: \n";
    std::cin >> number;
    
if(check_value(number)){
for (size_t a{1}; a <= number; a++){
        factorial = factorial*a;
    }
    std::cout<<"factorial of " << number <<" is " << factorial << "\n";
}            
return 0;   

}

【讨论】:

  • 请注意,您需要 long long int 用于阶乘
  • 嗯,是的,一般情况下这是个好主意。但是这个程序将计算的最大结果是 14 的阶乘,即 1278945280,并且在 int 的范围内。但是,是的,我肯定会在正常的阶乘程序中使用 long long int。
  • 14! = 8.7e10,大于2^31-1 = 2.14e-9
  • 糟糕!是的,你是对的!我的阶乘计算是错误的:D long long int 它是。
【解决方案2】:

正如 Karl 在 cmets 中指出的那样,break 语句将跳出恰好一个循环,在本例中为 while 循环,循环外的代码将继续执行。

此外,正如 Damien 所指出的,您需要使用 long long int 来计算阶乘,因为结果可能会超过 int 数据类型的最大大小。

您还可以重新编写代码以使其更具可读性,如下所示:

#include <iostream>

/* Checks if number is valid and can throw error msg */
bool isValidNumber(int num) {
    if(num % 2 != 0 || num < 5 || num > 15) {
        std::cout << "Error! The number entered is not valid." << std::endl;
        return false;
    }
    return true;
}

/* Calculates factorial and prints its value */
void calculateFactorial(int num) {
    long long int factorial = 1;

    for(int a = 1; a <= num; a++) {
        factorial = factorial * a;
    }

    std::cout << "factorial of " << num << " is " << factorial << std::endl;
}

int main()
{
    int number;
    bool isValid;

    do {
        std::cout << "Enter an even number between 5 & 15 to find it's factorial: ";
        std::cin >> number;

        isValid = isValidNumber(number);

        if(isValid) {
            calculateFactorial(number);
        }
    } while(!isValid);

   return 0;
}

注意: 使用using namespace std; 被认为是不好的做法,因为std 命名空间中的一个或多个方法与您以后可能创建的其他一些纳米空间的方法之间可能会发生方法冲突.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2015-01-08
    相关资源
    最近更新 更多