初学者 用C#写的一个简单万年历 还有哪里可以优化 希望高手指出来 希望有思路更清晰的

Saying AYO 2014-06-18 05:53:27
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();
}
}
}
...全文
399 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gqqnb 2014-06-19
  • 打赏
  • 举报
回复
玩了一下,看起来是Start方法是入口。文档应该写清楚一点。可以考虑把PrintYMD等方法改为private,这样用户一眼就看出只能调用Start方法了。 感觉楼主虽然把代码包装成为Calendar类,但内部还是过程式的思想。 PrintYMD名称与内容不符,动词应该用Input或Read。YMD不符合C#命名法。《.NET设计规范》反对用缩写,反对全大写。至少应该是Ymd,更好的是用全名。 ClcAllDay也一样,不要用缩写。ClcAllDay的参数是先year再month,但GetMonthDay变成了先month再year。不知道这样的变化有什么好处。楼主算法的核心在这里,本质上用循环,一年一年一月一月地把日子加起来。 C#与C++不一样,不区分变量的定义和声明。楼主写
            int allDay = 0;//总天数
            allDay = ClcAllDay(year, month);//得到总天数
一开始赋值为0是完全没必要的。如果装了VS插件Resharper,它会提示你这是句废话。 FormPrintMonth的名称里我不知道Form是什么意思,day和allDay有什么区别。尝试在代码级别上就写清楚,再辅以注释。你的注释说“该月天数”和“总天数”,我也不明所以,幸好我不用自己调用这个方法。这个方法里你写了Console.WriteLine("\n");。请尝试改用Environment.NewLine。· 如果楼主不是要练习日期算法,那么可以直接使用.net framework提供的日历类(System.Globalization.Calendar)。GregorianCalendar表示公历。 如果楼主不想练习循环,想直接用数学公式,可以参考 《兩日期相差天數計算》
引用
對於一日期計算出一相對應的一整數N,再計算出兩整數相差即為相差天數。 方法如下: N=1461 * f(年, 月) ÷ 4 + 153 * g(月) ÷ 5 +日 其中: f(年, 月) = 年-1 如果月<=2 =年 其他情況 g(月) =月+13 如果月<=2 =月+1 其他情況 (對於1900/3/1以後上式都成立) ex : 2004/2/1~2005/9/20 ∵N1=1461 * 2003 ÷ 4 +153 * 15 ÷ 5 + 1 =731595 + 459 + 1 =732055 N2=1461 * 2005 ÷ 4 +153 * 10 ÷ 5 +20 = 732326 + 306 +20 =732652 ∴ N2 - N1 = 597 = 相差天數
threenewbee 2014-06-18
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/370043525
  • 打赏
  • 举报
回复
写出的目的、测试用例,这些文字描述远比你的代码更重要!
  • 打赏
  • 举报
回复
请问,怎么知道你的“万年历”是什么呢?怎样测试?
EdsionWang 2014-06-18
  • 打赏
  • 举报
回复
这不能叫万年历吧。这玩意儿就练练手,有需求的时候能计算出来就行了。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧