主题:[讨论]求助,,,十万火急
xwxxww
[专家分:0] 发布于 2011-02-26 23:00:00
就要交作业了,大家帮帮我,小弟跪谢!!
一。 输入年 月 日,求出这一日是这一年中的多少天。
二。 输入年 月 日,求出这一日是星期几。
第二题,我完全不知道怎么做
第一题,下面是我的代码,但老是输出 输入错误,并且输出的天数也是错的,哪个好心人帮帮小弟看看,十分感激。。。。
[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]
最后更新于:2011-02-26 23:01:00
回复列表 (共6个回复)
沙发
fragileeye [专家分:1990] 发布于 2011-02-27 01:33:00
case 后不加break,表示一直往下执行,直到你的default,如果你这么用了,那么可以一年的总天数减去这个得到的值
还有,这段代码可能没有写全吧,闰年和非闰年会导致二月份天数不同,加以控制就ok、、
输入错误?注意下scanf的用法吧。scanf("%d-%d-%d",&year,&month,&day);中间的—也是要输入的额
至于第二问,mod 7并加以控制就行、
这是初学时必须训练到的,好好思考下吧……
以上仅供参考。
板凳
xwxxww [专家分:0] 发布于 2011-02-27 02:25:00
谢谢楼上的解释,第一个问题已经解决了。但是第二个问题还是不会写,你帮我写下代码给我参考好吗?
3 楼
fragileeye [专家分:1990] 发布于 2011-02-27 02:43:00
这个我可以给你一个轮廓,但不会给你写全、、你还在线么,qq多少……发给你算了、
4 楼
xwxxww [专家分:0] 发布于 2011-02-27 02:47:00
在阿 ,不可以发到论坛吗?
我的QQ是917664303
5 楼
windy0will [专家分:2300] 发布于 2011-02-28 00:24:00
我写段代码做参考:很久没写过超过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 楼
清风扬云 [专家分:0] 发布于 2011-03-01 21:46:00
#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;
}
}
}
我来回复