本题目的最终要就是根据用户输入的年和月在控制台输出单月的日历信息,附加范围年在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日所在的星期一相隔的天数,根据天数计算出单月的第一天是星期几,如果一星期一作为日历的第一个输出点后面类推,就需要知道该月第一天所在的星期与星期一相隔多少个空格,当第一天确定后,后面的日期就好判断了。

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

  1. Java Calendar实现控制台日历

    public static void main(String[] args) throws IOException { //初始化日历对象 Calendar calendar = Calendar.g ...

  2. 用最笨的方法实现java控制台日历打印

    如果想用户自定义输入日期查询,可以通过Calendar的set方法和Scanner方法设置 Calendar类简单使用:https://blog.csdn.net/weixin_43670802/ar ...

  3. C# 控制台日历 region分区编写思想

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

  4. C#输出日历

    用C#输出日历,此功能可用于Ajax方式列出计划日程相关的内容,由于是C#控制输出,可以方便加上自己需要的业务处理逻辑. 1.控制台输出: using System; namespace 控制台日历 ...

  5. oracle:如何用sql生成日历

    BI分析中,经常需要将事实表与时间维度表关联起来,按年/月/日来逐层展示,常用的做法是创建一张日历表,结构类似如下: create table T_BAS_CALENDAR ( d_year ) no ...

  6. java输出月的日历控制台

    LocalDate date=LocalDate.now(); int month=date.getMonthValue(); int today=date.getDayOfMonth(); date ...

  7. 《手把手教你》系列技巧篇(三十七)-java+ selenium自动化测试-日历时间控件-上篇(详解教程)

    1.简介 我们在实际工作中,有可能遇到有些web产品,网页上有一些时间选择,然后支持按照不同时间段范围去筛选数据.网页上日历控件一般,是一个文本输入框,鼠标点击,就会弹出日历界面,可以选择具体日期.这 ...

  8. Python学习实践-----打印日历

    使用python语言实现在控制台打印日历 输入年.月.日 输出对应日历,指定的日数输出为'--' 程序没有做严格的输入验证,故输入整数即可. 以下为没有优化的源码: print_calendar.py ...

  9. VS2015下如何用编译、调试程序。

    VS2015下如何用编译.调试程序. (通过实践给出截图) 安装步骤: 下载安装网址[VS2015下载地址](http://www.ithome.com/html/win10/164028.htm) ...

随机推荐

  1. Linux线程的创建

    一.线程与进程的区别 1.线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源. 2.进程是资源分配的基本单位.所有与该进程有关的资源,都 ...

  2. MVC 5 + EF6 完整教程15 -- 使用DI进行解耦

    如果大家研究一些开源项目,会发现无处不在的DI(Dependency Injection依赖注入). 本篇文章将会详细讲述如何在MVC中使用Ninject实现DI 文章提纲 场景描述 & 问题 ...

  3. 深度学习实践系列(3)- 使用Keras搭建notMNIST的神经网络

    前期回顾: 深度学习实践系列(1)- 从零搭建notMNIST逻辑回归模型 深度学习实践系列(2)- 搭建notMNIST的深度神经网络 在第二篇系列中,我们使用了TensorFlow搭建了第一个深度 ...

  4. 深拷贝/浅拷贝之Js / AngularJs

    var a = [1,2,3,4]; var b = a; b[1] = 8; console.log("a:" + a );//1,8,3,4 consloe.log(" ...

  5. stick footer布局

    需求: 将footer固定到底部.文章内容不足满屏时 footer在底部,超过满屏时footer在内容末尾. 方法一: <div id="wrap"> <div ...

  6. Java中如何动态创建接口的实现

    有很多应用场景,用到了接口动态实现,下面举几个典型的应用: 1.mybatis / jpa 等orm框架,可以在接口上加注解进行开发,不需要编写实现类,运行时动态产生实现. 2.dubbo等分布式服务 ...

  7. Wireshark的专家模式

    -------------------------------本文作为留档文章已备查看----------------------------------- Wireshark的每个协议的解析器(原始 ...

  8. php-fpm死机解决办法,脚本后台自动重启

    本人用nginx+php7搭建了一台服务器,因为请求量太大,而且php里面又有挂起的任务,导致php-fpm在高峰期的时候经常死掉,吧php-fpm的最大进程数已经改到1000了,还是吃不消,cpu也 ...

  9. VueJS实现一个货币结算自定义控件

    Vue.component('currency-input', { template: '\ <div>\ <label v-if="label">{{ l ...

  10. 新建Android项目,会出现两个项目一个是自己创建的项目,另一个是“appcompat_v7”项目,这是怎么回事呢?该怎么解决呢?

    做Android开发的朋友最近会发现,更新ADT至22.6.0版本之后,创建新的安装项目,会出现appcompat_v7的内容.并且是创建一个新的内容就会出现.这到底是怎么回事呢?原来appcompa ...