如何用c语言做个日历表

要求如下
日历表
⑴自动在屏幕上显示当前日前和时间。
⑵日历表中包含阴历。
⑶在一年内任意输入一个月份,则在屏幕上显示该月的日历。

一直失败,无奈来问

1、功能要求 :
1)输入任一年将显示出该年的所有月份日期,对应的星期
2)注意闰年情况
其显示格式要求如下:
1)份:中文英文都可以,
2)下一行显示星期,从周日到周六,中英文都可以
3)下一行开始显示日期从1号开始,并按其是周几实际情况与上面的星期数垂直对齐


2、例程:

#include <stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
int IsLeapYear(int);    //声明头文件和函数
void main() 

int i; 
int day; 
int year; 
int temp; 
int temp_i; 
long int Year_days = 0; 
int Year_Start = 1; 
int Per_Year_Days; 
int month_day[]={31,28,31,30,31,30,31,31,30,31,30,31,29}; //每个月的天数,最后一个是闰年2月
printf("Please enter the year: "); 
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 ) 

case 1: 
printf(" January(%d)\n",year);       //如 January(2008)
break; 
case 2: 
printf(" February(%d)\n",year); 
break; 
case 3: 
printf(" March(%d)\n",year); 
break; 
case 4: 
printf(" April(%d)\n",year); 
break; 
case 5: 
printf(" May(%d)\n",year); 
break; 
case 6: 
printf(" June(%d)\n",year); 
break; 
case 7: 
printf(" July(%d)\n",year); 
break; 
case 8: 
printf(" August(%d)\n",year); 
break; 
case 9: 
printf(" September(%d)\n",year); 
break; 
case 10: 
printf(" October(%d)\n",year); 
break; 
case 11: 
printf(" November(%d)\n",year); 
break; 
case 12: 
printf(" December(%d)\n",year); 
break; 

i = Year_days % 7;                                //计算这个月第一天是星期几
printf("Mon Tue Wed Thu Fri Sat Sun\n"); 
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("\n"); 
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("\n"); 
if( day >=10 )                     //理由同上
printf("%d  ",day); 
else 
printf("%d   ",day); 
Year_days++; 
day++; 

printf("\n"); 
if( getch() == 'q' )             //输入q退出程序
exit(0); 

getch();                         

int IsLeapYear( int year )      //判断是否为闰年

if ((year %4 == 0) && (year % 100 != 0) ||     //年份能被4整除且不能被100整除 或者 能被400整除的为闰年
(year % 400 == 0) ) 
return 1; 
else 
return 0; 
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-01
#include"stdio.h"
#include"time.h"

main(){

//定义变量
struct tm t,*date;

time_t t_day;

int year,month;
int month_day;
int i,j;

struct tm *local;
time_t t_mow;
t_mow=time(NULL);
local=gmtime(&t_mow);

//输入年份和月份
printf("请输入年份:\n");
scanf("%d",&year);
printf("请输入月份:\n");
scanf("%d",&month );

if(month==2 ){
if(year%4==0 && year%100!=0)
month_day=29;
else
month_day=28;

}
else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
month_day=31;
}
else //大月有30天
month_day=30;

printf("当前时间是: ");
printf(asctime(local));
printf("\n\n");

printf("当月天数是:%d \n\n 日历\n",month_day); //输出当前天数

printf("一\t二\t三\t四\t五\t六\t日\t\n"); //日历的第一行,显示一二三四五六日

for (i=1;i<=month_day;i++)
{
t.tm_year=year-1900;
t.tm_mon=month-1;
t.tm_mday=i;
t.tm_hour=0;
t.tm_min=0;
t.tm_sec=0;
t.tm_isdst=0;
t_day=mktime(&t);

date=gmtime(&t_day);

//下面的date->tm_wday 就是星期 – 取值区间为0到6,其中0代表星期天,1代表星期一,以此类推
//由于输出是从屏幕最左端开始的,如果1号是星期2,我们就要把星期1底下的数空出来,
//如果1号是星期3,我们就要把星期1和星期2底下的数空出来 以此类推

if(i==1)
{
for(j=0;j<date->tm_wday;j++)
printf("\t");
}

if(date->tm_wday==6)
{
printf("%d\n",i);
}
else
printf("%d\t",i);

}
printf("\n\n",i);
}本回答被提问者采纳
第2个回答  2019-11-06
1、功能要求

1)输入任一年将显示出该年的所有月份日期,对应的星期
2)注意闰年情况
其显示格式要求如下:
1)份:中文英文都可以,
2)下一行显示星期,从周日到周六,中英文都可以
3)下一行开始显示日期从1号开始,并按其是周几实际情况与上面的星期数垂直对齐
2、例程:
#include <stdio.h>
#include<conio.h>
#include<stdlib.h>
int IsLeapYear(int); //声明头文件和函数
void main()
{
int i;
int day;
int year;
int temp;
int temp_i;
long int Year_days = 0;
int Year_Start = 1;
int Per_Year_Days;
int month_day[]={31,28,31,30,31,30,31,31,30,31,30,31,29}; //每个月的天数,最后一个是闰年2月
printf("Please enter the year: ");
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 )
{
case 1:
printf(" January(%d)\n",year); //如 January(2008)
break;
case 2:
printf(" February(%d)\n",year);
break;
case 3:
printf(" March(%d)\n",year);
break;
case 4:
printf(" April(%d)\n",year);
break;
case 5:
printf(" May(%d)\n",year);
break;
case 6:
printf(" June(%d)\n",year);
break;
case 7:
printf(" July(%d)\n",year);
break;
case 8:
printf(" August(%d)\n",year);
break;
case 9:
printf(" September(%d)\n",year);
break;
case 10:
printf(" October(%d)\n",year);
break;
case 11:
printf(" November(%d)\n",year);
break;
case 12:
printf(" December(%d)\n",year);
break;
}
i = Year_days % 7; //计算这个月第一天是星期几
printf("Mon Tue Wed Thu Fri Sat Sun\n");
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("\n");
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("\n");
if( day >=10 ) //理由同上
printf("%d ",day);
else
printf("%d ",day);
Year_days++;
day++;
}
printf("\n");
if( getch() == 'q' ) //输入q退出程序
exit(0);
}
getch();
}
int IsLeapYear( int year ) //判断是否为闰年
{
if ((year %4 == 0) && (year % 100 != 0) || //年份能被4整除且不能被100整除 或者 能被400整除的为闰年
(year % 400 == 0) )
return 1;
else
return 0;
}