闰年基本 C++ 布尔值始终 returns true
Leap Year Basic C++ Boolean Always returns true
我写这段代码是为了判断输入的年份是否为闰年。意思是,那些能被 4 和 400 整除的是闰年,而被 100 或其他东西整除的则不是。
但是,我的程序对于布尔值总是 returns 真,这样输出就会相信每一年都是闰年。
到目前为止,这是我的代码:
#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;
}
}
应该是
IF ((年%4==0 && 年%100 !=0) || (年%400 == 0) )
return 过年。
你声明了一堆局部变量
else if (year % 100 == 0)
{
bool leap_year = false;
}
一旦 } 括号出现,此变量就会超出范围,您存储的值也会超出范围。
if (bool leap_year = false)
{
return false;
}
这是在定义一个变量 leap_year 并将其赋值为 false。 if 反过来将评估为 false,因此它将始终转到 else 条件。
我冒昧地重写了一部分程序。您现在可以看到如何调用该函数。同样在函数中,一个局部变量 is_leap_year 用于存储 return 值,最后被 returned。我还更正了逻辑,因为之前的第一个 %4 检查将为真,并且将执行其他 if 语句的 none,这不是您想要的。
#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;
}
你的问题是你的条件是 return true
还是 false
是:
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;
}
}
但更好的解决方案是使用 :
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;
}
//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
}
我写这段代码是为了判断输入的年份是否为闰年。意思是,那些能被 4 和 400 整除的是闰年,而被 100 或其他东西整除的则不是。
但是,我的程序对于布尔值总是 returns 真,这样输出就会相信每一年都是闰年。
到目前为止,这是我的代码:
#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;
}
}
应该是 IF ((年%4==0 && 年%100 !=0) || (年%400 == 0) ) return 过年。
你声明了一堆局部变量
else if (year % 100 == 0)
{
bool leap_year = false;
}
一旦 } 括号出现,此变量就会超出范围,您存储的值也会超出范围。
if (bool leap_year = false)
{
return false;
}
这是在定义一个变量 leap_year 并将其赋值为 false。 if 反过来将评估为 false,因此它将始终转到 else 条件。
我冒昧地重写了一部分程序。您现在可以看到如何调用该函数。同样在函数中,一个局部变量 is_leap_year 用于存储 return 值,最后被 returned。我还更正了逻辑,因为之前的第一个 %4 检查将为真,并且将执行其他 if 语句的 none,这不是您想要的。
#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;
}
你的问题是你的条件是 return true
还是 false
是:
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;
}
}
但更好的解决方案是使用 :
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;
}
//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
}