初学者 用C#写的一个简单万年历 还有哪里可以优化 希望高手指出来 希望有思路更清晰的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Calendar2
{
class Calendar
{
int year;
int month;
int day;
public void Start()
{
int allDay = 0;//总天数
int week = 1;//星期
int weekDay = 0;//输入月天数
PrintYMD();//输入年和月
allDay = ClcAllDay(year, month);//得到总天数
//Console.WriteLine(allDay);
week = GetWeek(allDay);//得到星期
//Console.WriteLine(week);
weekDay = GetMonthDay(this.month, this.year);//得到输入月份的天数
//Console.WriteLine(weekDay);
FormPrintMonth(weekDay, week, allDay);
}
/// <summary>
/// 输入年份和月份
/// </summary>
public void PrintYMD()
{
Console.Write("输入年份:");
this.year = int.Parse(Console.ReadLine());
Console.Write("输入月份:");
this.month = int.Parse(Console.ReadLine());
}
/// <summary>
/// 计算1900年到输入的年份月份之间的总天数
/// </summary>
/// <param name="year">输入人的年份</param>
/// <param name="month">输入的</param>
/// <return>总天数</return>
public int ClcAllDay(int year, int month)
{
int allDay = 0;
for (int i = 1900; i < year ; i++) //年
{
for (int j = 1; j <= 12; j++) // 月
{
allDay += GetMonthDay(j, i);
}
}
allDay += ClcAllMonthDay(month);
return allDay;
}
/// <summary>
/// 2月份的天数
/// </summary>
/// <param name="year">年份</param>
/// <param name="allDay">总天数</param>
public int Clc2(int year)
{
int dayNum = 0;
if (year % 4 == 0 && year % 400 != 0)
{
dayNum = 29;
}
else
{
dayNum = 28;
}
return dayNum;
}
/// <summary>
/// 计算输入年开始到输入的月份过了多少天
/// </summary>
/// <param name="month">输入月份</param>
/// <returns>返回总天数</returns>
public int ClcAllMonthDay(int month)
{
int allDay = 0;
for (int i = 1; i < month; i++)
{
allDay += GetMonthDay(i, this.year);
}
return allDay;
}
/// <summary>
/// 计算输入月份开始是星期几
/// </summary>
/// <param name="allDay">1900年到输入月份的总天数</param>
/// <returns>星期几</returns>
public int GetWeek(int allDay)
{
int week = 1;
week = (allDay + 1) % 7;
return week;
}
/// <summary>
/// 每个月的天数
/// </summary>
/// <param name="month">月份</param>
/// <returns>该月天数</returns>
public int GetMonthDay(int month, int year)
{
int dayNum = 0;
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
dayNum = 31;
break;
case 4:
case 6:
case 9:
case 11:
dayNum = 30;
break;
case 2:
dayNum = Clc2(year);
break;
}
return dayNum;
}
/// <summary>
/// 按格式打印输出月日历
/// </summary>
/// <param name="day">该月天数</param>
/// <param name="week">该月开始星期</param>
/// <param name="allDay">总天数</param>
public void FormPrintMonth(int day, int week, int allDay)
{
Console.WriteLine("\n\n\n\t\t{0}年 {1}月\n", this.year, this.month);
Console.WriteLine("{0, -4}\t{1, -4}\t{2, -4}\t{3, -4}\t{4, -4}\t{5, -4}\t{6, -4}\n", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
for (int i = 1; i <= week; i++)
{
Console.Write("{0, -4}\t", " ");
}
for (int i = 1; i <= day; i++)
{
Console.Write("{0, -4}\t", i);
if ((allDay + i) % 7 == 6)
{
Console.WriteLine("\n");
}
}
Console.WriteLine();
}
}
}