一、杂谈
大一学了C之后一直困惑,C到底怎么用?它不像HTML那么直观,也没有SQL那么常用,更没有Java那么功能强大,那他为何还存在,并依然火热呢?
答案很简单:编程语言是一家,C语言结构简单,但所蕴含的逻辑思维和其他语言大致相同,适合初学者。
编程不是一蹴而就,能力需要日积月累,推荐想我一样的初学者,大家自己动手玩玩简单的C程序!
二、万年历
像这样一个简单的全年日历,仔细观察不难发现由每个月的日历组成,每个月有最多6行,占6周,每周7天;
程序如下:
设定日历大小:
1
2
3
4
5
6
7
|
int date[12][6][7]; //12个月,每月最多6行,每行7天 int calendar[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31}, //平年 {31,29,31,30,31,30,31,31,30,31,30,31}}; //闰年 int year; char title[]= "SUN MON TUE WED THU FRI SAT" ; //周几 int sw,leap,i,j,k,wd,day; //变量 // sw 周几,leap 0平年 1闰年,i,j,k辅助变量,wd 第几周,day 日 |
提示用户输入想要查询的年份:(回车换行)
1
2
|
printf ( "Please input the year whose calendar you want to know: " ); scanf ( "%d%*c" ,&year); |
再计算该年1月1 日是起于周几:
(由于公元1月1日设为星期六,故3月1日为星期三。为使算法达到最简,故本算法以“星期”为计算单位。且选3月1日为基月。
每 4年(3个平年+1个闰年)共208周+5天 =208*7+5=1461
每百年共100*(208周+5天)-1天=5217周+5天 (整百年暂设为平年)
每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天
即400年一轮回!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
long int getyear( int year, int month){ if (month<3) return year-1; //以元年3月为基石 else return year; } long int getmonth( int month){ if (month<3) return month+13; //将月份调至下个月 else return month+1; } long int getday( int year, int month, int day){ return 1461L*getyear(year,month)/4+153L*getmonth(month)/5+day; //计算距离元年3月1日天数 //计算方法:每四年一周期1461天(相当于计算平均每年多少天) //每五个月一周期153天(相当于计算平均每月多少天) } int getweekday( int year, int month, int day){ return ( int )((getday(year,month,day)%7-2+7)%7); //得该日期的星期数 //得到的天数除以7天取余,减去3月1日周三,其他均为保证正数1-7的附加计算 } |
判断是否为闰年:
1
|
leap= year%4==0 && year%100||year%400==0 ; |
将日历置为空:
1
2
3
4
|
for (i=0;i<12;i++) for (j=0;j<6;j++) for (k=0;k<7;k++) date[i][j][k]=0; |
填充该年日期:
1
2
3
4
5
6
7
8
|
sw=getweekday(year,1,1); for (i=0;i<12;i++) for (wd=0,day=1; day <= calendar[leap][i]; day++){ date[i][wd][sw]=day; sw = ++sw%7; if (sw==0) wd++; } |
格式化输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
printf ( "\n|==================The Calendar of Year %d =====================|\n|" ,year); for (i=0;i<6;i++){ for (wd=0,k=0;k<7;k++) wd+=date[i][5][k]+date[i+6][5][k]; wd=wd?6:5; printf ( "%2d %s %2d %s |\n|" ,i+1,title,i+7,title); for (j=0;j<wd;j++){ printf ( " " ); for (k=0;k<7;k++) if (date[i][j][k]) printf ( "%4d" ,date[i][j][k]); else printf ( " " ); printf ( " " ); for (k=0;k<7;k++) if (date[i+6][j][k]) printf ( "%4d" ,date[i+6][j][k]); else printf ( " " ); printf ( " |\n|" ); } scanf ( "%*c" ); } puts ( "=================================================================|" ); puts ( "\n Press any key to quit..." ); |
结果为
完整代码:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#include "stdio.h" long int getyear( int year, int month){ if (month<3) return year-1; else return year; } long int getmonth( int month){ if (month<3) return month+13; else return month+1; } long int getday( int year, int month, int day){ return 1461L*f(year,month)/4+153L*g(month)/5+day; } int getweekday( int year, int month, int day){ return ( int )((n(year,month,day)%7-2+7)%7); } int date[12][6][7]; int calender[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31}, {31,29,31,30,31,30,31,31,30,31,30,31}}; main() { int sw,leap,i,j,k,wd,day; int year; char title[]= "SUN MON TUE WED THU FRI SAT" ; printf ( "Please input the year whose calendar you want to know: " ); scanf ( "%d%*c" ,&year); sw=w(year,1,1); leap=year%4==0&&year%100||year%400==0; for (i=0;i<12;i++) for (j=0;j<6;j++) for (k=0;k<7;k++) date[i][j][k]=0; for (i=0;i<12;i++) for (wd=0,day=1;day<=day_tbl[leap][i];day++){ date[i][wd][sw]=day; sw=++sw%7; if (sw==0) wd++; } printf ( "\n|==================The Calendar of Year %d =====================|\n|" ,year); for (i=0;i<6;i++){ for (wd=0,k=0;k<7;k++) wd+=date[i][5][k]+date[i+6][5][k]; wd=wd?6:5; printf ( "%2d %s %2d %s |\n|" ,i+1,title,i+7,title); for (j=0;j<wd;j++) { printf ( " " ); for (k=0;k<7;k++) if (date[i][j][k]) printf ( "%4d" ,date[i][j][k]); else printf ( " " ); printf ( " " ); for (k=0;k<7;k++) if (date[i+6][j][k]) printf ( "%4d" ,date[i+6][j][k]); else printf ( " " ); printf ( " |\n|" ); } scanf ( "%*c" ); } puts ( "=================================================================|" ); puts ( "\n Press any key to quit..." ); } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/gaobosky/article/details/81387773