用C增加结构施工时间



我刚开始使用C,我有一项任务要在输入的日期上添加1分30秒,该日期由年月日小时分秒组成。

所以,我使用了结构构造,因为它是其中一个需求。然而,在我不得不处理的许多案件之前,一切看起来都很好。例如,如果输入的日期是2014/12/31 23:58:30或2014/2/28 23:59:00,我必须更改所有内容。。最简单的方法是用if语句检查它,但我认为应该有另一种方法,而不是为我想处理的每一个案例编写大量的if语句。你能告诉我是否还有其他更清晰的方法吗?

struct{
 int day;
 int month;
 int year;
 }a;
struct{
 int hours;
 int minutes;
 int seconds;
 }b;

我认为这种方式可能会产生更多的if语句。另外一个要求是添加0,例如,如果月份输入为3,输出应该是03。无论如何,我似乎无法摆脱"电话号码"if语句。感谢您的回答和花费的时间!!

因此,让我们假设您并不关心时间中所有真正困难的部分。例如:闰秒、闰年、夏令时、更改为夏令时以及时区更改。

如果您不这样做,那么让我们像构建自定义添加运算符一样来考虑这个问题。

struct time {
    unsigned year;
    unsigned month;
    unsigned day;
    unsigned hour;
    unsigned minute;
    unsigned second;
};
struct time time_add(struct time date, struct time delta) {
    date.year   += delta.year;
    date.month  += delta.month;
    date.day    += delta.day;
    date.hour   += delta.hour;
    date.minute += delta.minute;
    date.second += delta.second;
    // Implement corrections
    while (date.second >= 60) {
        date.second -= 60;
        date.minute += 1;
    }
    while (date.minute >= 60) {
        date.minute -= 60;
        date.hour += 1;
    }
    while (date.hour >= 24) {
        date.hour -= 24;
        date.day += 1;
    }
    // and so on..
    return date;
}

使用这种方法,你应该能够显著减少你必须处理的案件数量。

如果你想用某种方法来缩写它(或者用一些通用的方法来添加奇怪的、可变的、记数的数字,比如旧的便士、先令和英镑系统),试着把这些东西放在一个数组中,把每个数字的编号基数放在另一个固定数组中,这样你就可以做一些事情,比如:

int basis[] = {
    100, /* hundreds of a second in a second */
    60,  /* secs in a minute */
    60,  /* mins in an hour */
    12,  /* hours in a cycle(AM/PM) */
    2,   /* cycles in a day */
    30,  /* days, but be careful, not all months have 30 days */
    12,  /* months */
    100, /* years in a century */
    0,   /* centuries, and sentinel to stop. */
};
int carry = 0;
int i;
for (i = 0; i; i++) { /* sum array a and b into c */
    c[i] = a[i] + b[i] + carry; /* sum digit i */
    carry = c[i] / basis[i]; /* determine carry, can be abreviated */
    c[i] %= basis[i]; /* determine final value, can be abreviated */
} /* for */
c[i] = a[i] + b[i] + carry;  /* finally, centuries, not based */

最新更新