网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月07日漏签0天
c语言吧 关注:801,744贴子:4,375,006
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 3 4 5 6 7 下一页 尾页
  • 96回复贴,共7页
  • ,跳到 页  
<<返回c语言吧
>0< 加载中...

计算任何一天是星期几的C语言源代码.

  • 只看楼主
  • 收藏

  • 回复
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include <stdio.h>
int main()
{
int day,mn,yr,i,days=0,s,k;
int mont[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char wek[][9]={ {'S','u','n','d','a','y'},
{'M','o','n','d','a','y'},
{'T','u','e','s','d','a','y'},
{'W','e','d','n','s','d','a','y'},
{'T','h','u','r','s','d','a','y'},
{'F','r','i','d','a','y'},
{'S','a','t','u','r','d','a','y'}
      };
printf("Inpute the date (year-month-day):");
scanf("%d-%d-%d",&yr,&mn,&day);
if (yr%4==0||yr%100==0||yr%400==0)
mont[2]=29;
else
mont[2]=28;
for (i=0;i<mn;i++)
days+=mont[i];
days+=day;
s=yr-1+(int)((yr-1)/4)-(int)((yr-1)/100)+(int)((yr-1)/400)+days;
k=s%7;
printf("%d-%d-%d is %s.",yr,mn,day,wek[k]);
   return 0;
}


快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
经过测试可以准确计算出输入的任何日期为星期几.
清多多指教.
我的QQ:37217317 注明:C语言交流
我的信箱 dmhflower@sohu.com


2026-01-07 13:53:51
广告
不感兴趣
开通SVIP免广告
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
也许英文单词可能打错,请多多包涵.


快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我说不会吧,怎么没人顶一下啊。
好损积极性哦


  • vc99
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
呵呵,是好贴,没人夸不等于说不好啊,
收入置顶了。

呵呵,看来,看贴回贴真的是一种美德啊


  • 211.98.106.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
if (yr%4==0¦¦yr%100==0¦¦yr%400==0)
应改为:
if ((0==yr%4&&0!=yr%100)¦¦0==yr%400 )

BY----do


  • vc99
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
闰年判断确实是do熊这样的


  • 219.156.36.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
s=yr-1+(int)((yr-1)/4)-(int)((yr-1)/100)+(int)((yr-1)/400)+days;
请问一下,这工式是如何来的?固定的吗?还是自己考虑后结果?


2026-01-07 13:47:51
广告
不感兴趣
开通SVIP免广告
  • vc99
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

  我们知道,公历的平年是365天,闰年是366天。置闰的方法是能被4整除的年份在2月加一天,但能被100整除的不闰,能被400整除的又闰。因此,像1600、2000、2400年都是闰年,而1700、1800、1900、2100年都是平年。公元前1年,按公历也是闰年。

  因此,对于从公元前1年(或公元0年)12月31日到某一日子的年份Y之间的所有整年中的闰年数,就等于

[(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400],

[...]表示只取整数部分。第一项表示需要加上被4整除的年份数,第二项表示需要去掉被100整除的年份数,第三项表示需要再加上被400整除的年份数。之所以Y要减一,这样,我们就得到了第一个计算某一天是星期几的公式:

W = (Y-1)*365 + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D. (1)

其中D是这个日子在这一年中的累积天数。算出来的W就是公元前1年(或公元0年)12月31日到这一天之间的间隔日数。把W用7除,余数是几,这一天就是星期几。比如我们来算2004年5月1日:

W = (2004-1)*365 + [(2004-1)/4] - [(2004-1)/100] + [(2004-1)/400] +31+29+31+30+1)
 = 731702,

731702 / 7 = 104528……6,余数为六,说明这一天是星期六。这和事实是符合的。

  上面的公式(1)虽然很准确,但是计算出来的数字太大了,使用起来很不方便。仔细想想,其实这个间隔天数W的用处仅仅是为了得到它除以7之后的余数。这启发我们是不是可以简化这个W值,只要找一个和它余数相同的较小的数来代替,用数论上的术语来说,就是找一个和它同余的较小的正整数,照样可以计算出准确的星期数。

  显然,W这么大的原因是因为公式中的第一项(Y-1)*365太大了。其实,

(Y-1)*365 = (Y-1) * (364+1)
 = (Y-1) * (7*52+1)
 = 52 * (Y-1) * 7 + (Y-1),

这个结果的第一项是一个7的倍数,除以7余数为0,因此(Y-1)*365除以7的余数其实就等于Y-1除以7的余数。这个关系可以表示为:

(Y-1)*365 ≡ Y-1 (mod 7).

其中,≡是数论中表示同余的符号,mod 7的意思是指在用7作模数(也就是除数)的情况下≡号两边的数是同余的。因此,完全可以用(Y-1)代替(Y-1)*365,这样我们就得到了那个著名的、也是最常见到的计算星期几的公式:

W = (Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D. (2)

  这个公式虽然好用多了,但还不是最好用的公式,因为累积天数D的计算也比较麻烦。是不是可以用月份数和日期直接计算呢?答案也是肯定的。我们不妨来观察一下各个月的日数,列表如下:

月  份:1月 2月  3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
--------------------------------------------------------------------------
天  数: 31 28(29) 31 30 31 30 31 31 30 31 30 31

如果把这个天数都减去28(=4*7),不影响W除以7的余数值。这样我们就得到另一张表:

月  份:1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
------------------------------------------------------------------------
剩余天数: 3 0(1) 3 2 3 2 3 3 2 3 2 3
平年累积: 3 3 6 8 11 13 16 19 21 24 26 29
闰年累积: 3 4 7 9 12 14 17 20 22 25 27 30

仔细观察的话,我们会发现除去1月和2月,3月到7月这五个月的剩余天数值是3,2,3,2,3;8月到12月这五个月的天数值也是3,2,3,2,3,正好是一个重复。相应的累积天数中,后一月的累积天数和前一月的累积天数之差减去28就是这个重复。正是因为这种规律的存在,平年和闰年的累积天数可以用数学公式很方便地表达:

 ╭ d;                 (当M=1)
D = { 31 + d;             (当M=2)           (3)
 ╰ [ 13 * (M+1) / 5 ] - 7 + (M-1) * 28 + d + i.  (当M≥3)

其中[...]仍表示只取整数部分;M和d分别是想算的日子的月份和日数;平年i=0,闰年=1。对于M≥3的表达式需要说明一下:[13*(M+1)/5]-7算出来的就是上面第二个表中的平年累积值,再加上(M-1)*28就是想算的日子的月份之前的所有月份的总天数。这是一个很巧妙的办法,利用取整运算来实现3,2,3,2,3的循环。比如,对2004年5月1日,有:



  • 219.156.36.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
谢谢


  • 219.156.36.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include "stdio.h"
#include "string.h"
int main()
{
int i,s,w,year,month,day,days=0;
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
 char *wek[7]={"sunday",
 "Monday",
 "Tuesday",
 "Wednesday",
 "Thursday",
 "Friday",
 "Saturday"};
printf("input the date (year-month-day):\n ");
scanf("%d %d %d",&year,&month,&day);
if ((year%4==0)&&(year%100!=0)||(year%400==0))
mon[2]=29;
for (i=0;i<month;i++)
days=days+mon[i];
days=days+day;
w=year-1+(int)((year-1)/4)-(int)((year-1)/100)+(int)((year-1)/400)+days;
 s=w%7;
printf("%d-%d-%d is %s\n",year,month,day,wek[s]);
return 0;
}


  • 222.51.128.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<stdio.h>
main()
{
int yue[131={0,31,29,31,30,31,39,31,30,31,31,30,31};
int n;
int y;
int r;
int d=0;
int w;
scanf("%d%d%d",&n,&y,&r);
if(n%4==0&&n%100==0||n%400==0)
 yue[2]=yue[2]-1;
for(int i=1;i<=y;i++)
 {
 d+=yue[i];
}
 w=(n-1)+(n-1)/4-(n-1)/100+(n-1)/400+d;
 printf("" %d年%d月%d日is星期%d"",n,yue,r,w/7?w/7:w/7+1);
}


  • 222.51.128.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
多谢VC99
请问你的身份是什么啊


  • 222.51.128.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
把int yue[131={0,31,29,31,30,31,39,31,30,31,31,30,31};改成
int yue[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};


2026-01-07 13:41:51
广告
不感兴趣
开通SVIP免广告
  • elva6401
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include <stdio.h>
int m_day(int year,int month)/*此函数是给定年,月,计算此月有多少天.*/
{
if ((year%4==0 &&year%100!=0) ¦¦ (year%400==0))
switch(month)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;
case 4: case 6: case 9: case 11: return 30;
case 2: return 29;
}

else 
switch(month)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;
case 4: case 6: case 9: case 11: return 30;
case 2: return 28;
}
}

int main()
{
int year,month;
int i,days=0,d,day=0;
printf("Enter the year and month:\n");
scanf("%d%d",&year,&month);
for (i=1;i<month;i++)
days+=m_day(year,i);
d=year-1+(year-1)/4-(year-1)/100+(year-1)/400+days+1;
printf("%d-%d\n",year,month);
printf(" Sun Mon Tue Wed Thu Fri Sat\n");
for (i=0;i<d%7;i++)
printf(" ");
for (i=1;i<=7-d%7;i++)
{
day++;
printf("%5d",day);
}
printf("\n");
while(1)
{
for (i=1;i<=7;i++)
{
day++;
if (day>m_day(year,month)) {getch();return 0;}
printf("%5d",day);
}
printf("\n");
}
} 
我写的,还有一门就考完了.光明在前面.呵呵.


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 3 4 5 6 下一页 尾页
  • 96回复贴,共7页
  • ,跳到 页  
<<返回c语言吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示