在C

时间:2018-06-16 09:33:57

标签: c

目前我有两个存储年月的变量。

示例:

  

var1:201711

     

var2:201801

首先,我想找出变量中的月份是否连续年份。如果没有,那么我想创建一个循环,以便我可以获得var1和2之间的月份。

if( MonthsDifference(var2,var1) = 1 )
{
    ....
}
else
{
     for ( a = 1 ; a <= MonthsDifference(var2 - var1) ; a++)
     {
           printf("Next month is:[%d]",addmonths(var1,1));
     }
}

我无法想象一个逻辑来获得月份差异&amp;也有效地增加了几个月。价值类型&amp; var1&amp;存储的数据(年 - 月) 2是灵活的,可以以任何方式优先。

提前致谢。

2 个答案:

答案 0 :(得分:1)

似乎两个变量中的年份和月份的编码方案是:

combined_value = year * 100 + month

因此,较低的两位小数是月份,高位数(通常为4位)是年份。好吧,我们知道如何在C中提取十进制数字:

lower_decimal_digit = num % 10
lower_2_decimal_digits = num % 100

等等(我们也可以用可变数字的数字来做这个,但这里不需要)。同样,我们只能保留更高的数字:

all_but_lower_decimal_digit = num / 10
all_but_lower_2_decimal_digits = num / 100

所以在你的情况下,这两个命令:

int year = combined / 100;
int month = combined % 100;

诀窍。我相信你可以从那里出发。

答案 1 :(得分:1)

迭代列表的常规是

for (var = first_item; end_not_reached(var); var = next_after(var))

您的编码具有正确的日期顺序,即var1 <= var2早于var1时的var2。因此,要检查您是否已到达列表的末尾,您需要做的就是将迭代器与结束日期进行比较。

在给定日期之后的下个月由以下函数给出:

int next_month(int date) {
    return date % 100 == 12 ? date + 89 : date + 1;
}

因此:

if (next_month(var1) == var2)
    ... // the months are consecutive with var1 just before var2

for (var = var1; var <= var2; var = next_month(var)) {
    …
}