ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言实现万年历

2021-10-21 23:32:09  阅读:162  来源: 互联网

标签:万年历 实现 void printf month int year C语言 31


在这里插入图片描述

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

标签:万年历,实现,void,printf,month,int,year,C语言,31
来源: https://blog.csdn.net/Twinkle_sone/article/details/120897066

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有