出一个C#面试题给大家做
题目要求:
(1)产生本月的月历,参考样式:
SU MO TU WE TH FR SA 01 02 03 0405 06 07 08 09 10 1112 13 14 15 16 17 1819 20 21 22 23 24 2526 27 28 29 30
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { string calendar = ""; // 在这里编写代码 Console.WriteLine(calendar); } }}
string calendar = ""; // 在这里编写代码 DateTime now = DateTime.Today; DateTime dt1 = new DateTime(now.Year, now.Month, 1); DateTime dt2 = dt1.AddMonths(1).AddDays(-1); StringBuilder sb = new StringBuilder(); for (int i = (int)DayOfWeek.Sunday; i <= (int)DayOfWeek.Saturday; i++) { sb.Append(((DayOfWeek)i).ToString().Substring(0, 2).ToUpper() + " "); } for (DateTime dt = dt1.AddDays(-(int)now.DayOfWeek); dt <= dt2; dt = dt.AddDays(1)) { if (dt.Month < now.Month) sb.Append(" "); else sb.Append(dt.Day.ToString().PadLeft(2, '0') + " "); if (dt.DayOfWeek == DayOfWeek.Saturday) sb.AppendLine(); } calendar = sb.ToString(); Console.WriteLine(calendar);
[解决办法]
方法笨点。。
string calendar = ""; // 在这里编写代码 DateTime date = DateTime.Now; DateTime firstDay = new DateTime(date.Year, date.Month, 1); int daysCount = DateTime.DaysInMonth(date.Year, date.Month); int weekOfFirstDay = Convert.ToInt32(firstDay.DayOfWeek); calendar = "\tSU\tMO\tTU\tWE\tTH\tFR\tSA\n"; for (int i = 1; i < daysCount + 1; i++) { if (i == 1) { for (int j = 0; j < weekOfFirstDay; j++) { calendar += "\t"; } } string str = i < 10 ? i.ToString().PadLeft(2, '0') : i.ToString(); calendar += "\t" + str; if ((i + weekOfFirstDay) % 7 == 0) { calendar += "\n"; } } Console.WriteLine(calendar); Console.ReadLine();
[解决办法]
拿出手机,调出日历,照着画
Console.WriteLine("SU MO TU WE TH FR SA");
Console.WriteLine(" 01 02 03 04");
Console.WriteLine("05 06 07 08 09 10 11");
Console.WriteLine("12 13 14 15 16 17 18");
Console.WriteLine("19 20 21 22 23 24 25");
Console.WriteLine("26 27 28 29 30 ");
临走别忘记淡定的说句,"这公司太弱了,出这么简单的题目,老子来了一次不想来第二次了"
[解决办法]
动动手,写个:
static void GenerateCalendar(int year, int month){ var num = 7; var cols = Enumerable.Range(0, num).ToArray(); var row = Enumerable.Range(0, num).Select(x => "__").ToArray(); var begin = new DateTime(year, month, 1); var end = begin.AddDays(DateTime.DaysInMonth(year, month) - 1); while (begin.Month == end.Month && begin.Day <= end.Day) { row[(int)begin.DayOfWeek] = begin.Day.ToString("00"); if ((int)begin.DayOfWeek == cols[cols.Length-1]) { Console.WriteLine(string.Join(" ", row)); row = Enumerable.Range(0, num).Select(x => "__").ToArray(); } begin = begin.AddDays(1); } Console.WriteLine(string.Join(" ", row));}
[解决办法]
标记一下
[解决办法]
都在炫技...这种需求根本不用搞这么复杂,一个循环就够了...
[解决办法]
年历……
string calendar = ""; // 在这里编写代码 DateTime now = DateTime.Today; DateTime dt1 = new DateTime(now.Year, 1, 1); DateTime dt2 = dt1.AddYears(1).AddDays(-1); StringBuilder sb = new StringBuilder(); for (int month = 1; month <= 12; month += 4) { for (int j = 0; j < 4; j++) { sb.Append(dt1.AddMonths(month + j - 1).ToString("MMM", new System.Globalization.CultureInfo("en-us")) + new string(' ', 18) + "|"); } sb.AppendLine(); for (int j = 0; j < 4; j++) { for (int i = (int)DayOfWeek.Sunday; i <= (int)DayOfWeek.Saturday; i++) { sb.Append(((DayOfWeek)i).ToString().Substring(0, 2).ToUpper() + " "); } sb.Append("|"); } sb.AppendLine(); DateTime[] dt = new DateTime[4]; for (int i = 0; i < dt.Length; i++) { dt[i] = dt1.AddMonths(month + i - 1); dt[i] = dt[i].AddDays(-(int)dt[i].DayOfWeek); } while (true) { for (int i = 0; i < 4; i++) { DateTime end = month + i == 12 ? new DateTime(now.Year + 1, 1, 1).AddDays(-1) : new DateTime(now.Year, month + i + 1, 1).AddDays(-1); end = end.AddDays(DayOfWeek.Saturday - end.DayOfWeek); for (; dt[i] <= end; dt[i] = dt[i].AddDays(1)) { if (dt[i] < new DateTime(now.Year, month + i, 1) || dt[i] > new DateTime(now.Year, month + i, 1).AddMonths(1).AddDays(-1)) sb.Append(new string(' ', 3)); else sb.Append(dt[i].Day.ToString().PadLeft(2, '0') + " "); if (dt[i].DayOfWeek == DayOfWeek.Saturday) { dt[i] = dt[i].AddDays(1); sb.Append("|"); break; } } } sb.AppendLine(); int count = 0; for (int j = 0; j < dt.Length; j++) { if (dt[j] >= new DateTime(now.Year, month + j, 1).AddMonths(1).AddDays(-1)) count++; else break; } if (count == 4) break; } sb.AppendLine(new string('-', 3 * 7 * 4)); } calendar = sb.ToString(); Console.WriteLine(calendar);
[解决办法]
四楼的不错。
[解决办法]
[解决办法]
本来不想写的,看着你们把简单问题复杂化真是蛋疼...这个题根本没有炫技的必要,非常简单的逻辑...
string MonthCalendar(int year, int month){ var first = new DateTime(year, month, 1); var last = new DateTime(month == 12 ? year + 1 : year, month == 12 ? 1 : month + 1, 1); var days = last.Subtract(first).Days; var prevDays = (int)first.DayOfWeek; var nextDays = 7 - (int)last.DayOfWeek; var result = new StringBuilder("SU MO TU WE TH FR SA"); result.AppendLine(); for (int i = -prevDays; i < prevDays + days + nextDays; i++) { if (i > -1 && i < days) result.Append((i + 1).ToString().PadLeft(2, ' ')); else result.Append(" "); if ((i + prevDays + 1) % 7 == 0) result.AppendLine(); else result.Append(" "); } return result.ToString();}string YearCalendar(int year){ var result = new StringBuilder(); for (int i = 1; i < 13; i++) { result.AppendLine(MonthCalendar(year, i)); } return result.ToString();}
[解决办法]
没代码也来捧个场。友情UP