#include stdio.h
成都創(chuàng)新互聯(lián)"三網(wǎng)合一"的企業(yè)建站思路。企業(yè)可建設(shè)擁有電腦版、微信版、手機(jī)版的企業(yè)網(wǎng)站。實(shí)現(xiàn)跨屏營銷,產(chǎn)品發(fā)布一步更新,電腦網(wǎng)絡(luò)+移動(dòng)網(wǎng)絡(luò)一網(wǎng)打盡,滿足企業(yè)的營銷需求!成都創(chuàng)新互聯(lián)具備承接各種類型的成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)項(xiàng)目的能力。經(jīng)過10年的努力的開拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質(zhì)的服務(wù),并獲得了客戶的一致好評(píng)。
#include stdlib.h
#include math.h
char* month[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nev","Dec"};
char* week[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int j_leapyear(int year) //定義函數(shù)檢測輸入年份是否為閏年
{
if((/*year%400==0*/year%4==0year%100!=0)||(year%400==0))
return (1);
// else if(year%4==0year%100!=0)
// return (1);
else return 0;
}
int month_day(int year,int month) //檢測該年月份有多少天
{
int mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
if(j_leapyear(year)month==2)
return 29;
else return (mon_day[month-1]);
}
int j_week(int year,int month,int day) //檢測該天是星期幾
{
int d=0,i; //d表示該天在該年份的累計(jì)天數(shù)
int w;
/* int month_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
if(j_leapyear(year)==1)
month_day[1]=29;
for(i=0;imonth;i++)
d+=month_day[i];
d=d+day;*/
for(i=1;imonth;i++)
d+=month_day(year,i);
d+=day;
w=(year-1)+(int)(year-1)/4-(int)(year-1)/100+(int)(year-1)/400+d;//網(wǎng)上公式
return ((int)w%7);
}
int allyear(int year) //輸出全年日歷
{
int i,j,b;
printf("\n%d 日歷",year);
for(i=1;i=12;i++)
{
printf("\n\n\t%s\n",month[i-1]);
// printf(" 7 1 2 3 4 5 6 \n");
printf(" S M T W T F S \n");
b=j_week(year,i,1);
for(j=1;j=month_day(year,i)+b;j++)
{
if(j=b)
printf(" ");
else if(j-b10)
printf("%2d ",j-b);
else printf("%2d ",j-b);
//else printf("%2d ",j-b);
if(j%7==0)
putchar('\n');
}
putchar('\n');
}
return 0;
}
void month_print(int year,int month) //輸入一個(gè)年月,輸出這個(gè)月的日歷
{
int i,c,d;
c=month_day(year,month);
printf("\n\n %d年%d月日歷\n",year,month);
printf(" S M T W T F S \n");
d=j_week(year,month,1);
for(i=1;i=c+d;i++)
{
if(i=d)
printf(" ");
else printf("%2d ",i-d);
if(i%7==0)
putchar('\n');
}
putchar('\n');
}
int jisuan_day(int year,int month,int day,int x,int y,int z) //輸入年月日,輸出距x年y月z日有多少天,星期幾,以及是否是公歷節(jié)日
{
int i,a,b,c=0,d=0,days=0,m=0,n=0,t;
a=year=x?year:x;
b=yearx?year:x;
if(ab)
{
for(i=b+1;ia;i++)
c+=j_leapyear(i);
}
else c=0;
if(year!=x)
d=a-b-1;
else d=0;
m=365*d+c;
if(yearx)
{
for(i=month;i=12;i++)
n+=month_day(year,i);
days=m+n+z-day;
}
else if(yearx)
{
for(i=y;i=12;i++)
n+=month_day(x,i);
for(i=1;imonth;i++)
n+=month_day(year,i);
days=m+n+day-z;
}
else
{
for(i=month=y?y:month;i(month=y?month:y);i++)
n+=month_day(x,i);
days=abs(day-z)+n; //輸出距離y月z日有多少天
}
printf("這天離%d年%d月%d號(hào)有%d天\n",x,y,z,days);
t=j_week(year,month,day);
if(t==0) //輸出星期幾
printf("這天星期日");
else if(t==1)
printf("這天星期一");
else if(t==2)
printf("這天星期二");
else if(t==3)
printf("這天星期三");
else if(t==4)
printf("這天星期四");
else if(t==5)
printf("這天星期五");
else if(t==6)
printf("這天星期六");
putchar('\n');
if(month==1day==1)
printf("這天是元旦節(jié)");
else if(month==2day==14)
printf("這天是情人節(jié)");
else if(month==3day==8)
printf("這天是婦女節(jié)");
else if(month==3day==12)
printf("這天是植樹節(jié)");
else if(month==4day==1)
printf("這天是愚人節(jié)");
else if(month==4day==4)
printf("這天是清明節(jié)");
else if(month==5day==1)
printf("這天是勞動(dòng)節(jié)");
else if(month==6day==1)
printf("這天是兒童節(jié)");
else if(month==8day==1)
printf("這天是建軍節(jié)");
else if(month==9day==10)
printf("這天是教師節(jié)");
else if(month==10day==1)
printf("這天是國慶節(jié)");
else if(month==12day==25)
printf("這天是圣誕節(jié)");
else printf("這天不是特殊節(jié)日");
putchar('\n');
return days;
}
void fish_or_net(int year,int month,int day) //判斷是打魚還是曬網(wǎng)
{
int q;
int i,a,b,c=0,d=0,days=0,m=0,n=0;
a=year=1990?year:1990;
b=year1990?year:1990;
if(ab)
{
for(i=b+1;ia;i++)
c+=j_leapyear(i);
}
else c=0;
if(year!=1990)
d=a-b-1;
else d=0;
m=365*d+c;
if(year1990)
{
for(i=month;i=12;i++)
n+=month_day(year,i);
days=m+n+1-day;
}
else if(year1990)
{
for(i=1;i=12;i++)
n+=month_day(1990,i);
for(i=1;imonth;i++)
n+=month_day(year,i);
days=m+n+day-1;
}
else
{
for(i=month=1?1:month;i(month=1?month:1);i++)
n+=month_day(1990,i);
days=abs(day-1)+n; //先確定這天離1990年1月1日有多少天
}
q=days%5+1;
if(q==1||q==2||q==3) //判斷打魚還是曬網(wǎng)
printf("漁人今天打魚");
else printf("漁人今天曬網(wǎng)");
putchar('\n');
}
/*int main() //這部分內(nèi)容用來校檢
{
int j_leapyear(int year);
int month_day(int year,int month);
int j_week(int year,int month,int day);
int allyear(int year);
void month_print(int year,int month);
int jisuan_day(int year,int month,int day,int x,int y,int z);
void fish_or_net(int year,int month,int day);
int x,y,z,year,month,day;
// allyear(2015);
//month_print(2016,12);
printf("請輸入今天的日期(按年,月,日輸入,如2016,1,14表示2016年1月14日):");
scanf("%d,%d,%d",x,y,z);
printf("\n請隨便輸入一個(gè)日期,格式同上:");
scanf("%d,%d,%d",year,month,day);
jisuan_day(year,month,day,x,y,z);
// fish_or_net(x,y,z);
return 0;
} // 這部分內(nèi)容是用來檢測上述函數(shù)是否出錯(cuò)的
*/
int main()
{
int j_leapyear(int year);
int month_day(int year,int month);
int j_week(int year,int month,int day);
int allyear(int year);
void month_print(int year,int month);
int jisuan_day(int year,int month,int day,int x,int y,int z);
void fish_or_net(int year,int month,int day); //函數(shù)聲明
int option,year,month,day,x,y,z;
char ny;
system("color 1f");
while (1)
{
printf("\n\n\t 歡迎來到由...編寫的程序\n\n");
printf(" 請選擇您需要的服務(wù),輸入編號(hào)回車結(jié)束\n");
printf(" 1.輸入一個(gè)年份,輸出該年的日歷\n");
printf(" 2.輸入年月,輸出這個(gè)月的日歷。\n");
printf(" 3.輸入年月日,輸出據(jù)今天還有多久,星期幾,是否是公歷節(jié)日。\n");
printf(" 4.某人自1990年1月1日開始打魚,“三天打魚,兩天曬網(wǎng)”,輸入一個(gè)1990年以后的日期,輸出他這一天是打魚還是曬網(wǎng)。\n");
printf(" 5.退出\n");
scanf("%d",option);
switch(option) //switch分支結(jié)構(gòu)
{
case 1:
while(1) //while循環(huán),后面的1是常數(shù),表示一直到break才結(jié)束循環(huán)
{
printf("請輸入一個(gè)年份:");
scanf("%d",year);
allyear(year);
printf("你想繼續(xù)查詢?nèi)諝v么?(y表示繼續(xù),n表示結(jié)束)");
scanf("%c",ny);
if(ny=='n')
break;
}
break;
case 2:
while (1)
{
printf("輸入年月:");
scanf("%d,%d",year,month);
month_print(year,month);
printf("你想繼續(xù)查詢?nèi)諝v么?(y表示繼續(xù),n表示結(jié)束):");
scanf("%c",ny);
if(ny=='n')
break;
}
break;
case 3:
while (1)
{
printf("輸入年月日:");
scanf("%d,%d,%d",year,month,day);
printf("請輸入今天的日期:");
scanf("%d,%d,%d",x,y,z);
jisuan_day(year,month,day,x,y,z);
printf("你想繼續(xù)查詢么?(y表示繼續(xù),n表示結(jié)束):");
scanf("%c",ny);
if(ny=='n')
break;
}
break;
case 4:
while (1)
{
printf("輸入1990年1月1日以后的一個(gè)日期:");
scanf("%d,%d,%d",year,month,day);
fish_or_net(year,month,day);
printf("你想繼續(xù)查詢漁人是打魚還是曬網(wǎng)么?(y表示繼續(xù),n表示結(jié)束):");
scanf("%c",ny);
if(ny=='n')
break;
}
break;
case 5:
while (1)
{
printf("確認(rèn)么?y表示是的,n表示不是");
scanf("%c",ny);
if(ny=='y')
exit(1); //表示退出程序
else if(ny=='n')
break;
}
break;
default:printf("對不起,暫時(shí)沒有這個(gè)服務(wù)");
break;
}
}
return 0;
}
#includestdio.h
static?int?year;
static?int?weekDay;
bool?isLeapYear(int?y)??//判斷是否是閏年
{
return(y%4==0y%100!=0||y%400==0);?//閏年的條件就是年份同時(shí)能被4和100整除或
//?者能被400整除
}
long?firstDayOfYear(int?y)???//求出輸入的那年第一天是星期幾
{
long?n;
n=y*365;
for(int?i=1;iy;i++)
if(isLeapYear(i))?
???n+=1;
return?n%=7;
}
void?printHead(int?m)??//打印每個(gè)月的標(biāo)題
{
if(m10)
?printf("????%d月???日???一???二???三???四???五???六\n",m);
else?
?printf("???%d月???日???一???二???三???四???五???六\n",m);
printf("???????");
for(int?i=0;iweekDay;i++)??
???printf("?????");
}
int?daysOfMonth(int?m)??//?判斷每個(gè)月有多少天
{
switch(m)
{
case?1:
case?3:
case?5:
case?7:
case?8:
case?10:
case?12:?return?31;
case?4:
case?6:
case?9:
case?11:?return?30;
case?2:if(isLeapYear(year))?
??return?29;
else?
???return?28;
}
return?0;
}
void?printMonth(int?m)??//打印每月的日歷
{
printHead(m);
int?days=daysOfMonth(m);
for(int?i=1;i=days;i++)
{
if(i10)?
?printf("????%d",i);
else?
?printf("???%d",i);
weekDay=(weekDay+1)%7;
if(weekDay==0)
??{
printf("\n");
printf("???????");
}
}
}
void?main()??//主程序入口,接收輸入的年份,調(diào)用函數(shù)打印日歷
{
int?y;
printf("請輸入年份:");
scanf("%d",y);
year=y;
if(year1)
{
printf("輸入年份不能小于1\n");
return;
}
weekDay=(int)firstDayOfYear(year);
printf("???????????????????%d年\n",year);
printf("???========================================\n");
for(int?i=1;i=12;i++)
?{
printf("\n");
printMonth(i);
printf("\n");
}
}
可以顯示公元1世紀(jì)以后的所有年份的日歷,第2和第3問其實(shí)都包含在第1問里,程序看懂了自然也就會(huì)了(話說為什么不能上傳附件?)
C語言中讀取系統(tǒng)時(shí)間的函數(shù)為time(),其函數(shù)原型為:
#include time.h
time_t time( time_t * ) ;
time_t就是long,函數(shù)返回從1970年1月1日(MFC是1899年12月31日)0時(shí)0分0秒,到現(xiàn)在的的秒數(shù)??梢哉{(diào)用ctime()函數(shù)進(jìn)行時(shí)間轉(zhuǎn)換輸出:
char * ctime(const time_t *timer);
將日歷時(shí)間轉(zhuǎn)換成本地時(shí)間,按年月日格式,進(jìn)行輸出,如:
Wed Sep 23 08:43:03 2015
C語言還提供了將秒數(shù)轉(zhuǎn)換成相應(yīng)的時(shí)間結(jié)構(gòu)的函數(shù):
struct tm * gmtime(const time_t *timer); //將日歷時(shí)間轉(zhuǎn)化為世界標(biāo)準(zhǔn)時(shí)間(即格林尼治時(shí)間)
struct tm * localtime(const time_t * timer); //將日歷時(shí)間轉(zhuǎn)化為本地時(shí)間
將通過time()函數(shù)返回的值,轉(zhuǎn)換成時(shí)間結(jié)構(gòu)struct tm :
struct tm {
int tm_sec; /* 秒 – 取值區(qū)間為[0,59] */
int tm_min; /* 分 - 取值區(qū)間為[0,59] */
int tm_hour; /* 時(shí) - 取值區(qū)間為[0,23] */
int tm_mday; /* 一個(gè)月中的日期 - 取值區(qū)間為[1,31] */
int tm_mon; /* 月份(從一月開始,0代表一月) - 取值區(qū)間為[0,11] */
int tm_year; /* 年份,其值等于實(shí)際年份減去1900 */
int tm_wday; /* 星期 – 取值區(qū)間為[0,6],其中0代表星期天,1代表星期一,以此類推 */
int tm_yday; /* 從每年的1月1日開始的天數(shù) – 取值區(qū)間為[0,365],其中0代表1月1日,1代表1月2日,以此類推 */
int tm_isdst; /* 夏令時(shí)標(biāo)識(shí)符,實(shí)行夏令時(shí)的時(shí)候,tm_isdst為正。不實(shí)行夏令時(shí)的進(jìn)候,tm_isdst為0;不了解情況時(shí),tm_isdst()為負(fù)。*/
};
編程者可以根據(jù)程序功能的情況,靈活的進(jìn)行日期的讀取與輸出了。
例如:
#includetime.h
main()
{
time_t timep;
struct tm *p;
time (timep);
p=gmtime(timep);
printf("%d\n",p-tm_sec); /*獲取當(dāng)前秒*/
printf("%d\n",p-tm_min); /*獲取當(dāng)前分*/
printf("%d\n",8+p-tm_hour);/*獲取當(dāng)前時(shí),這里獲取西方的時(shí)間,剛好相差八個(gè)小時(shí)*/
printf("%d\n",p-tm_mday);/*獲取當(dāng)前月份日數(shù),范圍是1-31*/
printf("%d\n",1+p-tm_mon);/*獲取當(dāng)前月份,范圍是0-11,所以要加1*/
printf("%d\n",1900+p-tm_year);/*獲取當(dāng)前年份,從1900開始,所以要加1900*/
printf("%d\n",p-tm_yday); /*從今年1月1日算起至今的天數(shù),范圍為0-365*/
}
此題不是很難,我會(huì)前三個(gè)
關(guān)鍵是算那一年的第一天是周幾
給你個(gè)基本算法,一年是365天,閏年366天
364是7的倍數(shù),這樣一年多出一天,中間多少個(gè)閏年,在加上相應(yīng)的天數(shù)即可
400年多出來的天數(shù)是400+97=497也是7的倍數(shù),那么400年一輪回,這樣就算400年以內(nèi)的即可
一個(gè)子函數(shù),返回這一年的第一天是周幾,很好做
int ye(int year)
{
int y=year%400;
int day=y;
int i;
for(i=0;iy;i++)
if(閏年判斷)
day++;
return day%7;
}
做一個(gè)月份天數(shù)的全局?jǐn)?shù)組
int mo[12]={31,28,31,30,31,30,31,31,30,31,30,31};
需要時(shí)用一個(gè)if判斷閏年改變m0[1]的值是28還是29
打印子函數(shù),有一個(gè)小技巧,就是每個(gè)月前面的空缺部分,這個(gè)1月份是ye子函數(shù)的返回值,后面的你看和前面月份是不是重合啊,吧這個(gè)記錄下來在下一月份用即可
1 2
3 4
這樣月份排列更好打印一些,你的那個(gè)截圖有點(diǎn)麻煩
int pr(int year)
{
int k=ye(year);
int i,j,;
if(閏年判斷)
mo[1]=29;
else
mo[1]=28;
for(i=0;i12;i++)
{
printf("周幾英文的打印");
for(j=0;jk;j++)
printf("一般是四個(gè)空格,就是月份前面空缺的打印");
for(j=1;j=mo[i];j++)
{
printf("%4d",j);
k++;
if((k+j)%7==0)
printf("\n");
}
k%=7;
if(k!=0)
printf("\n");
}
}
如果像你那樣,感覺需要賦值一個(gè)大一點(diǎn)的數(shù)組,在吧數(shù)組打印出來更好,呵呵
#include stdio.h
int leap(int year ) //平閏年的判斷
{
if ((year %4 == 0) (year % 100 != 0) || (year % 400 == 0))
{
return 1;
}
return 0;
}
void show(int year,int month) //顯示指定年制定月的日歷
{
//定義12個(gè)月的英文字符串
const char month_str[][4]={"","Jan","Feb","Mar","Apl",
"May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
//定義各個(gè)月的天數(shù),二月為28天, 平年
const int month_day[]={30,31,28,31,30,31,30,31,31,30,31,30,31};
//分別定義:
int i;//該變量在后續(xù)代碼中經(jīng)常被使用,為計(jì)數(shù)變量
int j;//同上
int wdays;//該變量是星期數(shù)(1至7)分別代表星期(一至日)
int mdays;//記錄所查詢的月份的天數(shù),注意該天數(shù)在一開始計(jì)算總天數(shù)days的時(shí)候并未被算入
int days;//記錄所查詢年月(從公元元年開始)的總天數(shù),比如2008年12月的days總天數(shù)計(jì)算方式為:先計(jì)算從公元1年到2007年的總天數(shù),再加上2008年前11個(gè)月的總天數(shù),至此總天數(shù)days的值還不是正確的,2008年12月份的天數(shù)尚未加上,這一點(diǎn)在(向控制臺(tái))顯示日歷的過程中將逐一加上,這一處理方法也是程序?qū)崿F(xiàn)的一個(gè)必須性要求
//從公元元年開始計(jì)算到第(year-1)年的總的天數(shù)
for(i=1,days=0;iyear;i++)
{
if(leap(i)) //閏年
{
days += 366;
}
else
{
days += 365; //平年
}
}
//再加上第year年前(month-1)個(gè)月的總天數(shù)
for(i=1;imonth;i++)
{
if(i==2 leap(year))
{
days+=29;
}
else
{
days+=month_day[i];
}
}
printf(" %s (%d)\n",month_str[month],year); //顯示月(年)
printf(" Mon Tue Wed Thu Fri Sat Sun\n"); //顯示日歷表頭
wdays = days % 7; //此即公式核心,計(jì)算星期序號(hào),星期天為星期七
for( j = 0; j wdays; j++)
{
printf("%4c",' '); // 控制臺(tái)顯示格式需要 即空格打印
}
//定義mdays的值
if(month == 2 leap(year))
{
mdays=29;
}
else
{
mdays= month_day[month];
}
//其中 i 為月的號(hào)數(shù)
for(i=1;i=mdays;i++)
{
if( i 1 days % 7 == 0 ) //此即日歷公式核心,它是以星期為單元計(jì)算日歷,可見公元元年元旦為星期一
{
printf("\n"); //格式需要 換行
}
printf("%4d",i);
days=days+1; //此處讓days(不是完整的總天數(shù))變量逐一遞增到真正的總天數(shù)
}
printf("\n---------------------------\n");
}
/*main()
{
int year,month;
printf("輸入年和月份:");
scanf("%d%d",year,month);//該程序的一個(gè)明顯的bug:對輸入的年月數(shù)據(jù)沒有進(jìn)行必要的數(shù)據(jù)約束檢查,比如我們總不能輸入 -2009 13 吧?這樣程序一下就崩潰了
show(year,month);
getchar();//暫停,讓控制臺(tái)顯示的內(nèi)容停留,鍵入任意鍵將繼續(xù)
}*/
//給個(gè)新的main()
void main()
{
int year,month;
char c;
do
{
printf("\n輸入年和月份:");
scanf("%d%d",year,month);
if(year1 || month1 || month 12)//這三個(gè)條件缺一不可
{
//錯(cuò)誤信息提示
printf("年月數(shù)據(jù)輸入有誤,請檢查!");
}
else
{
show(year,month);
}
printf("\n\n繼續(xù)查詢請輸入y");
c=getchar();
getchar();//接收鍵入y以后回車確定的字符
}while(c=='y');
}
//我已經(jīng)在VC上調(diào)試過,運(yùn)行正常
萬歷表還可以做很多擴(kuò)展,有興趣可以加我交流 QQ:805966355