计算5到15之间偶数的阶乘的C++程序

问题描述

当我为小于 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;
}

解决方法

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

更正:

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

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

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

    while(number

当它退出这个循环后,它会转到下一行,这是另一个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;   

}

,

正如 Karl 在评论中指出的那样,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 命名空间中的一个或多个方法与您可能使用的其他一些纳米空间的方法之间可能发生方法冲突一路创造。