程序預覽:
//作者:石輔寸
//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;
}