前
中
这个的报告不需要写太多注释,而且是用C语言写的,所以我也懒得注释了(嘿嘿
所以呢 大家想看就看看 因为我觉得其中有价值的地方就在于对文件的处理
提示:代码不要完全复制,我留了bug(包括编译错误和逻辑错误哦)
代码直接见后面,仅供参考。
后
#include<stdio.h>
#include<time.h>
#include<string.h>
#include<stdlib.h>
#define Lq 20 //期刊号的最大长度
#define Lr 20 //订户的最大人数
#define Lm 20 //杂志的最多种类数
#define Ln 20 //名字最大字符长度
#define La 20 //地址最大字符长度
#define Lp 20 //电话最大字符长度
#define Lh 20 //期刊名最大字符长度
struct Date {
int year , month;
};
struct Reader {
char name[Ln] , ads[La] , pnum[Lp] , qkh[Lq];
int cnt , mon;
struct Date from , to;
};
struct MAG {
char qkh[Lq] , qkm[Lh];
int cnt , mon;
};
struct Node {
int cnt;
char qkm[Lh];
};
int opp , fm , fr , fo , vis[Lr];
struct MAG mag[Lm];
struct Reader rds[Lr] , out[Lr];
struct Node que[Lm];
void OpenFileMag() {
FILE *m = fopen("MAG.txt","r");
int i;
struct MAG u;
for(i=0;!feof(m);i++) {
fscanf(m,"%s%s%d%d",u.qkh,u.qkm,&u.cnt,&u.mon);
mag[i] = u;
}
fm = i-1;
fclose(m);
}
void OpenFileReader() {
FILE *r = fopen("Reader.txt","r");
int i;
struct Reader v;
for(i=0;!feof(r);i++) {
fscanf(r,"%s%s%s%s%d%d%d%d%d%d",v.name,v.ads,v.pnum,v.qkh,&v.cnt,&v.from.year,&v.from.month,&v.to.year,&v.to.month,&v.mon);
rds[i] = v;
}
fr = i-1;
fclose(r);
}
void OpenFileOutOfDate() {
FILE *o = fopen("OutOfDate.txt","r");
int i;
struct Reader v;
for(i=0;!feof(o);i++) {
fscanf(o,"%s%s%s%s%d%d%d%d%d%d",v.name,v.ads,v.pnum,v.qkh,&v.cnt,&v.from.year,&v.from.month,&v.to.year,&v.to.month,&v.mon);
out[i] = v;
}
fo = i-1;
fclose(o);
}
void WriteFileReader() {
FILE *r = fopen("Reader.txt","w");
int i;
for(i=0; i<fr; i++)
fprintf(r,"%s %s %s %s %d %d %d %d %d %d\n",rds[i].name,rds[i].ads,rds[i].pnum,rds[i].qkh,rds[i].cnt,rds[i].from.year,rds[i].from.month,rds[i].to.year,rds[i].to.month,rds[i].mon);
fclose(r);
}
void WriteOutOfDate() {
FILE *o = fopen("OutOfDate.txt","w");
int i;
for(i=0; i<fo; i++)
fprintf(o,"%s %s %s %s %d %d %d %d %d %d\n",out[i].name,out[i].ads,out[i].pnum,out[i].qkh,out[i].cnt,out[i].from.year,out[i].from.month,out[i].to.year,out[i].to.month,out[i].mon);
fclose(o);
}
void AddReaders() {
int i;
struct Reader u;
OpenFileReader();
printf("\n请按照“姓名 地址 电话号码 期刊号 订阅份数 起订年月 止订年月”的格式输入用户信息\n");
printf("例如:张三 湖北 15100000000 CUG233 2 2020 6 2020 7\n");
scanf("%s%s%s%s%d%d%d%d%d",u.name,u.ads,u.pnum,u.qkh,&u.cnt,&u.from.year,&u.from.month,&u.to.year,&u.to.month);
for(i=0; i<fm; i++)
if(strcmp(mag[i].qkh , u.qkh)==0)
break;
u.mon = ((u.to.year-u.from.year)*12+(u.to.month-u.from.month))*mag[i].cnt*mag[i].mon*u.cnt;
rds[fr] = u; fr++;
WriteFileReader();
}
void GetDate(int *month , int *year) {
time_t timep;
struct tm *p;
time (&timep);
p=gmtime(&timep);
*month = 1+p->tm_mon;
*year = 1900+p->tm_year;
}
int jud(int x , int m , int y) {
if((rds[x].to.year<y)||(rds[x].to.year==y&&rds[x].to.month<m))
return 1;
return 0;
}
int jud2(int x , struct Date d1 , struct Date d2) {
if(((rds[x].from.year==d1.year&&rds[x].from.month>=d1.month)||(rds[x].from.year>d1.year))&&((rds[x].to.year<d2.year)||(rds[x].to.year==d2.year&&rds[x].to.month<=d2.month)))
return 1;
return 0;
}
void DelReaders() {
int i , month , year;
FILE *r;
OpenFileReader();
GetDate(&month,&year);
fo = 0;
memset(vis , 0 ,sizeof(0));
for(i=0; i<fr; i++)
if(jud(i , month , year)==1) {
out[fo++] = rds[i];
vis[i] = 1;
}
WriteOutOfDate();
r = fopen("Reader.txt","w");
for(i=0; i<fr; i++)
if(!vis[i])
fprintf(r,"%s %s %s %s %d %d %d %d %d %d\n",rds[i].name,rds[i].ads,rds[i].pnum,rds[i].qkh,rds[i].cnt,rds[i].from.year,rds[i].from.month,rds[i].to.year,rds[i].to.month,rds[i].mon);
fclose(r);
printf("过期订户记录清理完成\n");
}
void CntReaders() {
int i , month , year , ans = 0;
OpenFileReader();
GetDate(&month,&year);
for(i=0; i<fr; i++)
if(jud(i,month,year)==0)
ans++;
printf("有效杂志订户数:%d\n",ans);
}
void ReadReaders() {
int i , j , month , year , cnt[Lm];
OpenFileMag();
OpenFileReader();
memset(cnt , 0 , sizeof(cnt));
GetDate(&month , &year);
for(i=0; i<fm; i++)
for(j=0; j<fr; j++)
if(strcmp(rds[j].qkh,mag[i].qkh)==0&&jud(j,month,year)==0)
cnt[i]++;
for(i=0; i<fm; i++)
printf("%s杂志有效订阅份数为:%d\n",mag[i].qkm,cnt[i]);
}
void Swap(int a , int b) {
struct Node temp;
temp.cnt = que[a].cnt;
strcpy(temp.qkm , que[a].qkm);
que[a].cnt = que[b].cnt;
strcpy(que[a].qkm , que[b].qkm);
que[b].cnt = temp.cnt;
strcpy(que[b].qkm , temp.qkm);
}
void Sort() {
int i , j , maxx , max_op;
for(i=0; i<fm; i++) {
maxx = que[i].cnt;
max_op = i;
for(j=i+1; j<fm; j++)
if(que[j].cnt>maxx) {
maxx = que[j].cnt;
max_op = j;
}
Swap(i , max_op);
}
}
void PrintSort() {
struct Date from , to;
int i , j;
OpenFileReader();
printf("请输入要查询的时间段,格式为:起始年 起始月 终止年 终止月\n");
printf("例如:2020 6 2020 7\n");
scanf("%d%d%d%d",&from.year,&from.month,&to.year,&to.month);
for(i=0; i<fm; i++) {
strcpy(que[i].qkm , mag[i].qkm);
for(j=0; j<fr; j++)
if(jud2(j,from,to)==1&&strcmp(mag[i].qkh,rds[i].qkh)==0)
que[i].cnt++;
}
Sort();
for(i=0; i<fm; i++)
printf("%s杂志在查询时间段内有效订户数为:%d\n",que[i].qkm,que[i].cnt);
}
void FindReaders() {
int i , j , month , year , flag;
OpenFileOutOfDate();
OpenFileReader();
GetDate(&month , &year);
printf("\n今年没订阅期刊的订户信息如下:\n");
printf("%d\n",fo);
for(i=0; i<fo; i++) {
flag = 0;
for(j=0; j<fr; j++)
if((rds[j].from.year==year)&&strcmp(rds[j].name,out[i].name)==0) {
flag = 1;
break;
}
if(!flag)
printf("%s %s %s %s %d %d %d %d %d %d\n",out[i].name,out[i].ads,out[i].pnum,out[i].qkh,out[i].cnt,out[i].from.year,out[i].from.month,out[i].to.year,out[i].to.month,out[i].mon);
}
}
int main() {
printf("请输入以下功能编号选择功能:\n");
printf("1.增加新订户,输入用户信息\n");
printf("2.根据当天日期,清理订户文件,删除已经到期订户的记录,将其添加到过期订户文件中\n");
printf("3.根据当天日期,统计有效杂志订户数并输出统计结果\n");
printf("4.根据当天日期,统计每种期刊的有效订阅份数\n");
printf("5.查询某个时间段内,对各种期刊按订户数的降序排序结果\n");
printf("6.在过期订户文件中查找,列出今年没有订阅期刊的订户信息\n");
printf("7.退出系统\n");
printf("--------------------------------------------------------------------------------\n");
OpenFileMag();
OpenFileReader();
while(1) {
printf("\n请输入功能编号:");
scanf("%d",&opp);
switch(opp) {
case 1 : AddReaders(); break;
case 2 : DelReaders(); break;
case 3 : CntReaders(); break;
case 4 : ReadReaders(); break;
case 5 : PrintSort(); break;
case 6 : FindReaders(); break;
case 7 : exit(0);
}
}
return 0;
}