Ⅰ c語言設計萬年歷
/*不過除了沒有查詢某年某月某日是這一年的第幾天。。和判斷這一年的生肖外,都能滿足你的要求。
加點金幣幫你完善點!*/
#include<stdio.h>
int
Swiss(int
Years)
//判斷是否是閏年
{
if(!(Years%100))
{
Years=Years/100;
}
if(Years%4)
{
return
0;
}
else
{
return
1;
}
}
int
Number(int
Yearsa,int
Yearsb)
//已知兩個年份,求出兩個年份之間閏年的個數
{
int
i=Yearsa+1;
int
mou=0;
do{
if(Swiss(i))
{
mou++;
}
i++;
}while(i<Yearsb);
return
mou;
}
int
Mvalue(int
Years,int
Month,int
Day)
//已知年月日,求出某年某月某日是星期幾
{
int
M[12]={0,3,3,6,1,4,6,2,5,0,3,5};
//月值
int
N=6;
//年值初始化
int
a;
if(Years<2006)
//求年值,年值以2006年為基數
{
N=6-((2006-Years)%7)-Number(Years,2006);
if(Swiss(Years))
{
if(Month<3)
{
N--;
}
}
}
else
if(Years>2006)
{
N=((Years-2006)%7)-1+Number(2006,Years);
if(Swiss(Years))
{
if(Month>2)
{
N++;
}
}
}
a=(Day+M[Month-1]+N)%7;
//某年某月某日是星期幾=(日值+月值+年值)%7
return
a;
}
int
Amonth(int
Month)
//已知月,求出這個月是大月還是小月
{
switch(Month)
{
case
1:
case
3:
case
5:
case
7:
case
8:
case
10:
//1,3,5,7,8,10,12是大月,沒月31天
case
12:return
1;
case
4:
case
6:
case
9:
case
11:return
0;
//4,6,9,11是小月,每月30天
case
2:return
2;
//二月份
}
return
-1;
}
void
main
()
{
int
Dtable[7][7];
int
i,j;
int
Years=9999;
int
Month=12;
int
Day=1;
int
b;
for(i=0;i<7;i++)
//初始化數組
{
Dtable[0][i]=i;
}
for(i=1;i<7;i++)
{
for(j=0;j<7;j++)
{
Dtable[i][j]=0;
}
}
i=Mvalue(Years,Month,Day);
switch(Amonth(Month))
{
case
0:b=30;break;
case
1:b=31;break;
case
2:if(Swiss(Years))b=29;else
b=28;break;
//閏年2月29天,平年二月28天
default:b=-1;break;
}
for(;i<7;i++)
{
Dtable[1][i]=Day++;
}
for(i=2;i<7;i++)
{
for(j=0;j<7;j++)
//建造日歷表
{
if(Day<=b)
{
Dtable[i][j]=Day++;
}
else
{
continue;
}
}
}
printf("%d:%d\n",Years,Month);
for(i=0;i<7;i++)
//輸出日歷表
{
for(j=0;j<7;j++)
{
printf("%3d",Dtable[i][j]);
}
printf("\n");
}
getch();
//完畢!
}
Ⅱ 用c語言編寫萬年歷,要求輸出任意一年的某月,能顯示出這個月的日歷
1、首先要判斷一個年份是閏年還是平年,用一個子程序來做。
Ⅲ C語言年歷顯示程序設計
#include <stdio.h>
#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) //定義函數檢測輸入年份是否為閏年
{
if((/*year%400==0*/year%4==0&&year%100!=0)||(year%400==0))
return (1);
// else if(year%4==0&&year%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表示該天在該年份的累計天數
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;i<month;i++)
d+=month_day[i];
d=d+day;*/
for(i=1;i<month;i++)
d+=month_day(year,i);
d+=day;
w=(year-1)+(int)(year-1)/4-(int)(year-1)/100+(int)(year-1)/400+d;//網上公式
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-b<10)
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) //輸入一個年月,輸出這個月的日歷
{
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日有多少天,星期幾,以及是否是公歷節日
{
int i,a,b,c=0,d=0,days=0,m=0,n=0,t;
a=year>=x?year:x;
b=year<x?year:x;
if(a>b)
{
for(i=b+1;i<a;i++)
c+=j_leapyear(i);
}
else c=0;
if(year!=x)
d=a-b-1;
else d=0;
m=365*d+c;
if(year<x)
{
for(i=month;i<=12;i++)
n+=month_day(year,i);
days=m+n+z-day;
}
else if(year>x)
{
for(i=y;i<=12;i++)
n+=month_day(x,i);
for(i=1;i<month;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號有%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==1&&day==1)
printf("這天是元旦節");
else if(month==2&&day==14)
printf("這天是情人節");
else if(month==3&&day==8)
printf("這天是婦女節");
else if(month==3&&day==12)
printf("這天是植樹節");
else if(month==4&&day==1)
printf("這天是愚人節");
else if(month==4&&day==4)
printf("這天是清明節");
else if(month==5&&day==1)
printf("這天是勞動節");
else if(month==6&&day==1)
printf("這天是兒童節");
else if(month==8&&day==1)
printf("這天是建軍節");
else if(month==9&&day==10)
printf("這天是教師節");
else if(month==10&&day==1)
printf("這天是國慶節");
else if(month==12&&day==25)
printf("這天是聖誕節");
else printf("這天不是特殊節日");
putchar('\n');
return days;
}
void fish_or_net(int year,int month,int day) //判斷是打魚還是曬網
{
int q;
int i,a,b,c=0,d=0,days=0,m=0,n=0;
a=year>=1990?year:1990;
b=year<1990?year:1990;
if(a>b)
{
for(i=b+1;i<a;i++)
c+=j_leapyear(i);
}
else c=0;
if(year!=1990)
d=a-b-1;
else d=0;
m=365*d+c;
if(year<1990)
{
for(i=month;i<=12;i++)
n+=month_day(year,i);
days=m+n+1-day;
}
else if(year>1990)
{
for(i=1;i<=12;i++)
n+=month_day(1990,i);
for(i=1;i<month;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) //判斷打魚還是曬網
printf("漁人今天打魚");
else printf("漁人今天曬網");
putchar('\n');
}
/*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);
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請隨便輸入一個日期,格式同上:");
scanf("%d,%d,%d",&year,&month,&day);
jisuan_day(year,month,day,x,y,z);
// fish_or_net(x,y,z);
return 0;
} // 這部分內容是用來檢測上述函數是否出錯的
*/
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); //函數聲明
int option,year,month,day,x,y,z;
char ny;
system("color 1f");
while (1)
{
printf("\n\n\t 歡迎來到由...編寫的程序\n\n");
printf(" 請選擇您需要的服務,輸入編號回車結束\n");
printf(" 1.輸入一個年份,輸出該年的日歷\n");
printf(" 2.輸入年月,輸出這個月的日歷。\n");
printf(" 3.輸入年月日,輸出據今天還有多久,星期幾,是否是公歷節日。\n");
printf(" 4.某人自1990年1月1日開始打魚,「三天打魚,兩天曬網」,輸入一個1990年以後的日期,輸出他這一天是打魚還是曬網。\n");
printf(" 5.退出\n");
scanf("%d",&option);
switch(option) //switch分支結構
{
case 1:
while(1) //while循環,後面的1是常數,表示一直到break才結束循環
{
printf("請輸入一個年份:");
scanf("%d",&year);
allyear(year);
printf("你想繼續查詢日歷么?(y表示繼續,n表示結束)");
scanf("%c",&ny);
if(ny=='n')
break;
}
break;
case 2:
while (1)
{
printf("輸入年月:");
scanf("%d,%d",&year,&month);
month_print(year,month);
printf("你想繼續查詢日歷么?(y表示繼續,n表示結束):");
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("你想繼續查詢么?(y表示繼續,n表示結束):");
scanf("%c",&ny);
if(ny=='n')
break;
}
break;
case 4:
while (1)
{
printf("輸入1990年1月1日以後的一個日期:");
scanf("%d,%d,%d",&year,&month,&day);
fish_or_net(year,month,day);
printf("你想繼續查詢漁人是打魚還是曬網么?(y表示繼續,n表示結束):");
scanf("%c",&ny);
if(ny=='n')
break;
}
break;
case 5:
while (1)
{
printf("確認么?y表示是的,n表示不是");
scanf("%c",&ny);
if(ny=='y')
exit(1); //表示退出程序
else if(ny=='n')
break;
}
break;
default:printf("對不起,暫時沒有這個服務");
break;
}
}
return 0;
}
Ⅳ C語言編寫 年歷顯示程序
此題不是很難,我會前三個
關鍵是算那一年的第一天是周幾
給你個基本演算法,一年是365天,閏年366天
364是7的倍數,這樣一年多出一天,中間多少個閏年,在加上相應的天數即可
400年多出來的天數是400+97=497也是7的倍數,那麼400年一輪回,這樣就算400年以內的即可
一個子函數,返回這一年的第一天是周幾,咐猛輪很好做
int ye(int year)
{
int y=year%400;
int day=y;
int i;
for(i=0;i<y;i++)
if(閏年判斷)
day++;
return day%7;
}
做一個月份天數的全局數組
int mo[12]={31,28,31,30,31,30,31,31,30,31,30,31};
需要時用一個if判斷閏年改變m0[1]的值是28還是29
列印子函數,有一個小技巧,就是每個月前面的空缺部分,這個1月份是ye子函數的返回值,後面的你看和前面月份是不是重合啊,吧這知頌個記錄下來在下一月份用即可
1 2
3 4
這樣月份排列更好列印一些,你的那個截圖有點麻煩
int pr(int year)
{
int k=ye(year);
int i,j,;
if(閏年判斷)
mo[1]=29;
else
mo[1]=28;
for(i=0;i<12;i++)
{
printf("周幾英文的列印");
for(j=0;j<k;j++)
printf("一般是四個空格,就是月份前面空缺的列印");
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");
}
}
如果像你那樣,感覺需要賦值一個大一點的數組,在衡信吧數組列印出來更好,呵呵
Ⅳ C語言編程日歷顯示
#include <stdio.h>
#include <stdlib.h>
int leap(int); //判斷是否為閏年
int md(int m,int y); //返回頌含本月的天數
void prtweek(void); //輸出表頭
int fw(int m,int y); //返回本月一號是星期幾
void prtmonth(int m); //輸出月份表頭
int main(int argc, char* argv[])
{
int y,m,i,test,week;
printf("Year:");
scanf("%d",&y);
for (m=1; m<=12; m++) {
test=1;
prtmonth(m);
prtweek();
week=fw(m,y);
if (week!=6)
for (i=0; i<=week; i++) {
putchar('\含禪t');
test++;
}
for (i=1; i<=md(m,y); i++,test++) {
printf("%d\t",i);
if (test%7==0) {
putchar('\n');
}
}
putchar('\n');
system("pause");//暫停,以便觀察輸出
}
return 0;
}
int leap(int y)
{
return (y%4==0&&y%100||y%400==0)?1:0;
}
int md(int m,int y)
{
int d;
switch (m) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:d=31;break;
case 4:
case 6:
case 9:
case 11:d=30;break;
case 2:d=leap(y)?29:28;break;
}
return d;
}
void prtweek(void)
{
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n","Sun","Mon","Tue","Wed","Thur","Fri","Sat");
}
int fw(int m,int y)
{
int f;
if (m<3) {
m+=12;
y--;
}
f=(1+2*m+3*(m+1)/5+y+y/野老笑4-y/100+y/400)%7;
return f;
}
void prtmonth(int m)
{
switch (m) {
default:
case 1:puts("===January===");break;
case 2:puts("===February===");break;
case 3:puts("===March===");break;
case 4:puts("===April===");break;
case 5:puts("===May===");break;
case 6:puts("===June===");break;
case 7:puts("===July===");break;
case 8:puts("===August===");break;
case 9:puts("===September===");break;
case 10:puts("===October===");break;
case 11:puts("===November===");break;
case 12:puts("===December===");break;
}
}
Ⅵ 如何用c語言做個日歷表
1、功能要求 :
1)輸入任一年將顯示出該年的所有月份日期,對應的星期
2)注意閏年情況
其顯示格式要求如下:
1)份:中文英文都可以,
2)下一行顯示星期,從周日到周六,中英文都可以
3)下一行開始顯示日期從1號開始,並按其是周幾實際情況與上面的星期數垂直對齊
2、常式:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
intIsLeapYear(int);//聲明頭文件和函數
voidmain()
{
inti;
intday;
intyear;
inttemp;
inttemp_i;
longintYear_days=0;
intYear_Start=1;
intPer_Year_Days;
intmonth_day[]={31,28,31,30,31,30,31,31,30,31,30,31,29};//每個月的天數,最後一個是閏年2月
printf("Pleaseentertheyear:");
scanf("%d",&year);//輸入年份
while(Year_Start<year)//計算從公元1年1月1日到你所查詢年份前一年的天數,是為了以後確定這一年的第一天是星期幾
{
if(IsLeapYear(Year_Start))//確定一年的天數,閏年為366天,一般為365天
Per_Year_Days=366;
else
Per_Year_Days=365;
Year_days=Year_days+Per_Year_Days;
Year_Start++;
}
for(temp=1;temp<=12;temp++)//循環輸出每個月的日歷
{
switch(temp)
{
case1:
printf("January(%d) ",year);//如January(2008)
break;
case2:
printf("February(%d) ",year);
break;
case3:
printf("March(%d) ",year);
break;
case4:
printf("April(%d) ",year);
break;
case5:
printf("May(%d) ",year);
break;
case6:
printf("June(%d) ",year);
break;
case7:
printf("July(%d) ",year);
break;
case8:
printf("August(%d) ",year);
break;
case9:
printf("September(%d) ",year);
break;
case10:
printf("October(%d) ",year);
break;
case11:
printf("November(%d) ",year);
break;
case12:
printf("December(%d) ",year);
break;
}
i=Year_days%7;//計算這個月第一天是星期幾
printf("MonTueWedThuFriSatSun ");
if(i!=0)
for(temp_i=0;temp_i<i;temp_i++)//第一天不是星期一,在前面補空格,本來的空格少了,我加了兩個
printf("");
day=1;
if(IsLeapYear(year)&&temp==2)//閏年的2月
while(day<=month_day[12])
{
if(day>1)
if(Year_days%7==0)//如果不是1號且昨天是星期天,輸入回車,換行
printf(" ");
if(day>=10)//如果大於或等於10號則輸出日期並加2個空格,小於10號輸出日期並加3個空格
printf("%d",day);//開始沒想到這幾行是幹嘛用的,只要一個輸出就好嘛,後來才想到是用來調整格式的
else//只是他並沒有調整好,我做了下修改,現在很整齊了
printf("%d",day);
Year_days++;
day++;
}
else//不是閏年2月的
while(day<=month_day[temp-1])//輸出,同上
{
if(day>1)
if(Year_days%7==0)
printf(" ");
if(day>=10)//理由同上
printf("%d",day);
else
printf("%d",day);
Year_days++;
day++;
}
printf(" ");
if(getch()=='q')//輸入q退出程序
exit(0);
}
getch();
}
intIsLeapYear(intyear)//判斷是否為閏年
{
if((year%4==0)&&(year%100!=0)||//年份能被4整除且不能被100整除或者能被400整除的為閏年
(year%400==0))
return1;
else
return0;
}