说明

    这是一个功能简单的日历打印程序(显然没什么卵用),它可以打印1900年至2500年间的日期信息。本程序没有设置退出条件(你想要退出请强制退出),也没有加入更为复杂的输入判定(如果你输入非法类型数据,可能发生死循环、非预期值等情况),所以请善待它。

设计思路:
    程序以1900年的1月1日为基准(这天是星期一),当你输入某一日期(年份加月份,如:1949 10)后,程序进行简单的日期范围性判断。判断成功后,首先计算1900-1948年一共有多少天(我这里并非真正加上了每年的天数,进行闰年判断。如果为闰年,就加上366%7,否则加上365%7。可以避免年份较大时数据超出 int 型数据范围),然后加上1949年1-9月的天数,最终再加1(第10月的第一天)。最后用这个总值取余7,即可知道1949年10月1日是星期几(如果余0为星期日,10月1号这天是星期六)。
    然后利用一个简单的循环将这个月的日期与每周七天对应并打印,当然也有些值得注意的地方。比如首次打印时我借助了一个临时变量,以便于打印出 1 号之前(1号为周六,则上要打印周日至周五)的空格,随后再利用一个控制打印语句,实现每打印完周六后进行一次换行。

效果


代码

#include <stdio.h>#define INIT_YEAR 1900   //基准年份
#define LAST_YEAR 2500  //年份上限
#define BASE_YEAR_WEEKDAY 1 //基准年1月1日是星期几,用于修正日期void help_info();    //打印帮助信息
void input_date(int*, int*); //用户输入年份月份
_Bool check_input(int, int);    //检查输入是否在范围内
void print_cal(int, int);   //打印日历
_Bool runnian(int); //辅助函数,闰年判断int main(void)
{int year, month;   //用户输入年、月help_info();do {input_date(&year, &month);if(check_input(year, month))print_cal(year, month);elsecontinue;} while(1);return 0;
}_Bool runnian(int y)
{if(y % 4 == 0 && y % 100 != 0)return 1;if(y % 400 == 0)return 1;return 0;
}void print_cal(int y, int m)
{int sum = 0;  //总天数int i = INIT_YEAR;    //临时变量int mon_days[12] = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  //最后一年每个月天数,二月暂设为0int week_day;  //记录输入月份第一天为周几if(m < 10)printf("----------%d-0%d----------\n", y, m);elseprintf("----------%d-%d----------\n", y, m);for(; i < y; i++)  //计算1900至用户输入年份前一年有多少天,只计入有效余数{if(runnian(i))sum = sum + (366%7);elsesum = sum + (365%7);}if(runnian(y)) //判断最后一年二月份天数mon_days[1] = 29;elsemon_days[1] = 28;for(i = 1; i < m; i++)   //计算用户输入年份,这年到输入月份前一个月一共有多少天sum = sum + mon_days[i-1]%7;sum = sum + 1 + (BASE_YEAR_WEEKDAY - 1); //添加输入月份的第一天(1号)和基准年1月1号的偏移量week_day = sum % 7; //计算1号是星期几//打印printf("日  一  二  三  四  五  六\n");for(i = 0; i < week_day; i++) //打印1号之前的空白部分printf("    ");int j = week_day;    // j用于打印周六后的换行控制for(i = 1; i <= mon_days[m-1]; i++)  //正式打印{if(i < 10)  //为格式美观,控制日期打印宽度printf("0%d  ", i);elseprintf("%d  ", i);j++;if(j > 6)  //如果已打印至周六,则换行打印,重置j{printf("\n");j = 0;}}printf("\n");printf("--------------------------\n");
}_Bool check_input(int y, int m)
{_Bool check_status = 1;if(y < INIT_YEAR || y > LAST_YEAR){check_status = 0;printf("Bad year time!\n");}if(m < 1 || m > 12){check_status = 0;printf("Bad month time!\n");}return check_status;
}void input_date(int *y, int *m)
{printf("Input date(such as:1900 1):");scanf("%d%d", y, m);
}void help_info()
{printf("--------CALENDAR--------\n");printf("help: Input year and month to view calendar.\n");printf("      Usage: YEAR MONTH\n");printf("      YEAR: %d-%d    MONTH: 1-12\n", INIT_YEAR, LAST_YEAR);printf("\n");
}

C语言实现日历打印小程序相关推荐

  1. libvirt 用c语言编译,基于C语言libvirt API简单小程序

    libvirt API简单小程序 1.程序代码如下 #include #include int getDomainInfo(int id) { virConnectPtr conn = NULL; v ...

  2. 夸奖人的C语言小程序,c语言10个经典小程序

    [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. ...

  3. java日历查询代码,java实现日历查询小程序

    java语言实现的日历查询小程序,有输入容错机制,支持万年历. package hust.hg.test; import java.util.InputMismatchException; impor ...

  4. Go+Vue打印店远程打印小程序源码

    简介: Go+Vue打印店远程打印小程序源码,带微信小程序前端代码和后台程序源码,用户可以通过小程序上传文件→店主在线预览(下载)&打印. 网盘下载地址: http://kekewl.cc/j ...

  5. 「极点日历」小程序插件

    上期,我们在<「wxParser」小程序插件>一文中介绍了知晓云团队出品的「wxParser」小程序插件,对其意义.作用以及应用作出了说明.而在此之前,我们还介绍过「腾讯地图」.「腾讯视频 ...

  6. 标签打印软件如何批量打印小程序码图片

    现在很多应用程序都拥有了自己的小程序码,它的使用方法与二维码相同,外观缺不一致,那么如果有很多小程序码的图片,该如何批量打印呢,下面我们就中琅标签打印软件来看一下如何批量打印小程序码图片. 一.整理图 ...

  7. 记录云打印小程序搭建及运营心得。

    朋友是做图文打印的,最近因为疫情一直抱怨店内收入下降问题.问我有什么方法能自助打印不. 经过上网了解,云打印小程序可以解决这个问题. 云打印小程序是软件(小程序)+硬件(各种打印设备)+服务(增值服务 ...

  8. 编写C语言的最简单小程序Hello world和函数使用

    编写C语言的最简单小程序Hello world 一.示例一 1.编写demo.c程序 #include<stdio.h> int main() {printf("Hello wo ...

  9. java时钟日历_java日历时钟小程序

    java日历时钟小程序 java日历时钟小程序 Java时钟程序,按类粘贴至编译器编译即可使用. import java.awt.BorderLayout; import java.awt.Color ...

  10. C语言丨整蛊必备小程序,好玩炸翻天(附源码)

    前言 感觉学了c语言后仍然一无是处?!!想要整蛊一下朋友仍然不会?!! 别慌,看完这篇文章,你就会了. 下面给大家分享两个基础的整蛊小程序 1.我是猪关机程序 2.无限弹窗程序 一.我是猪关机程序 效 ...

最新文章

  1. (Win7)D盘Program Files文件夹不见了
  2. 又一位先驱陨落:伯特·萨瑟兰去世,他参与创造互联网、Java、图形界面PC、微处理器,也是明智的实验室领袖...
  3. 前端性能优化之DOM(三)
  4. 用户目录更改后显示为-bash-3.1#
  5. iptables配置详解
  6. 2021中国成人教育市场及用户洞察报告
  7. Qt:Qt实现Winsock网络编程—非阻塞模式下的简单远程控制的开发(WSAAsyncSelect)
  8. Spring cloud--鸿鹄Cloud分布式微服务云系统—Config
  9. 透明网桥(transparent bridge)
  10. php分页设计美化,国产PHP框架之ThinkPHP各模块开发系列十七,美化分页显示
  11. 推荐一款学习Autosar ecu配置的好工具
  12. 几个网络捕获工具的评价
  13. 技术分享 | MySQL 突如其来的主从复制延迟
  14. 电影级视觉特效插件:Red Giant VFX Suite for mac
  15. python爬虫项目-优美图库
  16. Unity3D_Util_Editor_显示RectTransform的世界坐标和相对坐标
  17. Python内置函数 max 详解
  18. fstream 头文件作用
  19. 如何正确地写存储过程
  20. java cancel_Future.cancel()疑难杂症

热门文章

  1. 2021年幼儿园教师招聘:小班梳子画《小草》
  2. dfuse——最顺畅的区块链 API 现已接入 Worbli
  3. CSS实现平行四边形
  4. mutate  字段替换
  5. 【翻译】LearnYouSomeErlangForGreatGood(一):导言
  6. 多边形近似轮廓-多边形简化
  7. lol:opgg国服账号怎么观看韩服
  8. ubuntu——sudo权限问题(sudo:/etc/sudoers is world writable sudo:no valid sudoers sources found,quitting..)
  9. 获取手机mac地址工具类
  10. 「R shiny基础」使用shinyapp分享你的Shiny应用