黑马程序员技术交流社区

标题: 到底哪里出问题了,弄一天了无法解决!!! [打印本页]

作者: fudanxiaoan    时间: 2015-7-30 22:54
标题: 到底哪里出问题了,弄一天了无法解决!!!


/*---------------------------------

10、小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)(C语言)

----------------------------------*/

#include <stdio.h>
#include <stdlib.h>

/*-----函数声明部分------*/

//最终输出函数:结识美女或帅哥等情况
void printEnd(int days);
//计算从2006年1月1日至输入日期总天数
int getDaysOftotal(int year,int month,int day);
//计算某年的天数
int getDaysOfYear(int year);
//判断当前年开始至输入日期的天数
int getDaysOfMonth(int year,int month);

/*-------主函数部分-------*/
int main(int argc, const char * argv[])
{
    //定义int变量用于保存用户输入的日期
    int year, month, day;
   
    //获取用户输入的热情
    printf("请输入年份:\n");
    scanf("%d", &year);
   
    printf("请输入月份:\n");
    scanf("%d",&month);
   
    printf("请输入日:\n");
    scanf("%d",&day);
   
    //给出判断结果
    printEnd(getDaysOftotal(year, month, day));
   
    return 0;
}

/*-------函数的定义部分-------*/

//最终输出函数:结识美女或帅哥等情况
void printEnd(int days)
{
    //定义_bool变量用于保存输出可能情况
    _Bool boy , girl, onlyBoy, onlyGirl, bothBoyAndGirl;

    boy = (days % 2 == 0);          //认识了帅哥
    girl = (days % 3 == 0);         //认识了美女
   
    //对上面两情况作逻辑运算
    onlyBoy = boy && (! girl);      //只是认识帅哥
    onlyGirl = girl && (! boy);     //只是认识美女
    bothBoyAndGirl = boy && girl;   //同时认识帅哥和美女
   
    //输入判断结果
    if (onlyBoy)
        printf("只是结识了帅哥");
    else if (onlyGirl)
        printf("只是结识了美女");
    else if (bothBoyAndGirl)
        printf("结识了帅哥和美女");
    else
        printf("都没有结识");
}

//计算从2006年1月1日至输入日期总天数
int getDaysOftotal(int year,int month,int day)
{
    int sumDaysOfYear = 0;
    int sumDaysOfMonth = 0;
/*int i = 2005;
   
    while (++i < year)
        sumDaysOfYear += getDaysOfYear(i);
    sumDaysOfMonth = getDaysOfMonth(year,month);
*/
    //计算之前年总天数
    for (int i= 2006; i < year; i++)
    {
        sumDaysOfYear += getDaysOfYear(i);
    }
    sumDaysOfMonth = getDaysOfMonth(year,month);
    return (sumDaysOfYear+ sumDaysOfMonth + day);
}

//计算某年的天数
int getDaysOfYear(int year)
{
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400))
        return 366;
    else
        return 365;
   
}
//判断当前年开始至输入日期的天数
int getDaysOfMonth(int year,int month)
{
    int sumDaysOfMonth = 0;
   
    //把闰年和平年每月的天数保存到一个2维数组里面
    const int monthDays[2] [12] = {
        {31,29,31,30,31,30,31,30,31,30,31,30},  //闰年
        {31,28,31,30,31,30,31,30,31,30,31,30}   //平年
    };
    //计算当前年至输入日期的天数
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400))
        for (int i = 1; i <= month; i++)
        {
            sumDaysOfMonth = monthDays[0] [i];
        }
    else
        for (int i = 1; i <= month; i++)
        {
            sumDaysOfMonth = monthDays[1] [i];
        }
    return sumDaysOfMonth;
}

作者: Eil.tea    时间: 2015-7-30 23:45
乍一看好像没问题,如果你愿意,可以把源码贴出来,我给你排排错。
作者: Eil.tea    时间: 2015-7-31 00:00
不用贴了, 你连几月有几天都定义错了,就是你定义的数组
作者: Eil.tea    时间: 2015-7-31 00:16
第二个大错误, if ((year % 4 == 0 && year % 100 != 0) || (year % 400)),  year % 400==0好吧
作者: Eil.tea    时间: 2015-7-31 00:22
  1. #include <stdio.h>
  2. int isLeapYear(int year)
  3. {
  4.      if ((year % 4 == 0 && year % 100 != 0) || (year % 400)==0)
  5.      {
  6.          return 1;
  7.      }
  8.     return 0;
  9. }
  10. int countday(int year,int month,int day)
  11. {
  12.     int sumday=0;
  13.     int monthDay[]={31,28,31,30,31,30,31,31,30,31,30,31};
  14.     for (int i=2006; i<year; i++) {
  15.         sumday+=365+isLeapYear(i);
  16.     }
  17.     for (int i=1; i<month; i++) {
  18.         sumday+=monthDay[i-1];
  19.         if (i==2 && isLeapYear(year)) {
  20.             sumday++;
  21.         }
  22.     }
  23.     return sumday+day;
  24. }

  25. int main(int argc, const char * argv[]) {
  26.     int year=2007;
  27.     int month=3;
  28.     int day=5;
  29.     int dayNum=countday(year, month, day);
  30.     if (dayNum%6==0) {
  31.         printf("男女通吃\n");
  32.     }
  33.     else if (dayNum%3==0) {
  34.         printf("搞基\n");
  35.     }
  36.     else if (dayNum%2==0){
  37.         printf("泡妞\n");
  38.     }
  39.     else {
  40.         printf("单身狗\n");
  41.     }
  42.     return 0;
  43. }
复制代码
因为你的思路很清晰了,所以基本是沿用你的思路来的,包括定义month数组,没有挨个去判断,贴一下我的代码,你可以两个执行一下,比较一下错误,如果我哪里写的不合适,欢迎指出

作者: fudanxiaoan    时间: 2015-7-31 17:25
Eil.tea 发表于 2015-7-31 00:22
因为你的思路很清晰了,所以基本是沿用你的思路来的,包括定义month数组,没有挨个去判断,贴一下我的代码 ...

谢谢,问题已经解决,必须说说:你的代码比我的好很多 如最后的判断输出结果就很好: 谢谢了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2