万年历c程序

程序預覽:
在这里插入图片描述

//作者:石輔寸
//2019年2月24日
//項目要求:要求輸入年份月份得到該年該月的日曆
//提綱:
// 1,寫年月
// 2,檢查年月
// 3,如果月份正確執行下一步,否則返回第1條
// 4,創建日曆(需要在週日至週六的框架上建立與日期的表格)
// 		4.1,判斷日期對應的星期數
// 		4.2,把日期對應星期數寫入裱中
//		4.3,方便起見,從每月的第一天開始寫
//		4.4,為保證當月日期能夠在一頁寫完,每頁至少6行,
//           即保證本月1日是週六時,本頁的空間仍然夠用
// 5,讀取日曆
int writeYM(int year,int month);//寫日月
int createCalendar(int year,int month,int calendar,int leapYear,int commonYear);//創建日曆
int readCalendar(int calendar);//讀日曆
int calendar[6][7] = {0};//年曆每月6行,7列
int leapYear[] = {31,29,31,30,31,30,31,31,30,31,30,31};//閏年
int commonYear[] = {31,28,31,30,31,30,31,31,30,31,30,31};//平年
//函數功能:主函數
int main()
{
    int year,month,yearmonth;
    yearmonth = writeYM(year,month);
	year = yearmonth/100;//寫日月
	month = yearmonth%100;
	createCalendar(year,month,calendar,leapYear,commonYear);//創建日曆
	readCalendar(calendar);//讀日曆
}
//函數功能:寫需要查詢的年月對應的日期
//注意:年份可正可負,所以只檢查月份是否正確
#include<stdio.h>
int checkmonth(int month);//檢查月份
int writeYM(int year,int month)
{
    int yearMonth;
	printf("請輸入年月:");
	scanf("%d,%d",&year,&month);
	if(checkmonth(month) == 1)
	{
		printf("輸入錯誤,請重新輸入.\n");
		writeYM(year,month);
	}
	yearMonth = year*100 + month;
	return yearMonth;
}
//函數功能:檢查月份是否錯誤
int checkmonth(int month)
{
	if(month <= 0 || month > 12)
	{
		printf("月份輸入錯誤,請重新輸入。\n");
		return 1;
	}
	else
    {
        return 0;
	}
}

//函數功能:創建日曆
int getWeekday(int year,int month,int day,int leapYear,int commonYear);//獲取星期
int createCalendar(int year,int month,int calendar[][7],int leapYear,int commonYear)
{
    int weekDay = getWeekday(year,month,1,leapYear,commonYear);	//獲取該年該月1日的星期數
	checkWeekday(weekDay);					//檢查得到的這個星期數是否合法
	//printf("%d",weekDay);
	writeCalendar(year,month,weekDay,calendar,leapYear,commonYear);					//寫日曆
    return 0;
}
//函數功能:檢查星期數是否正確
int checkWeekday(int weekDay)
{
    if(weekDay >= 0 && weekDay < 7)
    {
        return 0;
    }
    else
    {
        printf("獲取星期數失敗。");
        return 1;
    }
}
//函數功能:寫日曆,日期按星期數歸類
// 1,獲取本月天數,
// 2,從本月1日開始按星期數寫日曆
// 3,計算本月1日前空餘的天數
// 4,獲取上月天數
// 5,用上月末尾幾天補齊本月1日前空缺的日期
// 6,計算本月最後一日后在本頁空餘的天數
// 7,用下月開頭的幾天補齊本頁剩餘的空缺
int getDay(int year,int month,int leapYear,int commonYear);//獲取月份的天數
int writeCalendar(int year,int month,int weekDay,int calendar[][7],int leapYear[],int commonYear[])
{
	int i = 0,j,k,day,n;
	int lastMonth,nextMonth;		  		//聲明上下月的天數補空日曆空餘位置
	int lastYear,nextYear;                  //聲明上下年份
	int dayMonth = getDay(year,month,leapYear,commonYear);		//当月天数。
	k = weekDay;					  		//本月1日的星期數就是空缺的天數,m月1日之前空了k天
	lastMonth = month - 1;			  		//獲取上月月份數
	nextMonth = month + 1;			  		//獲取下月月份數
	lastYear = year - 1;                    //獲取去年年份
	nextYear = year + 1;                    //獲取下一年年份
	if(lastMonth < 1)
    {
        lastMonth = 12;
        day = getDay(lastYear,lastMonth,leapYear,commonYear);
    }
    else
    {
        day = getDay(year,lastMonth,leapYear,commonYear);
    }
	day = day-k;		            	  	//不錄入的上月天數
	day = day+1;							//從day+1日開始補錄
	//補錄上月日期
	while(k > 0)
	{
	    k--;
		calendar[0][i] = day;
		i++;
		day++;
	}
	//錄入第一行日期
	//從第k項開始錄入當月日期
	day = 1;//重置變量day
	k = weekDay;
    for(i = k;i < 7;i++)
    {
		calendar[0][i] = day;
		day++;
    }
	/*给二到六行赋值*/
	day = 7-k;//第一行本月天數
	day = day+1;//從day+1日開始寫第二行直到第六行
    for(i = 1;i < 6;i++)
    {
        for(j = 0;j < 7;j++)
        {
            if(day > getDay(year,month,leapYear,commonYear))
            {
				day = 1;
                calendar[i][j] = day;
				day++;
            }
            else
            {
                calendar[i][j] = day;
                day++;
            }
        }
    }
}
//函數功能:獲取月天數
//1,判斷是否閏年
//2,閏年返回閏年的數組元素
//3,平年返回平年的數組元素
int getDay(int year,int month,int leapYear[],int commonYear[])
{
	if((year%4 == 0 && year%100 != 0) || (year%400 == 0))
	{
		return leapYear[month-1];
	}
	else
	{
		return commonYear[month-1];
	}
}
//函數功能:讀日曆
#include<stdio.h>
int readCalendar(int calendar[][7])
{
	int i,j;
	printf("     日     一     二     三     四     五     六\n");
	for(i = 0;i < 6;i++)
    {
        for(j = 0;j < 7;j++)
        {
            printf("%7d",calendar[i][j]);
        }
        printf("\n");
    }
}
//函數功能:獲取星期數
int getWeekday(int year,int month,int day,int leapYear[],int commonYear[])
{
	int sum = 0;
	//依據的數學方程:
	/* S = {x - 1 + [(x-1)/4] - [(x-1)/100] + [(x-1)/400] + C}%7 */
	/* S為星期序數,x為年份,C為當年元旦至當日(包含當日)的天數 */
	sum = year -1;
	sum = sum + sum / 4 - sum / 100 + sum / 400;
	sum = sum + allDay(year,month,leapYear,commonYear);
	sum = sum % 7;
	return sum;
}
/*已知某年某月1日,求這是這年的第幾天*/
// 知道本月月份數,把本年本月以前的月份的天數相加
// 再加上1
int allDay(int year,int month,int leapYear[],int commonYear[])
{
	int i,daySum = 0;
	if((year%4 == 0 && year%100 != 0) || (year%400 == 0))
	{
		for(i = 0;i < month-1;i++)
		{
			daySum += leapYear[i];
		}
	}
	else
	{
		for(i = 0;i < month-1;i++)
		{
			daySum += commonYear[i];
		}
	}
	daySum += 1;
	return daySum;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值