[英]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;
}
該答案顯示了您的代碼中的一些更正,並提供了一段工作代碼。
更正:
在主 function 中編寫所有內容並不是一個好主意。 嘗試遵循 S 代表單一職責的 SOLID 原則。 這說明函數必須很小並且只做一件事。 在你的代碼中,你定義了一個非常大的 function ,它做了很多事情。
避免嵌套循環。 在您的示例中,您有一個 if,其中您有 while,while 和 inside while 您有 for。 這看起來很亂,不可讀。 盡量清晰地表達代碼,這樣當人們閱讀時,他們就能理解數據的流動。
Break 是從 while 循環中出來的東西,但這並不意味着它會退出 function。 所以在你的例子中,
while(number<5){ std::cout<<"錯誤:輸入大於五的偶數;"; 休息; }
退出此循環后,它將 go 到下一行,這是另一個 while 循環,然后繼續計算 function。
嘗試使用統一初始化。 代替 int i = 0 使用 int i{0}。 您可以在 google 上閱讀有關統一初始化的更多信息。
盡量不要使用“使用命名空間 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.