簡體   English   中英

C++程序計算5到15之間偶數的階乘

[英]C++ program to calculate the factorial of even numbers between 5 and 15

當我為小於 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. 在主 function 中編寫所有內容並不是一個好主意。 嘗試遵循 S 代表單一職責的 SOLID 原則。 這說明函數必須很小並且只做一件事。 在你的代碼中,你定義了一個非常大的 function ,它做了很多事情。

  2. 避免嵌套循環。 在您的示例中,您有一個 if,其中您有 while,while 和 inside while 您有 for。 這看起來很亂,不可讀。 盡量清晰地表達代碼,這樣當人們閱讀時,他們就能理解數據的流動。

  3. Break 是從 while 循環中出來的東西,但這並不意味着它會退出 function。 所以在你的例子中,

    while(number<5){ std::cout<<"錯誤:輸入大於五的偶數;"; 休息; }

退出此循環后,它將 go 到下一行,這是另一個 while 循環,然后繼續計算 function。

  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命名空間中的一個或多個方法與您可能在以后創建的其他一些 nanmespace 的方法之間可能發生方法沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM