| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1989 人关注过本帖
标题:一个计算星期的程序
只看楼主 加入收藏
数字帝国
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-5-24
收藏
 问题点数:0 回复次数:9 
一个计算星期的程序
下面程序的功能:任意输入一个时间X年Y月Z日,求出它是星期几。
i:月份  j:每月天数   k:若k=0,则x为闰年    t:闰年数    d:天数差

#include "stdio.h"
#include "math.h"
struct date
{
    int year;
    int month;
    int day;
};
int mon(int i)
{
    int j;
    if(i==1||i==3||i==5||i==7||i==8||i==10)
    j=31;
    if(i==4||i==6||i==9||i==11)
    j=30;
    if(i==2)
    j=28;
    return j;
}
int daies(int x,int y,int z)
{   
    enum weekday
    {mon=6,tue=0,wed,thu,fri,sta,sun};
    enum weekday week;
    int i,j,k,t,m=0,n,d;
    k=abs(x-1980)%4;
    if(x>=1980)
    {
        t=(x-1980)/4;
        for(i=1;i<y;i++)
        {   
             int mon(i);
             if(i==2&&k==0)
             j=29;
            m=j;
            m+=m;
        }
        d=(x-1980)*365+m+(z-1)+t;
        n=d%7;    
    }
    if(x<1980)
    {
        t=(1979-x)/4;
        for(i=12;i>y;i--)
        {
            int mon(i);
            if(i==2&&k==0)
            j=29;
            m=j;
            m+=m;
        }
        if(k==0)
        d=(1979-x)*365+m+(31-z)+t;
        n=6-d%7;
    }
    week=(enum weekday)n;
    switch(week)
    {
        case mon:printf("星期一\n"); break;
        case tue:printf("星期二\n"); break;
        case wed:printf("星期三\n"); break;
        case thu:printf("星期四\n"); break;
        case fri:printf("星期五\n"); break;
        case sta:printf("星期六\n"); break;
        case sun:printf("星期天\n"); break;
    }
}
main()
{
    struct date d;
    printf("输入年份:");
    scanf("%d",&d.year);
    printf("输入月份:");
    scanf("%d",&d.month);
    printf("输入日期:");
    scanf("%d",&d.day);
    printf("输出:\n");
    printf("%d年%d月%d日\n",d.year,d.month,d.day);
    daies(d.year,d.month,d.day);
}
参照日期:1980.1.1——星期二
程序运行后,有时正常,有时错误
如,输入:2008.5.24     输出:星期六(正常)
        输入:1981.2.24     输出:星期五(正确是星期二)
请哪位高手帮我指点下
搜索更多相关主题的帖子: 程序 
2008-05-24 22:53
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
代码不用这么长吧??

[color=white]
2008-05-24 23:25
hellbelial
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2008-4-29
收藏
得分:0 
不是有工式可以直接计算吗??
2008-05-25 00:22
njinji007
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2008-4-14
收藏
得分:0 
可以精简一点.等高手来看.
2008-05-25 01:54
zhuwei168
Rank: 1
来 自:东软信息学院
等 级:新手上路
帖 子:180
专家分:0
注 册:2008-2-13
收藏
得分:0 
我记得好像可以用time.h库函数求的
具体怎么弄也不太清楚

做一个自由的人,飞到蔚蓝的天空里。
2008-05-25 09:13
himpo
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:192
专家分:123
注 册:2008-5-16
收藏
得分:0 
回复 1# 数字帝国 的帖子
你的问题很多!
1  计算每月日子的函数没有12月份的。
2  闰年的计算方法不对,不是单纯的除以4,应为
  (year%4==0&&year%100!=0)||year%400==0 才对,举个例子:1900就不是闰年!
3  在计算每月天数之和的那一段有点问题,就是
  for(i=1;i<y;i++)
            {   
                     int mon(i);
                     if(i==2&&k==0)
                     j=29;
                    m=j;
                    m+=m;
            }
  自己看看!
4  在年份小于1980的时候你有一个判断 n=6-d%7;
    举个特列:1979年12月31日你计算出来的是????
5  针对你的程序,我改了一下,我是以2008年1月1日为准的,也是星期二!
int moon(int i,int t)    /* 求出每个月的天数,i代表月份,t代表是否闰年 */
{
 int j;
 if ((i==1)||(i==3)||(i==5)||(i==7)||(i==8)||(i==10)||(i==12)) j=31;
   else if ((i==4)||(i==6)||(i==9)||(i==11)) j=30;
      else if (i==2&&t==1) j=29;
         else j=28;
 return(j);
}
void weekday(int a,int b,int c)      /* 以2008年1月1日作比较 */
{
 int i,pd,t=0,leap=0;
 long days=0;
 if ((a%4==0&&a%100!=0)||a%400==0) t=1;
 if (a>=2008)
   {
    for(i=2008;i<a;i++)
      {
       if ((i%4==0&&i%100!=0)||i%400==0) leap++;
       days+=365;
      }
    for(i=1;i<b;i++)
      days+=moon(i,t);
    days+=leap+c-1;
    pd=days%7;
   }
  else {
    for(i=2007;i>a;i--)
       {
        if ((i%4==0&&i%100!=0)||i%400==0) leap++;
        days+=365;
       }
    for(i=12;i>b;i--)
       days+=moon(i,t);
    days+=leap+moon(b,t)-c+1;
    pd=(7-days%7);
    if (pd==7) pd=0;
       }
 switch(pd)
 {
  case 0:printf("星期二 *\n");break;     /* 以2008年1月1日是星期二为准 */
  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;
 }
}
main()
{
 int t=0,k,year,mon,day;
 printf("请输入要查询的年份:\n");
 scanf("%d",&year);
 if ((year%4==0&&year%100!=0)||year%400==0) t=1;
 printf("请输入要查询的月份:\n");
 scanf("%d",&mon);
 for(;(mon>12||mon<1);)
   {
    printf("您输入的月份有误,请重新输入:\n");
    scanf("%d",&mon);
   }
 k=moon(mon,t);
 printf("请输入要查询的天份:\n");
 scanf("%d",&day);
 for(;(day>k||day<1);)
   {
    printf("您输入的天份有误,请重新输入:\n");
    scanf("%d",&day);
   }
 printf("您所查询的结果为:\n\n");
 printf("\t\t********************************\n");
 printf("\t\t* %4d年%2d月%2d日那天是: ",year,mon,day);
 weekday(year,mon,day);
 printf("\t\t********************************\n");
 getch();
 return 0;
}
2008-05-28 18:14
想飞的菜鸟
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-05-28 20:54
切忌浮躁
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2008-5-28
收藏
得分:0 
6楼的程序我加了个#include "stdio.h"那个getch(); 改成getchar();。用GCC编译运行通过,测试几次正确。

[[it] 本帖最后由 切忌浮躁 于 2008-5-28 23:06 编辑 [/it]]
2008-05-28 23:05
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
int dayofweek(int y, int m, int d) /* 0 = Sunday */
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

我的代码,请测试。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-29 00:09
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
#include<stdio.h>

int dayofweek(int y, int m, int d)
{
    static int t[]={0,3,2,5,0,3,5,1,4,6,2,4};
    y -= m<3;
    return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

int main()
{
    char wd[]="SumMonTueWedThuFriSat";
    int y,m,d;
    while (scanf("%d %d %d",&y,&m,&d)!=EOF)
        printf("%.3s.\n",&wd[dayofweek(y,m,d)*3]);
}

给个测试代码。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-29 00:19
快速回复:一个计算星期的程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018014 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved