[课程设计]杂志订户管理系统

在这里插入图片描述

这个的报告不需要写太多注释,而且是用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;
}

猜你喜欢

转载自blog.csdn.net/cls1277/article/details/112645830