C语言题目求教

程序设计题一: 打印日历
【问题描述】
该课题要求学生会读取系统时间,利用系统库文件中所给的数据结构,得到自己解决问题所要的数据,设计算法求解问题,再进行一些输出格式上的控制,实现根据系统时钟输出当月日历、当年日历的功能。
编写一个程序,输出当前月的日历。
【基本功能】
(1)本课题不需要从键盘读入数据。
(2)读系统时间,计算生成当天的日期。
(3)计算生成当月的日历,打印当月的日历,输出到以自己学号命名的文件中(如:thismonth_B05070122.txt),同时也在屏幕显示。输出的格式如下(假设当天日期为2005年12月20日):
Calendar
December
________________________________
Sun Mon Tue Wed Thu Fri Sat
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
今天是: 2005年12月20日,星期二
当前时间是:22时40分43秒
(4)计算生成当年的日历,打印当年的日历,以每行两个月的形式输出(如下),向屏幕输出,也写入文件中(calendar_2005_ B05070122.txt)。
Calendar
2005
Jan Feb
________________________________ ________________________________
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 1 2 3 4 5
2 3 4 5 6 7 8 6 7 8 9 10 11 12
9 10 11 12 13 14 15 13 14 15 16 17 18 19
16 17 18 19 20 21 22 20 21 22 23 24 25 26
23 24 25 26 27 28 29 27 28
30 31

//随便写了一下,实现了其中一些功能,给楼主参考一下吧,不过代码的可读性很差...
#include <stdio.h>
#include <time.h>
int leap(int year)
{
if(year%4 == 0 && year %100 != 0)
return 1;
else
{
if(year % 400 == 0)
return 1;
else
return 0;
}
return 0;
}
//将当前时间保存在数组中,total为天数(到那个月为止),1970.1.1为星期四
void getcl(int a[])
{
int start = 1970;
int total = 0;
time_t t = time(NULL);
t += 8*3600;//时区
int sum = 0, tem = 0,i = 1,flag = 0;
while(start)
{
if(leap(start))
{
flag = 1;
t -= 366*24*3600;
}
else
{
flag = 0;
t -= 365*24*3600;
}
if(t < 0)
break;
if(flag)
total += 366;
else
total += 365;
sum = t;
start++;
}
t = sum;
a[0] = start;
for(; ; i++)
{
if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
{
flag = 1;
total += 31;
t -= 31*24*3600;
}
if(i == 4 || i == 6 || i == 9 || i == 11)
{
flag = 2;
total += 30;
t -= 30*24*3600;
}
if(i == 2)
{
if(leap(start))
{
flag = 3;
total += 29;
t -= 29*24*3600;
}
else
{
flag = 4;
total += 28;
t -= 28*24*3600;
}
}
if(t < 0)
{
total = total - 32 + flag;
break;
}
sum = t;
}
a[1] = i;
t = sum;
for(i = 1; ;i++)
{
t -= 24*3600;
if(t < 0)
break;
sum = t;
}
a[2] = i;
t = sum;
for(i = 0; ;i++)
{
t -= 3600;
if(t < 0)
break;
sum = t;
}
a[3] = i;
t = sum;
for(i = 0; ;i++)
{
t -= 60;
if(t < 0)
break;
sum = t;
}
a[4] = i;
a[5] = sum;
a[6] = total;
return ;
}
//a[0]年,1月,2日,3时,4分,5秒,6天数(到那个月为止);
void printcal(int a[])
{
//如果是sun在开头的话,那么星期天可以在0那个位置
int begin = (a[6]+4)%7;
//printf("%d",begin);
int i = a[1];
int flag;
if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
flag = 1;
if(i == 4 || i == 6 || i == 9 || i == 11)
flag = 2;
if(i == 2)
{
if(leap(a[0]))
flag = 3;
else
flag = 4;
}
printf("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
for(i = 1; i < 32 - flag;)
{
int count = 0;
while(begin)
{
count++;
printf("\t");
begin--;
}
while(count < 7)
{
count++;
printf("%d\t",i);
if(i >= 32 - flag)
break;
else
i++;
}
printf("\n");
}
}
int main()
{
int a[7];
getcl(a);
printf("当前时间是:%d 年 %d月 %d日 %d时 %d分 %d秒\n",a[0],a[1],a[2],a[3],a[4],a[5]);
printcal(a);
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-06-24
#include "time.h"
#include "stdio.h"
int IsLeapYear(int year)
{
if((year%4==0)&&(year%100!=0)||year%400==0)
return 1;
else
return 0;
}
int JudgeWeek(int year,int month)
{
/*//// 1900 年 1 月 1 日 星期一*/
int leapdays[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int a[13];
int sum,total;
sum=0;
a[0]=0;sum=0;
for(int i=1;i<=12;i++)
a[i]=a[i-1]+leapdays[i];
for(int m=1900;m<=year;m++)
if(IsLeapYear(m))
sum++;
total=((year-1900)*365+sum+a[month-1])%7;
if(!IsLeapYear(year)&&month<=2)
total++;
return total;
}

char * workday()
{
time_t t;
struct tm *current;
int i;
time(&t);
current=localtime(&t);
i=current->tm_wday;
if(i==0)
return "星期天";
else if(i==1)
return "星期一";
else if(i==2)
return "星期二";
else if(i==3)
return "星期三";
else if(i==4)
return "星期四";
else if(i==5)
return "星期五";
else
return "星期六";

}
void DisplayCalendar()
{
time_t t;
struct tm *current;
time(&t);
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},week,i;
int month,year;
current=localtime(&t);
month=current->tm_mon+1;
year=current->tm_year+1900;
week=JudgeWeek(year,month);
if(IsLeapYear(year)&&month==2)
a[2]=29;
printf(" %d 年 %d 月 \n",year,month);
printf("%4s%4s%4s%4s%4s%4s%4s\n","Sun","Mon","Tue","Wed","Thu","Fri","Sat");
if(week==7)
goto loop2;
for(i=0;i<week;i++)
printf("%4s"," ");
loop2:for(int s=1;s<=a[month];s++)
{
week++;
printf("%4d",s);
if(week%7==0)
printf("\n");
}
printf("\n");
}

void main()
{
time_t t;
struct tm *current;
time(&t);
current=localtime(&t);
printf("Current Date: %d 年 %d 月 %d 日,%s\n",1900+current->tm_year,
current->tm_mon+1,current->tm_mday,workday());
printf("Current Time: %d:%d:%d\n",current->tm_hour,current->tm_min,
current->tm_sec);
DisplayCalendar();
}
将日历写到文本文件不难,这里就不给出代码了。
第三小题答案有了,第四小题也就容易了。
参考资料:http://hi.baidu.com/ctralt/blog/item/ee937c167e87db4b21a4e96b.html
相似回答