A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/*
需求:小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,
编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)(C语言)
思路:1,先算出任意一天据2006年,1月1日多少天。
    1,算出差距年的总天数、
    2.算出差距月的总天数
    3.算出差距年月日的总天数。
    2.利用%2与%3是否有余数判断结识的事美女还是帅哥。
*/
#include <stdio.h>
//所用到的三个函数的声明;
int getDays(int y, int m, int d);
void estimate(int days);
int isRun(int y);
int main()
{   //初始化年,月,日,用于接收输入键盘录入。
int year,month,day;
   do
   {
      printf("请输入2006.1.1之后的任意一天,年月日之间以.隔开\n");        
      scanf("%d.%d.%d", &year, &month, &day);
   } while (year<2006 || month<1 || month>12 ||day>31);
   //调用函数getDays获得这天离2006年1月1日相差的天数。
   int days=getDays(year, month, day);
   //调用函数判断遇到的是美女还是帅哥。
   estimate(days);
   return 0;
   
}
int getDays(int y,int m,int d)
{
//闰年每月的天数
int leapYearMonths[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
    //正常年每月的天书
int yearMonths[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
//初始化一个月份差距的天数和,默认值为0。
int sumOfMonth=0;
//初始化一个年差距的天数和,默认值为0.
int sumOfYear=0;
//从2006年开始遍历,算出年差距的总天数。
for(int x=2006;x<y;x++)
{
  if(isRun(x))
   sumOfYear+=366;
  else
   sumOfYear+=365;   
}
//从1月份算起,算出月差距的总天数。
for(int i=1;i<m;i++)
{
  if(isRun(y))
   sumOfMonth+=leapYearMonths[i];
  else
   sumOfMonth+=yearMonths[i];
}
//返回一个年月日差距的总天数。
return sumOfMonth+sumOfYear+d;
}
void estimate(int days)
{
//利用%的特性来判断是否遇见美女和帅哥。
if(days%2==0)
  printf("这天小明碰到的是帅哥\n");
if(days%3==0)
  printf("这天小明碰到的是美女\n");
if(days%2!=0 && days%3!=0)
  printf("这天小明既没有碰到美女,也没有碰到帅哥");  
}
//判断是否是闰年的函数。
int isRun(int y)
{
//闰年的计算是1,能被4整除,且不能被100整除,
  //     2。能被400整除。两者满足其一即可。
    if((y/4==0 && y/100!=0)||(y/400==0))
    {
         return 1;
    }
    else
    {
         return 0;
}   
}

6 个回复

倒序浏览
学习了,这道题不看提示挺麻烦的
回复 使用道具 举报
好厉害@
回复 使用道具 举报
你这do while判断的不好,如果我输入的是2月30号呢?
回复 使用道具 举报
学习了,谢谢
回复 使用道具 举报
FTD 中级黑马 2015-10-11 20:19:30
地板
方法有好多种,每个人写的都不一样,不知道以后所有的题是不是都是这么难..
回复 使用道具 举报
#include <stdio.h>

// 声明定义的几个函数
int getDays(int y, int m, int d);
int isLeapYear(int y);
int isDateTrue(int y, int m, int d);

// 新建两个int类型的全局数组分别用来存放闰年和非闰年每月的天数
int leapYearMonths[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int yearMonths[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


int main(int argc, const char * argv[]) {
    // 1. 定义3个int类型的变量分别用来存储年、月、日
    int year, month, day;
   
    // 2. 提示用户输入并接收日期,并对输入的数据进行筛选
    do {
        // 2.1 提示用户输入
        printf("请输入一个2006-1-1之后的日期,中间用‘-’隔开:");
        
        // 2.2 接收用户用户输入的年、月、日信息,并分别存储到year、month、day变量中
        scanf("%d-%d-%d", &year, &month, &day);
        
    } while (isDateTrue(year, month, day));
   
    // 3. 调用getDays函数,计算输入日期距离2006-1-1的总天数
    int sumOfDays = getDays(year, month, day);
   
    // 4. 利用总天数计算小明当天结识帅哥还是美女
    // 4.1 总天数如果能被3整除,就结识美女
    if (sumOfDays % 3 == 0)
        printf("小明这天结识了美女!\n");
   
    // 4.2 总天数如果能被2整除,就结识帅哥
    if (sumOfDays % 2 == 0)
        printf("小明这天结识了帅哥!\n");
   
    // 4.2 总天数如果既不能被2整除,也不能被3整除,就既不结识帅哥,也不结识美女
    if ((sumOfDays % 2 != 0) && (sumOfDays % 3 != 0))
        printf("小明这天既没有结识帅哥,也没有结识美女!\n");
   
    return 0;
}

// 新建一个函数用来计算输入日期距离2006-1-1的总天数,接收年、月、日三个变量
int getDays(int y, int m, int d)
{
    // 新建两个变量分别用来存储年份,月份相差的天数
    int yearOfDays = 0, monthOfDays = 0;
   
    // 计算输入年份与2006年之间相差的天数
    for (int i = 2006; i < y; i++) {
        
        // 如果是闰年,则年份的天数加上366
        if (isLeapYear(i))
            yearOfDays += 366;
        
        // 如果不是闰年,则年份的天数加上365
        else
            yearOfDays += 365;
    }
   
    // 计算输入月份与1月1日之间相差的天数
    for (int j = 1; j < m; j++) {
        
        // 如果是闰年,就累加闰年所对应月份的天数
        if (isLeapYear(y))
            monthOfDays += leapYearMonths[j-1];
        
        // 如果不是闰年,就累加非闰年所对应月份的天数
        else
            monthOfDays += yearMonths[j-1];
    }

    // 计算总天数并返回
    int sumOfDays = yearOfDays + monthOfDays +d;
    return sumOfDays;
}

// 新建一个函数用来判断是否是闰年
int isLeapYear(int y)
{
    // 如果一个年份可以被4整除且不能够被100整除,或者可以被400整除,那么是闰年
    if ( (y%4==0 && y%100!=0) || (y%400==0) )
        // 如果是闰年,返回1
        return 1;
    else
        // 如果不是闰年,返回0
        return 0;
}

// 新建一个函数用来判断输入的日期是否合理,不合理返回1,合理返回0
int isDateTrue(int y, int m, int d)
{
    // 如果年份小于2006、或月份小于1、或月份大于12、或日小于1,则日期不合理
    if (y<2006 || m<1 || m>12 || d<1)
        return 1;
    // 如果是闰年
    if (isLeapYear(y))
        // 当天数大于当月所对应的最大天数,则不合理
        return d > leapYearMonths[m-1];
    // 如果不是闰年
    else
        // 当天数大于当月所对应的最大天数,则不合理
        return d > yearMonths[m-1];
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马