编写一个程序,请求用户输入日,月,年。月份可以是月份号,月分名,月份缩写。然后程序返回一年中到给定日子的总天数。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
union month_n //联和类型每次存储其选项列表中的 一个单独 的数据项类型。(月份的三种输入方式)
{
int m_n;
char m_full[10]; //精确到存储“位”,应包含'\0'。
char m_abb[4];
};
struct input
{
int day_n;
union month_n mon;//联和的变量mon。
int year_n;
};
struct months //该结构主要用于匹配三种输入月份的方式。
{
char name_full[10];
char name_abb[4];
int day;
int name_n;
};
//初始化。
struct months mons[12] = //结构months的变量mons。
{
{"January","JAN",31,1},
{"Febyuary","FEB",28,2},
{"March","MAR",31,3},
{"April","APR",30,4},
{"May","MAY",31,5},
{"June","JUN",30,6},
{"July","JUL",31,7},
{"August","AGU",31,8},
{"September","SEP",30,9},
{"October","OCT",31,10},
{"November","NOV",30,11},
{"December","DEC",31,12}
};
int main(void)
{
struct input in;//结构input的变量in。
int i;
int tot_days = 0;
char line[10];
while(1)
{
puts("Input the day:");
scanf("%d",&in.day_n);
while(getchar() != '\n')
continue;//清除剩余行。
puts("Input the month:");
if(scanf("%d",&in.mon.m_n)==1)//月份存入联和中。
{
if(!(in.mon.m_n > 0 && in.mon.m_n < 13))
{
puts("Month out of range!");
exit(1);
}
}
else
{
scanf("%s",line);
if(strlen(line) > 3)//月份输入是全称。
{
strcpy(in.mon.m_full,line);
for(i = 0;i < 12;i++)//进行月份匹配。
{
if(strcmp(mons[i].name_full,in.mon.m_full) == 0)
{
in.mon.m_n = i+1 ;
break;
}
}
}
else if(strlen(line) == 3)//月份输入缩写。strlen()不包含'\0'。
{
strcpy(in.mon.m_abb,line);
for(i = 0;i < 12;i++)
{
if(strcmp(mons[i].name_abb,in.mon.m_abb) == 0)
{
in.mon.m_n = i+1;
break;
}
}
}
}
puts("Input the year:");
scanf("%d",&in.year_n);
for(i = 0;i <in.mon.m_n-1;i++)//in.mon.m_n-1是因为搜索到哪个月匹配时,该月是不计入月份天数相加,相加的是输入的天数。(重要的是这种+1,-1可以匹配三种输入月份的方式)
tot_days += mons[i].day;
tot_days += in.day_n;
if(in.mon.m_n >= 2 && (in.year_n % 4 == 0 || in.year_n % 100 ==0))//闰年。
++tot_days;
printf("total %d days\n",tot_days);
i=0;
tot_days=0;
puts("Please enter next round:");
}
return 0;
}