这两天看了一下B站的unityC#基础,看到一个经典例题,也是说月历的。
稍微做了一下,在这里分享一下我个人的代码方法。
PS:本方法主要基于三个语句
获得天数:
int DateTime.DaysInMonth(year, month)
获得当天为星期几:
DateTime date = new DateTime(year, month, day);
int date.DayOfWeek (这个转int可以输出0~6,对应星期日到星期六);
下面是使用案例
1.Main直接用来交互
static void Main()
{
Console.WriteLine("请输入年份");
int year = AnswerYear();
Console.WriteLine("请输入月份");
int month = AnswerMonth();
Console.WriteLine("{0}年{1}月的月历", year, month);
Display(year,month);//把年份和月份传到display里
Console.WriteLine("再试一次吗?Y/N");
do
{
var answer = Console.ReadLine()?.ToLower();
switch (answer)
{
case "y":Main();return;
case "n":return;
default:Console.WriteLine("无法识别的输入,请重新输入");break;
}
} while (true);
}
2.AnswerYear和AnswerMonth的检测。
因为我的方法需要用到datetime(里面规定年份范围为1~9999,月份范围为1~12,否则会报错。)
private static int AnswerYear()
{
int answer;
do
{
int.TryParse(Console.ReadLine(), out answer);
if (answer >= 1 & answer <= 9999)
{
break;
}
else
{
Console.WriteLine("数据类型错误,请重新输入");
}
} while (true);
return answer;
}//判断输入的年份是否符合要求并输出int数
3.显示(display)函数
private static void Display(int year,int month)
{
int days = DateTime.DaysInMonth(year, month);//获得当月天数
Console.WriteLine("日\t一\t二\t三\t四\t五\t六");//表头
//逐日编入表中
for (int day = 1; day<=days; day++)
{
DatesLocation(year, month, day);//处理位置的函数
Console.Write(day);
}
Console.Write("\r\n");
}
4.日期位置DatesLocation函数
private static void DatesLocation(int year,int month,int day)
{
DateTime date = new DateTime(year, month, day);
if (day == 1)//处理第一天的位置
{
for(int i= (int)date.DayOfWeek; i>0; i--)//第一天的星期数即为空格数
{
Console.Write("\t");
}
}
else if ((int)date.DayOfWeek == 0)//处理星期天的转行
{
Console.Write("\r\n");
}
else//同行的日期空格
{
Console.Write("\t");
}
}