趣味小程序1—日历

本文介绍了作者如何创建一个日历小程序,以2019年1月1日(星期二)为基准,程序分为6个部分:主函数、功能实现、星期号输出、闰年判断等。通过函数调用来实现不同年份的日历显示,考虑了闰年和平年对2月天数的影响,详细阐述了代码逻辑和实现过程。
摘要由CSDN通过智能技术生成

搞了半天终于弄出来了,下面我来说一下我的思路

我以2019年一月一日,星期二,为基准,将整个程序分为6子部分

1:主函数:主要负责输入年份,比较输入的年份和2019的大小,

2-4:主要的功能实现块,其中有一部分最主要的可以单独写为一个函数,让其他部分调用,可以减小代码行数。

5:该函数块主要由switch组成,调用后打印星期号

6:该函数块主要判断年份是否为闰年,是则输出1,否则0.

整个程序主要功能块由3个函数组成,但它们的思路都一样,我就介绍其中一种

 

函数由形参传入年份,首先定义一系列需要的变量,先计算该年份到2019年的天数day,需要用到闰年判断,从而根据天数得到该年1月1日的星期xq,用循环打印12个月,循环体内,先调用xingqi打印函数打印星期号,开始已经定义了tap全局变量,所有函数通用。由于闰年平年不同,需要用闰年判断函数修改2月的天数。

修改完后开始打印天数,先判断星期变量 xq的值,如果不等于1,则不能直接打印,否则排列不好,先将xq赋值给l,通过循环打印多个空格,当l=1时,空格已经足够,可以打印天数了,

若打印星期变变量xq=7,则需要将其置一,换行,并用continue结束一次循环;由于1-9;10-30的位数不同,1-9需要加一个空格,当月数打印完毕后换行,跳出天数打印循环。继续下一月的循环。

下面我就公布一下源代码吧

#include<stdio.h>
int R=0;
int tap[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
const int Rest_year=2019; 
void xingqi(int i)
{
	switch(i)
	{
		case 1:printf("星期一   ");break;
		case 2:printf("星期二   ");break;
		case 3:printf("星期三   ");break;
		case 4:printf("星期四   ");break;
		case 5:printf("星期五   ");break;
		case 6:printf("星期六   ");break;
		case 7:printf("星期七\n");break;
		default :break;
	}
}
int ren(int year)//闰年判断,若是,输出1,否输出0
{
	if(0==year%4)
		if(0!=year%100||0==year%400)
			return 1;
	return 0;
}

void rupn(int y)//若年数小于2019,
{   int bs;      //必要的变量定义
    int day=0;
 	int xq,yue;
	int fg,l=1,k=y;
	
	printf("\n\n\n\n%d 年日历\n",y);//计算该年到2019年的天数,
	for(;y<2019;y++)
	{
          if(1==ren(y)) //闰年则天数为366,平年则为365
		day=day+365;
	  else day=day+365;
	}
	
	y=k;//在天数计算时,已经将y变成2019,需要回到初始值
	xq=2-day%7;
	if(xq<0) xq=7+xq;//判断该年的一月一日为星期几
	l=xq;
	//--------------------------------------------------
	for(yue=1;yue<=12;yue++) //以月打印
	{   l=xq;
        printf("                                 %d 月\n",yue); //显示月号
        for(bs=1;bs<8;bs++)///打印星期号
		  xingqi(bs);
	//--------------------------------------------------
		if(1==ren(y))
		      tap[2]=29;  //如果该年为闰年则2月为29天,否则为28天
	     else tap[2]=28;
   //-------------------------------------------
		for(fg=1;fg<=tap[yue];fg++) //以日打印
		{  if(1!=l)
			   for(;l>1;l--) printf("         ");//初始星期不为星期一,则从星期一到初始输出都为空格
		   //---------------------------------------------
		   //
		   if(xq==7)  //值为星期天,打印换行,并将星期置一
		       {printf("%d\n",fg);xq=1;continue;}
		       if(fg<10)printf(" %d       ",fg);
			   else printf("%d       ",fg);xq++;//打印一次星期加一次
	       
		   if(fg==tap[yue])printf("\n\n");//月份打印完,换行
        }
	}
}
//------------------------------------------------
void  rudw(int y)//大于2019
{   int s=y;
    int day=0;
	int xq,yue,bs,fg,l;
	printf("\n\n\n\n%d 年日历\n",y);
	for(;s>2019;s--)
		if(1==ren(s))
			day=day+366;
		else day=day+365;
		
	xq=2+day%7;
	if(xq==7) xq=1;
	l=xq;

	for(yue=1;yue<=12;yue++)
	{   //---------------------------------
          printf("                               %d 月\n",yue); 
        for(bs=1;bs<8;bs++)
		xingqi(bs);
	l=xq;
	    //-------------------------------------
		if(1==ren(y))
		      tap[2]=29;
	       else tap[2]=28;
		  //--------------------------------------- 
		for(fg=1;fg<=tap[yue];fg++) //以日打印
		{  if(1!=l)
			   for(;l>1;l--) printf("         ");//初始星期不为星期一,则从星期一到初始输出都为空格
		   //---------------------------------------------
		   //
		   if(xq==7)  //值为星期天,打印换行,并将星期置一
		       {printf("%d\n",fg);xq=1;continue;}
		       if(fg<10)printf(" %d       ",fg);
			   else printf("%d       ",fg);xq++;//打印一次星期加一次
	       
		   if(fg==tap[yue])printf("\n\n");//月份打印完,换行
        }
	}
}
void rudy(int y)//等于2019
{
   	int xq=2;
	int l=xq;
	int yue,fg,bs;
	printf("\n\n\n\n%d 年日历\n",y);
	for(yue=1;yue<=12;yue++)
	{   //--------星期打印-----------------------
          printf("                                  %d 月\n",yue); 
         for(bs=1;bs<8;bs++)
		 xingqi(bs);
	    l=xq;
	 //--------------------------------------------
	 for(fg=1;fg<=tap[yue];fg++) //以日打印
		{  if(1!=l)
			   for(;l>1;l--) printf("         ");//初始星期不为星期一,则从星期一到初始输出都为空格
		   //---------------------------------------------
		   //
		   if(xq==7)  //值为星期天,打印换行,并将星期置一
		       {printf("%d\n",fg);xq=1;continue;}
		       if(fg<10)printf(" %d       ",fg);
			   else printf("%d       ",fg);xq++;//打印一次星期加一次
	       
		   if(fg==tap[yue])printf("\n\n");//月份打印完,换行
        }	
	}
	
}
int main()
{   printf("Please Enter The Day:");
	int year;
	scanf("%d",&year);
     if(year<Rest_year)
		 rupn(year);
	   else if (year==Rest_year) 
		   rudy(year);
	   else
	       rudw(year);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值