C/C++语言 小程序 日历(万年历)

假期做的,容错性不太好,暂时没啥错误,如果发现错误请留言

#include <stdio.h>
#include <math.h>
/*********************************************************************************/
int leap_year(int year)//判断是否是闰年,1是
{

	if((year%4==0&&year%100!=0)||(year%400==0))
		return 1;
	else
		return 0;
}
/*********************************************************************************/
int fday(int year)//每年的第一天是星期几
{
	double s;
	s=floor(year-1+(year-1)/4.0-(year-1)/100.0+(year-1)/400.0+1);
	return (int)s%7;
}
/*********************************************************************************/
int passd(int mon,int leap)//过了多少天
{
	int sum=0;
	switch(mon)/*先计算某月以前月份的总天数*/
	{
	case 1:sum=0;break;
	case 2:sum=31;break;
	case 3:sum=59;break;
	case 4:sum=90;break;
	case 5:sum=120;break;
	case 6:sum=151;break;
	case 7:sum=181;break;
	case 8:sum=212;break;
	case 9:sum=243;break;
	case 10:sum=273;break;
	case 11:sum=304;break;
	case 12:sum=334;break;
	}
	if(leap==1&&mon>2)//闰年以后加1,当然要过了二月
		return sum+1;
	else
		return sum;
}
/*********************************************************************************/
void put(int y,int m,int d,int fd,int l,int mon[])
{
	int pd,mfd,i,j;
	pd=passd(m,l);
	mfd=pd%7+fd;//每月第一天星期几
	switch((d-1+mfd)%7)//自己算算
	{
	case 0:printf("今天是星期日\n");break;
	case 1:printf("今天是星期一\n");break;
	case 2:printf("今天是星期二\n");break;
	case 3:printf("今天是星期三\n");break;
	case 4:printf("今天是星期四\n");break;
	case 5:printf("今天是星期五\n");break;
	case 6:printf("今天是星期六\n");break;
	}
	printf("~~~~~我~~~~~是~~~~~华~~~~~丽~~~~~分~~~~~割~~~~~线~~~~~\n");
	printf("                   %d年%d月份的日历                   \n",y,m);
	printf(" 星期日 星期一 星期二 星期三 星期四 星期五 星期六\n");
	if(mfd>=7)
		mfd-=7;
	for(i=0;i<mfd;i++)//日历格式
		printf("       ");//七个空格
	i=mfd;
	for(j=1;j<=mon[m-1];)//从头排着输就行了
	{
		printf("%7d",j);
		j++;
		if(i==6)
		{
			printf("\n");
			i=0;
		}
		else
			i++;
	}
	printf("\n");
	printf("~~~~~我~~~~~是~~~~~华~~~~~丽~~~~~分~~~~~割~~~~~线~~~~~\n");
}
/*********************************************************************************/
int main(int argc, char* argv[])
{
	int year,mon,leap,fd,day;
	char a,b;
	int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};//注意二月天数
	int lmonth[12]={31,29,31,30,31,30,31,31,30,31,30,31};
	printf("这是一个能输出日历的程序,输入的格式为xxxx xx xx,输入0时结束。\n");
	while(1)
	{
		year=0,mon=0;
		printf("请输入年月,中间用空格隔开:\n");
		scanf("%d%c%d%c%d",&year,&a,&mon,&b,&day);
/*********************************************************************************/
		if(year==0)break;
		leap=leap_year(year);
		if(leap==1)
		{
			if(a!=' '||b!=' '||mon<=0||mon>12||day>lmonth[mon-1]||day<1)
                //关于容错性,有点坑= =
			{
				printf("输入有误,请重新输入\n");
				continue;
			}
			printf("本年是闰年\n");
			printf("本月有%d天\n",lmonth[mon-1]);
			fd=fday(year);
			put(year,mon,day,fd,leap,lmonth);
		}
		else
		{
			if(a!=' '||b!=' '||mon<=0||mon>12||day>month[mon-1]||day<1)
			{
				printf("输入的格式错误,请重新输入\n");
				continue;
			}
			printf("本年不是闰年\n");
			printf("本月有%d天\n",month[mon-1]);
			fd=fday(year);
			put(year,mon,day,fd,leap,month);
		}
	}
	return 0;
}


示例,像这样

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值