/*
10、 小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)(C语言)
*/
#include <stdio.h>
//全局变量:输入日期的闰年标志
int rnflag;
//定义日期的结构体变量类型
struct DATE
{
int year;
int month;
int day;
};
//日期输入函数声明
void InputDate(struct DATE base,struct DATE *input);
//闰年判断函数声明
int RunNian(int year);
//当月天数判断函数声明
int RiQi(int month,int flag);
//计算相差天数函数声明
int ComputeTS(struct DATE base,struct DATE *input);
//判断函数声明
void BoyOrGirl(int tianshu);
int main(int argc, const char * argv[])
{
printf("第10题开始:\n");
//定义基准年月日
struct DATE base = {2006,1,1};
struct DATE input = {0};
int result = 0;
//调用输入日期函数
InputDate(base,&input);
//调用计算相差天数函数
result = ComputeTS(base,&input);
//调用函数判断,小明当前日期是结识帅哥还是美女
BoyOrGirl(result);
printf("第10题结束\n");
return 0;
}
//函数:输入日期
void InputDate(struct DATE base,struct DATE *input)
{
int date = 0;
int rcode=0;
//静态变量:输入次数变量(统计输入的次数)
static int ics=0;
while (rcode != 3)
{
if (ics > 0)
{
//清除缓存
rewind(stdin);
printf("输入有误(可能是日期输入的格式有误或者是输入日期的年月日有误),请重新输入!\n");
}
printf("请输入日期(%d年%d月%d日之后),以'-'分隔(例:2006-2-1):\n",base.year,base.month,base.day);
rcode = scanf("%d-%d-%d",&(*input).year,&(*input).month,&(*input).day);
ics++;
}
//输入日期的年与月的合法性判断
if ((*input).year < base.year || (*input).month < 1 || (*input).month > 12)
{
InputDate(base,input);
}
//输入的年份是否是闰年的判断
rnflag = RunNian((*input).year);
//输入日期的日子的合法性判断
date = RiQi((*input).month,rnflag );
if ((*input).day < 1 || (*input).day > date)
{
InputDate(base,input);
}
}
//函数:闰年的判断
int RunNian(int year)
{
int flag = 0;
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) )
{
flag = 1;
}
return flag;
}
//当月天数判断函数
int RiQi(int month,int flag)
{
int ts31[7] = {1,3,5,7,8,10,12};
int ts30[4] = {4,6,9,11};
for (int i = 0; i < 7; i++)
{
if (month == ts31[i])
{
return 31;
}
}
for (int i = 0; i < 4; i++)
{
if (month == ts30[i])
{
return 30;
}
}
if (flag == 1)
{
return 29;
}
else{
return 28;
}
}
//计算相差天数函数
int ComputeTS(struct DATE base,struct DATE *input)
{
int tianshu[3] = {0};
int sum = 0;
//计算相差年份天数
if (base.year < (*input).year)
{
for (int y = base.year; y < (*input).year; y++)
{
if (RunNian(y))
{
tianshu[0] = tianshu[0] + 366;
}else
{
tianshu[0] = tianshu[0] + 365;
}
}
}
//计算月份相差天数
if (base.month < (*input).month)
{
for (int m = base.month; m < (*input).month; m++)
{
tianshu[1] = tianshu[1] + RiQi(m, rnflag);
}
}
//计算日子相差天数
if (base.day < (*input).day)
{
tianshu[2] = tianshu[2] + ((*input).day - base.day);
}
for (int s = 0; s < 3; s++)
{
sum = sum + tianshu[s];
}
return sum + 1;
}
//函数判断,小明当前日期是结识帅哥还是美女
void BoyOrGirl(int tianshu)
{
if (tianshu % 5 == 0 || tianshu % 5 == 4)
{
printf("小明今天结识的是帅哥!\n");
}
else
{
printf("小明今天结识的是美女!\n");
}
} |
|