昨天做基础题整理一下供大家参考,主要是思路问题,写的不好请大家多多指教
/*
小明从2006年1月1日开始,每三天结识一个美女两天结识一
个帅哥,编程实现当输入2006年1月1日之后的任意一天,输
出小明那天是结识美女还是帅哥(注意润年问题)(C语言)
*/
#include <stdio.h>
//声明函数
int getDays(int y, int m, int d);
int runYear(int y);
int jieShouData(int y, int m, int d);
//定义数组用来存放闰年和非闰年每月的天数
int pingYearM[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int runYearM[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main(int argc, const char * argv[]) {
//定义类型的变量
//提示用户输入并接收日期
//判断用户输入信息是否有误,如有提示用户重新输入
int year, month, day;
do {
printf("亲耐滴,请输入2006 1 1 之后的日期,中间用空格隔开:\n");
scanf("%d %d %d", &year, &month, &day);
} while (jieShouData(year, month, day));
//调用getDays函数,计算输入日期距离2006-1-1的总天数
int allDays = getDays(year, month, day);
//利用总天数计算小明某天是否结识帅哥美女
//总天数能被2整除就结识帅哥
//总天数能被3整除就结识美女
//总天数如果不能被2和3整除,就不结识帅哥,也不结识美女
if (allDays % 3 == 0)
printf("我靠!小明今天结识了美女!\n");
if (allDays % 2 == 0)
printf("运气不错哦,小明今天结识帅哥!\n");
if ((allDays % 2 != 0) && (allDays % 3 != 0))
printf("不会吧?小明今天居然没有结识帅哥,也没有结识美女!\n");
return 0;
}
//定义函数计算输入日期距离2006-1-1的总天数
//定义两个变量用来存储年份,月份相差的天数
//如果是闰年,年份天数加上366不是加365
int getDays(int y, int m, int d)
{
int yearDays = 0, monthDays = 0;
for (int i = 2006; i < y; i++) {
if (runYear(i))
yearDays += 366;
else
yearDays += 365;
}
//计算输入月份与1月1日之间相差的天数
//如果是闰年,就累加闰年所对应月份的天数
//如果不是闰年,就累加非闰年所对应月份的天数
for (int j = 1; j < m; j++) {
if (runYear(y))
monthDays += pingYearM[j-1];
else
monthDays += runYearM[j-1];
}
//计算总天数并返回
int allDays = yearDays + monthDays +d;
return allDays;
}
/* 新建一个函数用来判断是否是闰年
1)非整百年能被4整除的为闰年
2)整百年能被400整除的是闰年
*/
//如果是闰年,返回1,否则返回0
int runYear(int y)
{
if ( (y%4==0 && y%100!=0) || (y%400==0) )
return 1;
else
return 0;
}
//新建一个函数用来判断输入的日期是否合理,不合理返回1,合理返回0
//如果年份小于2006、或月份小于1、或月份大于12、或日小于1,则日期不合理
//如果是闰年
//当天数大于当月所对应的最大天数,则不合理
int jieShouData(int y, int m, int d)
{
if (y<2006 || m<1 || m>12 || d<1)
return 1;
if (runYear(y))
return d > runYearM[m-1];
else
return d > pingYearM[m-1];
} |