2015-11-02 64 views
1

我編寫了這段代碼來確定輸入年份是否爲閏年。意思是,可以被4和400整除的那些是閏年,並且是100或者其他什麼都不是。閏年基本C++布爾總是返回true

但是,我的程序總是布爾值返回true,這樣輸出纔會相信每年爲閏年。

這裏是我到目前爲止的代碼:

#include <iostream> 
#include <cmath> 
#include <string> 
#include <iomanip> 

using namespace std; 
bool leap_year(int year); 
int main() 
{ 
    int year; 
    bool leap_year(int year); 
    cout << "Please input the year in question: "; 
    cin >> year; 
    if (leap_year == false) 
    { 
     cout << "The year is not a leap year. "; 
    } 
    else 
    { 
     cout << "The year is a leap year. "; 
    } 
    return 0; 
} 
    bool leap_year(int year) 
{ 

    if (year % 4 == 0) 
    { 
     bool leap_year = true; 
    } 
    else if (year % 400 == 0) 
    { 
     bool leap_year = true; 
    } 
    else if (year % 100 == 0) 
    { 
     bool leap_year = false; 
    } 
    else 
    { 
     bool leap_year = false; 
    } 

    if (bool leap_year = false) 
    { 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 
+1

它不應該總是返回TRUE;因爲[它不應該編譯](HTTP:// coliru .stacked-crooked.com /一個/ 71aea1ab488cdd36)。 – chris

+0

它絕對編譯。我使用Visual Studio 2015 Express版作爲編譯器。 – marihikari

+0

有趣的是,GCC也編譯它(帶有警告)。但是,從一些閱讀中,我仍然相信克朗是對的。編輯:GCC是錯誤的,我想這是因爲它仍然接受'false'作爲空指針常量(即,它可以讓你做'int * p = false;')。 – chris

回答

8

您聲明一堆局部變量

else if (year % 100 == 0) 
{ 
    bool leap_year = false; 
} 

一旦}括號,這個變量超出範圍等做了你所儲存的價值。

if (bool leap_year = false) 
{ 
    return false; 
} 

這是定義一個變量leap_year並將其賦值爲false。如果反過來會評估錯誤,因此它總是會去其他條件。

我冒昧地重寫了一部分程序。您現在可以看到如何調用該函數。同樣在函數中使用局部變量is_leap_year來存儲返回值,並最終返回。我也修正了這個邏輯,因爲早些時候第一個%4檢查是真的,其他的if語句都不會執行,這不是你想要的。

#include <iostream> 
#include <cmath> 
#include <string> 
#include <iomanip> 

using namespace std; 
bool leap_year(int year); 
int main() 
{ 
    int year; 
    cout << "Please input the year in question: "; 
    cin >> year; 
    if (leap_year(year) == false) //Call the function and check if return is false 
    { 
     cout << "The year is not a leap year. "; 
    } 
    else 
    { 
     cout << "The year is a leap year. "; 
    } 
    return 0; 
} 
    bool leap_year(int year) 
{ 
    bool is_leap_year = false; 
    if (year % 4 == 0) 
    { 
     is_leap_year = true; 
    } 
    if (year % 100 == 0) 
    { 
     is_leap_year = false; 
    } 
    if (year % 400 == 0) 
    { 
     is_leap_year = true; 
    } 
    return is_leap_year; 
} 
+0

感謝您的解釋!儘管試圖讓Leap_year返回一個值到主函數是很有趣的,否則。 – marihikari

+0

@marihikari我已更新您的原始程序的變化。希望這應該能夠解決問題。 – Imran

+0

謝謝,它有點幫助,但我很困惑這是如何插入leap_year函數? – marihikari

1

應該 IF(!(年%4 == 0 & &年100%= 0)||(每年400%== 0)) 返回ISLEAPYEAR。

1

你的問題是,你的條件是否返回truefalse是:

if (bool leap_year = false) 
{ 
    return false; 
} 
else 
{ 
    return true; 
} 

您分配值false到您在條件語句中初始化變量leap_year。賦值運算符的定義如下:T& T::operator =(const T2& b)這意味着您總是在您的條件下評估false。要解決這個

一種方法是在bool leap_year(int year)頂部申報leap_year,而不是每次使用它的時候那麼你的函數應該是這樣的(這是毫無意義的行爲。):

bool leap_year(int year) { 
    bool leap_year = false; 

    if (year % 4 == 0) { 
     leap_year = true; 
    } else if (year % 400 == 0) { 
     leap_year = true; 
    } else if (year % 100 == 0) { 
     leap_year = false; 
    } 

    if (leap_year == false) { 
     return false; 
    } else { 
     return true; 
    } 
} 

但更好的解決方案將是使用the functionality that C++ already provides

bool leap_year(int year) { 
    tm bar = { 0, 0, 0, 29, 1, year - 1900 }; 

    return static_cast<time_t>(-1) != mktime(&bar) && bar.tm_mday == 29 && bar.tm_mon == 1 && bar.tm_year == year - 1900; 
} 

[Live Example]

+0

這將是一個很好的解決方案。不知何故,當我嘗試類似的東西時,它仍然不會返回錯誤的值。將繼續工作,但感謝您的迴應:) – marihikari

+0

@marihikari +1看起來你是正確的。在gcc 5.1.0和Visual Studio 2015中似乎存在一個錯誤。我在那裏發生了一個新的問題:http://stackoverflow.com/questions/33477379/mktime-only-handling-leap-years -on-clang –

+0

@marihikari成功[此答案](http://stackoverflow.com/a/33478052/2642059)包含一個完全跨平臺標準實施的解決方案!我已經更新了我的答案以包含它。 –

1
//You can simplify it like this: 
bool leap_year(int year) 
{ 
    bool leap_year = false; 
    if ((year % 4 == 0 && year%100 !=0) || year % 400 == 0) 
    { 
     bool leap_year = true; 
    } 
    return leap_year; 
} 

爲了避免這種情況:

if (leap_year = false) 
    { 
     return false; 
    } 

您可以檢查布爾值,這樣

if (leap_year) 
{ 
     // code to execute when leap_year is true 
}