万年历算法

Posted Max-Jiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了万年历算法相关的知识,希望对你有一定的参考价值。

        //万年历输入年份月份查找当月的日历
            #region

            Console.WriteLine("==========================Max Jiang的万年历=========================\n");

            int[] daysArr = new int[12] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

            Console.Write("请输入 1900 至 2099 年之间的年份:");
            int inputYear = Convert.ToInt32(Console.ReadLine());

            Console.Write("请输入查询的月份:");
            int inputMonth = Convert.ToInt32(Console.ReadLine());

            int yearDays = 0;
            for (int year = 1900; year <= inputYear - 1; year++)
            {
                if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
                {
                    yearDays += 366;
                }
                else
                {
                    yearDays += 365;
                }
            }
            //Console.WriteLine(yearDays);
            int monthDays = 0;
            Console.WriteLine("---------------------第" + inputYear + "年------------第" + inputMonth + "月份--------------------\n");
            for (int month = 0; month < inputMonth - 1; month++)
            {
                if ((inputYear % 4 == 0 && inputYear % 100 != 0) || inputYear % 400 == 0)
                {
                    daysArr[1] = 29;
                    monthDays += daysArr[month];
                }
                else
                {
                    daysArr[1] = 28;
                    monthDays += daysArr[month];
                }
            }
            //Console.Write(monthDays);
            yearDays += monthDays;  //计算出输入的前一月的天数总和

            ////这是将知道的每月的第一天星期几,放在相对应的周几

            int dayOfWeek = yearDays % 7 + 1;   //通过总天数计算周数,加1为了计算下一月的第一天星期几
            //Console.WriteLine("本月第一天是星期" + dayOfWeek);
            int[,] weeks = new int[(daysArr[inputMonth - 1] / 7) + 1, 7];//二位数组,加载周


            Console.WriteLine("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期日\t");
            int cols = 0;
            int m = 1;
            switch (dayOfWeek)
            {
                case 1: cols = 0; break;
                case 2: cols = 1; break;
                case 3: cols = 2; break;
                case 4: cols = 3; break;
                case 5: cols = 4; break;//通过列cols承载星期几
                case 6: cols = 5; break;
                case 7: cols = 6; break;
                default: break;
            }
            for (int row = 0; row < (daysArr[inputMonth - 1] / 7) + 1; row++)
            {
                if (cols != 0)
                {
                    for (int i = 0; i < cols; i++)
                    {
                        weeks[row, i] = 0;//如果新月份的第一天不是星期一,用空填充星期
                        Console.Write("\t");
                    }
                }
                for (; cols < 7; cols++)//通过cols给每一列赋值,也就是天数
                {
                    if (m <= daysArr[inputMonth - 1])//小于没月份的天数
                    {
                        weeks[row, cols] = m;
                        Console.Write("\0\0" + m + "\t");
                        ++m;
                    }
                }
                cols = 0;//循环给零,不能放上面,因为就不能循环为零
                Console.WriteLine();
            }

            #endregion

自己没事瞎写的,有想法请评论。

以上是关于万年历算法的主要内容,如果未能解决你的问题,请参考以下文章

Python学习插曲之万年历算法

Python学习插曲之万年历算法

万年历算法

基于51单片机的万年历(算法实现)

C语言第一个C语言小程序 —— 日期算法和万年历2

年份月数天数