获取当年年份 月份判断星期几 如何写个程序计算出每个月的第一个星期一对应的日期

获取当年年份

#include<time.h>

main()
{
time_t timep;
struct tm *p;
time (&timep);
p=gmtime(&timep);
printf("%d\n",p->tm_sec); /*获取当前秒*/
printf("%d\n",p->tm_min); /*获取当前分*/
printf("%d\n",8+p->tm_hour);/*获取当前时,这里获取西方的时间,刚好相差八个小时*/
printf("%d\n",p->tm_mday);/*获取当前月份日数,范围是1-31*/
printf("%d\n",1+p->tm_mon);/*获取当前月份,范围是0-11,所以要加1*/
printf("%d\n",1900+p->tm_year);/*获取当前年份,从1900开始,所以要加1900*/
printf("%d\n",p->tm_yday); /*从今年1月1日算起至今的天数,范围为0-365*/

}

https://zhidao.baidu.com/question/558299804.html


月份判断星期几 

#include "stdio.h"
#include <stdlib.h>  // 缺少头文件 
 
main()
{
    int y,m,d,a,b;
    b=0;
    scanf("%d%d%d",&y,&m,&d); 
    if(m>12||m<0) 
    {
        b=1;                          // b=1 后面少了逗号 
        printf("month is error.\n");  // 最后面少了逗号
    }                                 // 这里结尾的分号去掉
    else 
    {
        if(d<0) 
        {
            b=1; 
            printf("day is error.\n");// 最后面少了逗号
        }                             // 这里结尾的分号去掉
    else
    switch(m)
    {
    case 1: if(d>32) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号 
    case 2: if((y%4==0&&y%100!=0)||(y%400==0)) a=1;            
                        // 这里把 a==1 改成 a=1 
    else a==2;                                                 
                        // 这里把 a==2 改成 a=2
    if(a==1&&d>30) {b=1; printf("day is error.\n");}; break;   
                        // 问题同上,少逗号
    if(a==2&&d>29) {b=1; printf("day is error.\n");}; break;   
                        // 问题同上,少逗号
    case 3: if(d>32) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 4: if(d>31) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 5: if(d>32) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 6: if(d>31) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 7: if(d>32) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 8: if(d>32) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 9: if(d>31) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 10: if(d>32) {b=1; printf("day is error.\n");}; break;
                        // 问题同上,少逗号
    case 11: if(d>31) {b=1; printf("day is error.\n");}; break;
                        // 问题同上,少逗号
    case 12: if(d>32) {b=1; printf("day is error.\n");}; break;
                        // 问题同上,少逗号
    }
    }
    if(m==1||m==2) {
        m+=12;
        y--;} 
     
    if(b==0) {int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 
       // 这里把 b=0 改成 b==0 
    switch(iWeek)
    {
    case 0: printf("1\n"); break;
    case 1: printf("2\n"); break;
    case 2: printf("3\n"); break;
    case 3: printf("4\n"); break;
    case 4: printf("5\n"); break;
    case 5: printf("6\n"); break;
    case 6: printf("0\n"); break;
    } 
    }
    system("pause"); 
}

https://zhidao.baidu.com/question/1238216961329183379.html

作者:陈默
链接:https://www.zhihu.com/question/51789552/answer/127750014
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

蔡勒公式:
&amp;lt;img src=&quot;https://i-blog.csdnimg.cn/blog_migrate/91c0bc536c8f5421f52ddeed64c3d042.jpeg&quot; data-rawwidth=&quot;1042&quot; data-rawheight=&quot;114&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1042&quot; data-original=&quot;https://pic2.zhimg.com/v2-31a2c831436a892f14b15fcb38e3b5c9_r.jpg&quot;&amp;gt;

公式中的符号含义如下:

  • w:星期(0-星期日;1-星期一;2-星期二;3-星期三;4-星期四;5-星期五;6-星期六)
  • c:年份前两位数
  • y:年份后两位数
  • m:月(m的取值范围为3至14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算)
  • d:日
  • [ ]:称作高斯符号,代表向下取整,即,取不大于原数的最大整数。
  • mod:同余(这里代表括号里的答案除以7后的余数)
&amp;lt;img src=&quot;https://i-blog.csdnimg.cn/blog_migrate/409f7f77e89c2bf3dd9183d878e6362d.png&quot; data-rawwidth=&quot;1089&quot; data-rawheight=&quot;338&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1089&quot; data-original=&quot;https://pic1.zhimg.com/v2-ed68522e8b1e9bbd358dad973c78625c_r.png&quot;&amp;gt; https://zh.wikipedia.org/zh-hans/蔡勒公式
有一个公式可以计算:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 
w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。(C是世纪数减一,y是年份后两位,M是月份,d是日数。1月和2月要按上一年的13月和 14月来算,这时C和y均按上一年取值。)
算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。
https://zhidao.baidu.com/question/243564537.html

简单,用蔡勒公式即可:

#include <stdio.h>

int main ()

{

  int y, m, d, c, w;

  printf ("输入年 月 日(空格间隔):");

  scanf ("%d %d %d", &y, &m, &d);

  if (m ==1 || m == 2) { //判断月份是否为1或2

    y--;

    m += 12;

  }

  c = y / 100;

  y = y - c * 100;

  w = (c / 4) - 2 * c + (y + y / 4) + (13 * (m + 1) / 5) + d - 1;

  while (w < 0) w += 7;

  w %= 7;

  if (w == 0) printf ("星期日");

  else printf ("星期%d", w);

  return 0;

}

https://zhidao.baidu.com/question/1510495711879567580.html

如何写个程序计算出每个月的第一个星期一对应的日期

在前面,我们分别利用泰勒公式和C标准库中的mktime()函数推算了某个特定日期所对应的星期几,刚做完这些,就又遇到了一个与日期相关的新任务:

老板把每个月例会的时间定在了每个月的第一个星期一,他让我把具体日期整理出来,发给每一个成员,提醒大家准时参加。

简单地讲,也就是把每个月的第一个星期一对应的日期提取出来。如果时间范围比较短(比如一年),自己翻翻日历勉强也能解决,如果要是时间范围比较长(比如十年),再去一个个翻日历,就麻烦了。怎么办?

还记得我们在学了C语言,如何统计一篇英文文章中的单词数?中所认识和体会到的:

程序,就是用来帮助人们完成这些看起来枯燥繁琐但是带有一定规律性的事情的。

面对这个麻烦而又有一定规律的问题,我们同样可以用C语言写个程序来解决。

如何解决呢?想想我们是如何在日历中找出每个月的第一个星期一的?我们先用1月份的第一个星期一作为起点,然后以七天为一个间隔,查看下一个星期一的日期,如果是新的一个月的星期一,则输出,如果在已经输出的这个月,则继续加上7天向下寻找,知道找完这一年为止。

基本思路就是这样,但是,我们这里还用到了mktime()函数的一个特点,也就是如果输入的分解时间的日期tm_mday超出了其取值范围[0,30],mktime()会将其折算成相邻月份的日期,比如,某个月的tm_mday 为32,而这个月只有30天,mktime()会将其视作下个月的第二天,而不会将其视作日期错误。利用这个特性,我们就可以通过递增tm_mday完成整个一年的遍历访问量了。

按照上面分析的思路,我们可以将其实现如下:

#include <string.h> #include <time.h> #include <stdio.h> //#include <stdbool.h> #define YEAR 2017 int main() {     struct tm t;     memset(&t,0,sizeof(t));     //用年月日填充分解时间t     //这里指定1月中的第一个星期为起点     t.tm_year = YEAR - 1900; // 年份,减去起始年份     t.tm_mon = 1 - 1; // 月份     t.tm_mday = 1;  // 2013年1月7日是1月份的第一个星期一  修改处     (这儿我们写成第一个星期日)     puts("the first mondays in 2017 are");     // 记录已经输出的月份     int lastmon = -1;     while(1)     {         //将分解时间t转换为日历时间ct         time_t ct = mktime(&t);         if(-1 == ct) //日期错误         {             break;         }         else         {             //用localtime()函数获取日历时间ct对应的分解时间             struct tm* bt = localtime(&ct);             //判断是否在2013年内             if(bt->tm_year != YEAR-1900)             {                 break;             }             //判断这个星期一是否是本月的第一个星期一             if(t.tm_mon != lastmon)             {                 //如果是,输出对应的日期                 printf("%d - %d\n",bt->tm_mon+1,bt->tm_mday);                 //记录本月已经输出                 lastmon = bt->tm_mon;             }             t = *bt;  //更新日期             t.tm_mday += 7; //检查下一个星期一         }     }     return 0; }
http://www.cnblogs.com/kingshow123/archive/2013/11/01/firstmonday.html
2017年每个月份第一个星期日对应的日期:
#include <string.h>
#include <time.h>
#include <stdio.h>
int getxq();


//#include <stdbool.h>
//#define YEAR 2016   //宏规定时间
int YEAR ;
int main()
{    




//变量获取时间


time_t timep;
struct tm *p;
time (&timep);
p=gmtime(&timep);
YEAR=1900+p->tm_year;












    struct tm t;
    memset(&t,0,sizeof(t));
    //用年月日填充分解时间t
    //这里指定1月中的第一个星期为起点
    t.tm_year = YEAR - 1900; // 年份,减去起始年份
    t.tm_mon = 1 - 1; // 月份


    t.tm_mday = 1+7-getxq();  // 2013年1月7日是1月份的第一个星期一  修改处     (这儿我们写成第一个星期日)
    puts("the first mondays in 2017 are");
    // 记录已经输出的月份
    int lastmon = -1;
    while(1)
    {
        //将分解时间t转换为日历时间ct
        time_t ct = mktime(&t);
        if(-1 == ct) //日期错误
        {
            break;
        }
        else
        {
            //用localtime()函数获取日历时间ct对应的分解时间
            struct tm* bt = localtime(&ct);
            //判断是否在2013年内
            if(bt->tm_year != YEAR-1900)
            {
                break;
            }
            //判断这个星期一是否是本月的第一个星期一
            if(t.tm_mon != lastmon)
            {
                //如果是,输出对应的日期
                printf("%d - %d\n",bt->tm_mon+1,bt->tm_mday);
                //记录本月已经输出
                lastmon = bt->tm_mon;
            }
            t = *bt;  //更新日期
            t.tm_mday += 7; //检查下一个星期一
        }
    }


    return 0;
}


int getxq()
{/*int YEAR ;
time_t timep;
struct tm *p;
time (&timep);
p=gmtime(&timep);
YEAR=1900+p->tm_year;*/




    int y,m,d,a,b;
    b=0;
  y=YEAR;
  m=1;
  d=1; //当年1月1号的星期几


    if(m>12||m<0) 
    {
        b=1;                          // b=1 后面少了逗号 
        printf("month is error.\n");  // 最后面少了逗号
    }                                 // 这里结尾的分号去掉
    else 
    {
        if(d<0) 
        {
            b=1; 
            printf("day is error.\n");// 最后面少了逗号
        }                             // 这里结尾的分号去掉
    else
    switch(m)
    {
    case 1: if(d>32) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号 
    case 2: if((y%4==0&&y%100!=0)||(y%400==0)) a=1;            
                        // 这里把 a==1 改成 a=1 
    else a==2;                                                 
                        // 这里把 a==2 改成 a=2
    if(a==1&&d>30) {b=1; printf("day is error.\n");}; break;   
                        // 问题同上,少逗号
    if(a==2&&d>29) {b=1; printf("day is error.\n");}; break;   
                        // 问题同上,少逗号
    case 3: if(d>32) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 4: if(d>31) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 5: if(d>32) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 6: if(d>31) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 7: if(d>32) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 8: if(d>32) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 9: if(d>31) {b=1; printf("day is error.\n");}; break; 
                        // 问题同上,少逗号
    case 10: if(d>32) {b=1; printf("day is error.\n");}; break;
                        // 问题同上,少逗号
    case 11: if(d>31) {b=1; printf("day is error.\n");}; break;
                        // 问题同上,少逗号
    case 12: if(d>32) {b=1; printf("day is error.\n");}; break;
                        // 问题同上,少逗号
    }
    }
    if(m==1||m==2) {
        m+=12;
        y--;} 
     
    if(b==0) {int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 
       // 这里把 b=0 改成 b==0 
    switch(iWeek)
    {
    case 0: return 1; break;
    case 1: return 2; break;
    case 2: return 3; break;
    case 3: return 4; break;
    case 4: return 5; break;
    case 5: return 6; break;
    case 6: return 7; break;
    } 
    }
  
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值