- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
是的,这是一项作业——所以请不要发布解决方案,但详细的伪代码非常有帮助!
我已经有一个 C++ 程序可以接受来自用户的日期并确定它是否是闰年。
到目前为止,这是我的闰年函数(我希望这是正确的逻辑):
bool isLeapYear (int year){
int leapYear = 0;
//leapyear = 1 when true, = 0 when false
if ((year%400 == 0) && (year%100 != 100)) {
leapYear = 1;
}
else if (year%4 == 0) {
leapYear = 1;
}
else {
leapYear = 0;
}
if (leapYear == 1) {
return 1;
}
else {
return 0;
}
}
下面是我接下来必须做的事情的解释:
You MUST use a loop that adds months one at a time to an accumulated sum. Don't use any hardcoded values Such as 152 for the first 5 months in a leap year
澄清一下,这是我的第一堂编程课,上这门 C++ 课已经快一个月了。因此,如果有人能帮我弄清楚如何执行循环语句来添加月份数,我将不胜感激?(IE:12/31/2013 在非闰年应为“365”,在闰年应为“366”)。
我知道这是错误的,但这是我目前所拥有的函数“dayNumber”,它只是将一年中的天数返回给主函数(调用 dayNumber 函数):
int dayNumber (int day, int month, int year){
//variable declarations
int sumTotal = 0;
for ( int loop = 1; loop < month; loop++) {
sumTotal = (( month-1 ) * 31);
sumTotal = sumTotal + day + 1;
if ( (loop==4) || (loop=6) || (loop=9) ||
(loop==11) ) {
sumTotal = ( sumTotal - 1 );
}
else if ( isLeapYear(year) == 1 ) {
sumTotal = (sumTotal - 2);
}
else {
sumTotal = (sumTotal - 3);
}
}
return sumTotal;
}
在我知道的几天里,我开始弄乱它以获得适当的值(value),但它有点搞砸了,哈哈。
如果有人对如何正确执行循环有任何指导,我将非常感激!:)
编辑:好吧,我想我可能已经回答了我自己的问题。
int dayNumber (int day, int month, int year){ //variable declarations int sumTotal = 0;
for ( int loop = 1; loop < month; loop++) { sumTotal = ( sumTotal + 31 );
if ( (loop==4) || (loop==6) || (loop==9) ||
(loop==11) ) {
sumTotal = ( sumTotal - 1 );
}} if ((month !=2) && (month > 1)) { if (isLeapYear(year) ==1) { sumTotal = ( sumTotal - 2 ); } else { sumTotal = ( sumTotal - 3); } }
else { sumTotal = sumTotal; } sumTotal = sumTotal + day;
return sumTotal; }
我肯定需要处理我的循环。我很高兴让我知道我的“=”应该是“==”!
我相信这是一个使用足够简单循环的合适代码?我将测试更多日期。到目前为止,我只测试了类(class)网站上提供的少数几个。
我不能回复我自己的帖子,我没有足够的声誉。
最佳答案
我知道一个答案已经被接受了,但是我自己写了一些时间,让我们看看它是否可以增加一些整体信息。
让我们慢慢回顾。
首先,您的 isLeapYear()
函数不完全正确。
无需深入研究算法部分,可以改进两三件事。
您返回的是 bool
,而您的 return 语句返回的是 int
。这本身并没有错,但是使用 true
和 false
关键字可以提高可读性和一致性。
您应该立即返回结果,而不是创建、分配和返回变量。
在运算符周围添加空格:year%400
应变为 year %400
。
现在是您的代码。
这个条件:
if ((year%400 == 0) && (year%100 != 100))
...尤其是这部分:
(year%100 != 100)
没有按照您的期望行事。
总的来说,算法如下:
if year is not divisible by 4 then common year
else if year is not divisible by 100 then leap year
else if year is not divisible by 400 then common year
else leap year
用代码翻译:
/**/ if (year % 4 != 0)
return false;
else if (year % 100 != 0)
return true;
else if (year % 400 != 0)
return false;
else
return true;
现在让我们稍微简化一下:
/**/ if (year % 4 == 0 && year % 100 != 0)
return true;
else if (year % 400 == 0)
return true;
else
return false;
再次:
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return true;
else
return false;
最后,可以直接返回整个 bool 表达式:
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
现在您的函数是正确的,让我们尝试对您的 dayNumber
函数使用算法:
如果参数中提供的日期被认为是正确的,那么算法就很简单了:
0
开始sum
month
的循环已排除
month
是 Frebruary,则如果 isLeapYear
返回 true
,则加 29,否则加 28month
是一月、三月、五月、七月、八月、十月或十二月,则加 31day
添加到 sum
。关于c++ - 在 C++ 中,使用循环查找任何给定日期的天数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24487958/
我是一名优秀的程序员,十分优秀!