〓〓 讨论:打印2004年日历 〓〓

到百度贴吧首页
新闻   网页   贴吧   知道   MP3   图片   视频   百科
    吧内搜索 | 帮助

〓〓 讨论:打印2004年日历 〓〓

1楼

要求:用C语言编程,打印2004年日历,输出到文件2004.txt中,
格式如下图:

2楼

晕,怎么没帖上来呀!
再帖一次!

3楼

算了,点下面的链接看吧:
http://photo.wangyou.com/showpic.php?dirid=36497&imgid=788283

4楼

我写的源码:(在WinXP Dev C/C++ 平台上运行通过)
/* FOR YEAR 2004*/
#include<stdio.h>
void main()
{ FILE *fp;
 char weekday[7][5]={ "sun","mon","tur","wen","thu","fri","sta" };
 char M[12][4]={ "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep",
 "Oct","Nov","Dec" };
 int days[12], flag[12],date[12];
 /* 28<=days[i]<=31; 0<=flag[i]<7; 1<=date[i]<=days[i]; */
 int a=0,i,j,k=0;

 days[0]=days[2]=days[4]=days[6]=days[7]=days[9]=days[11]=31;
 days[1]=29; days[3]=days[5]=days[8]=days[10]=30;

 for(i=0;i<12;i++) { date[i]=1; }
 flag[0]=4; /* the Jan frist day is Friday. */
 for(i=1;i<12;i++) /* The frist day of month(i) is flag[i] */
 { flag[i]=(days[i-1]+flag[i-1])%7; }
 fp=fopen("2004.txt","w");
 fprintf(fp,"2004:\n");

 while(a<9) /* a(a to a+3) is valued by 0(0,1,2,3), 4(4,5,6,7), 8(8,9,10,11). */ 
 {
 while(k<=a+3)
 { fprintf(fp,"%-34s",M[k++]); } /* print: "Jan Feb Mar Apr " */
 fprintf(fp,"\n");
 for(i=0;i<4;i++) /* print: "sun mon tur wen thu fri sta" */
 { for(j=0;j<7;j++)
 { fprintf(fp,"%4s",weekday[j]); }
 fprintf(fp," ");
 }
 fprintf(fp,"\n");
 for(i=0;i<flag[a];i++) /* print the space before 1th. */
 { fprintf(fp," "); }
ONE: while(date[a]<=days[a]) /* print(e.g): 1 2 3/4 5 6 7 8 9 10/11 12 13...../ 18 19.../... */
 { fprintf(fp,"%4d",date[a]++);
 flag[a]=++flag[a]%7;
 if(!(flag[a]))
 { fprintf(fp," ");
 for(i=0;i<flag[a+1];i++) /* print the space before 1th of the next month. */
 { fprintf(fp," "); }
 goto TWO;
 }
 }
 for(i=0;i<(7-flag[a]);i++) { fprintf(fp," "); } flag[a]=0;
 /* print the space after the last date of the month. */ 
 fprintf(fp," "); /* print the space btween the month and the next one. */
TWO: while(date[a+1]<=days[a+1])
 { fprintf(fp,"%4d",date[a+1]++);
 flag[a+1]=++flag[a+1]%7;
 if(!(flag[a+1]))
 { fprintf(fp," ");
 for(i=0;i<flag[a+2];i++)
 { fprintf(fp," "); }
 goto THERE;
 }
 }
 for(i=0;i<(7-flag[a+1]);i++) { fprintf(fp," "); } flag[a+1]=0;
 fprintf(fp," ");
THERE: while(date[a+2]<=days[a+2])
 { fprintf(fp,"%4d",date[a+2]++);
 flag[a+2]=++flag[a+2]%7;
 if(!(flag[a+2]))
 { fprintf(fp," ");
 for(i=0;i<flag[a+3];i++)
 { fprintf(fp," "); }
 goto FOUR;
 }
 }
 for(i=0;i<(7-flag[a+2]);i++) { fprintf(fp," "); } flag[a+2]=0;
 fprintf(fp," ");
FOUR: while(date[a+3]<=days[a+3])
 { fprintf(fp,"%4d",date[a+3]++);
 flag[a+3]=++flag[a+3]%7;
 if(!(flag[a+3]))
 { fprintf(fp,"\n"); goto ONE; }
 }
 fprintf(fp,"\n");
 for(i=a;i<a+3;i++)
 { if(date[i]<=days[i]) /* print the tail of every month if they are not finished. */
 { while(date[i]<=days[i]) { fprintf(fp,"%4d",date[i]++); flag[i]++; }
 while(flag[i]++<7) { fprintf(fp," "); }
 fprintf(fp," ");
 }
 else fprintf(fp," ");
 }

 fprintf(fp,"\n");
 a+=4;
 }
 fp=fclose("2004.txt");
}

5楼

虽然运行的结果是正确的,但我在这程序中用了4次goto语句,程序不够稳定、不易维护,有没有谁可以帮我改一下?(用for或者if-else或者其它的语句替代goto语句)。谢谢!

6楼

要求:用C语言编程,打印2004年日历,输出到文件2004.txt中,
 日历格式如下图:   (怎么没人理我啊?!)

218.19.141.*

7楼

很难哦。
210.77.6.*

8楼

#include <stdio.h>
#include <time.h>
int main(int argc, char** argv)
{
time_t t0;
struct tm t;
char w[7][5]={ "sun","mon","tur","wen","thu","fri","sta" };
char m[12][4]={ "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" };

t.tm_min=0;
t.tm_sec=0;
t.tm_hour=0;
t.tm_year=2004-1900;
t.tm_mday=1;
t.tm_mon=0;
t0=mktime(&t);

int i,j,k;
for(i=0;i<12;i++)
{
printf("%s\n",m[i]);
for(j=0;j<7;j++)printf("%s\t",w[j]);
printf("\n");
for(k=0;k<t.tm_wday;k++)printf("\t");
while(t.tm_mon==i)
{
printf("%d\t",t.tm_mday);
if(t.tm_wday==6)printf("\n");
t0+=3600*24;
t=*gmtime(&t0);
}
printf("\n");
}
return 0;
}

210.77.6.*

9楼

当然上面的程序不完全符合要求,呵呵。还得自己改改。
我不大明白,为什么要这么奇怪的要求,一行打印4个月。

我是assiss。不知道是谁封了我还是百度出了问题,我不能登陆了。

10楼

assiss,你的程序输出第一个月有点问题:
Jan
sun   mon   tur   wen   thu   fri   sta
                1    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

我把t的初值改了一下,再运行就正常了:
t.tm_min=59;
t.tm_sec=59;
t.tm_hour=23;

11楼

真奇怪,在我电脑上输出结果和你的不一样的。
我这里很正常,不需要任何修改。
难道是系统的问题?
请大家在各个系统上帮测试一下。

12楼

至于为什么要一行打印四个月,那是我们老师要求的。(我不是来要作业的,我已经编出来了,上面的图片就是我运行的结果)

一行打印一个月有点小儿科了,打印四个月难度会增加很多!循环很麻烦!

谢谢你提供源码,很有参考价值,用“struct tm”来做值得借鉴。

13楼

我的程序用了4次goto语句,虽然运行的结果是正确的,但程序不够稳定、不易维护,有没有谁可以帮我改一下?(用for或者if-else或者其它的语句替代goto语句)。谢谢!

14楼

是不是要作业的人,嘿嘿,我能看出来。你不用多解释。我相信我的眼力。
至于一行打4个月的,也不会难到哪里去,只要稍微换一下思路。
给个思路给你:用数组存储365天的情况,然后打印。

15楼

这是一个让我非常不满意的程序。
尽管它勉强完成了题目。
究其不满意的根源,在于这种题目:又要求算法,又要求复杂的输出格式。
就好像zfy办的协会一样,过分追求了界面,这对学C语言是非常有害的。
界面的输出,应该由专门的函数来完成,而不应该像这样,集中在一个程序里。

另: 流浪的Shaka 你给的程序(4楼)能运行吗?我在我电脑上不能运行。

#include <stdio.h>
#include <time.h>
int main(int argc, char** argv)
{
    time_t t0;
    struct tm t;
    char w[7][5]={ "sun","mon","tur","wen","thu","fri","sta" };
    char m[12][4]={ "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" };
    int days[12],week[12];

    
    int i,j,k,a[4];
    
    for(i=0;i<12;i++)
    {
        t.tm_min=0;
        t.tm_sec=0;
        t.tm_hour=0;
        t.tm_year=2004-1900;
        t.tm_mday=1;
        t.tm_mon=i+1;
        t0=mktime(&t)-1;
        t=*gmtime(&t0);
        days[i]=t.tm_mday;
        
        t.tm_min=0;
        t.tm_sec=0;
        t.tm_hour=0;
        t.tm_year=2004-1900;
        t.tm_mday=1;
        t.tm_mon=i;
        t0=mktime(&t);
        t=*gmtime(&t0);
        week[i]=t.tm_wday;
    }
    
    
    for(i=0;i<3;i++)
    {
        a[0]=a[1]=a[2]=a[3]=1;
        for(j=0;j<4;j++)printf("%28s",m[i*4+j]);
        printf("\n");
        for(j=0;j<4;j++)
        {
            for(k=0;k<7;k++)
            {
                printf("%4s",w[k]);
            }
            printf(" ");
        }

16楼

        for(j=0;j<4;j++)
        {
            for(k=0;k<week[i*4+j];k++);            
        }
        printf("\n");
        while(a[0]<=days[i*4] ||a[1]<=days[i*4+1] ||a[2]<=days[i*4+2] ||a[3]<=days[i*4+3])
        {
            for(j=0;j<4;j++)
            {
                if(a[j]==1)for(k=0;k<week[i*4+j];k++)printf(" ");
                for(;a[j]<=days[i*4+j];a[j]++)
                {
                    printf("%4d",a[j]);
                    if((a[j]+week[i*4+j])%7==0)
                    {
                        a[j]++;
                        break;
                    }                    
                }
                if(a[j]>days[i*4+j]+1)
                {
                    printf("%28s"," ");
                }
                else if(a[j]==days[i*4+j]+1)
                {
                    for(;(a[j]+week[i*4+j]-1)%7!=0;a[j]++)printf(" ");
                }
                printf(" ");
            }
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}

17楼

心情给这道题弄得很糟。
中国人做表面文章的功夫是天下第一的。
现在国内也依然是界面第一。
这样做出来的东西能赚一时的钱,又能维持几时?
国家的强盛,又岂是这些花哨能做到的?
心,隐隐地痛,不知痛到何时……

18楼

回15楼:把最后一句:fp=fclose("2004.txt");  去掉,就可以运行了。
我重新帖一下:
/* FOR YEAR 2004*/
#include<stdio.h>

int main()
{  FILE *fp;
  char weekday[7][5]={ "sun","mon","tur","wen","thu","fri","sta" };
  char M[12][4]={ "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep",
   "Oct","Nov","Dec" };
  int days[12], flag[12],date[12];
                /* 28<=days[i]<=31; 0<=flag[i]<7; 1<=date[i]<=days[i]; */
  int a=0,i,j,k=0;

  days[0]=days[2]=days[4]=days[6]=days[7]=days[9]=days[11]=31;
  days[1]=29; days[3]=days[5]=days[8]=days[10]=30;

  for(i=0;i<12;i++) { date[i]=1; }
  flag[0]=4;      /* the Jan frist day is Friday. */
  for(i=1;i<12;i++)  /* The frist day of month(i) is flag[i] */
  {  flag[i]=(days[i-1]+flag[i-1])%7;  }
  fp=fopen("F:\\2004.txt","w");
  fprintf(fp,"2004:\n");

  while(a<9)      /* a(a to a+3) is valued by 0(0,1,2,3), 4(4,5,6,7), 8(8,9,10,11). */
  {
     while(k<=a+3)
     {   fprintf(fp,"%-34s",M[k++]); }   /* print: "Jan Feb Mar Apr " */
     fprintf(fp,"\n");
     for(i=0;i<4;i++)          /* print: "sun mon tur wen thu fri sta"  */
     {  for(j=0;j<7;j++)
       {  fprintf(fp,"%4s",weekday[j]); }
       fprintf(fp,"   ");
     }
     fprintf(fp,"\n");
     for(i=0;i<flag[a];i++)     /* print the space before 1th. */
     {  fprintf(fp,"  ");  }
ONE:   while(date[a]<=days[a])  /* print(e.g):   1 2 3/4 5 6 7 8 9 10/11 12 13...../ 18 19.../... */
   {  fprintf(fp,"%4d",date[a]++);
     flag[a]=++flag[a]%7;
     if(!(flag[a]))
     {  fprintf(fp,"   ");
     for(i=0;i<flag[a+1];i++)  /* print the space before 1th of the next month. */
     {  fprintf(fp,"  "); }
   goto TWO;
     }
   }
     for(i=0;i<(7-flag[a]);i++) { fprintf(fp,"  "); }  flag[a]=0;
                 /* print the space after the last date of the month. */
     fprintf(fp,"   ");     /* print the space btween the month and the next one. */
TWO:   while(date[a+1]<=days[a+1])
   {   fprintf(fp,"%4d",date[a+1]++);
      flag[a+1]=++flag[a+1]%7;
      if(!(flag[a+1]))
      {  fprintf(fp,"   ");
      for(i=0;i<flag[a+2];i++)
      {  fprintf(fp,"  "); }
      goto THERE;
      }
   }
     for(i=0;i<(7-flag[a+1]);i++) { fprintf(fp,"  "); }  flag[a+1]=0;
     fprintf(fp,"   ");
THERE:  while(date[a+2]<=days[a+2])
   {   fprintf(fp,"%4d",date[a+2]++);
      flag[a+2]=++flag[a+2]%7;
      if(!(flag[a+2]))
      {  fprintf(fp,"   ");
      for(i=0;i<flag[a+3];i++)
      {  fprintf(fp,"  "); }
      goto FOUR;
      }
   }
     for(i=0;i<(7-flag[a+2]);i++) { fprintf(fp,"  "); }  flag[a+2]=0;
     fprintf(fp,"   ");
FOUR:  while(date[a+3]<=days[a+3])
   {   fprintf(fp,"%4d",date[a+3]++);
      flag[a+3]=++flag[a+3]%7;
      if(!(flag[a+3]))
      {  fprintf(fp,"\n");  goto ONE; }
   }
     fprintf(fp,"\n");
     for(i=a;i<a+3;i++)
     {  if(date[i]<=days[i])       /* print the tail of every month if they are not finished. */
       { while(date[i]<=days[i]) { fprintf(fp,"%4d",date[i]++); flag[i]++; }
      while(flag[i]++<7) { fprintf(fp,"  ");  }
      fprintf(fp,"   ");
       }
       else fprintf(fp,"                 ");
     }

     fprintf(fp,"\n");
     a+=4;
  }
  return 0;
}

将上面的源码复制到记事本中,在菜单里选择 “编辑——替换”,会弹出一个窗口,在替换内容(N)、替换为(P)里分别填入:中文状态下的空格一个(全码)、英文状态的空格(半码)两个,然后选择“全部替换”。最后将记事本中的源码复制到编译器中即可运行。

19楼

回15楼:把最后一句:fp=fclose("2004.txt");  去掉,就可以运行了。
====
去掉的作法是不规范的。
应该改为这样:
fclose(fp);

20楼

哦,是这样啊,我开始编的时候没有那一句,后来为了规范才加上的,编译了一下没有错误,我就没管了,呵呵~!~!

PS:看来关于文件的输入输出还得再看看书。

21楼

晕,好复杂

22楼

呵呵,你自己先想想,然后看看别人写的代码,应该不是委难的,呵呵。
下面的是assiss编的,我稍微修改了一下:
#include <stdio.h>
#include <time.h>
int main(int argc, char** argv)
{
 time_t t0;
 struct tm t;
 char w[7][5]={ "sun","mon","tur","wen","thu","fri","sta" };
 char m[12][4]={ "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" };
 int days[12],week[12];
 FILE *fp;
 int i,j,k,a[4];

 if((fp=fopen("d:\\assiss3.txt","w"))==NULL)
 {
 printf("error! can't open the file!");
 system("pause");
 exit(1);
 }
 

 for(i=0;i<12;i++)
 {
 t.tm_min=0;
 t.tm_sec=0;
 t.tm_hour=0;
 t.tm_year=2004-1900;
 t.tm_mday=1;
 t.tm_mon=i+1;
 t0=mktime(&t)-1;
 t=*gmtime(&t0);
 days[i]=t.tm_mday; //保存第(i+1)个月的天数。

 t.tm_min=0;
 t.tm_sec=0;
 t.tm_hour=0;
 t.tm_year=2004-1900;
 t.tm_mday=1;
 t.tm_mon=i;
 t0=mktime(&t);
 t=*gmtime(&t0);
 week[i]=(t.tm_wday+1)%7; //保存第(i+1)个月的第一天星期几(星期日到星期六0~6)。
 printf("%d\t%d\n",days[i],week[i]);
 }
 
 
 for(i=0;i<3;i++)
 {
 a[0]=a[1]=a[2]=a[3]=1;
 for(j=0;j<4;j++) fprintf(fp,"%-29s",m[i*4+j]);
 fprintf(fp,"\n");
 for(j=0;j<4;j++)
 {
 for(k=0;k<7;k++)
 {
 fprintf(fp,"%-4s",w[k]);
 }
 fprintf(fp," ");
 }

 fprintf(fp,"\n");
 while(a[0]<=days[i*4] ||a[1]<=days[i*4+1] ||a[2]<=days[i*4+2] ||a[3]<=days[i*4+3])
 {
 for(j=0;j<4;j++)
 {
 if(a[j]==1) for(k=0;k<week[i*4+j];k++) fprintf(fp,"%4s"," ");
 for(;a[j]<=days[i*4+j];a[j]++)
 {
 fprintf(fp,"%-4d",a[j]);
 if((a[j]+week[i*4+j])%7==0)
 {
 a[j]++;
 break;
 } 
 }

 if(a[j]==days[i*4+j]+1)
 {
 for(;(a[j]+week[i*4+j]-1)%7!=0;a[j]++) fprintf(fp,"%4s"," ");
 }
 else if(a[j]>days[i*4+j]+1)
 {
 fprintf(fp,"%28s"," ");
 }

 fprintf(fp," ");
      }//end of for(j)
      fprintf(fp,"\n");
    } //end of while()
    fprintf(fp,"\n");
  }//end of for(i)
  fclose(fp);
  system("pause");
  return 0;

//
将上面的源码复制到记事本中,在菜单里选择 “编辑——替换”,会弹出一个窗口,在替换内容(N)、替换为(P)里分别填入:中文状态下的空格一个(全码)、英文状态的空格(半码)两个,然后选择“全部替换”。最后将记事本中的源码复制到编译器中即可运行。

23楼

/***偶也来贴个,刚写的。回车后打印各月月份。2005的月份哦。现在是2005年嘛。format[0]=4 day[1]=28 可打印2004的月份****/
#include <stdio.h>

void main()
{
int day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int format[12];
int i,j,k;
format[0]=6;

for (i=1;i<12;i++)
format[i]=(format[i-1]+day[i-1])%7;

printf("||**2005's Month**||\n");
for (i=0;i<12;i++)
{
printf("  The %dth Month\n",i+1);
printf(" Sun Mon Tur Wen Thu Fri Sta\n");

for (k=0;k<format[i];k++)
{
printf(" ");
}
for (j=1;j<=day[i];j++)
{



if((format[i]+j)%7==0)
{
printf(" ");
if (j<10)
{
printf(" %d",j);
}
else
printf("%d",j);
printf("\n");
}

else
{
if (j<10)
{
printf(" %d",j);
}
else
printf(" %d",j);
}


}
printf("\n\n");
getch();
}
}

24楼

format[]用于控制每个月前的空格数
我在Tc下编译通过。
这只是个雏形吧。还可以完善!!

25楼

waiwai1025 ,我试了一下,只有你这个可以在我的win-tc和tc2下编译成功。谢谢,我拿来好好学习一下
222.208.41.*

26楼

DAGGGGGGGGGGGGGGGGGGGGGFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDDDDDRRRRRRRRRRRRRRRRGQWVJ;REGVL;SLF,JGWH'HK
221.235.70.*

27楼

我也在waiwai1025的帮助下运行成功了
不过要谢谢所有的师傅们

59.69.171.*

28楼

你很厉害

29楼

《C语言程序设计》综合性程序设计(文科类)

实验名称:万年历的查询及打印
【目的】 
1.
利用所学的三种程序基本结构以及数组、用户自定义函数进行一个中型程序的设计,进一步理解和掌握C语言的语法以及三种基本程序结构的综合应用。
2.
通过程序中涉及到的操作加深对算法、程序设计思路、常用程序设计技巧的理解与掌握,逐步培养学生的程序开发能力。 

【内容】:设计一个查询并打印万年历的程序。
【步骤】:
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整除,同时又能被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,所以该日是星期三。


( )
那位高手帮帮我呀
我明天就要用了

220.175.15.*

30楼

怎么还没有人回复呀!!!!!!!!!

发表回复

内 容:
用户名:
  
©2010 Baidu 贴吧协议  意见反馈