❶ 用c语言编写万年历,要求输出任意一年的某月,能显示出这个月的日历
1、首先要判断一个年份是闰年还是平年,用一个子程序来做。
❷ c语言编写万年历
#include"stdio.h"
#include"stdlib.h"
#include"windows.h"
void welcome();
void getday(int year,int month);
void shuru();
void end();
long year;
long month;
void welcome()
{
printf("【万年历程序加载中");
for(int i=0;i<30;i++)
{
printf("★");
Sleep(100);
}
system("cls");
printf("【万年历程序加载中】\n");
Sleep(1000);
printf("☆~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☆\n");
Sleep(1000);
printf(" ~~~谢谢使用【菠菜】制作的万年历~~~~\n");
Sleep(100);
printf("☆~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☆\n");
Sleep(1000);
}
void end()
{
printf("【万年历关闭中");
for(int i=0;i<30;i++)
{
printf("★");
Sleep(100);
}
system("cls");
printf("【万年历关闭完成】\n");
Sleep(1000);
printf("☆~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☆\n");
Sleep(1000);
printf(" ~~~谢谢使用【菠菜】制作的万年历~~~~\n");
Sleep(100);
printf("☆~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☆\n");
Sleep(1000);
exit(0);
}
void shuru()
{
int a;
printf("☆~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☆\n");
printf(" ≮欢迎使用万年历≯\n");
printf("☆~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☆\n");
while(1)
{
printf("请输入年份:");
scanf("%d",&year);
if(year>0)
break;
else
{
printf("\n");
printf("你输入的年份有误,请重新输入\n"); } }
printf("\n");
while(1)
{
printf("请输入月份:");
scanf("%d",&month);
if(month>=1&&month<=12)
break;
else
{
printf("\n");
printf("你输入的月份有误,请重新输入\n"); } }
getday(year,month);
}
void getday(int year,int month)
{
int week; //星期几
int nowday=0; //该月前的总天数
long allday; //从公元1年起的总天数
int dayofmonth[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(year%4==0&&year%100!=0||year%400==0)
dayofmonth[2]=29;
for(int m=0;m<month;m++)
{
nowday=nowday+dayofmonth[m];
}
allday=nowday+year*365+year/4-year/100+year/400; //公元一年到现在用了多少天
week=allday%7; //求出这个月第一天是星期几
printf(" %d 年 %d 月\n",year,month);
printf("日 一 二 三 四 五 六\n");
for(int j=0;j<week;j++)
{
printf(" ");
}
for(int i=1;i<=dayofmonth[month];i++)
{
if(week==7)
{
printf("\n");
week=0; }
printf("%2d ",i);
week++; }
printf("\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
}
void main()
{
char a;
welcome();
while(1)
{
shuru();
printf("你还需要继续吗?<y ro n>");
fflush(stdin); //清空输入缓冲区,避免缓冲区内残存读取函数无法取走的内容!
scanf("%c",&a);
if(a=='n')
break;
}
end();
}
这个万年历比较好看哈!你可以试试这个?
❸ 用C语言实现万年历
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
long Year;
int date[12][6][7];
int day_tbl[ ][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}};//每月最后一天
char *str[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
void nian(long year,FILE *fp)
{
int i,j,n=0,t;
char s[5][23];//把数字图形看作一个二维数组
void fyear(int t,int n,char s[5][23]);
for(i=0;i<5;i++){
for(j=0;j<23;j++){
if(((i==1)||(i==3))&&((j>=1&&j<=3)||(j>=7&&j<=9)||(j>=13&&j<=15)||(j>=19&&j<=21)))
s[i][j]=' ';
else if((j==5)||(j==11)||(j==17))
s[i][j]=' ';
else
s[i][j]='*';
}//判断‘*’的位置
}
do{
t=year%10;
year=year/10;
fyear(t,n,s);
n++;
}while(year!=0);
if(n<4){
for(i=0;i<5;i++){
for(j=0;j<24-6*n;j++)
s[i][j]=' ';
}
}
for(i=0;i<5;i++){
printf(" ");
fprintf(fp,"%s"," ");
for(j=0;j<23;j++){
printf("%c",s[i][j]);
fprintf(fp,"%c",s[i][j]);
}
printf("\n");
fprintf(fp,"\n");
}
}//用‘*’显示年份
void fyear(int t,int n,char s[5][23])
{
int i,j;
switch(t){
case 0:
for(j=19-6*n;j<22-6*n;j++)
s[2][j]=' ';
break;
case 1:
for(i=0;i<5;i++){
for(j=18-6*n;j<22-6*n;j++)
s[i][j]=' ';
}
break;
case 2:
s[1][18-6*n]=' ';
s[3][22-6*n]=' ';
break;
case 3:
s[1][18-6*n]=' ';
s[3][18-6*n]=' ';
break;
case 4:
for(j=19-6*n;j<22-6*n;j++){
s[0][j]=' ';
s[4][j]=' ';
}
s[3][18-6*n]=' ';
s[4][18-6*n]=' ';
break;
case 5:
s[1][22-6*n]=' ';
s[3][18-6*n]=' ';
break;
case 6:
s[1][22-6*n]=' ';
break;
case 7:
for(i=1;i<5;i++){
for(j=18-6*n;j<22-6*n;j++)
s[i][j]=' ';
}
break;
case 8:
break;
case 9:
s[3][18-6*n]=' ';
break;
}
}//判断图形数字里的空格
long int f(long year,int month)
{
if(month<3) return year-1;
else return year;
}
long int g(int month)
{
if(month<3) return month+13;
else return month+1;
}
long int n(int year,int month,int day)
{
return 1461L*f(year,month)/4+153L*g(month)/5+day;
}
int w(int year,int month,int day)
{
return(int)((n(year,month,day)%7-621049L%7+7)%7);
}//计算查询日期所处位置
void yueli(int m,FILE *fp)
{
struct tm *local;
long t;
long i,sw,wd,day,leap,k,j;
char title[]=" 日 一 二 三 四 五 六";
void rili(long year,FILE *fp);
time(&t);
local = localtime(&t);
local->tm_year = local->tm_year + 1900;
local->tm_mon ++;
Year=local->tm_year;
if(m==1){
printf("\t\t\t %s\n",str[local->tm_mon-1]);
fprintf(fp,"\t\t\t %s\n",str[local->tm_mon]);
printf("\t\t ___________________________\n");
fprintf(fp,"\t\t ___________________________\n");
printf("\t\t %s\n",title);
fprintf(fp,"\t\t %s\n",title);
sw=w(local->tm_year,local->tm_mon,1);
leap=local->tm_year%4==0&&local->tm_year%100||local->tm_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(wd=0,day=1;day<=day_tbl[leap][local->tm_mon-1];day++)
{
date[local->tm_mon][wd][sw]=day;
sw=++sw%7;//每星期七天,以0至6计数
if(sw==0) wd++;//日期表每七天一行,星期天开始新的一行
}
for(j=0;j<6;j++){
printf("\t\t ");
fprintf(fp,"\t\t ");
for(k=0;k<7;k++)
if(date[local->tm_mon][j][k]){
printf("%3d ",date[local->tm_mon][j][k]);
fprintf(fp,"%3d ",date[local->tm_mon][j][k]);
}
else{
printf(" ");
fprintf(fp,"%s"," ");
}
printf("\n");
fprintf(fp,"\n");
}
printf("\t\t 今天是: %ld年%ld月%ld日,",local->tm_year,local->tm_mon,local->tm_mday);
fprintf(fp,"\t\t 今天是: %ld年%ld月%ld日,",local->tm_year,local->tm_mon,local->tm_mday);
switch(local->tm_wday){
case 0:printf("星期日\n");fprintf(fp,"星期日\n");break;
case 1:printf("星期一\n");fprintf(fp,"星期一\n");break;
case 2:printf("星期二\n");fprintf(fp,"星期二\n");break;
case 3:printf("星期三\n");fprintf(fp,"星期三\n");break;
case 4:printf("星期四\n");fprintf(fp,"星期四\n");break;
case 5:printf("星期五\n");fprintf(fp,"星期五\n");break;
case 6:printf("星期六\n");fprintf(fp,"星期六\n");break;
default:printf("error\n");
}
printf(" \t\t 当前时间是: %ld时%ld分%ld秒\n",local->tm_hour,local->tm_min,local->tm_sec);
fprintf(fp," \t\t 当前时间是: %ld时%ld分%ld秒\n",local->tm_hour,local->tm_min,local->tm_sec);
}//显示当前系统时间
if(m==2)
rili(local->tm_year,fp);
}
void rili(long year,FILE *fp)
{ int sw,leap,i,j,k,wd,day;
char title[]=" 日 一 二 三 四 五 六";
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;//日期表置0
nian(year,fp);
for(i=0;i<12;i++)//一年十二个月
for(wd=0,day=1;day<=day_tbl[leap][i];day++)
{//将第i+1月的日期填入日期表
date[i][wd][sw]=day;
sw=++sw%7;//每星期七天,以0至6计数
if(sw==0) wd++;//日期表每七天一行,星期天开始新的一行
}
for(i=0;i<11;i+=2)
{//先测算第i+1月和第i+2月的最大星期数
// for(wd=0,k=0;k<7;k++)//日期表的第六行有日期,则wd!=0
// wd+=date[i][5][k]+date[i+2][5][k];
// wd=6;
printf("\t\t%s\t\t\t\t%s\n",str[i],str[i+1]);
fprintf(fp,"\t\t%s\t\t\t\t%s\n",str[i],str[i+1]);
printf(" ___________________________ ___________________________\n");
fprintf(fp," ___________________________ ___________________________\n");
printf(" %s %s \n",title,title);
fprintf(fp," %s %s \n",title,title);
for(j=0;j<6;j++)
{
printf(" ");//输出四个空白符
//左栏为第i+1月,右栏为第i+2月
fprintf(fp," ");
for(k=0;k<7;k++)
if(date[i][j][k]){
printf("%4d",date[i][j][k]);
fprintf(fp,"%4d",date[i][j][k]);
}
else{
printf(" ");
fprintf(fp," ");
}
printf(" ");//输出十个空白符
fprintf(fp," ");
for(k=0;k<7;k++)
if(date[i+1][j][k]){
printf("%4d",date[i+1][j][k]);
fprintf(fp,"%4d",date[i+1][j][k]);
}
else{
printf(" ");
fprintf(fp," ");
}
printf(" \n");
fprintf(fp," \n");
}
//键入回车输出下一行的日历
}
}
void main()
{
FILE *fp;
int choice;
if((fp=fopen("E:\\out1.txt","w"))==NULL){
printf("open error!\n");
exit(0);
}
yueli(1,fp);
while(1){
printf("欢迎使用本程序!请按提示选择\n");
printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");
printf("按[1]查看当天信息和本月月历\n");
printf("按[2]查看当年日历\n");
printf("按[3]查看某年日历\n");
printf("按[4]查看下一年日历\n");
printf("按[5]查看上一年日历\n");
printf("按[0]退出\n");
printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");
printf("输入你的选择并按回车结束:");
scanf("%d",&choice);
switch(choice){
case 1:yueli(1,fp);break;
case 2:yueli(2,fp);break;
case 3:
printf("请输入你要查询的年份: ");//输入年
scanf("%d",&Year);
rili(Year,fp);
break;
case 4:rili(++Year,fp);break;
case 5:rili(--Year,fp);break;
case 0:printf("感谢您的使用,再见!\n");return;
}
}
fclose(fp);
return;
}
❹ C语言程序设计 万年历查询程序。
实验名称:万年历的查询及打印
【内容】:设计一个查询并打印万年历的程序。
【步骤】:
1.
画出程序流程图;
2.
编写程序;
3.
调试程序,对调试过程中出现的问题进行分析,找出错误的原因并予改正;
4.
写出通过调试并修改正确的原程序。
【要求】:
1.
程序运行后,首先在屏幕上显示主菜单:
1.
查询某年某月某日是星期几
2.
查询某年是否是闰年
3.
打印某年的全年日历
4.
退出
2.
在主菜单中输入1后,显示:
“请输入年月日(XXXX,XX,XX)”
运行后输出:XXXX年XX月XX日是星期X,是否继续查询(Y/N)?
如果输入Y,则重新显示
“请输入年月日(XXXX,XX,XX)”,否则回到主菜单。
3.
在主菜单中输入2后,显示:
“请输入要查哪一年?(XXXX)”
运行后输出:XXXX年是(否)是闰年,是否继续查询(Y/N)?
如果输入Y,则重新显示,“请输入要查哪一年?(XXXX)”,否则回到主菜单。
4.
在主菜单中输入3后,显示:
“请输入要打印的年份(XXXX)”
运行后输出XXXX年的日历,格式为:
XXXX
X(月数)
0
1
2
3
4
5
6
S
M
T
W
T
F
S
x
x
x
x
x
x
x
x
x
x
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
X(月数)
0
1
2
3
4
5
6
S
M
T
W
T
F
S
x
x
x
x
x
x
x
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
.
.
.
.
.
运行完后显示:“是否继续打印(Y/N)?”
如果输入Y,则重新显示,“请输入要打印的年份(XXXX)”,否则回到主菜单。
5.
在主菜单中输入4后,显示:“是否要真的退出(Y/N)?”
如果输入Y,结束程序运行,否则重新显示主菜单。
【提示】:
1.
闰年计算:满足下列二者之一,是闰年:
能被4整除,但不能被100整除;
能被4整除,且能被400整除。
2.闰年的二月是29天,平年的二月是28天
3.星期几的计算:
S=X-1+(X-1)/4+(X-1)/100+(X-1)/400+C
X是年份,C是该年从元旦开始到到这一日的天数。
S/7的余数既是星期数
例1:1982年12月26日
由于1982年不是闰年(不能被4整除),所以该年的二月是28天。
C=31+28+31+30+31+30+31+31+30+31+30+26=360
(1月到11月的天数+12月的实际天数)
S=1982-1+(1982-1)/4+(1982-1)/100+(1982-1)/400+360=2821.3925
S/7=2821/7=403
余数为0,所以该日是星期天。
例2:2000年3月8日
由于2000年是闰年(能被4整除,又能被100和400整除),所以该年的二月是29天。
C=31+29+8=68
(1月到2月的天数+3月的实际天数)
S=2000-1+(2000-1)/4+(2000-1)/100+(2000-1)/400+68=2551.757
S/7=2551/7=364
余数为3,所以该日是星期三。
❺ 用c语言编写万年历
写万年历程序,您需要先了解万年历的特点
下面是万年历的特点(复制粘贴的):
1. 平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2月29天。
由于公元1月1日设为星期六,故3月1日为星期三。 ——注意这个“三”
为使算法达到最简,故本算法以“星期”为计算单位。且选3月1日为基月。
2. 每400年整一闰,或每4年且不为百年的一闰。(原因:地球绕太阳一周的时间是365天5小时46秒,为了使一年的天数为整数,将一年的天数定为365天,余下的时间积累起来,四年就是23小时15分4秒,将近一天,把这一天加在某年的二月而成29天,该年称为闰年,其它年称为平年。但四年加一天又多用了44分56秒,这个数积满400年为三天。因此400年中只能有97个闰年,所以凡能被400整除,或不能被100整除但能被4整除的年份为闰年。)
所以百年%4=0闰或(年%4=0并且年<>0)闰。
3. 每 4年(3个平年+1个闰年)共208周+5天 ——注意这个“5天”
每百年共100*(208周+5天)-1天=5217周+5天 ——注意这个“5天”(整百年暂设为平年)
每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和“1天”(4个整百年只有一个闰年)
即400年一轮回!(原来万年历400年前是一家)
至于你说的日期和星期对齐,给你一点思路参考:每一行是7天,可以设定每一天占10个字符(同时上面的星期也得占满10个字符),假设本月第一天是星期4,那么在输出1之前需要先输出10×3个字符来占位,当输出星期天的日期之后换行,之后的就简单了
❻ 用C语言怎么编写这个万年历
核心算法:星期(0~6)=(年份系数+月份系数+日期)%7;
其中,年份系数我以2007年做参照,已知2007年,年份系数是0,往前往后分别是递减和递增。增减规律:非闰年为±1,闰年1~2月-2或+1,闰年3~12月+2或者-1。
其中,12个月份系数对应:0,3,3,6,1,4,6,2,5,0,3,5。
根据以上规律,只要利用循环,就可以的到对应系数和星期。
日历实现翻页功能,按键盘左右方向键可以翻译查看当年其他月份,按向上方向键可以返回菜单。
下面是代码:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#define XY 2007
#define X07 0//以2007年年系数0做参照
int isLeapYear(int year);//判断是否是闰年,是返回1,否返回0
int addyx(int yx,int n);//年系数自增,0~6,n:自增的跨度,返回自增后的年系数
int getYX(int year,int month);//获得年系数0~6
int getMX(int month);//获得月系数
int getWeek(int yx,int mx,int day);//通过年月系数(yx:年系数;mx:月系数)及日期获取星期
char *getStrWeek(int yx,int mx,int day);//通过年月系数(yx:年系数;mx:月系数)及日期获取星期对应的中文字符串
int getMaxDay(int year,int month);//通过年月获取当月最大天数
void prCalendar(int year,int month);//打印日历
int showMeun();//打印主菜单
int getDuration(int year,int month,int day);//通过日期获取距今天数
int calendar[6][7];
int main()
{
//int year,month,day,yx,mx;
while(1)
{
if(!showMeun())
break;
}
return 0;
}
int showMeun()//打印主菜单
{
int n,year,month,day,yx,mx;
while(1)
{
system("cls");
printf("1、输入年份,显示该年每个月的日历 ");
printf("2、输入年月,显示该月的天数 ");
printf("3、输入日期,显示距离今天的天数 ");
printf("4、输入日期,查询这一天是星期几 ");
printf("0、结束程序 ");
n=-1,year=0,month=0,day=0;
while(n<0 || n>4)
{
printf("请输入选择的菜单序号:");
scanf("%d",&n);
}
switch(n)
{
case 1:while(year<=0 || year>9999)
printf("请输入年份:"),scanf("%d",&year);
prCalendar(year,1);
break;
case 2:while(year<=0 || year>9999 || month<=0 || month>12)
printf("请输入年份及月份:"),scanf("%d%d",&year,&month);
printf("%4d年%2d月共有%d天 按任意键继续。。。。。。 ",year,month,getMaxDay(year,month)),getch();
break;
case 3:while(year<=0 || year>9999 || month<=0 || month>12 || day<0 || day>getMaxDay(year,month))
printf("请输入日期:"),scanf("%d%d%d",&year,&month,&day);
printf("距离今日有%d天 按任意键继续。。。。。。 ",getDuration(year,month,day)),getch();
break;
case 4:while(year<=0 || year>9999 || month<=0 || month>12 || day<0 || day>getMaxDay(year,month))
printf("请输入日期:"),scanf("%d%d%d",&year,&month,&day);
yx=getYX(year,month);
mx=getMX(month);
printf("%4d年%2d月%2d日是%s 按任意键继续。。。。。。 ",year,month,day,getStrWeek(yx,mx,day)),getch();
break;
case 0:return 0;
}
}
return n;
}
void prCalendar(int year,int month)//打印日历
{
char c1,c2;
int i,j,*p=NULL,yx,mx,cnt,w,maxDay;
while(1)
{
p=&calendar[0][0];
yx=getYX(year,month),mx=getMX(month);
cnt=0,w=getWeek(yx,mx,1);
maxDay=getMaxDay(year,month);
for(i=0;i<6;i++)
for(j=0;j<7;j++)
{
if(cnt<w)
p++,cnt++;
calendar[i][j]=0;
}
for(i=1;i<=maxDay;i++)
*p=i,p++;
system("cls");
printf(" %4d 年%2d月 ",year,month);
printf("日 一 二 三 四 五 六 ");
for(i=0;i<6;i++,printf(" "))
for(j=0;j<7;j++)
if(calendar[i][j]==0)
printf(" ");
else
printf("%2d ",calendar[i][j]);
printf("<- 按方向键向左或向右翻页 -> ");
printf(" 按向上方向键返回主菜单 ");
c1=getch();
c2=getch();
if(c1==-32 && c2==75)//左键
{
if(month==1)
month=12;
else
month--;
}
if(c1==-32 && c2==77)//右键
{
if(month==12)
month=1;
else
month++;
}
if(c1==-32 && c2==72)//上键
{
showMeun();
break;
}
}
}
int getDuration(int year,int month,int day)//通过日期获取距今天数
{
int i,y,m,d,sum=0,sum2=0,minY,maxY,minM,maxM,minD,maxD;
time_t tt;
struct tm *tmp;
time(&tt);
tmp=localtime(&tt);
y=1900+tmp->tm_year,m=1+tmp->tm_mon,d=tmp->tm_mday;//获取当前日期的年月日
if(year<y)
minY=year,maxY=y,minM=month,maxM=m,minD=day,maxD=d;
if(year>y)
minY=y,maxY=year,minM=m,maxM=month,minD=d,maxD=day;
if(year!=y)
{
for(i=minY;i<maxY;i++)//按相差年份累加(不包含右端最大年份)
if(isLeapYear(i))
sum+=366;//闰年
else
sum+=365;
for(i=1;i<minM;i++)//扣除左端年份已过月份对应天数
sum-=getMaxDay(minY,i);
sum-=minD;//扣除左端当月已过天数
for(i=1;i<maxM;i++)//累加右端最大年份已过月份对应天数(不包含最大年份当月)
sum+=getMaxDay(maxY,i);
sum+=maxD;//累加右端当月已过天数
}
else//如果年份相同,累加两边一年内已过天数,求差值
{
for(i=1;i<month;i++)
sum+=getMaxDay(month,i);
sum+=day;
for(i=1;i<m;i++)
sum2+=getMaxDay(m,i);
sum2+=d;
return abs(sum2-sum);
}
return sum;
}
int getMaxDay(int year,int month)//通过年月获取当月最大天数
{
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year) && month==2)
return days[month-1]+1;
return days[month-1];
}
char *getStrWeek(int yx,int mx,int day)//通过年月系数(yx:年系数;mx:月系数)及日期获取星期对应的中文字符串
{
int w;
static char week[7];
memset(week,0,7);
strcpy(week,"星期");
w=getWeek(yx,mx,day);
switch(w)
{
case 0:strcat(week,"日");break;
case 1:strcat(week,"一");break;
case 2:strcat(week,"二");break;
case 3:strcat(week,"三");break;
case 4:strcat(week,"四");break;
case 5:strcat(week,"五");break;
case 6:strcat(week,"六");break;
}
return week;
}
int getWeek(int yx,int mx,int day)//通过年月系数(yx:年系数;mx:月系数)及日期获取星期对应的数值0~6
{
return (yx+mx+day)%7;
}
int getMX(int month)//获得月系数
{
int xmonth[12]={0,3,3,6,1,4,6,2,5,0,3,5};//月系数:1-12月,每月的系数。
return xmonth[month-1];
}
int getYX(int year,int month)//获得年系数0~6
{
int yx=0,nyear=XY,isly,flag;
if(nyear==year)
return 0;
if(nyear<year)
flag=0,nyear++;
else
flag=1,nyear--;
while(1)
{
isly=isLeapYear(nyear);
if(!isly){//非闰年年系数累加1
if(!flag)
yx=addyx(yx,1);
else
yx=addyx(yx,-1);
}
if(isly && month>=1 && month<=2){//闰年1~2月年系数累加1,3`12月年系数累加2
if(!flag)
yx=addyx(yx,1);
else
yx=addyx(yx,-2);
}
else if(isly && month>=3 && month<=12){
if(!flag)
yx=addyx(yx,2);
else
yx=addyx(yx,-1);
}
if(nyear==year)
break;
if(!flag && nyear<year)
nyear++;
if(flag && nyear>year)
nyear--;
}
return yx;
}
int addyx(int yx,int n)//年系数自增,0~6,n:自增的跨度,返回自增后的年系数
{
if(n>0)
{
if(yx+n<=6)
return yx+n;
if(yx+n>6)
return yx+n-7;
}
if(n<0)
{
if(yx+n>=0)
return yx+n;
if(yx+n<0)
return yx+n+7;
}
return -1;
}
int isLeapYear(int year)//判断是否是闰年,是返回1,否返回0
{
if((year%4==0 && year%100!=0)||(year%400==0))
return 1;
return 0;
}
❼ c语言编写万年历
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
typedef struct //定义一个接受输入日期的结构体
{
int year;
int month;
int day;
}time2;
/*打印菜单*/
void menu()
{
system("cls");
printf("||===========================================||\n");
printf(" 1、输出系统所对应的本月月历。\n");
printf(" 2、查找某年某月。输出其对应的月历。\n");
printf(" 3、查找具体日期是星期几?\n");
printf(" 0、退出本程序。\n");
printf("||===========================================||\n");
}
int year_leap(int year)//判断输入的年是否是闰年?
{
int i=0;
if(year%4==0&&year%100!=0||year%400==0)
i=1; //是闰年 为真。
return i;
}
int month_day(int year,int month)
{
int i;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//判断本月是否为大月?
return i=31;
if(month==4||month==6||month==9||month==11) //判断本月是否为小月?
return i=30;
if(month==2&&year_leap(year)) //判断本月是否为闰年的二月?
return i=29;
else
return i=28;
}
/*查找每一天所对应的是星期几?*/
int day_search(int year,int month,int day)
{
int c=0;
float s;
int m;
for(m=1;m<month;m++)
c=c+month_day(year,m);
c=c+day;
s=year-1+(float)(year-1)/4+(float)(year-1)/100+(float)(year-1)/400-40+c;
return ((int)s%7); //返回要查找的日期是星期几,
}
/*判断输入的年月是否符合习惯*/
time2 panan_year_month(int year,int month)
{
time2 b;
b.year=year;
b.month=month;
if(year<0)
{
system("cls");
printf("你输入的年份有错!!!\n请重新输入年份:"); //判断输入的year是否符合习惯?
scanf("%d",&b.year);
}
if(month>12||month<1) //判断输入的month是否符合习惯?
{
system("cls");
printf("输入的月份有错!!!\n请重新输入月份:");
scanf("%d",&b.month);
}
return b;
}
//输出所查找的那天是星期几?
void print_weekday()
{
FILE *fp;
char string[7];
time2 time,b;
system("cls");
printf("请输入你要查找的年月日:");
scanf("%d%d%d",&time.year,&time.month,&time.day); //输入年月日
if((fp=fopen("weekday.txt","r"))==NULL) //判断能否打开文件
{
printf("cannot open this file\n");
exit(0);
}
b=panan_year_month(time.year,time.month);
if(time.day<1||time.day>month_day(time.year,time.month)) //判断输入的day是否符习惯,若不,则重新输入。
{
system("cls");
printf("你输入的日期有错!!!\n请重新输入:");
scanf("%d",&b.day);
}
else
b.day=time.day;
time=b;
fseek(fp,6*day_search(time.year,time.month,time.day),0);
fread(string,6,1,fp);
string[6]='\0';
printf("%d/%d/%d/是%s\n",time.year,time.month,time.day,string);
fclose(fp);
getch();
}
/*打印一个月的月历。*/
void print_month(int a,int b)
{
int i,j=1,k=1;
printf(" Sun Mon Tue Wed Thu Fri Sat \n");
if(a==7) //判断每月的第一天是够是星期日,若是,则按以下算法输出当月月历。
{
for(i=1;i<=b;i++)
{
printf("%4d",i);
if(i%7==0)
{
printf("\n");
}
}
}
if(a!=7) //若当月第一天不是星期日,则按以下算法输出当月月历。
{
while (j<=4*a)
{
printf(" ");
j++;
}
for(i=1;i<=b;i++)
{
printf("%4d",i);
if(i==7*k-a)
{
printf("\n");
k++;
}
}
}
printf("\n");
}
/*打印系统当月的月历*/
void print_system_month()
{
int a,b;
system("cls");
/*调用系统时间*/
time_t tval;
struct tm *now;
tval=time(NULL);
now=localtime(&tval);
printf("现在时间: %4d年 %d月 %02d日\n",now->tm_year+1900, now->tm_mon+1, now->tm_mday);//结束调用系统时间,并输出当前的系统月历。
b=month_day(now->tm_year+1900,now->tm_mon+1);
a=day_search(now->tm_year+1900,now->tm_mon+1,1);
print_month(a,b);
getch();
}
/*输出要查找的年月所对应的月历。*/
void print_any_month()
{
time2 time;
int a,b;
system("cls");
printf("请输入你要查找的年份:");
scanf("%d%d",&time.year,&time.month);
time=panan_year_month(time.year,time.month); //判断输入的月份是否正确?若不正确,那就重新输入,并把修改后的结果赋给time
b=month_day(time.year,time.month);
a=day_search(time.year,time.month,1);
system("cls");
print_month(a,b); //输出月历
getch();
}
void print_xx() //输出欢迎用语!
{
system("cls");
printf("||================================欢迎下次光临!===============================||\n");
}
void choice() //选择功能选项
{
int i;
while(1)
{
menu();
printf("请输入你要选择的功能所对应的数:\n");
i=getch();
if(i=='0') break; //判断输入的数是否为零,若是,退出循环。
switch(i)
{
case '1': print_system_month();break;
case '2': print_any_month();break;
case '3': print_weekday();break;
default: printf("没有你要选择的功能选项!!!!!\n");getch();
}
}
print_xx(); //调用函数输出,致谢语。
}
/*在主函数中通过choice()函数调用其他功能函数。*/
void main()
{
choice();
printf("\n");
}
❽ 用c语言做一个万年历
#include <stdio.h>
/*表示星期的常量*/
const int Su = 0;
const int Mo = 1;
const int Tu = 2;
const int We = 3;
const int Th = 4;
const int Fr = 5;
const int Sa = 6;
/*日历开始年份,默认是 2000 年*/
const int START_YEAR = 2000;
/*日历开始月份,默认是 1 月*/
const int START_MONTH = 1;
/*日历开始月份,默认是 1 号*/
const int START_DAY = 1;
/*日历开始的星期,默认是星期六(2000年1月1日是星期六)*/
const int START_WEEK_DAY = Sa;
/*
功能:计算一年中指定月份的天数
*/
int calDaysOfMonth(int year ,int month)
{
const int daysOfMonth[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if( month == 2 && ( (year%4==0 && year%100!=0) || year %400==0 ))
{
return daysOfMonth[month] +1;
}
else
{
return daysOfMonth[month];
}
}
/*
功能:计算距离 START_YEAR : START_MONTH : START_DAY 的天数
输入:年year,月month,日day
输出:距离 START_YEAR : START_MONTH : START_DAY 的天数
*/
int calDateInterval(int year ,int month , int day)
{
int days = 0 ;
int y,m,d;
/*加上整年的天数*/
for(y = START_YEAR ; y < year ; y ++)
{
/*如果是闰年*/
if((y%4==0%y%100!=0) || y%400==0)
{
days += 366;
}
else
{
days += 365;
}
}
/*加上整月的天数*/
for(m = 1 ; m < month ; m ++)
{
days += calDaysOfMonth(year,m);
}
/*加上当月的天数*/
days += ( day - 1 );
return days;
}
/*
功能:计算每月第一天所在的星期
*/
int calFirstDayOfMonthInWeekDay(int year ,int month)
{
int days = calDateInterval(year,month,1);
return (days % 7 + START_WEEK_DAY) % 7;
}
void printCalendar(int year,int month)
{
int firstDayOfMonthInWeekDay = 1;
int daysOfMonth;
int daysCounter;
int d;
/********************检查年份月份输入********************/
/*检查输入的年份*/
if(year < START_YEAR )
{
printf("The year must after 2007(inclued)!\n");
return ;
}
if(year > 9999)
{
printf("The year must before 9999(inclued)!\n");
return ;
}
/*检查输入的月份*/
if(month < 0 || month > 12)
{
printf("Illegal month : %d ! The month must range [0,12]");
}
/********************开始打印日历********************/
/*日历年月头部*/
if(month > 10)
{
printf("Calendar %d-%d\n",year,month);
}
else
{
printf("Calendar %d-%0d\n",year,month);
}
printf("------------------------------------------------------\n");
/*日历星期头部*/
printf("Su Mo Tu We Th Fr Sa\n");
printf("------------------------------------------------------\n");
/*日历每天排列*/
/*每月的第一天所在的星期*/
firstDayOfMonthInWeekDay = calFirstDayOfMonthInWeekDay(year,month);
/*当月的天数*/
daysOfMonth = calDaysOfMonth(year,month);
/*输出每月开头空出的星期,并统计空白的星期*/
for(d = 0 ,daysCounter = 0; d < firstDayOfMonthInWeekDay ; d ++)
{
printf(" ");
daysCounter ++;
}
/*输出每月的天,根据所在的星期*/
for( d = 1 ; d <= daysOfMonth; d ++)
{
if(daysCounter % 7 ==0)
{
printf("\n");
}
printf("%2d ",d);
daysCounter++;
}
printf("\n------------------------------------------------------\n\n");
}
int main(int argc, char *argv[])
{
int year,month;
printf("Input the year(YYYY):");
while(scanf("%d",&year)!=EOF)
{
for(month = 1 ; month <= 12 ; month ++)
{
printCalendar(year,month);
}
printf("Input the year(YYYY):");
}
return 0;
}
/*
Input the year(YYYY):2011
Calendar 2011-1
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
------------------------------------------------------
Calendar 2011-2
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28
------------------------------------------------------
Calendar 2011-3
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
------------------------------------------------------
Calendar 2011-4
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
------------------------------------------------------
Calendar 2011-5
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
------------------------------------------------------
Calendar 2011-6
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
------------------------------------------------------
Calendar 2011-7
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
------------------------------------------------------
Calendar 2011-8
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
------------------------------------------------------
Calendar 2011-9
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
------------------------------------------------------
Calendar 2011-10
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
------------------------------------------------------
Calendar 2011-11
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
------------------------------------------------------
Calendar 2011-12
------------------------------------------------------
Su Mo Tu We Th Fr Sa
------------------------------------------------------
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
------------------------------------------------------
Input the year(YYYY):
*/
❾ 用C语言怎么编写万年历
C语言编写万年历的源代码如下:
#include <stdio.h>
int week(int y,int m,int d);
int main()
{
char wk[7][3] = {{"天"},{"一"},{"二"},{"三"},{"四"},{"五"},{"六"}};
int year, month, day, w;
scanf("%d %d %d", &year, &month, &day);
w = week(year, month, day);
printf("%d年%d月%d日 星期%s", year, month, day, wk[w]);
}
int week(int y,int m,int d)
{
static int r[13]={0,0,3,3,6,1,4,6,2,5,0,3,5};
int c,w;
y %= 400;
if ((y==0||y%4==0&&y%100!=0)&&m<3)
c = 5;
else
c = 6;
w = (y+y/4-y/100+r[m]+d+c)%7;
return w;
}
(9)c语言万年历实验扩展阅读
电子时钟C语言版的源代码如下:
#include<stdio.h>
#include<time.h>
#include<string.h>
int main()
{
char str[50];
time_t t;
struct tm *nt;
while(1)
{
system("cls");//清屏函数
t=time(NULL);
nt=localtime(&t);
strftime(str,50,"%Y-%m-%d %H:%M:%S “,nt);
printf("现在时刻:%s ",str);
}
getch();
return 0;
}
❿ 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();
//完毕!
}