2017-08-26 235 views
1

我有這個函數檢查日期是否在範圍內。默認情況下不會執行C++

bool check_date(const int &in_day, const int &in_month, const int &in_year) 
{ 
    if (in_year < 1582) 
     return false; 
    else if (in_year == 1582 && in_month < october) 
     return false; 
    else if (in_month < 1 || in_month > 12) 
     return false; 

    switch (in_month) 
    { 
    case january:  // 31 days 
     if (in_day < 1 || in_day > 31) 
      return false; 
     break; 

    case february:  // 28 days, 29 if leap. 
     if (is_leap(in_year)) 
     { 
      if (in_day > 29 || in_day < 1) 
       return false; 
     } 
     else 
     { 
      if (in_day > 28 || in_day < 1) 
       return false; 
     } 

    case march:   // 31 days 
     if (in_day < 1 || in_day > 31) 
      return false; 
     break; 

    case april:   // 30 days 
     if (in_day < 1 || in_day > 30) 
      return false; 
     break; 

    case may:   // 31 days 
     if (in_day < 1 || in_day > 31) 
      return false; 
     break; 

    case june:   // 30 days 
     if (in_day < 1 || in_day > 30) 
      return false; 
     break; 

    case july:   // 31 days 
     if (in_day < 1 || in_day > 31) 
      return false; 
     break; 

    case august:  // 31 days 
     if (in_day < 1 || in_day > 31) 
      return false; 
     break; 

    case september:  // 30 days 
     if (in_day < 1 || in_day > 30) 
      return false; 
     break; 

    case october:  // 31 days 
     if (in_day < 1 || in_day > 31) 
      return false; 
     break; 

    case november:  // 30 days 
     if (in_day < 1 || in_day > 30) 
      return false; 
     break; 

    case december:  // 31 days 
     if (in_day < 1 || in_day > 31) 
      return false; 
     break; 
    default: 
     std::cout <<"CORRECT DATE"; 
    } 

    return true; 

} 

雖然代碼工作在它返回真假,它應該,在default:情況下,從來沒有被選中,即使日期是正確的,例如在in_day = 17, in_month = 9, in_year = 1999。起初我在默認情況下有return true;,但它永遠不會返回true,並且在運行調試器後,我發現默認情況下從未運行過,所以我將return移出switch語句(它在那裏工作)。我做錯了什麼,爲什麼不執行默認情況?你永遠不輸入默認的情況下 - 如果你通過任何東西,除了一月至十二月 既然你測試開關前的範圍

+2

「1月」,「二月」等定義在哪裏? –

+2

「1月,2月」等定義在哪裏? – Malice

+0

你應該用所有警告和調試信息編譯你的代碼(如果使用[GCC](http://gcc.gnu.org/),'g ++ -Wall -Wextra -g')然後**使用調試器* *('gdb')。你的修復我的代碼問題在這裏脫離主題。 –

回答

1

這是可達代碼

switch (in_month) { 
    default: // if (in_month < 1 || in_month > 12) 
    std::cout << "BAD month: "; 
    return false; 

看到這個優化和清理代碼:
defaultswitch (in_month),如果你想使用defaultswitch (in_month)你不需要if (in_month < 1 || in_month > 12)看到的是等於

if (in_month < 1 || in_month > 12) return false; 

所以

#include <iostream> 
using namespace std; 

enum { 
    january = 1, 
    february, 
    march, 
    april, 
    may, 
    june, 
    july, 
    august, 
    september, 
    october, 
    november, 
    december 
}; 
bool is_leap(const int year) { 
    if (year % 400 == 0) 
    return true; 
    if (year % 100 == 0) 
    return false; 
    if (year % 4 == 0) 
    return true; 
    return false; 
} 
bool check_date(const int in_day, const int in_month, const int in_year) { 
    if (in_year < 1582) 
    return false; 
    if (in_year == 1582 && in_month < october) 
    return false; 

    switch (in_month) { 
    default: // if (in_month < 1 || in_month > 12) 
    std::cout << "BAD DATE: "; 
    return false; 

    case january: // 31 days 
    if (in_day < 1 || in_day > 31) 
     return false; 
    break; 

    case february: // 28 days, 29 if leap. 
    if (is_leap(in_year)) { 
     if (in_day > 29 || in_day < 1) 
     return false; 
    } else { 
     if (in_day > 28 || in_day < 1) 
     return false; 
    } 
    break; 

    case march: // 31 days 
    if (in_day < 1 || in_day > 31) 
     return false; 
    break; 

    case april: // 30 days 
    if (in_day < 1 || in_day > 30) 
     return false; 
    break; 

    case may: // 31 days 
    if (in_day < 1 || in_day > 31) 
     return false; 
    break; 

    case june: // 30 days 
    if (in_day < 1 || in_day > 30) 
     return false; 
    break; 

    case july: // 31 days 
    if (in_day < 1 || in_day > 31) 
     return false; 
    break; 

    case august: // 31 days 
    if (in_day < 1 || in_day > 31) 
     return false; 
    break; 

    case september: // 30 days 
    if (in_day < 1 || in_day > 30) 
     return false; 
    break; 

    case october: // 31 days 
    if (in_day < 1 || in_day > 31) 
     return false; 
    break; 

    case november: // 30 days 
    if (in_day < 1 || in_day > 30) 
     return false; 
    break; 

    case december: // 31 days 
    if (in_day < 1 || in_day > 31) 
     return false; 
    break; 
    } 
    std::cout << " CORRECT DATE: "; 
    return true; 
} 
int main() { 
    cout << check_date(0, 0, 2017) << endl; // 0 
    cout << check_date(29, 2, 2000) << endl; // 1 
    cout << check_date(29, 2, 2017) << endl; // 0 
    cout << check_date(1, 1, 2017) << endl; 
    cout << check_date(1, 1, 2017) << endl; 
    cout << check_date(1, 1, 2017) << endl; 
} 

輸出:

BAD month: 0 
CORRECT DATE: 1 
0 
CORRECT DATE: 1 
CORRECT DATE: 1 
CORRECT DATE: 1 
5

違約將被執行。

你需要做的是什麼 - 是把你的

std::cout <<"CORRECT DATE"; 

出開關和返回真之前把它; - 當你的測試通過並且你沒有返回錯誤時,你會從任何情況下到達那裏,而不是返回錯誤 - 而是打破分支。

相關問題