C語(yǔ)言實(shí)現(xiàn)萬(wàn)年歷小程序
一、雜談
大一學(xué)了C之后一直困惑,C到底怎么用?它不像HTML那么直觀,也沒(méi)有SQL那么常用,更沒(méi)有Java那么功能強(qiáng)大,那他為何還存在,并依然火熱呢?
答案很簡(jiǎn)單:編程語(yǔ)言是一家,C語(yǔ)言結(jié)構(gòu)簡(jiǎn)單,但所蘊(yùn)含的邏輯思維和其他語(yǔ)言大致相同,適合初學(xué)者。
編程不是一蹴而就,能力需要日積月累,推薦想我一樣的初學(xué)者,大家自己動(dòng)手玩玩簡(jiǎn)單的C程序!
二、萬(wàn)年歷
像這樣一個(gè)簡(jiǎn)單的全年日歷,仔細(xì)觀察不難發(fā)現(xiàn)由每個(gè)月的日歷組成,每個(gè)月有最多6行,占6周,每周7天;
程序如下:
設(shè)定日歷大小:
int date[12][6][7]; //12個(gè)月,每月最多6行,每行7天 int calendar[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31}, //平年 {31,29,31,30,31,30,31,31,30,31,30,31}}; //閏年 int year; char title[]="SUN MON TUE WED THU FRI SAT"; //周幾 int sw,leap,i,j,k,wd,day; //變量 // sw 周幾,leap 0平年 1閏年,i,j,k輔助變量,wd 第幾周,day 日
提示用戶輸入想要查詢(xún)的年份:(回車(chē)換行)
printf("Please input the year whose calendar you want to know: "); scanf("%d%*c",&year);
再計(jì)算該年1月1 日是起于周幾:
(由于公元1月1日設(shè)為星期六,故3月1日為星期三。為使算法達(dá)到最簡(jiǎn),故本算法以“星期”為計(jì)算單位。且選3月1日為基月。
每 4年(3個(gè)平年+1個(gè)閏年)共208周+5天 =208*7+5=1461
每百年共100*(208周+5天)-1天=5217周+5天 (整百年暫設(shè)為平年)
每400年共4*(5217周+5天)+1天(整400年閏)=20871周+0天
即400年一輪回?。?nbsp;
long int getyear(int year,int month){ if(month<3) return year-1; //以元年3月為基石 else return year; } long int getmonth(int month){ if(month<3) return month+13; //將月份調(diào)至下個(gè)月 else return month+1; } long int getday(int year,int month,int day){ return 1461L*getyear(year,month)/4+153L*getmonth(month)/5+day; //計(jì)算距離元年3月1日天數(shù) //計(jì)算方法:每四年一周期1461天(相當(dāng)于計(jì)算平均每年多少天) //每五個(gè)月一周期153天(相當(dāng)于計(jì)算平均每月多少天) } int getweekday(int year,int month,int day){ return(int)((getday(year,month,day)%7-2+7)%7); //得該日期的星期數(shù) //得到的天數(shù)除以7天取余,減去3月1日周三,其他均為保證正數(shù)1-7的附加計(jì)算 }
判斷是否為閏年:
leap= year%4==0 && year%100||year%400==0 ;
將日歷置為空:
for(i=0;i<12;i++) for(j=0;j<6;j++) for(k=0;k<7;k++) date[i][j][k]=0;
填充該年日期:
sw=getweekday(year,1,1); for(i=0;i<12;i++) for(wd=0,day=1; day <= calendar[leap][i]; day++){ date[i][wd][sw]=day; sw = ++sw%7; if(sw==0) wd++; }
格式化輸出:
printf("\n|==================The Calendar of Year %d =====================|\n|",year); for(i=0;i<6;i++){ for(wd=0,k=0;k<7;k++) wd+=date[i][5][k]+date[i+6][5][k]; wd=wd?6:5; printf("%2d %s %2d %s |\n|",i+1,title,i+7,title); for(j=0;j<wd;j++){ printf(" "); for(k=0;k<7;k++) if(date[i][j][k]) printf("%4d",date[i][j][k]); else printf(" "); printf(" "); for(k=0;k<7;k++) if(date[i+6][j][k]) printf("%4d",date[i+6][j][k]); else printf(" "); printf(" |\n|"); } scanf("%*c"); } puts("=================================================================|"); puts("\n Press any key to quit...");
結(jié)果為
完整代碼:
#include "stdio.h" long int getyear(int year,int month){ if(month<3) return year-1; else return year; } long int getmonth(int month){ if(month<3) return month+13; else return month+1; } long int getday(int year,int month,int day){ return 1461L*f(year,month)/4+153L*g(month)/5+day; } int getweekday(int year,int month,int day){ return(int)((n(year,month,day)%7-2+7)%7); } int date[12][6][7]; int calender[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31}, {31,29,31,30,31,30,31,31,30,31,30,31}}; main() {int sw,leap,i,j,k,wd,day; int year; char title[]="SUN MON TUE WED THU FRI SAT"; printf("Please input the year whose calendar you want to know: "); scanf("%d%*c",&year); sw=w(year,1,1); leap=year%4==0&&year%100||year%400==0; for(i=0;i<12;i++) for(j=0;j<6;j++) for(k=0;k<7;k++) date[i][j][k]=0; for(i=0;i<12;i++) for(wd=0,day=1;day<=day_tbl[leap][i];day++){ date[i][wd][sw]=day; sw=++sw%7; if(sw==0) wd++; } printf("\n|==================The Calendar of Year %d =====================|\n|",year); for(i=0;i<6;i++){ for(wd=0,k=0;k<7;k++) wd+=date[i][5][k]+date[i+6][5][k]; wd=wd?6:5; printf("%2d %s %2d %s |\n|",i+1,title,i+7,title); for(j=0;j<wd;j++) { printf(" "); for(k=0;k<7;k++) if(date[i][j][k]) printf("%4d",date[i][j][k]); else printf(" "); printf(" "); for(k=0;k<7;k++) if(date[i+6][j][k]) printf("%4d",date[i+6][j][k]); else printf(" "); printf(" |\n|"); } scanf("%*c"); } puts("=================================================================|"); puts("\n Press any key to quit..."); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C++中基類(lèi)與派生類(lèi)的轉(zhuǎn)換以及虛基類(lèi)
這篇文章主要介紹了詳解C++中基類(lèi)與派生類(lèi)的轉(zhuǎn)換以及虛基類(lèi),是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09C語(yǔ)言超詳細(xì)講解循環(huán)與分支語(yǔ)句基礎(chǔ)
各位小伙伴們,今天給大家?guī)?lái)的是循環(huán)與分支語(yǔ)句,本篇將會(huì)向大家介紹這些語(yǔ)句的格式和使用的基本方法,感興趣的朋友來(lái)看看吧2022-04-04C++ LeetCode1796字符串中第二大數(shù)字
這篇文章主要為大家介紹了C++ LeetCode1796字符串中第二大數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12初識(shí)C++?Vector模板與實(shí)例化原理
這篇文章主要為大家介紹了初識(shí)C++?Vector模板與實(shí)例化原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12C語(yǔ)言編程中的聯(lián)合體union入門(mén)學(xué)習(xí)教程
這篇文章主要介紹了C語(yǔ)言編程中的聯(lián)合體union入門(mén)學(xué)習(xí)教程,也是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-12-12C++中重載、重寫(xiě)(覆蓋)和隱藏的區(qū)別實(shí)例分析
這篇文章主要介紹了C++中重載、重寫(xiě)(覆蓋)和隱藏的區(qū)別,是C++面向?qū)ο蟪绦蛟O(shè)計(jì)非常重要的概念,需要的朋友可以參考下2014-08-08C++探索構(gòu)造函數(shù)私有化會(huì)產(chǎn)生什么結(jié)果
C++的構(gòu)造函數(shù)的作?:初始化類(lèi)對(duì)象的數(shù)據(jù)成員。即類(lèi)的對(duì)象被創(chuàng)建的時(shí)候,編譯系統(tǒng)對(duì)該對(duì)象分配內(nèi)存空間,并?動(dòng)調(diào)?構(gòu)造函數(shù),完成類(lèi)成員的初始化。構(gòu)造函數(shù)的特點(diǎn):以類(lèi)名作為函數(shù)名,?返回類(lèi)型2022-05-05