数据结构课设
/*[问题描述]
给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名以及各科成绩组成。对学生的考试成绩进行有关统计,并打印统计表。
[基本要求]
(1) 按总数高低次序,打印出名次表,分数相同的为同一名次;
(2) 按名次打印出每个学生的学号、姓名、总分以及各科成绩。*/
#include
#include
#include
#include
#define maxsize0 100
#define maxsize1 10
struct subjects
{
float grade;
char course[20];
}sub[maxsize1];
struct students
{
int num;
int room;
char name[20];
float total;
int rank;
struct subjects sub[maxsize1];
}stu[maxsize0];
typedef struct
{
int M,N;
struct students stu[maxsize0];
struct subjects sub[maxsize1];
}number;
number Num;
void save0()
{
FILE *fp;
int i,j,k;
if((fp=fopen("Student.txt","w"))==NULL)
{
printf("\n文件打开失败!\n");
exit(0);
}
if(Num.stu[0].total!=0)
fprintf(fp,"名次 ");
fprintf(fp,"学号 姓名");
for(j=0;j
{
fprintf(fp," %s",Num.sub[j].course);
}
if(Num.stu[0].total!=0)
fprintf(fp," 总分\n");
else fprintf(fp,"\n");
for(i=0;i
{
if(Num.stu[0].total!=0)
fprintf(fp,"%4d ",Num.stu[i].rank);
fprintf(fp,"%d",Num.stu[i].num);
k=strlen(Num.stu[i].name);
while(8-k>0)
{
fprintf(fp," ");
k++;
}
fprintf(fp," %s ",Num.stu[i].name);
for(j=0;j
{
k=strlen(Num.sub[j].course);
while(k-4>0)
{
fprintf(fp," ");
k-=2;
}
fprintf(fp,"%.1f ",Num.stu[i].sub[j].grade);
}
if(Num.stu[0].total!=0)
fprintf(fp,"%.1f\n",Num.stu[i].total);
else fprintf(fp,"\n");
}
fclose(fp);
}
void save()
{
FILE *fp;
int i;
if((fp=fopen("Student.dat","w"))==NULL)
{
printf("\n不能打开文件\n");
exit(0);
}
for(i=0;i
{
if(fwrite(&Num,sizeof(number),1,fp)!=1)
printf("文件输入错误\n");
}
fclose(fp);
save0();
}
void load()
{
FILE *fp;
int i;
if((fp=fopen("Student.dat","r"))==NULL)
{
printf("\n不能打开文件\n");
exit(0);
}
for(i=0;!feof(fp);i++)
{
fread(&Num,sizeof(number),1,fp);
}
fclose(fp);
}
void input()
{
int i,j,y=0;
while(1)
{
printf("请输入将要输入学生的人数: ");
scanf("%d",&Num.N);
printf("\n请输入将要输入学生科目数: ");
scanf("%d",&Num.M);
printf("\n");
if(Num.N>maxsize0) printf("输入信息数过多,请重新输入:\n");
else break;
}
printf("请输入科目数,并且输入相应数字选择科目或添加科目:\n\n");
printf("\t0.高数 1.英语 2.数据结构 3.数字逻辑\n\t4.模电 5.线性代数 6.离散数学 7.添加课程\n");
while(y
{
scanf("%d",&j);
switch(j)
{
case 0:
strcpy(Num.sub[y].course,"高数");break
;
case 1:
strcpy(Num.sub[y].course,"英语");break;
case 2:
strcpy(Num.sub[y].course,"数据结构");break;
case 3:
strcpy(Num.sub[y].course,"数字逻辑");break;
case 4:
strcpy(Num.sub[y].course,"线性代数");break;
case 5:
strcpy(Num.sub[y].course,"模电");break;
case 6:
strcpy(Num.sub[y].course,"离散数学");break;
case 7:
printf("请输入需添加科目:\n");
scanf("%s",Num.sub[y].course);break;
}
y++;
}
printf("请按顺序输入学生学号、姓名以及各科成绩\n");
printf("学号 姓名");
for(y=0;y
{
printf(" %s",Num.sub[y].course);
}
printf("\n");
for(i=0;i
{
scanf("%d %s",&Num.stu[i].num,Num.stu[i].name);
for(y=0;y
{
scanf("%f",&Num.stu[i].sub[y].grade);
}
}
}
void total()
{
float number;
int i,j;
for(i=0;i
{
number=0;
for(j=0;j
{
number=Num.stu[i].sub[j].grade+number;
}
Num.stu[i].total=number;
}
}
int QKPass_total(int low,int high)
{
struct students x;
x=Num.stu[low];
while(low
{
while(low
high--;
if(low
{
Num.stu[low]=Num.stu[high];
low++;
}
while(lowx.total)
low++;
if(low
{
Num.stu[high]=Num.stu[low];
high--;
}
}
Num.stu[low]=x;
return low;
}
void QKSort_total(int low,int high)
{
int pos;
if(low
{
pos=QKPass_total(low,high);
QKSort_total(low,pos-1);
QKSort_total(pos+1,high);
}
}
void rank()
{
int low,high,i,k=1;
total();
low=0;
high=Num.N-1;
QKSort_total(low,high);
for(i=0;i
{
Num.stu[i].rank=k;
k++;
if(Num.stu[i].total==Num.stu[i+1].total)
k--;
}
}
void display()
{
int i=0,j,k;
if(Num.stu[0].total!=0)
{
printf("\t-------------------");
for(j=0;j
{
printf("---");
for(k=strlen(Num.sub[j].course);k>0;k--)
printf("-");
}
printf("---------------");
}
else
{
printf("\t------------------");
for(j=0;j
{
printf("---");
for(k=strlen(Num.sub[j].course);k>0;k--)
printf("-");
}
printf("\n\t▏");
}
if(Num.stu[0].total!=0)
{
printf("\n\t▏名次 ▏");
}
printf("学号 ▏ 姓名 ▏");
for(i=0;i
printf("%s ▏",Num.sub[i].course);
if(Num.stu[0].total!=0)
{
printf(" 总分 ▏\n");
}
if(Num.stu[0].total!=0)
{
printf("\t--------------------------");
for(j=0;j
{
printf("---");
for(k=strlen(Num.sub[j].course);k>0;k--)
printf("-");
}
printf("--------");
}
else
{
printf("\n\t------------------");
for(j=0;j
{
printf("---");
for(k=strlen(Num.sub[j].course);k>0;k--)
printf("-");
}
printf("\t");
}
for(i=0;i
{
if(Num.stu[0].total!=0)
{
printf("\n\t▏%4.d ",Num.stu[i].rank);
}
else printf("
\n\t");
printf("▏%d ▏",Num.stu[i].num);
k=strlen(Num.stu[i].name);
while(8-k>0)
{
printf(" ");
k++;
}
printf("%s ▏",Num.stu[i].name);
for(j=0;j
{
k=strlen(Num.sub[j].course);
while(k-4>0)
{
printf(" ");
k-=1;
}
printf("%.1f ▏",Num.stu[i].sub[j].grade);
}
if(Num.stu[0].total!=0)
{
printf(" %.1f ▏",Num.stu[i].total);
}
printf("\n");
if(Num.stu[0].total!=0)
{
printf("\t--------------------------");
for(j=0;j
{
printf("---");
for(k=strlen(Num.sub[j].course);k>0;k--)
printf("-");
}
printf("--------");
}
else
{
printf("\t------------------");
for(j=0;j
{
printf("---");
for(k=strlen(Num.sub[j].course);k>0;k--)
printf("-");
}
}
}
printf("\n\t***任意键返回主菜单***");
}
void display1()
{
int i,k;
printf("\n\n\t ****名次表****\n");
printf("\t---------------------------\n");
printf("\t▏名次 ▏ 姓名 ▏ 总分 ▏\n");
printf("\t---------------------------\n");
for(i=0;i
{
printf(" \t▏%4d ▏",Num.stu[i].rank);
k=strlen(Num.stu[i].name);
while(8-k>0)
{
printf(" ");
k++;
}
printf("%s ▏",Num.stu[i].name);
printf(" %.1f▏\n",Num.stu[i].total);
printf("\t---------------------------\n");
}
printf("\n\t***任意键返回主菜单***");
}
void menu()
{
int k;
char x;
while(1)
{
printf("\n\n\t ********************************\n");
printf("\t\t 学 生 成 绩 统 计\n");
printf("\t ********************************\n\n");
printf("\t -------------------------\n");
printf("\t\t0. 输入学生信息\n");
printf("\t\t1. 查看学生名次\n");
printf("\t\t2. 学生综合成绩表\n");
printf("\t\t3. 退出系统\n");
printf("\t -------------------------\n");
printf("\t(操作提示:完成一项功能后,任意键可返回主菜单!)\n\n");
printf("\t请输入相应数字选择所要执行操作:[ ]\b\b");
scanf("%d",&k);
switch(k)
{
case 0:
Num.stu[0].total=0;
system("CLS");
input();
system("CLS");
printf("\t **********输入信息如下**********\n");
display();
printf("\n\n\tEnter 保存信息 || Esc 取消保存\n");
x=getch();
if(x==13)
{
save();
printf("\t信息保存成功!\n");
}
else if(x==27)
printf("\t信息已取消保存!\n");
getch();
system("CLS");
break;
case 1:
system("CLS");
load();
rank();
display1();
printf("\n\n\tEnter 保存信息 || Esc 取消保存\n");
x=getch();
if(x==13)
{
save();
printf("\t信息保存成功!\n");
}
else if(x==27)
printf("\t信息已取消保存!\n");
getch();
system("CLS");
break;
case 2:
system("CLS");
load();
rank();
printf("\n\t\t**********成绩表**********\n");
display();
printf("\n
\n\tEnter 保存信息 || Esc 取消保存\n");
x=getch();
if(x==13)
{
save();
printf("\t信息保存成功!\n");
}
else if(x==27)
printf("\t信息已取消保存!\n");
getch();
system("CLS");
break;
case 3:
printf("\n\t**Enter 确定退出 || Esc取消退出**\n");
break;
}
if(k==3)break;
}
}
void main()
{
char x;
menu();
while(1)
{
x=getch();
if(x==13)
break;
else if(x==27)
{
system("CLS");
menu();
}
}
}