新手上路,这是基于公历第一年的第一天是星期一的原理而做出的简易万年历,总共只有四个函数便可实现计算,应该说还是一个比较简洁的也比较简单的万年历,欢迎大家为它的进一步完善和改进提出建议
#include<stdio.h>
#include <time.h>
#define YEARDAYS 365 //定义一年天数
#define YEARMONS 12 //定义一年月数
#define WEEKDAYS 7 //定义一周天数
//用枚举数据结构定义一个星期里的每一天的称呼
typedef enum{
Sun,Mon,Tue,Wed,Thu,Fri,Sat
}WEEK;
//用枚举数据结构定义十二个月
typedef enum{
JAN=1,FEB,MAT,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC
}MONTH;
//输出万年历
void printMonth(const WEEK firstDay, int length)
{
WEEK weekDay = firstDay ;
int i;
printf(" Sun Mon Jue Wed Thu Fri Sat\n");
for(i=1;i<=weekDay;i++)
{
printf(" ");//输入空位以顶替当月第一周第一天之前的所缺天数
}
for(i=1;i<=length;++i)
{
weekDay = (++weekDay) % WEEKDAYS;
printf("%7d",i);
if(weekDay == 0)
printf("\n");
}
printf("\n");
}
//判断是否是闰年,是就返回1,不是就返回0
int isLeapYear(const int y)
{
return(y % ( y % 100 ? 4 : 400 ) ? 0 : 1);
}
//得到当年的第一个月的第一天是第一周的第几天
int getYearOfDay(const int year)//得到年份
{
int yearNumber = year - 1;//由于公元纪年的起点是公元1年
int n = 0,i=0;
if(year == 0)
return 1;
for( i=1;i<year;i++)
if(isLeapYear(i)==1)
n++;//记录出因为闰年而多出的天数
return(YEARDAYS * yearNumber + n+1) % WEEKDAYS;//1是第一天
}
//计算天数
void printCalendar(const int y , const int m)
{
int i=0;
WEEK yDAY = getYearOfDay(y);
int vDay = isLeapYear(y);//如果是闰年则等于1
int monWeeks [YEARMONS+1];
int monLen [YEARMONS+1];
//为每个月设置具体天数
monLen[0] = 0;
monLen[JAN] = 31;
monLen[FEB] = 28 + vDay;//计算闰月
monLen[MAT] = 31;
monLen[APR] = 30;
monLen[MAY] = 31;
monLen[JUN] = 30;
monLen[JUL] = 31;
monLen[AUG] = 31;
monLen[SEP] = 30;
monLen[OCT] = 31;
monLen[NOV] = 30;
monLen[DEC] = 31;
monWeeks[0] = 0;
monWeeks[JAN] = yDAY;//得到当年的第一个月的第一天是第一周的第几天
for(i = JAN ; i < DEC ; i++)
monWeeks[i+1] = ((monWeeks[i] + monLen[i]) % WEEKDAYS);//得到每个月的第一天是第一周的第几天
printf("&d, &d \n", y, m);
printf("---------------------------------------------------\n");
printMonth(monWeeks[m] , monLen[m]);//传入当月的第一天是第一周的第几天,和当月的天数
printf("\n");
}
int main(void)
{
struct tm when; //定义系统自带的tm结构体对象when
time_t now;
int Y = 0;//所需的年份储存变量
int m = JAN;//所需的月份储存变量
int quit = 0;//循环控制变量
//设置循环,便于多次查询
time( &now );//获取当前时间,存now里
when = *localtime( &now ); //获取当地时间,根据地址传值;
printf( "Current time is %s\n", asctime( &when ) );//输出当前时间
printCalendar (when.tm_year+1900,when.tm_mon+1);//输出当前万年历
while(!quit)
{
printf("Please input the year,month;-1 for break\n");//提示输入所需年月
scanf("%d,%d",&Y,&m);//输入年月
if(Y == -1)
quit = 1;//退出程序
else if(Y < 10000 && Y > 0 && m > 0 && m < 13)
printCalendar (Y,m);//输出Y年m当月的万年历
else
printf("请按要求输入数字!\n");//确保输入正确
}
return 0;
}
相关推荐
### 使用C语言实现简易万年历的知识点解析 #### 一、程序背景及目标 本程序采用C语言编写,旨在创建一个简易但功能强大的万年历。它能够根据用户输入的年份和月份来显示相应的日历。此程序不仅能够展示特定月份的...
标题 "wannianli.rar_简易万年历" 指的是一个基于C语言编写的简单万年历程序。这个程序可能包含基本的日期计算和显示功能,旨在帮助用户查看不同年份的日历,而无需复杂的操作。在编程领域,实现这样的万年历程序是...
【简易万年历_单片机_万年历】项目是一个基于51单片机的电子日历设计,它能够实现时间的显示、调整以及复位功能。在电子工程领域,这样的项目对于学习单片机编程和硬件接口设计非常有帮助。下面我们将详细探讨这个...
用C 语言实现的万年历系统,适合初学者。
在本任务中,学生将参与一个单片机技术的实践项目——设计并制作一个简易的万年历。这个任务旨在加深对单片机原理及应用的理解,同时涉及到C语言编程、硬件接口通信以及时间管理等多个方面的知识。以下是相关知识点...
C 语言普适性最强的一种计算机程序编辑语言,它不仅可以发挥出高级编程语言的功用,还具有汇编语言的优点,因此相对于其它编程语言,它具有自己独特的特点。具体体现在以下三个方面: 其一,广泛性。...
使用定时器产生秒基时,编程实现万年历功能,在LCD上显示年月日、星期、时分秒。 设计触摸屏键盘校对时间,在LCD屏幕的下半部分设计出键盘,包含有“0、1、2、3、4、5、6、7、8、9、!、<”键,修改日期时间(!、<,...
本项目“万年历_c语言”是一个使用C语言编写的控制台应用程序,旨在实现一个简易的万年历功能。通过这个项目,我们可以深入学习C语言的日期和时间处理,以及控制台界面的交互设计。 首先,让我们了解一下C语言中的...
4. **软件编程**:使用C语言或其他编程语言编写程序代码,实现时间计算、显示控制等功能。 5. **调试测试**:在Keil软件中编写和调试程序,确保软件逻辑正确无误。 6. **仿真验证**:利用Proteus软件进行电路仿真,...
本项目是基于51单片机设计的一款简易万年历程序,利用LCD1602作为显示屏,能够实现日期与时间的显示及调整功能。通过几个按键(C1、C2、C3)来控制时间的显示与调整。 #### 主要功能 1. **实时显示**: 启动程序后...
在仿Windows应用程序篇中,我们介绍了万年历、画图板、电子时钟、简易计算器、文本编辑器五个小应用程序的设计与实现。本书从实用性和先进性出发,内容组织合理、通俗易懂。 1. 内容及使用方法 (1) 本光盘提供了书...
本次设计旨在设计基于51系列的单片机进行的简易电子万年历,在硬件与软件方面进行同步设计。此电子万年历在硬件方面主要采用STC89C52单片机作为主控核心,由DS1302时钟芯片提供时钟、DS18B20芯片显示温度、1602LCD...
摘自书《C语言课程设计案例精编》 ...在仿Windows应用程序篇中,我们介绍了万年历、画图板、电子时钟、简易计算器、文本编辑器五个小应用程序的设计与实现。本书从实用性和先进性出发,内容组织合理、通俗易懂。
c语言课程设计案例精编配套光盘资料包括俄罗斯方块,推箱子,五子棋游戏源码;学生成绩,工资管理,电话簿管理等系统;ping程序设计,tcp程序设计,...万年历,画图板,电子时钟,文本编辑器,简易计算器等使用小程序。
1602液晶屏是一种常见的字符型液晶显示器,常用于单片机控制的简易显示设备。51单片机则是微控制器的一种,以其易用性和广泛的硬件支持而著名,是初学者和专业人士常用的开发平台。 描述提到,“51单片机做的万年历...
本文将详细介绍如何使用Visual C++ (简称VC) 开发一款简易但实用的万年历软件。该程序能够准确计算出输入日期是星期几,并显示相应的月份天数。通过分析提供的部分代码片段,我们可以深入理解其实现原理和技术细节。...
项目6基于AT89S51单片机万年历的设计 项目7 基于AT89S51单片机密码锁的设计 项目8 基于AT89S51单片机比赛记分牌的设计 项目9 单片机数显交通灯的设计 项目10单片机控制步进电机 项目11基于AT89S51单片机数字音乐盒的...
在本课程设计中,学生将学习如何利用单片机技术来构建一个简易的万年历系统。 1. **设计目的** 主要是提升学生在学习单片机课程后的综合应用能力,包括理论知识与实际操作的结合。通过设计和制作万年历,学生需要...
《C语言实现的万年历程序详解》 在信息技术领域,日历程序是常见的实用工具,它可以帮助用户查看日期、安排日程等。本篇文章将深入探讨一款由C语言编写的万年历程序,该程序操作简单,适用于各种日常需求。 C语言...
【标题】"万年历与学生成绩管理系统"所涉及的知识点主要集中在C语言编程上,结合了数据结构和程序设计的基本概念。该系统旨在提供一个简易的学生成绩管理功能,包括用户登录、数据输入、查询、删除、更新和输出等...