1. 程式人生 > >程式設計之C#控制檯輸出日曆示例

程式設計之C#控制檯輸出日曆示例

        本題目的最終要就是根據使用者輸入的年和月在控制檯輸出單月的日曆資訊,附加範圍年在1900-2100之間,月的範圍在1-12之間,當用戶輸入不在範圍時要給予錯誤資訊提示;已知條件是1900年1月1日為星期一。

        要輸出此日曆就需要知道該月的第一天是星期幾,確定後才好根據天數推出後面的日期。其具體實現的程式碼如下:

using System;
using System.Collections.Generic;
class Test
{
    public static void Main(String[] args)
    {
        while (true)
        {
            int year, month;//分別宣告接收使用者輸入年月的變數
            while (true)
            {
                Console.Write("請輸入年份(1900-2100):");
                year = int.Parse(Console.ReadLine());
                if (year < 1900 || year > 2100)
                {
                    Console.Write("輸入的年份不在1900-2100之間,請按會車鍵重新輸入!");
                    Console.ReadLine();
                    Console.Clear();
                }
                else
                {
                    Console.Write("請輸入月份(1-12):");
                    month = int.Parse(Console.ReadLine());
                    if (month < 1 || month > 12)
                    {
                        Console.Write("輸入的月份不在1-12之間,請按回車鍵重新輸入!");
                        Console.ReadLine();
                        Console.Clear();
                    }
                    else
                        break;
                }
            }

            List<string> dataes = new List<string>();
            //分別宣告使用者輸入的年月與已知1900年1月1日相隔的整年天數和月份天數
            int crossDayToYear = 0, crossDayToMonth = 0;
            //1900年到year-1年相隔的天數
            for (int i = 1900; i < year; i++)
            {
                if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
                    crossDayToYear += 366;
                else
                    crossDayToYear += 365;
            }

            for (int i = 1; i < month; i++)
            {
                if (i == 2)
                {
                    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                        crossDayToMonth += 29;
                    else
                        crossDayToMonth += 28;
                }
                else if (i <= 7 && i % 2 != 0 || i > 7 && i % 2 == 0)
                    crossDayToMonth += 31;
                else
                    crossDayToMonth += 30;
            }
            int crossDay = crossDayToYear + crossDayToMonth;//相隔的總天數
            int dayOfWeek = crossDay % 7 + 1;//使用者輸入的月份第一天是星期幾
            int space = dayOfWeek - 1;
            for (int i = 0; i < space; i++)
            {
                dataes.Add("");
            }

            int days;//使用者輸入的月份的天數
            if (month == 2)
            {
                if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                    days = 29;
                else
                    days = 28;
            }
            else if (month <= 7 && month % 2 != 0 || month > 7 && month % 2 == 0)
                days = 31;
            else
                days = 30;
            for (int i = 1; i <= days; i++)
            {
                dataes.Add(i.ToString());
            }
            Console.WriteLine("******************************************************");
            Console.Write("一\t二\t三\t四\t五\t六\t日");
            for (int i = 0; i < dataes.Count; i++)
            {
                if (i % 7 == 0)
                    Console.WriteLine();
                Console.Write(dataes[i] + "\t");
            }
            Console.WriteLine();
            Console.WriteLine("******************************************************");
            Console.Write("按回車鍵繼續");
            Console.ReadLine();
            Console.Clear();
        }
    }
}

        此題的難點在於根據使用者輸入的年月計算出與已知1900年1月1日所在的星期一相隔的天數,根據天數計算出單月的第一天是星期幾,如果一星期一作為日曆的第一個輸出點後面類推,就需要知道該月第一天所在的星期與星期一相隔多少個空格,當第一天確定後,後面的日期就好判斷了。