专业换油中心:C语言编程问题

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/03 03:32:19
用C语言编写一个程序:先输入一个时间(年、月、日),再输入一个时间(年、月、日),计算两个时间有多少天。其中要考虑到闰年的问题。

/*不支持负年,即公元前*/
#include <stdio.h>
long days(int y,int m,int d); /*函数返回从公元元年1月1日到y年m月d日的天数(包含公元元年1月1日)*/
main()
{
int y,m,d;
long Result;
printf("Enter Start Year,Month,Day:");/*输入第一个时间*/
scanf("%d,%d,%d",&y,&m,&d);
Result=days(y,m,d);
printf("Enter End Year,Month,Day:");/*输入第二个时间*/
scanf("%d,%d,%d",&y,&m,&d);
printf("Result is : %ld\n",Result=days(y,m,d)-Result);
getch();
}
long days(int y,int m,int d)
{
int i;
long days=0;
for(i=1;i<y;i++)
{
if(i%4==0&&i%100!=0||i%400==0)days+=366;
else days+=365;
}
if(m>2&&(y%4==0&&y%100!=0||y%400==0))days+=1;
switch(m)
{
case 2:days+=31;break;
case 3:days+=59;break;
case 4:days+=90;break;
case 5:days+=120;break;
case 6:days+=151;break;
case 7:days+=181;break;
case 8:days+=212;break;
case 9:days+=243;break;
case 10:days+=273;break;
case 11:days+=304;break;
case 12:days+=334;break;
}
days+=d;
return days;
}

我也想知道

/*
下面的代码在VC中测试了,仅供参考!可能放到TC下面还要改动。
先说一下思路吧:
其实很简单,
我们可以绕过闰年的问题,
一天总归就是就是3600*24秒,也就是86400秒,
time.h里面有一个tm的struct,可以设置年月日。
计算机里面时间一般是通过离1970年1月1日的秒数来定的,也可能是毫秒数。具体什么就不清楚了,我这里测下来好像是秒数,如果是毫秒数,就把最后除的86400改成86400000。
*/
#include <stdio.h>
#include <time.h>
#include <memory.h>

int main(int argc, char **argv)
{
tm tBegin = {0}, tEnd = {0};
int yBegin, mBegin, mdBegin, yEnd, mEnd, mdEnd;
time_t begin, end;
time_t interval;
printf("Begin Year: \n");
scanf("%d", &yBegin);
yBegin -= 1900;
printf("Begin Month: \n");
scanf("%d", &mBegin);
mBegin--;
printf("Begin Day: \n");
scanf("%d", &mdBegin);

tBegin.tm_year = yBegin;
tBegin.tm_mon = mBegin;
tBegin.tm_mday = mdBegin;

begin = mktime(&tBegin);

printf("End Year: \n");
scanf("%d", &yEnd);
yEnd -= 1900;
printf("End Month: \n");
scanf("%d", &mEnd);
mEnd--;
printf("End Day: \n");
scanf("%d", &mdEnd);

tEnd.tm_year = yEnd;
tEnd.tm_mon = mEnd;
tEnd.tm_mday = mdEnd;

end = mktime(&tEnd);

interval = end - begin;

printf("Total : %d days\n", interval / 86400);
return 0;
}

简单,这样:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

int check(char *Date, char *year, char *month, char *day)
{
int i;
// Format : yyyymmdd
if( (i=strlen(Date))!=8 )
return -1;

strncpy(year, &Date[0], 4);
strncpy(month, &Date[4], 2);
strncpy(day, &Date[6], 2);

printf("time : %s/%s/%s\n", year, month, day);

return 0;
}

int diff(char *date1, char *date2)
{
char y1[6], m1[4], d1[4];
char y2[6], m2[4], d2[4];

memset(y1, 0, sizeof(y1));
memset(m1, 0, sizeof(m1));
memset(d1, 0, sizeof(d1));
memset(y2, 0, sizeof(y2));
memset(m2, 0, sizeof(m2));
memset(d2, 0, sizeof(d2));

if( check(date1, y1, m1, d1)<0 ||
check(date2, y2, m2, d2)<0 )
return -1;

time_t t1, t2, t3;
struct tm tm1, tm2;

tm1.tm_year = atoi(y1) - 1900;
tm1.tm_mon = atoi(m1) - 1;
tm1.tm_mday = atoi(d1);
tm1.tm_hour = 0;
tm1.tm_min = 0;
tm1.tm_sec = 0;

tm2.tm_year = atoi(y2) - 1900;
tm2.tm_mon = atoi(m2) - 1;
tm2.tm_mday = atoi(d2);
tm2.tm_hour = 0;
tm2.tm_min = 0;
tm2.tm_sec = 0;

t1 = mktime(&tm1);
t2 = mktime(&tm2);
t3 = t1 - t2;

printf("day1 = %d, day2 = %d, day1 - day2 = %d\n", t1, t2, t3);

return ( t3/(60*60*24) );
}

int main(int argc ,char *argv[])
{
printf("day(s) = %d\n", diff(argv[1], argv[2]));

return 0;
}

示例:
编译:gcc test.c -o test
执行:./test 20060104 20051230
time : 2006/01/04
time : 2005/12/30
day1 = 1136304000, day2 = 1135868400, day1 - day2 = 435600
day(s) = 5