C语言定义一个结构体变量(包括年、月、日),输入一个日期,计算该日在本年中是第几天。

①考虑润年问题 ②输入的信息为数字以外时要提示错误信息 ③输入的信息超过相应位数时,只取前面相应位数的信息 ④输入的年月日不正确的时候需要提示错误信息 由于要求很严格必须每个功能都实现,,跪求高手解答!

第1个回答  2012-05-17
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct date_time
{
int year;
int month;
int day;

}DATE;
int main()
{
int i,len,flag,day_cnt;
char str[50],buf[10];
struct date_time date;
int mon[12];

while(1)
{
//初始化月份数组
for(i=0;i<12;i++) mon[i] = 31;
mon[1] = 28;
mon[3] = 30;
mon[5] = 30;
mon[8] = 30;
mon[10] = 30;

printf("please input date eg(20010203):");
memset(str,0,50);
scanf("%s",str);

len = strlen(str);//20121212
if(len!=8)//长度不对直接报错 0000 - 9999
{
printf("input error!\n");
continue;
}

flag = 1;
while(len--)//不是数字报错
{
if(str[len]<'0'||str[len]>'9')
{
printf("input error!\n");
flag = 0;
break;
}
}
if(flag)//如果上面检测有错 不进行if里面的操作
{
//判断是否为闰年
memset(buf,0,10);
strncpy(buf,str,4);
date.year = atoi(buf);
//printf("date.year = %d \r\n",date.year);
if((date.year%4==0)&&(date.year%100!=0)||(date.year%400==0)) mon[1]=29;

//判断月份是否合法
memset(buf,0,10);
strncpy(buf,str+4,2);
date.month = atoi(buf);
//printf("date.month = %d \r\n",date.month );
if(date.month>12||date.month<1)
{
printf("month input error!\n");
continue;
}

//判断日期是否合法
memset(buf,0,10);
strncpy(buf,str+6,2);
date.day= atoi(buf);
//printf("date.day = %d \r\n",date.day);
if(date.day>31||date.day<1)
{
printf("day input error!\n");
continue;
}

//比如输入20050525 有4个月+25天
//把数组前4个月的天数加起来 分别对应数组下标0 1 2 3
//所以下面循环要月份减一
day_cnt = 0;
for(i=0;i<date.month-1;i++)
{
day_cnt += mon[i];
printf("mon[%d] = %d \r\n",i,mon[i]);
}
day_cnt += date.day;

printf("days = %d \r\n",day_cnt);
break;

}

}
return 0;
}
楼主 求分!不懂可以给我留言!本回答被提问者采纳
相似回答