程序因循环而冻结
Program gets frozen because of a loop
我正在制作一个程序,该程序通过为程序提供日期和天数来计算日期,以便在输入中添加到该日期。为此,我需要进行切换并使其循环重复,但由于某些原因,程序被冻结并且在用户插入要添加的天数后不执行任何操作。我试过删除循环并且程序有效。
期待有人能帮我解决这个问题。
这是获取要添加到循环末尾的天数的代码部分:
cin>>addDays;
while (addDays > 0) {
switch (month) {
//months with 31 days
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
{
finalDay = day + addDays;
if (finalDay > 31) {
addDays = finalDay - 31;
month++;
day = 1;
}
break;
}
//months with 30 days
case 4:
case 6:
case 9:
case 11:
{
finalDay = day + addDays;
if (finalDay > 30) {
addDays = finalDay - 30;
month++;
day = 1;
}
break;
}
//december
case 12:
{
finalDay = day + addDays; //oggi è 10. Voglio aggiungere 30
if (finalDay > 31) { //40 è maggiore di 31
addDays = finalDay - 31; //l'aggiunta 30 diventa 40 - 31 che fa 9
year++;
day = 1;
month = 1;
}
break;
}
//february
case 2:
{
finalDay = day + addDays;
if (year % 4 == 0) {
if (finalDay > 29) {
addDays = finalDay - 29;
month++;
day = 1;
}
}
else {
if (finalDay > 28) {
addDays = finalDay - 28;
month++;
day = 1;
}
}
break;
}
}
}
你的循环运行直到 addDays
下降到 <= 0
。问题是,当你将 addDays
添加到 day
时,如果结果 finalDay
是 在当前 month
的数量内天,你没有打破循环,你没有调整day
或addDays
的值,所以循环再次迭代相同的 day
和 addDays
值,计算相同的 finalDay
值,一遍又一遍,无休止。这就是您的程序出现冻结的原因。
修正后,您也没有考虑 addDays
可能跨越超过一个月的天数的可能性。用户可以要求一次添加超过 1 个月。因此,您需要每月更精细地调整 addDays
。
另外,当当前month
是2
(二月)时,你的闰年计算不完整。被 4
整除并不是您需要检查以了解 year
是否为闰年的唯一规则。可以被 4
和 100
整除但不能被 400
整除的 year
不是闰年。
话虽如此,请尝试更像这样的东西:
bool isLeapYear(int year)
{
return ((year % 4) == 0) &&
(((year % 100) != 0) || ((year % 400) == 0));
}
int lastDayInMonth(int year, int month)
{
switch (month) {
//months with 31 days
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
//months with 30 days
case 4:
case 6:
case 9:
case 11:
return 30;
//month with 28 or 29 days
case 2:
return isLeapYear(year) ? 29 : 28;
}
return 0;
}
int year, month, day, addDays, lastDay;
...
cin >> addDays;
while (addDays > 0) {
lastDay = lastDayInMonth(year, month);
day += addDays;
if (day <= lastDay) break;
addDays -= (lastDay - day);
if (++month == 13) {
++year;
month = 1;
}
day = 1;
}
也就是说,看看 this answer,它将这种逻辑包装在一个名为 Date
的可重用 struct
中,它有一个重载的 operator+=
添加天数。
非常感谢您的帮助!你让我明白错误在哪里。我已经修好了,现在可以正常使用了。但是因为我没有你那么有经验,而且我在阅读该代码时遇到了困难,所以我没有像你那样做,而是在 [=13= 中的每个 if
中添加了一个 else
],这会将 addDays
重置为 0,因为赋值语句会复制它们的值,它们不会移动它,出于某些原因我没有考虑这个愚蠢而基本的事情。
也感谢您让我注意到不完整的闰年算法。
这是固定代码。祝你有美好的一天!
cin>>addDays;
while (addDays > 0) {
switch (month) {
//months with 31 days
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
{
finalDay = day + addDays;
if (finalDay > 31) {
addDays = finalDay - 31;
month++;
day = 0;
}
else {
addDays = 0;
}
break;
}
//months with 30 days
case 4:
case 6:
case 9:
case 11:
{
finalDay = day + addDays;
if (finalDay > 30) {
addDays = finalDay - 30;
month++;
day = 0;
}
else {
addDays = 0;
}
break;
}
//december
case 12:
{
finalDay = day + addDays; //oggi è 10. Voglio aggiungere 30
if (finalDay > 31) { //40 è maggiore di 31
addDays = finalDay - 31; //l'aggiunta 30 diventa 40 - 31 che fa 9
year++;
day = 0;
month = 1;
}
else {
addDays = 0;
}
break;
}
//february
case 2:
{
finalDay = day + addDays;
if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) {
if (finalDay > 29) {
addDays = finalDay - 29;
month++;
day = 0;
}
else {
addDays = 0;
}
}
else {
if (finalDay > 28) {
addDays = finalDay - 28;
month++;
day = 0;
}
else {
addDays = 0;
}
}
break;
}
}
}
我正在制作一个程序,该程序通过为程序提供日期和天数来计算日期,以便在输入中添加到该日期。为此,我需要进行切换并使其循环重复,但由于某些原因,程序被冻结并且在用户插入要添加的天数后不执行任何操作。我试过删除循环并且程序有效。 期待有人能帮我解决这个问题。
这是获取要添加到循环末尾的天数的代码部分:
cin>>addDays;
while (addDays > 0) {
switch (month) {
//months with 31 days
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
{
finalDay = day + addDays;
if (finalDay > 31) {
addDays = finalDay - 31;
month++;
day = 1;
}
break;
}
//months with 30 days
case 4:
case 6:
case 9:
case 11:
{
finalDay = day + addDays;
if (finalDay > 30) {
addDays = finalDay - 30;
month++;
day = 1;
}
break;
}
//december
case 12:
{
finalDay = day + addDays; //oggi è 10. Voglio aggiungere 30
if (finalDay > 31) { //40 è maggiore di 31
addDays = finalDay - 31; //l'aggiunta 30 diventa 40 - 31 che fa 9
year++;
day = 1;
month = 1;
}
break;
}
//february
case 2:
{
finalDay = day + addDays;
if (year % 4 == 0) {
if (finalDay > 29) {
addDays = finalDay - 29;
month++;
day = 1;
}
}
else {
if (finalDay > 28) {
addDays = finalDay - 28;
month++;
day = 1;
}
}
break;
}
}
}
你的循环运行直到 addDays
下降到 <= 0
。问题是,当你将 addDays
添加到 day
时,如果结果 finalDay
是 在当前 month
的数量内天,你没有打破循环,你没有调整day
或addDays
的值,所以循环再次迭代相同的 day
和 addDays
值,计算相同的 finalDay
值,一遍又一遍,无休止。这就是您的程序出现冻结的原因。
修正后,您也没有考虑 addDays
可能跨越超过一个月的天数的可能性。用户可以要求一次添加超过 1 个月。因此,您需要每月更精细地调整 addDays
。
另外,当当前month
是2
(二月)时,你的闰年计算不完整。被 4
整除并不是您需要检查以了解 year
是否为闰年的唯一规则。可以被 4
和 100
整除但不能被 400
整除的 year
不是闰年。
话虽如此,请尝试更像这样的东西:
bool isLeapYear(int year)
{
return ((year % 4) == 0) &&
(((year % 100) != 0) || ((year % 400) == 0));
}
int lastDayInMonth(int year, int month)
{
switch (month) {
//months with 31 days
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
//months with 30 days
case 4:
case 6:
case 9:
case 11:
return 30;
//month with 28 or 29 days
case 2:
return isLeapYear(year) ? 29 : 28;
}
return 0;
}
int year, month, day, addDays, lastDay;
...
cin >> addDays;
while (addDays > 0) {
lastDay = lastDayInMonth(year, month);
day += addDays;
if (day <= lastDay) break;
addDays -= (lastDay - day);
if (++month == 13) {
++year;
month = 1;
}
day = 1;
}
也就是说,看看 this answer,它将这种逻辑包装在一个名为 Date
的可重用 struct
中,它有一个重载的 operator+=
添加天数。
非常感谢您的帮助!你让我明白错误在哪里。我已经修好了,现在可以正常使用了。但是因为我没有你那么有经验,而且我在阅读该代码时遇到了困难,所以我没有像你那样做,而是在 [=13= 中的每个 if
中添加了一个 else
],这会将 addDays
重置为 0,因为赋值语句会复制它们的值,它们不会移动它,出于某些原因我没有考虑这个愚蠢而基本的事情。
也感谢您让我注意到不完整的闰年算法。 这是固定代码。祝你有美好的一天!
cin>>addDays;
while (addDays > 0) {
switch (month) {
//months with 31 days
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
{
finalDay = day + addDays;
if (finalDay > 31) {
addDays = finalDay - 31;
month++;
day = 0;
}
else {
addDays = 0;
}
break;
}
//months with 30 days
case 4:
case 6:
case 9:
case 11:
{
finalDay = day + addDays;
if (finalDay > 30) {
addDays = finalDay - 30;
month++;
day = 0;
}
else {
addDays = 0;
}
break;
}
//december
case 12:
{
finalDay = day + addDays; //oggi è 10. Voglio aggiungere 30
if (finalDay > 31) { //40 è maggiore di 31
addDays = finalDay - 31; //l'aggiunta 30 diventa 40 - 31 che fa 9
year++;
day = 0;
month = 1;
}
else {
addDays = 0;
}
break;
}
//february
case 2:
{
finalDay = day + addDays;
if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) {
if (finalDay > 29) {
addDays = finalDay - 29;
month++;
day = 0;
}
else {
addDays = 0;
}
}
else {
if (finalDay > 28) {
addDays = finalDay - 28;
month++;
day = 0;
}
else {
addDays = 0;
}
}
break;
}
}
}