作业要求:
代码实现:
#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;
}