|
1楼 格式如下图: |
|
|
|
|
3楼 http://photo.wangyou.com/showpic.php?dirid=36497&imgid=788283 |
|
|
|
|
4楼 /* 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楼 |
|
|
|
| 218.19.141.* |
7楼 |
|
|
| 210.77.6.* |
8楼 #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楼 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; |
|
|
|
|
12楼 一行打印一个月有点小儿科了,打印四个月难度会增加很多!循环很麻烦! 谢谢你提供源码,很有参考价值,用“struct tm”来做值得借鉴。 |
|
|
|
|
13楼 |
|
|
|
|
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(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楼 我重新帖一下: /* 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楼 ==== 去掉的作法是不规范的。 应该改为这样: fclose(fp); |
|
|
|
|
20楼 PS:看来关于文件的输入输出还得再看看书。 |
|
|
|
|
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楼 #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楼 我在Tc下编译通过。 这只是个雏形吧。还可以完善!! |
|
|
|
| 222.208.41.* |
26楼 |
|
|
| 221.235.70.* |
27楼 不过要谢谢所有的师傅们 |
|
|
| 59.69.171.* |
28楼 |
|
|
|
29楼 实验名称:万年历的查询及打印 【目的】 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楼 |
|
|

