年历显示。功能要求:1.输入一个年份,输出时在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。2.输入年月,输出该月的日历。
- 问题分析
首先对于年份来份来说,闰年的二月有29天,对此,可通过运用算法设计判断所求年份是不是闰年,如果是,则为其二月份的天数加一。
其次,对于每个月份的第一天是星期几,则通过所求年月日距离1940年1月1日(即星期一)来进行判断是星期几。
然后,将数字0、1、2、3、4、5、6分别对应星期天、星期一、星期二、星期三、星期四、星期五、星期六,然后将每月的第一天在第一列的位置往后挪一个星期几对应的数字。
年日历输出分为左右两边,左边为1-6月,右边为7-12月。
月日历与年日历在分析上大致相同大致相同,但是只输出一年之中的一个月份。
- 算法设计
(1)、模块划分:
通过 YearDays(int y,int m,int d)函数,进行计算某年某月某日到该年1月1日的日数。
通过Week(int y,int m,int d)函数,得到某年某月某日是星期几。
通过ShowYear(int y)函数,展示出一年的日历。
通过ShowMonth(int y,int m)函数,展示出一年中某一月份的日历。
最后使用main()函数,将内容输出出来。
(2)、详细编码
#include<stdio.h>
char month[12][12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };int YearDays(int y, int m, int d)
//计算某年某月某日到该年第一月第一日的日数
{int all = 0;int MonthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if ((y % 100 != 0 && y % 4 == 0) || (y % 400 == 0))//判断是否是闰年,闰年二月有29天 {MonthDays[1] += 1;}for (int i = 0; i < m - 1; i++){all += MonthDays[i];}all += d;return all;
}
int Week(int y, int m, int d)
// 得到某年某月某日是星期几
{int all = 0;int get;if (y == 1940){all = YearDays(y, m, d) - 1;}else{for (int i = 1940; i < y; i++){all += 365 + ((y % 100 != 0 && y % 4 == 0) || (y % 400 == 0));}all += YearDays(y, m, d) - 1;//计算所求年月日到1940年1月1日的总天数 }get = (all + 1) % 7;return get;
}
void ShowYear(int y)
{int MonthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if ((y % 100 != 0 && y % 4 == 0) || (y % 400 == 0)){MonthDays[1] += 1;}int lweek;//左边第一天为星期几 int rweek;//右边第一天为星期几 for (int m = 0; m < 6; m++){printf("%-32s%s\n", month[m], month[m + 6]);printf("--------------------------- --------------------------- \n");printf("Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat \n");lweek = Week(y, m + 1, 1);rweek = Week(y, m + 7, 1);int ldate = 1;int rdate = 1;while (ldate <= lweek + MonthDays[m] || rdate <= rweek + MonthDays[m + 6])//星期天,星期一....星期六依次为0、1、2、3、4、5、6//将月份的第一天与星期几相对应 {int flag[15] = { 0 };flag[7] = -1;for (int a = 0; a < 7; ++a, ++ldate, ++rdate){if (ldate <= lweek + MonthDays[m]){if (ldate < lweek) {flag[a] = -1;}else{flag[a] = ldate - lweek;}}else{flag[a] = -1;}if (rdate <= rweek + MonthDays[m + 6]) {if (rdate < rweek) {flag[a + 8] = -1;}else {flag[a + 8] = rdate - rweek;}}else {flag[a + 8] = -1;}}for (int i = 0; i < 15; ++i) {if (flag[i] == -1 || flag[i] == 0) {printf(" ");}else {printf("%-4d", flag[i]);}}printf("\n");}printf("\n");}}void ShowMonth(int y, int m)
{int MonthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if ((y % 100 != 0 && y % 4 == 0) || (y % 400 == 0)){MonthDays[1] += 1;}int week;printf("%s\n", month[m - 1]);printf("--------------------------- \n");printf("Sun Mon Tue Wed Thu Fri Sat \n");week = Week(y, m, 1);int date = 1;while (date <= (week + MonthDays[m - 1]))//星期天,星期一....星期六依次为0、1、2、3、4、5、6//将月份的第一天与星期几相对应 {int flag[6] = { 0 };for (int a = 0; a < 7; ++a, ++date){if ((date <= (week + MonthDays[m - 1]))) {if (date < week) {flag[a] = -1;}else {flag[a] = date - week;}}else{flag[a] = -1;}}for (int i = 0; i < 7; ++i){if (flag[i] == -1 || flag[i] == 0) {printf(" ");}else {printf("%-4d", flag[i]);}}printf("\n");}printf("\n");
}int main()
{int flag = 1;int year;int i;int month;while (flag){printf("查找年日历输入1、查找年月日历输入2、结束输入0:\n");scanf("%d", &i);switch (i) {case 1:printf("输入要查找的年份\n");printf("年:");scanf("%d", &year);ShowYear(year); break;case 2:printf("输入要查找的年月份\n");printf("年:");scanf("%d", &year);printf("月:");scanf("%d", &month);ShowMonth(year, month); break;case 0:flag = 0; break;default:printf("输入值错误,请重新输入\n");break;}}printf("结束\n");return 0;
}
年历显示。功能要求:1.输入一个年份,输出时在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。2.输入年月,输出该月的日历。相关推荐
- 年历显示系统,输入一个年份,输出是在屏幕上显示该年的日历。
一.输入一个年份,输出是在屏幕上显示该年的日历.假定输入的年份在1940-2040年之间 (1)输入年,输出该年的日历. (2)输入年月,输出该月的日历. (3)输入年月日,输出距今天还有多少天,星 ...
- kindle显示电池加叹号-kindle长时间不用,屏幕上显示一个电池加叹号的图标,充电后掉电特别快,一晚上又变成电池加叹号怎么办?kindle长时间不用,充电后电池不耐用怎么办?
问题描述 kindle长时间不用,屏幕上显示一个电池加叹号的图标,充电后掉电特别快,一晚上又变成电池加叹号,kindle长时间不用,充电后电池不耐用.注意,本文章是针对,充电后能用,但掉电特别快,一晚 ...
- 游侠我的世界显示java_我的世界怎么用命令方块在屏幕上显示字
我的世界怎么用命令方块在屏幕上显示字?还有一些玩家不知道怎么使用命令方块显示文字,下面就为大家带来显示文字的方法. 我的世界怎么用命令方块在屏幕上显示字 首先玩家需要打开作弊模式输入:/give @a ...
- 汇编 一星题目字符串合集:输入字符,操作,在屏幕上显示
倒序 ASSUME CS:CODES,DS:DATAS,SS:STACKSDATAS SEGMENTKONG DB 0DH,0AH,'$' ;0D回车;0A换行 DATAS ENDSSTACKS SE ...
- Java黑皮书课后题第10章:*10.5(显示素数因子)编写一个程序,提示用户输入一个正整数,然后以降序显示它的所有最小因子
*10.5(显示素数因子)编写一个程序,提示用户输入一个正整数,然后以降序显示它的所有最小因子 题目 程序 破题 代码 Test5.java Test5_StackOfIntegers.java 运行 ...
- Java黑皮书课后题第5章:*5.46(倒排一个字符串)编写一个程序,提示用户输入一个字符串,然后以反序显示该字符串
5.46(倒排一个字符串)编写一个程序,提示用户输入一个字符串,然后以反序显示该字符串 题目 题目概述 破题 运行示例 代码 题目 题目概述 5.46(倒排一个字符串)编写一个程序,提示用户输入一个字 ...
- Java黑皮书课后题第5章:*5.44(计算机体系结构:比特级的操作)一个short型值用16位比特存储。编写程序,提示用户输入一个short型的整数,然后显示这个整数的16比特形式,下面是运行示例
5.44(计算机体系结构:比特级的操作)一个short型值用16位比特存储.编写程序,提示用户输入一个short型的整数,然后显示这个整数的16比特形式 题目 题目概述 运行示例 资料与破题 原码反码 ...
- Java黑皮书课后题第4章:*4.15(电话键盘)电话上的国际标准字母/数字映射如下所示。编写程序,提示用户输入一个小写或大写字母,然后显示对应数字。对于非字母输入,提示非法输入
*4.15(电话键盘)电话上的国际标准字母/数字映射如下所示.编写程序,提示用户输入一个小写或大写字母,然后显示对应数字.对于非字母输入,提示非法输入 题目 题目概述 运行示例 破题 代码 题目 题目 ...
- 计算两个数之间所有整数的和_汇编语言:输入2个0–99之间的整数,对其做乘法运算,在屏幕上显示出该乘积对应的二进制和十六进制数...
实验要求: (1)在屏幕提示:"please input the first number(0–99): "后,输入一个0–99之间的整数. 若所输入的数不在此范围内,或输入其它字 ...
最新文章
- 杨剑勇:物联网是一个未来概念?其实就在身边
- AWS之EC2实例搭建LAMP服务器
- 3d人脸重建 facescape 测试
- java 伪异步 netty,Netty(一) - 不死的达芬奇的个人空间 - OSCHINA - 中文开源技术交流社区...
- python idle 清屏问题的解决
- python executemany执行延迟_运维架构师-Python 自动化运维开发-031
- js递归遍历json树_2020-08-26:裸写算法:树的非递归先序遍历
- Ergo生态:首个算法稳定币SigmaUSD正式启动
- Android中MVC、MVP、MVVM具体解释
- lammps教程:1D正弦粗糙界面建模建模教程
- 主数据管理项目建设经验分享
- java表格标题栏_java使用poi自定义excel标题头并导出(springmvc+poi)
- 唯冠咬住苹果不管有何功利目的
- 程序员新手上路第一步
- JavaPoet动态生成代码,高薪程序员必会
- 二元logistics回归
- aria2Linux开机启动,Ubuntu安装aira2及开机启动配置
- 讯飞语音转文字_录音实时转文字就是如此简单 讯飞智能录音笔SR701评测
- python爬虫——爬取网页的中文
- html折叠div,纯CSS折叠/展开div
热门文章
- 影豹R·ABT联名版亮相上海车展,专为年轻人打造的个性化改装之选
- slam 基础之机器人学中的坐标转换学习总结
- Dubbox简单入门
- SqlSugar-C#中数据库存储的框架
- 吉他新手防踩雷,告别吉他选择困难症!初学者吉他推荐!看这一篇就够了!
- 最新不安装百度云管家就可以下载网盘资源的方法及各种浏览器修改JavaScript开关方法
- 如何用WebView打开pdf链接
- 04_红黑树_B树知识点_添加上溢和删除下溢
- 记录《疯狂Java讲义精粹》划线内容及理解(第十章-输入输出流(IO))
- saiku 使用笔记