如何用C#完成控制台日历?

本题目的最终要就是根据用户输入的年和月在控制台输出单月的日历信息,附加范围年在1900-2100之间,月的范围在1-12之间,当用户输入不在范围时要给予错误信息提示;已知条件是1900年1月1日为星期一。

要输出此日历就需要知道该月的第一天是星期几,确定后才好根据天数推出后面的日期。其具体实现的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp18
{
class Program
{
static void Main(string[] args)
{
while (true)
{
int year, month;
List<string> dates = new List<string>();
while (true)
{
Console.Write("请输入年份(1900-2100):");
year = int.Parse(Console.ReadLine());
if (year < 1900 || year > 2100)
{
Console.Write("年份输入错误,按回车后重新输入");
Console.ReadLine();
Console.Clear();
}
else
{
Console.Write("请输入月份(1-12):");
month = int.Parse(Console.ReadLine());
if (month < 1 || month > 12)
{
Console.Write("月份输入错误,按回车后重新输入");
Console.ReadLine();
Console.Clear();
}
else
{
break;
}
}
}
int dayYear = 0;//计算1900到year-1年经过的天数
for (int i = 1900; i < year; i++)
{
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
{
dayYear += 366;
}
else
{
dayYear += 365;
}
}
int dayMonth = 0;//计算在变量year这一年,从1月到month-1的天数
for (int i = 1; i < month; i++)
{
if (i == 2)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
dayMonth += 29;
}
else
{
dayMonth += 28;
}
}
else if (i <= 7 && i % 2 == 1 || i >= 8 && i % 2 == 0)
{
dayMonth += 31;
}
else
{
dayMonth += 30;
}
}
int allDays = dayYear + dayMonth;//经过的总天数
int dayWeek = allDays % 7 + 1;//year-month-1是星期几
int space = dayWeek - 1;
for (int i = 0; i <= space; i++)
{
dates.Add("");
}
int days;
if (month == 2)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
days = 29;
}
else
{
days = 28;
}
}
else if (month <= 7 && month % 2 == 1 || month >= 8 && month % 2 == 0)
{
days = 31;
}
else
{
days = 30;
}
for (int i = 1; i <= days; i++)
{
dates.Add(i.ToString());
}
Console.WriteLine("*******************************************************");
Console.Write("一\t二\t三\t四\t五\t六\t七");
for (int i = 0; i < dates.Count; i++)
{
if (i % 7 == 0)
{
Console.WriteLine("\n");
}
Console.Write(dates[i] + "\t");
}
Console.WriteLine();
Console.WriteLine("*******************************************************");
Console.Write("按回车键后继续");
Console.ReadLine();
Console.Clear();
}
}
}
}

效果图:

此题的难点在于根据用户输入的年月计算出与已知1900年1月1日所在的星期一相隔的天数,根据天数计算出单月的第一天是星期几,如果一星期一作为日历的第一个输出点后面类推,就需要知道该月第一天所在的星期与星期一相隔多少个空格,当第一天确定后,后面的日期就好判断了。

时间: 2024-10-21 03:44:20

如何用C#完成控制台日历?的相关文章

VS工具制作控制台日历中算法的启发

前些天的学习任务是利用VS工具编码实现控制台显示任意年份和月份对应的日历.因为关系到年份和月份,很容易考虑到润年的情况,故功能需求中对于润年的判断及相对应月份天数的判断利用多个for循环和if判断均可轻易实现.但作为该任务最难也是最重要的一点是,当月日历会承接上月的星期而显示一定数量的空白,如图所示: 这个功能的实现,需要找到每个月空白的规律.在没有提示的情况下,萨摩观察了多个月的规律,得到这样的关系:设一只1900年1月1号前为1个空白,则该月末有5*7-1-当月天数即35-1-31=3个空白

控制台日历

已知道1900-1-1为星期一. 模块分区 //获取用户的正确输入并分别保存到变量year和month中 //声明一个用于保存空白和当月日期数的集合dates //遍历输出集合dates using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ConsoleApplication3{ class Program

向控制台输出日历

上章也在文中举例过向控制台输出日历,那么这章我们就来具体的说说怎么实现: //第一步:提示并获取用户的输入 //第二步:根据用户输入的年月,创建集合 //第三步:向控制台显示输出 //第四步:等待用户指令,清屏重新输出 怎么实现呢? //第一步:提示并获取用户的输入,如果错误那么需要清屏提醒重新输入,前面一贴我们讲过,这种情况,我们就应该运用到while(true)和console.clear(),输入正确结束循环 int years, month; while (true) { Console

C#输出日历

用C#输出日历,此功能可用于Ajax方式列出计划日程相关的内容,由于是C#控制输出,可以方便加上自己需要的业务处理逻辑. 1.控制台输出: [csharp] view plaincopyprint? using System; namespace 控制台日历 { class Program { public static void Main(string[] args) { string s = "    "; Console.WriteLine("输入年份:");

经典实例

综合实例 水仙花数(Narcissistic number): 也被称为超完全数字不变数(pluperfect digital invariant, PPDI).自恋数.自幂数.阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 n 位数(n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153). using System; using System.Collections.Generic; using System.

输出结果不对,求大神帮我找一下bug

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace ConsoleApplication1{ class Program { static void Main(string[] args) { // 打印1993年到2018年每月12月7日是星期几 for (int year = 1993; year <= 2018; year++) { Console.Writ

java学习--java.util包中常用类

java.util包被称为java工具包,里面包含大部分的工具类 Random 随机数类 new Random() rd.nextInt() rd.nextInt(100) Scanner 扫描器类 Scanner sc = new Scanner(system.in); String str = sc.next(); String str1 = sc.nextLine(); int t = sc.nextInt(); float t = sc.nextFloat(); Date 日期类 Dat

如何用java编程在控制台输出当前时间

如何用java编程在控制台输出当前时间 package com.chimp4.p155; import java.text.SimpleDateFormat; import java.util.Date; public class Account { /** * 日期格式化 * @author young * */ public static void main(String[] args) { // 在构造器中传入日期样式 // SimpleDateFormat sdf=new SimpleD

函数应用,在控制台输出用户的输入日历

#include<stdio.h> //获取用户输入的年份(1900-2100 #include<stdio.h> //获取用户输入的年份(1900-2100),如果用户输入不正确,则提示重新输入int getUserInputYear(void){ printf("请你输入一个年份(1900-2100):"); int year; while(scanf("%d",&year)==0 || year<1900 || year&