C语言实现万年历

简介: C语言实现万年历

1、判断润年
//判断润年
bool isLeap(int year){
  if((year%4==0 && year%100!=0)||(year%400==0)){
        return true;
    }
    return false;
}
2、打印表头表脚
void printHeader(){
  printf("\t\t%d年%d月\t\n",year,month);
  printf(" -------------------------------------------------------\n");
  printf("|*******************************************************|\n");
  printf("|-------------------------------------------------------|\n");
  printf("|星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六  |\n");
  printf("|-------------------------------------------------------|\n");
  return ;
}
void prinfFooter(){
  printf("\n|-------------------------------------------------------|\n");
  printf("|*******************************************************|\n");
  printf("|-------------------------------------------------------|\n");
}
3、获取当前日期
void getNowDate(){
  time_t timep;
  struct tm *p;
  time(&timep);
  p = gmtime(&timep);
  year = 1900 + p->tm_year;
  month = 1 + p->tm_mon;
//  printf("%d  %d  %d:", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday);
//  printf("%d;%d;%d ", p->tm_hour+8, p->tm_min, p->tm_sec);
  return;
}
完整代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
//判断润年
bool isLeap(int year);
//获取月份天数
int getMonthDays(int year,int month);
//函数功能:输入年月日,输出1900-1-1到该天的天数,-1位输入不合法
int Day(int y,int m,int d);
//绘制表头 
void printHeader();
//绘制日历日期 
void printDays(int week,int day);
//绘制表脚 
void prinfFooter();
//输出菜单 
void printMenu();
//绘制日历 
void printCalendar(int year,int month);
//重新输入时间
void resetDate();
//下月 
void nextMonth();
//上月 
void lastMonth();
//获取当前年份月份 
void getNowDate();
int year,month;
int main(){
  getNowDate(); 
  printCalendar(year,month);
  while(1){
    printMenu();
  } 
  return 0;
} 
void getNowDate(){
  time_t timep;
  struct tm *p;
  time(&timep);
  p = gmtime(&timep);
  year = 1900 + p->tm_year;
  month = 1 + p->tm_mon;
//  printf("%d  %d  %d:", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday);
//  printf("%d;%d;%d ", p->tm_hour+8, p->tm_min, p->tm_sec);
  return;
}
void printCalendar(int year,int month){
  int m = getMonthDays(year,month);
  int d = Day(year,month,1) % 7;
  printHeader(); 
  printDays(d - 1,m);
  prinfFooter();
} 
//重新输入时间
void resetDate(){
    printf("请输入年、月(用空格隔开):");
    scanf("%d %d",&year,&month);
    printCalendar(year,month);
} 
//下个月 
void nextMonth(){
  month = month + 1;
  if(month == 13){
    month = 1;
    year = year + 1;
  }
    printCalendar(year,month);
} 
//上个月 
void lastMonth(){
  month = month - 1;
  if(month == 0){
    month = 12;
    year = year - 1;
  }
    printCalendar(year,month);
} 
void printMenu(){
  printf("1、重新输入时间\n");
  printf("2、下个月\n");
  printf("3、上个月\n");
  printf("4、退出程序\n");
  printf("请选择:");
  int choose;
  scanf("%d",&choose); 
  system("CLS");
  switch(choose){
    case 1:
      resetDate(); 
      break;
    case 2:
      nextMonth();
      break;
    case 3:
      lastMonth();
      break;
    case 4:
      exit(1);
      break;
    default:
      printf("请选择正确选项!!!\n");
      break;
  }
}
void printHeader(){
  printf("\t\t%d年%d月\t\n",year,month);
  printf(" -------------------------------------------------------\n");
  printf("|*******************************************************|\n");
  printf("|-------------------------------------------------------|\n");
  printf("|星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六  |\n");
  printf("|-------------------------------------------------------|\n");
  return ;
}
void prinfFooter(){
  printf("\n|-------------------------------------------------------|\n");
  printf("|*******************************************************|\n");
  printf("|-------------------------------------------------------|\n");
}
void printDays(int week,int day){
  printf("|");
  if(week == -1) week = 0;
  for(int i = 0; i <= week; i++){
    printf("\t");
  }
//  printf("week=%d\n",week);
  for(int i = 0; i < day; i++){
    if((i + week > 0) && (i + week + 1) % 7 == 0){
      printf("|\n|\n| %d\t",i + 1);
    }else{
      printf("  %d\t",i + 1);
    }
  }
  return;
}
//判断润年
bool isLeap(int year){
  if((year%4==0 && year%100!=0)||(year%400==0)){
        return true;
    }
    return false;
}
//获取月份天数
int getMonthDays(int year,int month){
  month = month - 1;
  if(month < 0 || month > 11) return 0;
  int months[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    if(isLeap(year)){
      months[1] = 29;
    }
    return months[month];
}
//函数功能:输入年月日,输出1900-1-1到该天的天数,-1位输入不合法
int Day(int y,int m,int d)
{
    int i;
    int r=0;  //储存1900到该天的闰年个数
    int a[]={31,28,31,30,31,30,31,31,30,31,30}; //m给每出月的天数
    if(y>=1900 && m>0 && m<13 && d>0 && d<32)
    {
        for(i=1900;i<=y;i++)  //计算闰年的个数
        {
            if(i%400==0||i%100!=0&&i%4==0)
                r++;
        }
        for(i=0;i<m-1;i++)  //统计当年1月1日到当月的天数
        {
            d+=a[i];
        }
        if((y%400==0||y%100!=0&&y%4==0)&&m<3)  //如果当年是闰年但不到二月就不能算进去
            r--;
        return 365*(y-1900)+r+d;
    }
    else
        return -1;
}
目录
相关文章
|
Serverless C语言
C语言实现万年历(附代码)
公元元1年1月1日是星期一(注:有说是星期六的,但从程序倒推回去是星期一,具体原因是一些历史问题,并不影响后续年份日历的呈现)。
528 0
C语言实现万年历(附代码)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
|
程序员 C语言 C++
教你用C语言编写万年历,程序员超乎你的想象!
教你用C语言编写万年历,程序员超乎你的想象!
1868 0
|
算法 C语言
【C语言】第一个C语言小程序 —— 日期算法和万年历
1. 写了个万年历的功能练练手。还没有写交互的代码,只是把方法写完了。先给出头部和方法签名 #include #define DAYS_PER_WEEK 7 #define MONTHS 12 #define DATE_HEADER " Sun Mon Tues Wed...
1881 0
|
算法 C语言
【C语言】第一个C语言小程序 —— 日期算法和万年历2
1. 上一篇我们只完成了   a. 算出某年某月某日是星期几   b. 打印出某年某月的日历 这一次我写了一个打印某一年的日历。一开始我是不打算写的,因为可以调用之前的方法,分别打印出这一年12个月的日历。
1869 0
|
机器学习/深度学习 C语言 Windows
用C语言写的万年历---亲手写的。好累哦
#include #include #include #define str "   SUN   MON  TUE   WED   THU   FRI   SAT   "void menu();         //操作菜单 int leap(int year);        //判断某年是不...
889 0
|
C语言
C语言实现万年历
给出你想知道的年份,便可以计算出该年对应的每个月每个日所对应的星期数,是不是感觉很好玩 ? #include #include long int f(int year,int month) { /*f(年,月)=年-1,如月
1419 0
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
35 3
|
12天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
28 6