本題目的最終要就是根據用戶輸入的年和月在控制檯輸出單月的日曆信息,附加範圍年在1900-2100之間,月的範圍在1-12之間,當用戶輸入不在範圍時要給予錯誤信息提示;已知條件是1900年1月1日爲星期一。spa
要輸出此日曆就須要知道該月的第一天是星期幾,肯定後纔好根據天數推出後面的日期。其具體實現的代碼以下:code
1 using System;
2 using System.Collections.Generic; 3 class Test 4 { 5 public static void Main(String[] args) 6 { 7 while (true) 8 { 9 int year, month;//分別聲明接收用戶輸入年月的變量 10 while (true) 11 { 12 Console.Write("請輸入年份(1900-2100):"); 13 year = int.Parse(Console.ReadLine()); 14 if (year < 1900 || year > 2100) 15 { 16 Console.Write("輸入的年份不在1900-2100之間,請按會車鍵從新輸入!"); 17 Console.ReadLine(); 18 Console.Clear(); 19 } 20 else 21 { 22 Console.Write("請輸入月份(1-12):"); 23 month = int.Parse(Console.ReadLine()); 24 if (month < 1 || month > 12) 25 { 26 Console.Write("輸入的月份不在1-12之間,請按回車鍵從新輸入!"); 27 Console.ReadLine(); 28 Console.Clear(); 29 } 30 else 31 break; 32 } 33 } 34 35 List<string> dataes = new List<string>(); 36 //分別聲明用戶輸入的年月與已知1900年1月1日相隔的全年天數和月份天數 37 int crossDayToYear = 0, crossDayToMonth = 0; 38 //1900年到year-1年相隔的天數 39 for (int i = 1900; i < year; i++) 40 { 41 if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) 42 crossDayToYear += 366; 43 else 44 crossDayToYear += 365; 45 } 46 47 for (int i = 1; i < month; i++) 48 { 49 if (i == 2) 50 { 51 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) 52 crossDayToMonth += 29; 53 else 54 crossDayToMonth += 28; 55 } 56 else if (i <= 7 && i % 2 != 0 || i > 7 && i % 2 == 0) 57 crossDayToMonth += 31; 58 else 59 crossDayToMonth += 30; 60 } 61 int crossDay = crossDayToYear + crossDayToMonth;//相隔的總天數 62 int dayOfWeek = crossDay % 7 + 1;//用戶輸入的月份第一天是星期幾 63 int space = dayOfWeek - 1; 64 for (int i = 0; i < space; i++) 65 { 66 dataes.Add(""); 67 } 68 69 int days;//用戶輸入的月份的天數 70 if (month == 2) 71 { 72 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) 73 days = 29; 74 else 75 days = 28; 76 } 77 else if (month <= 7 && month % 2 != 0 || month > 7 && month % 2 == 0) 78 days = 31; 79 else 80 days = 30; 81 for (int i = 1; i <= days; i++) 82 { 83 dataes.Add(i.ToString()); 84 } 85 Console.WriteLine("******************************************************"); 86 Console.Write("一\t二\t三\t四\t五\t六\t日"); 87 for (int i = 0; i < dataes.Count; i++) 88 { 89 if (i % 7 == 0) 90 Console.WriteLine(); 91 Console.Write(dataes[i] + "\t"); 92 } 93 Console.WriteLine(); 94 Console.WriteLine("******************************************************"); 95 Console.Write("按回車鍵繼續"); 96 Console.ReadLine(); 97 Console.Clear(); 98 } 99 } 100 }
此題的難點在於根據用戶輸入的年月計算出與已知1900年1月1日所在的星期一相隔的天數,根據天數計算出單月的第一天是星期幾,若是一星期一做爲日曆的第一個輸出點後面類推,就須要知道該月第一天所在的星期與星期一相隔多少個空格,當第一天肯定後,後面的日期就好判斷了。blog