我刚开始使用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 */