📄 wnl.c
字号:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
/*getch()所得值宏命名*/
#define CESC 1
#define CBACK 8
#define CSPACE 32
#define CENTER 13
#define CTAB 9
#define CSHIFT_P 80 /*shift+p之值*/
#define X " Sun Mon Tue Wed Thu Fri Sat"/*将星期输出,每一个包括空格占四个位置,以便格式化输出于屏幕*/
#define P printf
#define B break
#define FP fprintf
char gstr[50];/*用以存放getstr()函数所获得的数据的外部变量,以便交流数据*/
char *intos(int num){
char ax[50];
if(num==0){
ax[0]='\0';return ax;
}
return itoa(num,ax,10);
}
int getstr(int amax,int px,int py,char *p,int allow){
/*------从键盘获得数据并进行相应处理,不允许输入空格,可以勉强有效控制用户乱输入数据,因时间有限,可能有缺陷-------*/
/*---amax表示允许的最大字符数-------*/
/*---allow表示允许的输入的数据类型,如果其值为1表示整型,2表示字符串-------*/
/*---p给出初始数据-------*/
/*---px,py表示准备输入时之光标横纵坐标-------*/
/*---ny(返回值)表示输入完毕后光标纵坐标的的移动。其值为正负一-------*/
char ch;
int ny,i,minpx;
minpx=px;
for(i=px;i<px+amax;i++)cprintf(" ");/*----首先将px到px+amax位置全部用空格占掉-----*/
gotoxy(px,py);
strcpy(gstr,p);
for(i=0;gstr[i];i++){
cprintf("%c",gstr[i]);px++;
}
for(i=0;i<50;){
ch=getch();
if(allow==1&&ch>='0'&&ch<='9'&&i+1<=amax){
/*当输入整型数时*/
cprintf("%c",ch);
px++;
gstr[i]=ch;
i++;
}
if(ch==CBACK&&px>minpx){
/*当按下back space键时*/
px--;
gotoxy(px,py);
cprintf(" ");
gotoxy(px,py);
gstr[i-1]='\0';
i--;continue;
}
if(ch==CSPACE){
/*当按下空格键时*/
continue;
}
if(ch==CTAB){
/*当按下tab键时*/
ny=1;
return ny;
}
if(ch==CSHIFT_P||ch==CSHIFT_P+32){
/*当按下shift+p键时,执行shift+tab类似功能*/
ny=-1;
return ny;
}
if(ch==CENTER){
/*当按下回车时,初步提交数据*/
ny=0;
return ny;
}
if(allow==2&&i+1<=amax){
/*当输入字符串时*/
cprintf("%c",ch);
px++;
gstr[i]=ch;
i++;
}
}
}
void print(int n){ /*输出N个空格*/
int i;
for(i=0;i<n;i++) printf(" ");
}
int day(int year){ /*求得本年第一天是星期几*/
long a,b;
if(year<=2000){
a=2000-year;b=6-(a+a/4-a/100+a/400)%7; return b;
}
else {
a=year-2000; b=(a+1+(a-1)/4-(a-1)/100+(a-1)/400)%7+6; return b%7;
}
}
void main(){
int i,j,k,m,n,f1,f2,year,d;
int isf=0;/*标记,是否存盘*/
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; /*将a[0]空出,以便按习惯处理,每个月的天数*/
char fname[]="c:\\clendary.txt"; /*存放文件名*/
char gch;
FILE *fw;
clrscr();
/*全屏背景设计初始为蓝色*/
textbackground(1);
for(i=0;i<25;i++)insline();
/*全屏背景设计初始为蓝色结束*/
textcolor(14);
clrscr();/*清屏,随后输出的字符均将以黄色输出*/
gotoxy(25,5);
textcolor(14);
P("03级计算机课程设计系列之-------万年历系统:");
gotoxy(30,6);P("学生:陈欢");
gotoxy(30,7);P("班级:03级计算机6班");
gotoxy(28,8);P("请按<回车>进入本系统");
while(1){
gch=getch();
if(gch==13)break;
}
gotoxy(10,10);
P(" 请输入年份:");
gotoxy(13,11); P("[ ]");
while(!gstr[0])getstr(5,14,11,"",1);
year=atoi(gstr);
P("\n\n 是否将%d年的年厉存盘y/n[ ]:\b\b\b",year);
while(1){
gch=getch();
if(gch=='Y'||gch=='y'){isf=1;break;}
if(gch=='N'||gch=='n'){isf=0;break;}
}
if(isf==1){
fw=fopen(fname,"w+"); /*打开文件*/
if(fw==NULL){
P(" can not open file."); return;
}
}
clrscr();
gotoxy(18,24); P("学生:陈欢 班级:03级计算机6班 类型:课程设计");
gotoxy(25,2); P("03级计算机课程设计系列之-------万年历系统:");
gotoxy(35,4);P("%d的年历\n",year);
if(isf==1)FP(fw," %d的年历\n",year);
d=day(year);/*算得本年第一天是星期几*/
if(year%4==0&&year%100||year%400==0) a[2]++; /*如果是闫年,二月的天数加一*/
for(i=1;i<=12;i+=2){
m=0; n=0; f1=0; f2=0;
switch(i){
case 1:P(" Januray 1 "); if(isf==1)FP(fw," Januray 1 "); B;
case 3:P(" March 3 "); if(isf==1)FP(fw," March 3 "); B;
case 5:P(" May 5 "); if(isf==1)FP(fw," May 5 "); B;
case 7:P(" July 7 "); if(isf==1)FP(fw," July 7 "); B;
case 9:P(" September 9 "); if(isf==1) FP(fw," September 9 "); B;
case 11:P(" Nevember 11 "); if(isf==1)FP(fw," Nevember 11 "); B;
}
print(21); /*输出21个空格*/
if(isf==1)for(k=0;k<21;k++) fprintf(fw," ");
switch(i+1){
case 2:P(" February 2 ");if(isf==1) FP(fw," February 2 ");B;
case 4:P(" April 4 ");if(isf==1) FP(fw," April 4 ");B;
case 6:P(" June 6 ");if(isf==1) FP(fw," June 6 ");B;
case 8:P(" August 8 "); if(isf==1) FP(fw," August 8 "); B;
case 10:P(" October 10 ");if(isf==1) FP(fw," October 10 ");B;
case 12:P(" December 12");if(isf==1) FP(fw," December 12");B;
}
P("\n");
if(isf==1) fprintf(fw,"\n");
P(X);if(isf==1) fprintf(fw,X); print(6);
if(isf==1)fprintf(fw," "); P(X); if(isf==1)fprintf(fw,X);
if(isf==1) fprintf(fw,"\n"); P("\n");
/*处理本个月的天数格式分布并输出*/
for(j=0;j<6;j++){/*j表示对本个月天数分六行处理,其中第一行要特别注意他的星期数与第一日对齐*/
if(j==0){
print(d*4); for(k=0;k<d*4;k++)if(isf==1) fprintf(fw," ");/*分别对屏幕和文件输出4*d个空格*/
for(k=0;k<7-d;k++){
P("%4d",++m);if(isf==1) fprintf(fw,"%4d",m);
}
print(6); if(isf==1)fprintf(fw," ");
d+=a[i]%7; d%=7; /*已知本月一日是星期几,求得下一个月一日是星期几*/
print(d*4); for(k=0;k<d*4;k++)if(isf==1) fprintf(fw," ");
for(k=0;k<7-d;k++) {
P("%4d",++n);if(isf==1) fprintf(fw,"%4d",n);
}
P("\n");if(isf==1) fprintf(fw,"\n");
}
else{
for(k=0;k<7;k++){
if(m<a[i]){
P("%4d",++m); if(isf==1)fprintf(fw,"%4d",m);
}
else{
print(4); if(isf==1) fprintf(fw," ");
}
if(m==a[i]) f1=1; /*如果已达最后一天,f1=1*/
}
print(6);if(isf==1) fprintf(fw," ");
for(k=0;k<7;k++){
if(n<a[i+1]){
P("%4d",++n);if(isf==1)fprintf(fw,"%4d",n);
}
else{
print(4); if(isf==1)fprintf(fw," ");
}
if(n==a[i+1]) f2=1; /*如果已达最后一天,f2=1*/
}
P("\n"); if(isf==1)fprintf(fw,"\n");
if(f1&&f2) B; /*如果两个都达到最后一天,退出循环*/
}
}
d+=a[i+1]%7; d%=7; /*计算下一个月的第一天是星期几*/
P(" "); if(isf==1) fprintf(fw," ");
for(k=0;k<27;k++) {P("="); if(isf==1)fprintf(fw,"=");}
print(6);if(isf==1)fprintf(fw," "); P(" "); if(isf==1) fprintf(fw," ");
for(k=0;k<27;k++) {P("=");if(isf==1)fprintf(fw,"=");}
P("\n"); if(isf==1)fprintf(fw,"\n");
if(i==3||i==7){
printf(" 因屏幕显示范围有限,本页只显示4个月.查看下一页请按[Y]\b\b");
while(1){
gch=getch();
if(gch=='Y'||gch=='y')break;
}
clrscr();
gotoxy(18,24); P("学生:陈欢 班级:03级计算机6班 类型:课程设计");
gotoxy(25,2);
P("03级计算机课程设计系列之-------万年历系统");
gotoxy(35,4);
P(" %d的年历\n",year);
}
}
if(isf==1) fclose(fw);
if(isf==1) printf(" %d年的年历已经以文本形式成功保存存在%s",year,fname);
printf(" 要退出请按[Y]\b\b");
while(1){
gch=getch();
if(gch=='Y'||gch=='y')break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -