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

获取当年年份

#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://pic2.zhimg.com/v2-31a2c831436a892f14b15fcb38e3b5c9_b.jpg&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://pic1.zhimg.com/v2-ed68522e8b1e9bbd358dad973c78625c_b.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;
    } 
    }
  
}






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我会给一个 Java 程序来帮助您打印日历图。 首先,我们需要一个函数来计算给定年份月份的天数。我们可以使用 Java 的 `Calendar` 类来实现这一点。 ``` import java.util.Calendar; public static int getDaysInMonth(int year, int month) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month); return calendar.getActualMaximum(Calendar.DAY_OF_MONTH); } ``` 然后,我们可以使用这个函数来打印日历图。我们还需要一个函数来计算给定年份月份的第一天是星期几。 ``` import java.util.Calendar; public static int getFirstDayOfWeek(int year, int month) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month); calendar.set(Calendar.DAY_OF_MONTH, 1); return calendar.get(Calendar.DAY_OF_WEEK); } ``` 现在,我们可以使用这两个函数来打印日历图。首先,我们打印月份的名称和年份,然后打印星期的名称。 ``` import java.util.Calendar; public static void printCalendar(int year, int month) { // 获取当前月份的天数 int daysInMonth = getDaysInMonth(year, month); // 获取当前月份第一天是星期几 int firstDayOfWeek = getFirstDayOfWeek(year, month); // 打印月份名称和年份 System.out.println(getMonthName(month) + " " + year); // 打印星期名称 System.out.println("Su Mo Tu We Th Fr Sa"); // 打印空白日期 for (int i = 1; i < firstDayOfWeek; i++) { System.out.print(" " ### 回答2: 实现以上功能可以采用以下步骤: 1. 首先,要根据用户输入的年份月份来确定该月的天数。可以使用Java的Calendar类来获得某个月的天数。使用如下代码获取某年某月的天数: ```java int year = 2021; // 用户输入的年份 int month = 8; // 用户输入的月份 Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1, 1); int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); ``` 2. 然后,要确定起始日期星期几,根据题目的条件,1900年1月1日是星期一,所以可以计算从1900年1月1日到用户输入的年份月份所表示的日期的总天数,并对7取模得到当前月份的起始日期星期几。使用如下代码计算: ```java int totalDays = 0; for (int i = 1900; i < year; i++) { if (calendar.isLeapYear(i)) { // 判断是否为闰年 totalDays += 366; } else { totalDays += 365; } } for (int i = 1; i < month; i++) { calendar.set(year, i - 1, 1); totalDays += calendar.getActualMaximum(Calendar.DAY_OF_MONTH); } int startDayOfWeek = (totalDays + 1) % 7; // 计算当前月份的起始日期星期几,星期一为0,星期二为1,依此类推 ``` 3. 接下来,可以使用循环打印日历图。使用如下代码打印: ```java System.out.println("星期一 星期星期星期星期星期星期日"); for (int i = 0; i < startDayOfWeek; i++) { System.out.print(" "); // 打印起始日期之前的空格 } for (int i = 1; i <= days; i++) { System.out.printf("%7d", i); // 打印日期 if ((startDayOfWeek + i) % 7 == 0) { System.out.println(); // 每打印7个日期换行 } } ``` 以上是根据用户输入的年份月份打印日历图的实现方法,可以将以上代码整合到一个方法中,并对异常情况进行处理。 ### 回答3: 可以通过以下步骤来实现根据用户输入的年份月份打印日历图。 1. 首先,需要获取用户输入的年份月份。可以使用Scanner类来实现。 2. 接下来,需要计算输入月份的第一天是星期几。根据题目给的条件,已知1900年1月1日是星期一。可以通过计算经过的天数来求得所需日期星期几。 3. 然后,需要确定输入月份的天数。可以使用Calendar类的getActualMaximum方法来获取。 4. 最后,要按照日历的形式打印输。可以使用循环来实现。先打印星期几的标题行,再打印每一天的日期。可以使用格式化输来对齐输的内容。 下面是一种可能的实现方式,具体代码如下: ```java import java.util.Scanner; import java.util.Calendar; public class CalendarPrinter { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入年份:"); int year = scanner.nextInt(); System.out.print("请输入月份:"); int month = scanner.nextInt(); // 计算第一天是星期几 Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1, 1); int firstDayOfWeek = (calendar.get(Calendar.DAY_OF_WEEK) - 1 + 7) % 7; // 确定月份的天数 int daysOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); // 打印输 System.out.println("==============================="); System.out.printf(" %d年%d月%n", year, month); System.out.println("==============================="); System.out.println("日 一 二 三 四 五 六"); // 打印空格 for (int i = 0; i < firstDayOfWeek; i++) { System.out.print(" "); } // 打印日期 for (int i = 1; i <= daysOfMonth; i++) { System.out.printf("%2d ", i); if ((firstDayOfWeek + i) % 7 == 0) { System.out.println(); } } System.out.println(); System.out.println("==============================="); scanner.close(); } } ``` 这样,用户输入的年份月份即可打印对应的日历图。在打印日期时,如果一个月的第一天不是星期一,那么需要在前面打印相应的空格。每打印7个日期后换行。输的格式与日历类似。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值