作业要求:

代码实现:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>

const int M=5;
const int N=110;
bool flag=true;
int n,cnt;
int a[N<<2],rank[N],mem[N];
double skip;

struct Student{
	bool noob;
	char sex;
	char name[20],id[11];
	double ave,wave;
	double grade[M+1];
}inf[N];

struct Lesson{
	char name[50];
	double credit,sum;
};

Lesson node[M+1]={{},{"数学分析",6},{"线性代数",4},{"计算机程序设计",6},{"英语交流",2},{"英语读写",2}};

void Print_Menu(){
	printf("中国科技大学学生成绩管理系统\n"
	"============================================\n"
	"1. 录入成绩\n"
	"2. 删除成绩\n" 
	"3. 打印所有学生成绩\n"
	"4. 打印所有不及格成绩\n"
	"5. 导入学生成绩\n"
	"6. 打印所有学生成绩到文件\n"
	"7. 按加权平均成绩从高到低排序\n"
	"8. 打印各科平均成绩\n"
	"0. 退出\n"
	"============================================\n"
	"请选择:");
}

bool Check(double x){
	return x>=0&&x<=100;
}

void Check_Noob(int x){
	inf[x].noob=false;
	for(int i=1;i<=M;i++)
		if(inf[x].grade[i]<60){
			inf[x].noob=true;
			return ;
		}
}

double Ave(int x){
	if(inf[x].ave) return inf[x].ave;
	double tmp=0;
	for(int i=1;i<=M;i++)
		tmp+=inf[x].grade[i];
	return tmp/M;
}

double wAve(int x){
	double tmp=0,sum=0;
	for(int i=1;i<=M;i++)
		sum+=node[i].credit;
	for(int i=1;i<=M;i++)
		tmp+=inf[x].grade[i]*node[i].credit/sum;
	return tmp;
}

int Read(){
	system("cls");
	printf("请输入学生姓名、性别和学号(若输入错误,请在成绩处录入非法数据,将自动返回上一级):\n");
	n++;
	mem[n]=n;
	scanf("%s %c %s",inf[n].name,&inf[n].sex,inf[n].id);
	printf("请输入学生成绩:\n"); 
	for(int i=1;i<=M;i++){
		printf("%s:",node[i].name);
		double tmp;
		if(!scanf("%lf",&tmp)||!Check(tmp)) return mem[n--]=0;
		inf[n].grade[i]=tmp;
	}
	Check_Noob(n);
	system("pause");
	return -1;
}

void Print_Grade(int op){
	system("cls");
	printf("姓名       性别       学号       "); 
	for(int i=1;i<=M;i++)
		printf("%-16s ",node[i].name);
	printf("平均分           加权平均分"); 
	putchar('\n');
	for(int i=0;i<=(M+4)<<4;i++)
		putchar('=');
	putchar('\n');
	for(int i=1;i<=n;i++){
		printf("%d:%-10s %-10c %-10s ",i,inf[i].name,inf[i].sex,inf[i].id);
		for(int j=1;j<=M;j++)
			printf("%-16.2f ",inf[i].grade[j]);
		printf("%-16.2f %-16.2f",Ave(i),wAve(i));
		putchar('\n');
	}
	putchar('\n');
	if(op) system("pause");
}

void Print_Noob(){
	system("cls");
	printf("姓名       性别       学号       "); 
	for(int i=1;i<=M;i++)
		printf("%-16s ",node[i].name);
	putchar('\n');
	for(int i=0;i<=(M+2)<<4;i++)
		putchar('=');
	putchar('\n');
	for(int i=1;i<=n;i++){
		if(!inf[i].noob) continue;
		printf("%-10s %-10c %-10s ",inf[i].name,inf[i].sex,inf[i].id);
		for(int j=1;j<=M;j++)
			printf(inf[i].grade[j]>=60?"                 ":"%-16.2f ",inf[i].grade[j]);
		putchar('\n');
	}
	putchar('\n');
	system("pause");
}

int fRead(){
	system("cls");
	printf("导入中……\n"); 
	int Init=n;
	FILE *fp=fopen("grade.txt","r");
	for(;;){
		n++;
		mem[n]=n;
		fscanf(fp,"%s %c %s",inf[n].name,&inf[n].sex,inf[n].id);
		if(!inf[n].name[0]){
			n--;
			break;
		}
		for(int i=1;i<=M;i++){
			double tmp;
			if(!fscanf(fp,"%lf",&tmp)||!Check(tmp)) return n=Init;
			inf[n].grade[i]=tmp;
		}
		fscanf(fp,"%lf",&skip);
		fscanf(fp,"%lf",&skip);
		Check_Noob(n);
	}
	fclose(fp);
	printf("导入完成\n");
	system("pause");
	return -1;
}

void fPrint(){
	system("cls");
	printf("导出中……\n"); 
	FILE *fp=fopen("grade.txt","w");
	for(int i=1;i<=n;i++){
		fprintf(fp,"%-10s %-10c %-10s ",inf[i].name,inf[i].sex,inf[i].id);
		for(int j=1;j<=M;j++)
			fprintf(fp,"%-16.2f ",inf[i].grade[j]);
		fprintf(fp,"%-16.2f%-16.2f\n",Ave(i),wAve(i));
	}
	fclose(fp);
	printf("导出完成\n"); 
	system("pause");
}

void Swap(int *a,int *b){
	int tmp=*a;
	*a=*b;
	*b=tmp;
}

void Insert(int now){
	if(now==1) return ;
	if(inf[a[now]].wave>inf[a[now>>1]].wave){
		Swap(&a[now],&a[now>>1]);
		Insert(now>>1);
	}
}

void Delete(int now){
	if(((now<<1)>cnt)&&((now<<1|1)>cnt)) return ;
	int mx=(inf[a[now<<1]].wave>inf[a[now<<1|1]].wave)?(now<<1):(now<<1|1);
	if(inf[a[now]].wave<inf[a[mx]].wave){
		Swap(&a[now],&a[mx]);
		Delete(mx);
	}
}

void Sort(){
	system("cls");
	Student cpy[n+1];
	int now=0;
	for(int i=1;i<=n;i++){
		inf[i].wave=wAve(i);
		a[++cnt]=i;
		Insert(cnt);
	}
	for(int i=1;i<=n;i++){
		int tmp=a[1];
		a[1]=0;
		Swap(&a[1],&a[cnt]);
		cnt--;
		Delete(1);
		printf("%d:%-10s %-10.2f \n",i,inf[tmp].name,inf[tmp].wave);
		cpy[++now]=inf[tmp];
	}
	for(int i=1;i<=n;i++)
		inf[i]=cpy[i];
	system("pause");
}

void Print_Ave(){
	system("cls");
	for(int i=1;i<=M;i++){
		node[i].sum=0;
		printf("%-16s",node[i].name);
		for(int j=1;j<=n;j++)
			node[i].sum+=inf[j].grade[i];
		printf("%-10.2f\n",node[i].sum/n);
	}
	system("pause");
}

void Remove(){
	Print_Grade(0);
	printf("请输入要删除的序号:");
	int seq;
	scanf("%d",&seq);
	system("cls");
	n--;
	for(int i=seq;i<=n;i++)
		inf[i]=inf[i+1];
	printf("删除完成\n");
	system("pause");
	return ;		 
}

int main(){
	while(flag){
		system("cls");
		Print_Menu();
		int op=getchar()-'0';
		switch(op){
			case 0:flag=false;break;
			case 1:{
				if(Read()>=0){
					printf("格式有误,操作已回滚\n");
					system("pause");
				}
				break;
			}
			case 2:Remove();break;
			case 3:Print_Grade(1);break;
			case 4:Print_Noob();break;
			case 5:{
				if(fRead()>=0){
					printf("格式有误,操作已回滚\n");
					system("pause");
				}
				break;
			}
			case 6:fPrint();break;
			case 7:Sort();break;
			case 8:Print_Ave();break;
		}
	}
	return 0;
}
5 1 vote
文章评分
订阅这个评论
提醒

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

1 评论
最旧
最新 得票最多
Inline Feedbacks
View all comments