`
sxyplibo
  • 浏览: 6601 次
文章分类
社区版块
存档分类
最新评论

C语言简易万年历

c 
阅读更多

新手上路,这是基于公历第一年的第一天是星期一的原理而做出的简易万年历,总共只有四个函数便可实现计算,应该说还是一个比较简洁的也比较简单的万年历,欢迎大家为它的进一步完善和改进提出建议

 

#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;
}

 

0
2
分享到:
评论

相关推荐

    用c语言实现的简易万年历

    ### 使用C语言实现简易万年历的知识点解析 #### 一、程序背景及目标 本程序采用C语言编写,旨在创建一个简易但功能强大的万年历。它能够根据用户输入的年份和月份来显示相应的日历。此程序不仅能够展示特定月份的...

    wannianli.rar_简易万年历

    标题 "wannianli.rar_简易万年历" 指的是一个基于C语言编写的简单万年历程序。这个程序可能包含基本的日期计算和显示功能,旨在帮助用户查看不同年份的日历,而无需复杂的操作。在编程领域,实现这样的万年历程序是...

    简易万年历_单片机_万年历_

    【简易万年历_单片机_万年历】项目是一个基于51单片机的电子日历设计,它能够实现时间的显示、调整以及复位功能。在电子工程领域,这样的项目对于学习单片机编程和硬件接口设计非常有帮助。下面我们将详细探讨这个...

    简易的万年历代码 用C语言实现

    用C 语言实现的万年历系统,适合初学者。

    单片机综合实践 简易万年历设计与制作任务单2.doc

    在本任务中,学生将参与一个单片机技术的实践项目——设计并制作一个简易的万年历。这个任务旨在加深对单片机原理及应用的理解,同时涉及到C语言编程、硬件接口通信以及时间管理等多个方面的知识。以下是相关知识点...

    大学期间的C语言课程设计,一个简易的万年历.zip

    C 语言普适性最强的一种计算机程序编辑语言,它不仅可以发挥出高级编程语言的功用,还具有汇编语言的优点,因此相对于其它编程语言,它具有自己独特的特点。具体体现在以下三个方面: 其一,广泛性。...

    万年历+stm32+触摸按键

    使用定时器产生秒基时,编程实现万年历功能,在LCD上显示年月日、星期、时分秒。 设计触摸屏键盘校对时间,在LCD屏幕的下半部分设计出键盘,包含有“0、1、2、3、4、5、6、7、8、9、!、&lt;”键,修改日期时间(!、&lt;,...

    万年历_c语言

    本项目“万年历_c语言”是一个使用C语言编写的控制台应用程序,旨在实现一个简易的万年历功能。通过这个项目,我们可以深入学习C语言的日期和时间处理,以及控制台界面的交互设计。 首先,让我们了解一下C语言中的...

    基于c51单片机万年历的设计(毕业设计)

    4. **软件编程**:使用C语言或其他编程语言编写程序代码,实现时间计算、显示控制等功能。 5. **调试测试**:在Keil软件中编写和调试程序,确保软件逻辑正确无误。 6. **仿真验证**:利用Proteus软件进行电路仿真,...

    基于51单片机和LCD1602的万年历程序

    本项目是基于51单片机设计的一款简易万年历程序,利用LCD1602作为显示屏,能够实现日期与时间的显示及调整功能。通过几个按键(C1、C2、C3)来控制时间的显示与调整。 #### 主要功能 1. **实时显示**: 启动程序后...

    C语言课程设计案例精编光盘

    在仿Windows应用程序篇中,我们介绍了万年历、画图板、电子时钟、简易计算器、文本编辑器五个小应用程序的设计与实现。本书从实用性和先进性出发,内容组织合理、通俗易懂。 1. 内容及使用方法 (1) 本光盘提供了书...

    【单片机项目】基于单片机数字万年历的设计(含毕业论文)

    本次设计旨在设计基于51系列的单片机进行的简易电子万年历,在硬件与软件方面进行同步设计。此电子万年历在硬件方面主要采用STC89C52单片机作为主控核心,由DS1302时钟芯片提供时钟、DS18B20芯片显示温度、1602LCD...

    《C语言课程设计案例精编》源代码

    摘自书《C语言课程设计案例精编》 ...在仿Windows应用程序篇中,我们介绍了万年历、画图板、电子时钟、简易计算器、文本编辑器五个小应用程序的设计与实现。本书从实用性和先进性出发,内容组织合理、通俗易懂。

    c语言课程设计案例精编配套光盘资料

    c语言课程设计案例精编配套光盘资料包括俄罗斯方块,推箱子,五子棋游戏源码;学生成绩,工资管理,电话簿管理等系统;ping程序设计,tcp程序设计,...万年历,画图板,电子时钟,文本编辑器,简易计算器等使用小程序。

    wnl.rar_1602万年历_51_1602_万年历_毕业设计 单片机_毕业设计 单片机

    1602液晶屏是一种常见的字符型液晶显示器,常用于单片机控制的简易显示设备。51单片机则是微控制器的一种,以其易用性和广泛的硬件支持而著名,是初学者和专业人士常用的开发平台。 描述提到,“51单片机做的万年历...

    用vc代码实现一个万年历功能

    本文将详细介绍如何使用Visual C++ (简称VC) 开发一款简易但实用的万年历软件。该程序能够准确计算出输入日期是星期几,并显示相应的月份天数。通过分析提供的部分代码片段,我们可以深入理解其实现原理和技术细节。...

    20个单片机课程设计-毕业设计实例(C语言类与汇编类)

    项目6基于AT89S51单片机万年历的设计 项目7 基于AT89S51单片机密码锁的设计 项目8 基于AT89S51单片机比赛记分牌的设计 项目9 单片机数显交通灯的设计 项目10单片机控制步进电机 项目11基于AT89S51单片机数字音乐盒的...

    基于单片机的万年历.doc

    在本课程设计中,学生将学习如何利用单片机技术来构建一个简易的万年历系统。 1. **设计目的** 主要是提升学生在学习单片机课程后的综合应用能力,包括理论知识与实际操作的结合。通过设计和制作万年历,学生需要...

    日历源程序

    《C语言实现的万年历程序详解》 在信息技术领域,日历程序是常见的实用工具,它可以帮助用户查看日期、安排日程等。本篇文章将深入探讨一款由C语言编写的万年历程序,该程序操作简单,适用于各种日常需求。 C语言...

    万年历与学生成绩管理系统

    【标题】"万年历与学生成绩管理系统"所涉及的知识点主要集中在C语言编程上,结合了数据结构和程序设计的基本概念。该系统旨在提供一个简易的学生成绩管理功能,包括用户登录、数据输入、查询、删除、更新和输出等...

Global site tag (gtag.js) - Google Analytics