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日是星期一(注:有说是星期六的,但从程序倒推回去是星期一,具体原因是一些历史问题,并不影响后续年份日历的呈现)。
583 0
C语言实现万年历(附代码)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
|
程序员 C语言 C++
教你用C语言编写万年历,程序员超乎你的想象!
教你用C语言编写万年历,程序员超乎你的想象!
1886 0
|
算法 C语言
【C语言】第一个C语言小程序 —— 日期算法和万年历
1. 写了个万年历的功能练练手。还没有写交互的代码,只是把方法写完了。先给出头部和方法签名 #include #define DAYS_PER_WEEK 7 #define MONTHS 12 #define DATE_HEADER " Sun Mon Tues Wed...
1888 0
|
算法 C语言
【C语言】第一个C语言小程序 —— 日期算法和万年历2
1. 上一篇我们只完成了   a. 算出某年某月某日是星期几   b. 打印出某年某月的日历 这一次我写了一个打印某一年的日历。一开始我是不打算写的,因为可以调用之前的方法,分别打印出这一年12个月的日历。
1875 0
|
机器学习/深度学习 C语言 Windows
用C语言写的万年历---亲手写的。好累哦
#include #include #include #define str "   SUN   MON  TUE   WED   THU   FRI   SAT   "void menu();         //操作菜单 int leap(int year);        //判断某年是不...
893 0
|
C语言
C语言实现万年历
给出你想知道的年份,便可以计算出该年对应的每个月每个日所对应的星期数,是不是感觉很好玩 ? #include #include long int f(int year,int month) { /*f(年,月)=年-1,如月
1428 0
|
1天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
25 15
|
1天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
36 24