struct date{
int year;
int month;
int day;}
//末尾缺了个分号
struct date{
int year;
int month;
int day;};
for(j=1;1<(p+0)->month;j++){
b=b+tab[j];}
//我不知道你本来的逻辑是什么。你原本的写法,只要月份大于1,这里会一直循环,直到超过数组下限,造成非法访问内存。
//把1<(p+0)->month改成j<(p+0)->month。具体什么逻辑你自己判断,我只是给你一个思路
for(j=1;j<(p+0)->month;j++){
b=b+tab[j];}
//统计当前的天数
int TotalDays(int year,int month,int day)
{
int i = year - YEAR; //计算输入年份与2000年的差值,若大于等于1则超过了一年,否则不满一年
int i_month = 1; //从输入年份的第一个月开始计算
int totalday = day; //把输入月份对应的天数先写入总天数,以便后续累加计算
if ( year%4 == 0 && year%100 != 0)
{
a[2] = 29; //如果是闰年,则把a数组中2月的天数改为29天
}
while (i_month < month) //从一月到输入的月份之前,计算输入年份的总天数
{
totalday += a[i_month ++]; //从一月份开始,把a数组中存放的每个月的天数进行累加,一直加到输入的月份之前,输入月份的天数已经事先用来初始化累积和了,不用再加入了。
}
if ( i > 0 ) //如果距离2000年超过了一年,还要补上整年的天数
{
totalday += DAYS*i + (i-1)/4 + 1; //整年天数统一按照365天(DAYS)计算,由于2000年是闰年,所以以后每满四年多补一天( (i-1)/4 + 1 )。
}
return totalday;
}
根据题意可以将解题过程分为三步:
1、计算从1990年1月1日开始至指定日期共有多少天;
2、由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3、根据余数判断他是在“打鱼”还是在“晒网”;若 余数为1,2,3,则他是在“打鱼”;否则 是在“晒网”。
#include
/*定义日期结构体*/
typedef struct date {
int year;
int month;
int day;
} DATE;
/*判断是否为闰年,是返回1,否返回0*/
int isLeap (int year) {
return ( (year%4==0 && year%100!=0) || (year%400==0) );
}
/*计算指定日期距离1990年1月1日的天数*/
int countDay (DATE currentDay) {
int perMonth[13]={0,31,28,31,30,31,30,31,31,30,31,30}; /*每月天数数组*/
int totalDay=0,year,i;
/*求出指定日期之前的每一年的天数累加和*/
for(year=1990; yearif(isLeap(year)) /*判断是否为闰年*/
totalDay=totalDay+366;
else
totalDay=totalDay+365;
}
/*如果为闰年,则二月份为29天*/
if(isLeap(currentDay。year))
perMonth[2]+=1;
/*将本年内的天数累加到totalDay中*/
for(i=0; itotalDay+=perMonth[i];
/*将本月内的天数累加到totalDay中*/
totalDay+=currentDay。day;
/*返回totalDay*/
return totalDay;
}
int main(void) {
DATE today; /*指定日期*/
int totalDay; /*指定日期距离1990年1月1日的天数*/
int result; /*totalDay对5取余的结果*/
int error;
do { /*输入指定日期*/
printf(“Please input the year/month/day :\n”);
scanf(“%d/%d/%d”, &today。year, &today。month, &today。day);
printf(“\n”);
error=0;
if(today。year<1990) /*判断日期格式是否正确*/
{printf(“The year should be larger than 1990!\n”);error=1;}
if(today。month<1||today.month>12)
{printf(“The month input is error!\n”);error=1;}
if(today。day<0||today.day>31)
{printf(“The day input is error!\n”);error=1;}
printf (“======================================================\n\n”);
} while(error);
totalDay=countDay(today); /*求出指定日期距离1990年1月1日的天数*/
/*天数%5,判断输出打鱼还是晒网*/
result=totalDay%5;
if(result>0 && result<4)
printf(“fishing!\n”);
else
printf(“sleeping!\n”);
printf(“\n”);
return 0;
}
运行结果
1991/10/25,打渔
1992/10/25,晒网
日期输入错误