回 帖 发 新 帖 刷新版面

主题:[讨论]求助,,,十万火急

就要交作业了,大家帮帮我,小弟跪谢!!
一。 输入年 月 日,求出这一日是这一年中的多少天。
二。 输入年 月 日,求出这一日是星期几。

第二题,我完全不知道怎么做
第一题,下面是我的代码,但老是输出 输入错误,并且输出的天数也是错的,哪个好心人帮帮小弟看看,十分感激。。。。

[code=c]
#include <stdio.h>
#include <stdlib.h>

int daysYear (int year, int month, int day)
{
    int days=0;
    switch(month)
    {
     case 1:days+=31;
     case 2:days+=28;
     case 3:days+=31;
     case 4:days+=30;
     case 5:days+=31;
     case 6:days+=30;
     case 7:days+=31;
     case 8:days+=31;
     case 9:days+=30;
     case 10:days+=31;
     case 11:days+=30;
     case 12:days+=31;
     default:printf("输入错误"); 
    }
    return days;
}

void main()
{
    int year, month, day;
    printf("请输入年-月-日\n"); 
    scanf("%d-%d-%d",&year,&month,&day);
    printf("%d\n",daysYear(year,month,day));
    system("pause");
}[/code]

回复列表 (共6个回复)

沙发

case 后不加break,表示一直往下执行,直到你的default,如果你这么用了,那么可以一年的总天数减去这个得到的值

还有,这段代码可能没有写全吧,闰年和非闰年会导致二月份天数不同,加以控制就ok、、
输入错误?注意下scanf的用法吧。scanf("%d-%d-%d",&year,&month,&day);中间的—也是要输入的额

至于第二问,mod 7并加以控制就行、
这是初学时必须训练到的,好好思考下吧……

以上仅供参考。

板凳

谢谢楼上的解释,第一个问题已经解决了。但是第二个问题还是不会写,你帮我写下代码给我参考好吗?

3 楼


这个我可以给你一个轮廓,但不会给你写全、、你还在线么,qq多少……发给你算了、

4 楼

在阿 ,不可以发到论坛吗?

我的QQ是917664303

5 楼

我写段代码做参考:很久没写过超过100行的代码了,没怎么调试,可能中间有错误。楼主您自己结合注释参考下。下面的代码的主要原理是查表法。
[color=FF0000]这个文件是date.h[/color]
[code=c]
/*
 * 文件名: date.h
 */

#ifndef _date_h_
#define _date_h_


typedef struct {
  unsigned int year, month, day;       /* 年 月 日 */
  unsigned int yearDay, weekDay; /* 一年中第几天 星期几 */
} Date;



#ifndef is_leap_year
#define is_leap_year(year) (((year)%4==0) && ((year)%100!=0) | ((year)%400==0))
#endif/* is_leap_year */ /* 闰年? */


void adjust_date( Date * );
int  get_weekDay( Date * ); 
int  get_weekDay_as_yearDay( Date * );
void adjust_date_as_yearDay( Date * );

#endif/* _date_h_ */

[/code]

[color=FF0000]这个文件是date.c[/color]
[code=c]
/*
 * 文件名: date.c 
 */

#include <date.h>


/* s_days_before_month [month]表示: 
   平年中, month月 中一共有多少天    */
static const unsigned int s_days_in_each_month [13] =
  {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  
/* s_days_before_month [month]表示: 
   平年中,1月1号 到 month月1号 所有的天数    */
static const unsigned int s_days_before_month [13] =
  {0,  0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};




/*    根据date对象 year(年),month(月),day(日), 获取 weekDay(星期) */
int
get_weekDay( Date *date )
{
  Date dateT = *date;
  adjust_date( &dateT );
  return get_weekDay_as_yearDay( &dateT );
}



/*   根据date对象的year(年),month(月),day(日) 
     纠正 yearDay(一年中第几天),weekDay(星期)   */
void
adjust_date( Date *date )
{
  unsigned int isLeapYear = is_leap_year( date -> year );
  unsigned int yearDay;
  
  /* 如果是闰年,并且是3月以后,yearDay初值为1(可定多经过了2月29号) */
  yearDay = (isLeapYear == 1U) & (date -> month > 2U);
      
  yearDay += s_days_before_month [date -> month];

  date -> yearDay = yearDay + date -> day;
  date -> weekDay = get_weekDay_as_yearDay( date );/* 调整 星期 */
}


/*   根据date对象的year(年) yearDay(一年中第几天) 
     纠正   month(月),   day(日),   weekDay(星期)    */
void
adjust_date_as_yearDay( Date *date )
{
  unsigned int month, day;
  unsigned int yearDay = date -> yearDay;
  unsigned int isLeapYear = is_leap_year (date -> year);
  
  if ((isLeapYear == 1U) & (yearDay == 60U)) {
      /* 闰年的2月29号,特殊考虑 */
      month = 2U,
      day   = 29U;
      
  } else {
      /* 闰年并且是3月1号以后(yearDay>60),yearDay减1(肯定经过了2月29号这天) */
      yearDay -= (isLeapYear == 1U) & (yearDay > 60U);
      
      /* 假设每个月都是32天,计算是第几月 */
      month  = (yearDay + 31U) >> 5;
      day    = yearDay - s_days_before_month [month];
      
      /* 根据上面的结果,查表,进一步求出准确的结果 */
      if (day > s_days_in_each_month [month]) {
        day   -=  s_days_in_each_month [month];
           month ++;
      }    
  }

  date -> day     = day;   /* 纠正 日期 */
  date -> month   = month; /* 纠正 月份 */
  date -> weekDay = get_weekDay_as_yearDay( date ); /* 纠正 星期 */
}



/*   根据date对象 year(年),yearDay(一年中第几天), 获取 weekDay(星期) */
int
get_weekDay_as_yearDay( Date *date )
{
  unsigned int days  = date -> year - 1U;

  days += (days / 4U) + (days / 400U) - (days / 100U);
  days += date -> yearDay;

  return (int)(days % 7U); 
}

[/code]

6 楼

#include<stdio.h>
void main()
{
int i,year,month,days,day,sum=0;
printf("请输入某年某月某日\n");
scanf("%d%d%d",&year,&month,&days);
if((year%4==0 && year%100!=0) || year%400==0)
day=29; 
else
day=28;
switch(month)
 { case 1: sum=days;break;
   case 2: sum=31+days;break;
   case 3: sum=31+day+days;break;
   case 4: sum=31*2+day+days;break;
   case 5: sum=31*2+day+days+30;break;
   case 6: sum=31*3+day+days+30;break;
   case 7: sum=31*3+day+days+30*2;break;
   case 8: sum=31*4+day+days+30*2;break;
   case 9: sum=31*5+day+days+30*2;break;
   case 10: sum=31*5+day+days+30*3;break;
   case 11: sum=31*6+day+days+30*3;break;
   case 12: sum=31*6+day+days+30*4;break;
   default: sum=0;break;
 }
if(sum==0)
printf("您输入的数据有误\n");
else
 {for(i=1990;i<year;i++)
  {if(i%4==0 && i%100!=0 || i%400==0)
   sum+=366;
   else
   sum+=365;
  }
  printf("这一天是");
  switch(sum%7)
  {case 0: printf("星期日\n");break;
   case 1: printf("星期一\n");break;
   case 2: printf("星期二\n");break;
   case 3: printf("星期三\n");break;
   case 4: printf("星期四\n");break;
   case 5: printf("星期五\n");break;
   case 6: printf("星期六\n");break;
  }
 }
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册