个人写作项目:控制台实现年历
//提出一个方法,要确认旗下代码都是做该方法做的唯一一件事
/* 1.控制台中实现年历的方法
* -调用12遍实现月历
* 2.控制台中实现月历的方法
* -显示表头Console.WriteLine("日\t一\t二\t三\t四\t五\t六")
* -计算当月1日星期数,输出空白(\t)
* Console.Write
* -计算当月天数,输入1\t2\t3 ...
* -每逢周六换行
* 3.根据年月日计算星期数
* 4.计算指定月历的天数
* 5.2月闰年29天,平年28天.年份不能被100整除,或者年份能被400整除
*///按照5 4 3 2 1 从小到大往上写
//打三个///便会蹦出文档注释,调用方法时会显示中文注释帮助理解
测试类:
static void Main()
{
GetTotalDays getTotalDays = new GetTotalDays();
Console.WriteLine("请输入年份");
int year = int.Parse(Console.ReadLine());
getTotalDays.PrinYearCalendar(year);
Console.ReadLine();
}
参与类:
public class GetTotalDays
{
/// <summary>
/// 根据年月日计算星期数的方法
/// </summary>
/// <param name="year">年份</param>
/// <param name="month">月份</param>
/// <param name="day">日期</param>
/// <returns>星期数</returns>
public static int GetWeekByDay(int year, int month, int day)
{
DateTime dt = new DateTime(year, month, day);
return (int)dt.DayOfWeek;
}
//写方法要做到他人一看这个类型便知道是什么,一般编程内只有俩种结果用bool
/// <summary>
/// 计算是否是闰年
/// </summary>
/// <param name="year">年份</param>
/// <returns>ture/false</returns>
public static bool IsLeapYear(int year)
{
//if (year%4==0&&year%100!=0||year%400==0)
// return true;
//else
//return false;
return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}
/// <summary>
/// 计算当月日期有多少天
/// </summary>
/// <param name="year">年份</param>
/// <param name="month">月份</param>
/// <returns>当月日数</returns>
public static int GetDayByMonth(int year, int month)
{
//if (month < 13 && month > 0)
//{
// switch (month)
// {
// case 2:
// //if (IsLeapYear(year))
// // return 29;
// //else
// // return 28;
// return IsLeapYear(year) ? 29 : 28;
// case 6:
// case 4:
// case 9:
// case 11:
// return 30;
// default:
// return 31;
// }
//}
//else
// return 0;
//在程序中尽量少嵌套if,多层if(三层及以上)会导致代码可读性变得极差
//将容易短路的条件放上面,执行下面的程序便是满足条件的程序
if (month > 12 || month < 1) return 0;
switch (month)
{
case 2:
//if (IsLeapYear(year))
// return 29;
//else
// return 28;
return IsLeapYear(year) ? 29 : 28;
case 6:
case 4:
case 9:
case 11:
return 30;
default:
return 31;
}
}
/// <summary>
/// 打印该年月历
/// </summary>
/// <param name="year">年份</param>
/// <param name="month">月份</param>
public void PrinMonthCalendar(int year, int month)
{
//显示表头
Console.WriteLine();
Console.WriteLine("{0}年{1}月", year, month);
Console.WriteLine("日\t一\t二\t三\t四\t五\t六");
//根据一日星期数显示空白
int week = GetWeekByDay(year, month, 1);
for (int i = 0; i < week; i++) { Console.Write("\t"); }
//根据当月总天数显示日
int days = GetDayByMonth(year, month);
for (int i = 1; i <= days; i++)
{
Console.Write(i + "\t");
//每逢周六换行
if (GetWeekByDay(year, month, i) == 6)
Console.WriteLine();
}
}
/// <summary>
/// 打印该年年历
/// </summary>
/// <param name="year">年份</param>
public void PrinYearCalendar(int year)
{
for (int i = 1; i <= 12; i++)
PrinMonthCalendar(year, i);
}
//方法就是对一系列语句的命名
//提高代码的可重用性和可维护性
}
思路:
分类计算年月日,并且分开打印与日期相对
问题:
在进行判断方面,还需要优化,优先进行短路条件判断,减少IF层的嵌套,增强代码可读性
总结:
思路较为通顺,预期目的达成,增加方法可读性,减少console在方法中出现次数,增强代码可读性与通用性