简易[C#]个人项目_控制台实现年历

个人写作项目:控制台实现年历

//提出一个方法,要确认旗下代码都是做该方法做的唯一一件事
    /* 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在方法中出现次数,增强代码可读性与通用性

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值