闰年计划似乎没有运行

时间:2016-03-11 11:27:22

标签: c++ date if-statement statements

问题 - 366天的一年被称为闰年。如果一年可以被4整除(例如1980年),那么它就是闰年,除非它可以被100整除(例如,1900年),它不是闰年;但是,如果它可以被400整除(例如,2000年),那么它就是闰年。在1582年10月15日引入公历之前没有例外。编写一个程序,询问用户一年,并计算该年是否是闰年。

这是我到目前为止所做的,而且该计划似乎没有超过1582年的运行。有人可以帮我解释原因吗?非常感谢

using namespace std;

int main()
{
cout<< "Pleas enter a year: " <<endl;
int year = 0;
cin >> year;

if (year <= 1581)
{
    if (year % 4 == 0)
    {
        cout << "It's a leap year, wow! " << endl;
    }

    else 
    {
        cout << "It's not a leap year " << endl;

    }
}

else if (year > 1581)
{
    if (year % 4 == 0)
    {
        if (year % 100 == 0)
        {
            cout<< "It is not a leap year " << endl;
        }
        else if (year % 400 == 0)
        {
            cout<< "It is a leap year, Wow!" << endl;
        }
    }

}

else
{
    cout<< "You entered a wrong year number "<< year<<  endl;
}

return 0;
}

7 个答案:

答案 0 :(得分:1)

你使它变得非常复杂。我不认为您需要关心年份是否大于1582(对于4位数字),前提是闰年是:

•可被400整除   
•不能被100整除 AND 整除4 使用不必要的嵌套ifs会使代码变长并且容易出错。试试这个方法:

#include<iostream.h>
int main(){
    int y=0;
    cout << "Enter a year\n";
    cin >> y;
    cout <<"\n"<<y;
    if(y%400==0 || (y%100!=0 && y%4==0))
    cout <<" is a leap year";
    else
    cout <<" is not a leap year";
    return 0;
}

答案 1 :(得分:1)

不检查年份&gt; 1582

                <?php
                error_reporting(E_ALL ^ E_DEPRECATED);





                $username = "root_jdc";

                $password = "password";

                $hostname = "localhost";

                $database = "table_customers";



                $conn = mysql_connect($hostname, $username, $password)

                or die("Connecting to MySQL failed");

                mysql_close($conn);

                if ($conn) {
                    if (isset($_GET["end"])) {
                        //this is calendar query. 
                        //form an array of events
                        $arr = array();
                        $from_date = htmlspecialchars($_GET["end"]);
                        $to_date   = htmlspecialchars($_GET["end"]);
                        $sql_string = "SELECT count(DISTINCT id) as title, date as ShipDate FROM players3 group by date";



                        $result = mysql_fetch_assoc($sql_string);


                        //odbc_result_all($result);
                        // Fetch rows:
                        while(mysql_fetch_array($result))
                        {
                            if (!mysql_result($result,2)) continue;
                            //collect results
                            $title=mysql_result($result,1);
                            $date=mysql_result($result,2);


                            $arr[] = array(
                                'title' => $title,
                                'url' => 'myfeed.php?dt='.substr($date, 0, 10),
                                'start' => substr($date, 0, 10)
                            );
                        }
                        echo json_encode($arr);
                    }
                }

                    ?>

答案 2 :(得分:0)

在1581年之后的几年中,你遗漏了许多案件。

  • 打印&#34;没有闰年&#34;除非(年%4 == 0)
  • 第三种情况,其中可被4整除的年份既不能被100整除也不会被400整理

就像你刚刚没有编写2004年年份时运行的任何代码一样简单。

答案 3 :(得分:0)

你缺少其他2声明

using namespace std;

int main()
{
cout<< "Pleas enter a year: " <<endl;
int year = 0;
cin >> year;

if (year <= 1581)
{
    if (year % 4 == 0)
    {
        cout << "It's a leap year, wow! " << endl;
    }

    else 
    {
        cout << "It's not a leap year " << endl;

    }
}

else if (year > 1581)
{
    if (year % 4 == 0)
    {
        if (year % 100 == 0)
        {
            cout<< "It is not a leap year " << endl;
        }
        else if (year % 400 == 0)
        {
            cout<< "It is a leap year, Wow!" << endl;
        }
        // <----------- Here you are missing an else
    }
    // <----------- Here you are missing an else
}

else
{
    cout<< "You entered a wrong year number "<< year<<  endl;
}

return 0;
}

答案 4 :(得分:0)

我建议

if (    ((year % 400) == 0)
     || (   ((year % 4) == 0) // or (year & 0x3) == 0
         && (   (year <= 1581)
             || ((year % 100) != 0) )))
   cout << "It's a leap year, wow! " << endl;
else
   cout << "It's not a leap year " << endl;

if (    ((year % 4) == 0) // or  year & 0x3 == 0
     && (   (year <= 1581)
         || ((year % 100) != 0)
         || ((year % 400) == 0) ) )
   cout << "It's a leap year, wow! " << endl;
else
   cout << "It's not a leap year " << endl;

答案 5 :(得分:0)

简化条件是一个好主意。一种通用的方法是转换为合取或析取的范式,并首先进行最有可能短路的测试。对于像这样的简单情况,您只需注意一下即可。

在这种情况下,联合范式非常简单:

year%4 == 0 &&
( year < 1582 || year%100 != 0 || year%400 == 0 )

也就是说,年份可以被四整除,公历改革的三个条件中的任何一个都不成立。由于第一个&&项为假,第一个||项为真,因此将表达式短路了,因此我们要首先把最有可能短路的子句放在首位。 / p>

请注意,如果您更容易阅读,则可以在条件表达式内对year%100 != 0year%100进行代码转换,对year%2000 == 0!(year%2000)进行编码。 >

将其移至辅助功能很有意义。我们可以将其标记为constexpr,以向编译器提供提示,使其可以计算常量在编译时是否为leap年。

我不喜欢对看似家庭作业的问题发表完整的答案,但是那艘船已经航行了。

#include <cstdlib>
#include <iostream>

using std::cin;
using std::cout;

constexpr bool is_leap(const int year)
{
  // Conjunctive normal form:
  return ( year%4 == 0 &&
           ( year < 1582 || year%100 != 0 || year%400 == 0 ) );
}

int main()
{
  int year = 0; // Used only within the body of the loop that sets it.

  while (cin >> year)
    cout << year
         << ( is_leap(year) ? " is a leap year.\n"
                            : " is not a leap year.\n" );

  return EXIT_SUCCESS;
}

即使对于像这样的琐碎程序,也有一个值得考虑的设计决策:我们将int year;声明为未初始化,还是将其初始化为诸如int year = 0;之类的错误值?在这种情况下,这都是安全的,因为year仅在设置它的循环体内使用。但是,如果我们不初始化它,我们稍后可能会重构代码以在循环外使用year,然后可能会有一个在初始化之前使用year的代码路径(导致未定义的行为) !)另一方面,如果我们确实初始化year,则可能会阻止编译器注意到在将其初始化为真实之前已经使用了某个路径。我个人更喜欢将其初始化为无效值,并assert将其初始化后再使用。

答案 6 :(得分:-1)

或者您可以简单地编写以下程序:

#include<iostream>
using namespace std;

int main()
{
    int year;
    cout << "Enter year: ";
    cin >> year;

    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
        cout << "It is a leap year" << endl;
    }
    else{
        cout << "It is not a leap year" << endl;
    }
    return 0;
}