C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷
前言:本文章向大家介紹如何使用C語(yǔ)言代碼實(shí)現(xiàn)萬(wàn)年歷使用實(shí)例,講解編寫(xiě)萬(wàn)年歷的方法,教你輕松學(xué)會(huì)寫(xiě)出萬(wàn)年歷。這個(gè)小程序算是我自己寫(xiě)的第一個(gè)比較完整的小程序,算是對(duì)大一上學(xué)期學(xué)習(xí)的C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)的一個(gè)總結(jié)
知識(shí)強(qiáng)調(diào)
特別說(shuō)明
各函數(shù)說(shuō)明
1.打印星號(hào)函數(shù)
2.打印日歷抬頭函數(shù)
3.判斷閏年平年函數(shù)
4.計(jì)算總天數(shù)函數(shù)
5.打印日歷函數(shù)
6.main函數(shù)(主函數(shù))
完整代碼
總結(jié)
知識(shí)強(qiáng)調(diào)
1.由于教皇格里戈八世在1582年2月24日頒布法令,永遠(yuǎn)抹去了1582年10月5日到1582年10月14日。所以導(dǎo)致歷史上永遠(yuǎn)不存在這10天。1582年2月24日是星期四,它的第二天是1582年10月5日,這天是星期五。
因此考慮到這十天的影響,所以本篇文章使用1900年1月1日進(jìn)行計(jì)算,這天正好是星期一,便于我們的程序計(jì)算。
2.判斷閏年與平年的方法
閏年:年份數(shù)是4的倍數(shù)但不是100的倍數(shù),或者年份數(shù)是400的倍數(shù)。
平年:除去閏年的年份就都是平年。
3.閏年有366天,平年有365天。閏年的二月有29天,平年的二月有28天。
特別說(shuō)明:
1.本文所寫(xiě)的日歷的第一天是從星期一開(kāi)始的,與某些紙質(zhì)日歷從星期日開(kāi)始的不同。
2.本篇文章所寫(xiě)的日歷是某一年某一個(gè)月的日歷,不是完整的年日歷。
如下圖所示
各函數(shù)說(shuō)明
1.打印星號(hào)函數(shù)
void printStar()
{
printf("*****************************************************\n");
}
目的是為了在修飾輸出后的萬(wàn)年歷,使其更加美觀(guān),好看。
2.打印日歷抬頭函數(shù)
char weekday[7][10]={"一","二","三","四","五","六","日"};
void printBegin()
{
printf("\t\t\t萬(wàn)年歷\t\t\t\n");
printStar();
for(int i=0;i<7;i++)
{
printf("%s\t",weekday[i]);
}
printf("\n");
}
將日歷的抬頭與封裝在一起,方便輸出周一至周日。
3.判斷閏年平年函數(shù)
int leap(int year)
{
if(year%4==0&&year%100!=0||year%400==0)
{
return 1;
}
else
{
return 0;
}
/*int four,hundred,fourhundred;
four=year%4;
hundred=year%100;
fourhundred=year%400;
if(four==0&&hundred==0&&fourhundred==0)
{
return 1;
}
else if(four==0&&hundred!=0&&fourhundred!=0)
{
return 1;
}
return 0;*/
}
將判斷閏年與平年的函數(shù)封裝成一個(gè)函數(shù),更見(jiàn)方便調(diào)用。在這里,計(jì)算平年與閏年有兩種方法,第二種方法理解起來(lái)有點(diǎn)麻煩。更加希望選擇第一種。
4.計(jì)算總天數(shù)函數(shù)
//1900年1月1日是星期一,比較方便后面的計(jì)算
//我們需要算我們輸入的年份離1900年有多少天
int daySum(int year,int month)
{
//1900 1 1 是星期一
int i,sum=0;
for(i=1900;i<year;i++)
{
//判斷當(dāng)前年份是閏年還是平年
{
if(leap(i))
{
sum+=366;
}
else
{
sum+=365;
}
}
}
for(i=0;i<month-1;i++)//i<month-1是因?yàn)槲覀儾荒軐⑽覀冚斎氲脑路萦?jì)算在內(nèi)
{
if(leap(year)==1)
{
sum+=runnian[i];
}
else
{
sum+=pingnian[i];
}
}
return sum;
}
這個(gè)函數(shù)是計(jì)算我們輸入的月份離1900年1月1日有多少天,方便我們下面計(jì)算。
5.打印日歷函數(shù)
//打印日歷
void printResult(int sum,int year,int month)
{
int result,temp,i;//result為余數(shù),temp為中間變量,i為循環(huán)變量
result=sum%7;//日歷上前面空余的天數(shù),就是總天數(shù)除以7的余數(shù)
//把當(dāng)前月份空余的天數(shù)用空格表示
for(i=0;i<result;i++)
{
printf("\t");
}
temp=7-result;//從第幾格開(kāi)始打印一號(hào)
if(leap(year)==1)
{
//數(shù)組下標(biāo)從0開(kāi)始
//月份只能從1開(kāi)始
for(i=1;i<=runnian[month-1];i++)
{
printf("%d\t",i);
if(i==temp||(i-temp)%7==0)
{
printf("\n");
}
}
printf("\n");
}
else
{
for(i=1;i<=pingnian[month-1];i++)
{
printf("%d\t",i);
if(i==temp||(i-temp)%7==0)
{
printf("\n");
}
}
}
printf("\n");
}
這個(gè)函數(shù)的作用就是打印日歷,result是日歷上面空余的天數(shù)
得到的result就是為了將這些空白部分輸出,把當(dāng)前月份空余天數(shù)輸出。
5.main函數(shù)(主函數(shù))
int main(void)
{
//用戶(hù)輸入年 月
printf("請(qǐng)輸入年-月:");
scanf("%d-%d",&year,&month);
printBegin();
int sum=daySum(year,month);
printResult(sum,year,month);
printStar();
system("pause");//防止閃屏
return 0;
}
將其他函數(shù)在主函數(shù)中調(diào)用,就能做出一個(gè)完整的萬(wàn)年歷。
完整代碼
/*
1.用戶(hù)輸入年,月
2.打印一個(gè)日歷
*/
#define _CRT_SECURE_NO_WARNINGS//使用宏定義是讓編譯器進(jìn)行操作,讓編譯器忽略?xún)?nèi)庫(kù)存的問(wèn)題
#include<stdio.h>
#include<stdlib.h>
int year,month;
//閏年和平年 2月份天數(shù)不一樣
int runnian[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int pingnian[12]={31,28,31,30,31,30,31,31,30,31,30,31};
char weekday[7][10]={"一","二","三","四","五","六","日"};
//打印星號(hào)
void printStar()
{
printf("*****************************************************\n");
}
//打印日歷的抬頭
void printBegin()
{
printf("\t\t\t萬(wàn)年歷\t\t\t\n");
printStar();
for(int i=0;i<7;i++)
{
printf("%s\t",weekday[i]);
}
printf("\n");
}
//判斷當(dāng)前年份是閏年還是平年
int leap(int year)
{
if(year%4==0&&year%100!=0||year%400==0)
{
return 1;
}
else
{
return 0;
}
/*int four,hundred,fourhundred;
four=year%4;
hundred=year%100;
fourhundred=year%400;
if(four==0&&hundred==0&&fourhundred==0)
{
return 1;
}
else if(four==0&&hundred!=0&&fourhundred!=0)
{
return 1;
}
return 0;*/
}
//1900年1月1日是星期一,比較方便后面的計(jì)算
//我們需要算我們輸入的年份離1900年有多少天
int daySum(int year,int month)
{
//1900 1 1 是星期一
int i,sum=0;
for(i=1900;i<year;i++)
{
//判斷當(dāng)前年份是閏年還是平年
{
if(leap(i))
{
sum+=366;
}
else
{
sum+=365;
}
}
}
for(i=0;i<month-1;i++)//i<month-1是因?yàn)槲覀儾荒軐⑽覀冚斎氲脑路萦?jì)算在內(nèi)
{
if(leap(year)==1)
{
sum+=runnian[i];
}
else
{
sum+=pingnian[i];
}
}
return sum;
}
//打印日歷
void printResult(int sum,int year,int month)
{
int result,temp,i;//result為余數(shù),temp為中間變量,i為循環(huán)變量
result=sum%7;//日歷上前面空余的天數(shù) ,就是總天數(shù)除以7的余數(shù)
//把當(dāng)前月份空余的天數(shù)用空格表示
for(i=0;i<result;i++)
{
printf("\t");
}
temp=7-result;//從第幾格開(kāi)始打印一號(hào)
if(leap(year)==1)
{
//數(shù)組下標(biāo)從0開(kāi)始
//月份只能從1開(kāi)始
for(i=1;i<=runnian[month-1];i++)
{
printf("%d\t",i);
if(i==temp||(i-temp)%7==0)
{
printf("\n");
}
}
printf("\n");
}
else
{
for(i=1;i<=pingnian[month-1];i++)
{
printf("%d\t",i);
if(i==temp||(i-temp)%7==0)
{
printf("\n");
}
}
}
printf("\n");
}
int main(void)
{
//用戶(hù)輸入年 月
printf("請(qǐng)輸入年-月:");
scanf("%d-%d",&year,&month);
printBegin();
int sum=daySum(year,month);
printResult(sum,year,month);
printStar();
system("pause");//防止閃屏
return 0;
}
這里我們進(jìn)行一個(gè)測(cè)試,當(dāng)我們輸入2022-12時(shí),看我們所寫(xiě)的程序運(yùn)行結(jié)果是不是能和電腦上的日歷一樣。
這是我們運(yùn)行出來(lái)的結(jié)果:
這是電腦日歷:
我們可以從這兩個(gè)圖片觀(guān)察出,我們代碼運(yùn)行出來(lái)的結(jié)果與電腦日歷上是差不多的。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-516212.html
總結(jié)
以上便是根據(jù)年月的輸入,輸出所在的當(dāng)月日歷。在這個(gè)基礎(chǔ)上,我們還能夠編寫(xiě)通過(guò)輸入年份,輸出這一年十二個(gè)月的日歷,如果感興趣的小伙伴們,可以自行嘗試寫(xiě)一下。
這是我第一次寫(xiě)的完整的一個(gè)程序,如果有錯(cuò)誤的地方或者有疑問(wèn)的地方,請(qǐng)大家在評(píng)論區(qū)中指出。希望大家能給我這個(gè)新人點(diǎn)個(gè)關(guān)注,點(diǎn)點(diǎn)贊!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-516212.html
到了這里,關(guān)于C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷(附代碼) 小白完成的第一個(gè)C語(yǔ)言程序,希望大家多多關(guān)注,點(diǎn)贊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!