#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define N 100 //最大學生數量
#define LEN sizeof(struct student)
FILE *fp;
int n=0; //學生數量
struct student
{
int num;
char name[20];
int x_num;
int class_num;
float score1;
float score2;
float score3;
float total;
float average;
}stu[N]; //學生信息結構體
/*1.學生信息存入文件*/
void creat()
{
int i,j;
struct student t;
printf("輸入學生的數量。(不超過%d)\n",N);
scanf("%d",&n);
if(n>N) exit(0);
printf("依次輸入學生信息:學號 姓名 學院代號 班級號 高數成績 英語成績 C語言成績\n");
for(i=0;i<n;i++)
{
scanf("%d %s %d %d %f %f %f",&stu[i].num,stu[i].name,&stu[i].x_num,&stu[i].class_num,&stu[i].score1,&stu[i].score2,&stu[i].score3);
stu[i].total=stu[i].score1+stu[i].score2+stu[i].score3;
stu[i].average=stu[i].total/3;
}
for(j=0;j<n-1;j++)
for(i=j;i<n-j-1;i++)
{
if(stu[i].num > stu[i+1].num)
{
t=stu[i];
stu[i]=stu[i+1];
stu[i+1]=t;
}
}
if((fp=fopen("student_number","wb"))==NULL) //保存學生數量n
{
printf("can't open file!\n");
exit(0);
}
fwrite(&n,sizeof(int),1,fp);
if((fp=fopen("student","wb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(i=0;i<n;i++)
fwrite(&stu[i],LEN,1,fp);
fclose(fp);
}
/*2.增加壹個學生信息*/
void add()
{
int i,j;
char ch;
struct student t;
if((fp=fopen("student_number","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
fread(&n,sizeof(n),1,fp);
if((fp=fopen("student","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(i=0;i<n;i++)
fread(&stu[i],LEN,1,fp);
printf("依次輸入學生信息:學號 姓名 學院代號 班級號 高數成績 英語成績 C語言成績\n");
scanf("%d %s %d %d %f %f %f",&t.num,t.name,&t.x_num,&t.class_num,&t.score1,&t.score2,&t.score3);
t.total=t.score1+t.score2+t.score3;
t.average=t.total/3;
if(t.num>stu[n-1].num)
{
n=n+1;
stu[n-1]=t;
}
else
for(i=0;i<n;i++)
{
printf("aw\n");
if(t.num<stu[i].num)
{
n=n+1;
for(j=n-2;j>i-1;j--) stu[j+1]=stu[j];
stu[i]=t;
break;
}
}
if((fp=fopen("student_number","wb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
fwrite(&n,sizeof(n),1,fp);
if((fp=fopen("student","wb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(i=0;i<n;i++)
fwrite(&stu[i],LEN,1,fp);
fclose(fp);
begin:
printf("@是否繼續“添加”操作(y/n)?\n");
fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y') add();
else if(ch=='n'||ch=='N') ;
else { printf("輸入有誤!\n"); goto begin;}
}
/*3.刪除學生信息*/
void del()
{
int i,numb,mark=0;
char ch;
printf("輸入要刪除學生的學號:\n");
scanf("%d",&numb);
if((fp=fopen("student_number","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
fread(&n,sizeof(n),1,fp);
if((fp=fopen("student","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(i=0;i<n;i++)
{
fread(&stu[i],LEN,1,fp);
if(stu[i].num==numb)
{
i--;
n--;
mark=1;
}
}
if(mark==0) printf("沒有該生信息\n");
if((fp=fopen("student_number","wb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
fwrite(&n,sizeof(n),1,fp);
if((fp=fopen("student","wb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(i=0;i<n;i++)
fwrite(&stu[i],LEN,1,fp);
fclose(fp);
begin:
printf("@是否繼續“刪除”操作(y/n)?\n");
fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y') del();
else if(ch=='n'||ch=='N') ;
else { printf("輸入有誤!\n"); goto begin;}
}
/*4.修改學生信息*/
void change()
{
int i,numb,mark=0;
float score1,score2,score3,totall,average;
char ch;
printf("輸入要修改學生的學號 高數成績 英語成績 C語言成績:\n");
scanf("%d %f %f %f",&numb,&score1,&score2,&score3);
if((fp=fopen("student_number","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
fread(&n,sizeof(n),1,fp);
if((fp=fopen("student","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(i=0;i<n;i++)
{
fread(&stu[i],LEN,1,fp);
if(stu[i].num==numb)
{
totall=score1+score2+score3;
average=totall/3;
stu[i].score1=score1;
stu[i].score2=score2;
stu[i].score3=score3;
stu[i].total=totall;
stu[i].average=average;
mark=1;
}
}
if(mark==0) printf("沒有該生信息\n");
if((fp=fopen("student_number","wb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
fwrite(&n,sizeof(n),1,fp);
if((fp=fopen("student","wb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(i=0;i<n;i++)
fwrite(&stu[i],LEN,1,fp);
fclose(fp);
begin:
printf("@是否繼續“修改”操作(y/n)?\n");
fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y') del();
else if(ch=='n'||ch=='N') ;
else { printf("輸入有誤!\n"); goto begin;}
}
/*5.查詢操作*/
//(1)按學號查詢,輸入壹個學號,輸出對應的學生信息。
void num_search()
{
int i,num,mark=0;
printf("輸入學號:\n");
scanf("%d",&num);
for(i=0;i<n;i++)
if(stu[i].num==num)
{
printf("學號:%d 姓名:%s 學院代號:%d 班級號:%d 高數成績:%0.2f 英語成績:%0.2f c語言成績:%0.2f 總分:%0.2f 平均分:%0.2f\n",stu[i].num,stu[i].name,stu[i].x_num,stu[i].class_num,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].total,stu[i].average);
mark=1;
}
if(mark==0) printf("沒有找到相關信息。\n");
}
//(2)按全名查詢。
void name_search()
{
int i,mark=0;
char name[20];
printf("輸入姓名:\n");
scanf("%s",name);
for(i=0;i<n;i++)
if(strcmp(stu[i].name,name)==0)
{
printf("學號:%d 姓名:%s 學院代號:%d 班級號:%d 高數成績:%0.2f 英語成績:%0.2f c語言成績:%0.2f 總分:%0.2f 平均分:%0.2f\n",stu[i].num,stu[i].name,stu[i].x_num,stu[i].class_num,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].total,stu[i].average);
mark=1;
}
if(mark==0) printf("沒有找到相關信息。\n");
}
//(3)按姓氏查詢。
void firstname_search()
{
int i,mark=0;
char name[20];
printf("輸入姓氏:\n");
scanf("%s",name);
for(i=0;i<n;i++)
if(stu[i].name[0]==name[0] && stu[i].name[1]==name[1])
{
printf("學號:%d 姓名:%s 學院代號:%d 班級號:%d 高數成績:%0.2f 英語成績:%0.2f c語言成績:%0.2f 總分:%0.2f 平均分:%0.2f\n",stu[i].num,stu[i].name,stu[i].x_num,stu[i].class_num,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].total,stu[i].average);
mark=1;
}
if(mark==0) printf("沒有找到相關信息。\n");
}
//(4)按學院查詢,輸入學院名稱,輸出該學院的全部學生的信息。
void x_search()
{
int i,x_num,mark=0;
printf("輸入學院代號:\n");
scanf("%d",&x_num);
for(i=0;i<n;i++)
if(stu[i].x_num==x_num)
{
printf("學號:%d 姓名:%s 學院代號:%d 班級號:%d 高數成績:%0.2f 英語成績:%0.2f c語言成績:%0.2f 總分:%0.2f 平均分:%0.2f\n",stu[i].num,stu[i].name,stu[i].x_num,stu[i].class_num,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].total,stu[i].average);
mark=1;
}
if(mark==0) printf("沒有找到相關信息。\n");
}
//(5)按班級查詢,輸入班級名稱,輸出該班級的全部學生的信息。
void classnum_search()
{
int i,class_num,mark=0;
printf("輸入學院代號:\n");
scanf("%d",&class_num);
for(i=0;i<n;i++)
if(stu[i].class_num==class_num)
{
printf("學號:%d 姓名:%s 學院代號:%d 班級號:%d 高數成績:%0.2f 英語成績:%0.2f c語言成績:%0.2f 總分:%0.2f 平均分:%0.2f\n",stu[i].num,stu[i].name,stu[i].x_num,stu[i].class_num,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].total,stu[i].average);
mark=1;
}
if(mark==0) printf("沒有找到相關信息。\n");
}
//查詢模塊
void search()
{
char ch;
int i;
if((fp=fopen("student_number","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
fread(&n,sizeof(n),1,fp);
if((fp=fopen("student","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(i=0;i<n;i++)
fread(&stu[i],LEN,1,fp);
fclose(fp);
printf("選擇要進行查詢的關鍵字代號:1、學號查詢。2、按全名查詢。3、按姓氏查詢。4、學院查詢。5、班級查詢。\n");
fflush(stdin);
ch=getchar();
switch(ch)
{
case '1': num_search(); break;
case '2': name_search(); break;
case '3': firstname_search(); break;
case '4': x_search(); break;
case '5': classnum_search(); break;
default :printf("輸入代號有誤。\n");
}
begin:
printf("@是否繼續“查詢”操作(y/n)?\n");
fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y') search();
else if(ch=='n'||ch=='N') ;
else { printf("輸入有誤!\n"); goto begin;}
}
/*6.統計*/
//(1)按總分對學生信息進行排序(由高到低),輸出排序後的信息,並將排序後的學生信息存放到壹個新的二進制文件中。
void totall_score()
{
int i,j;
struct student t;
for(j=0;j<n-1;j++)
for(i=0;i<n-j-1;i++)
if(stu[i].total<stu[i+1].total)
{
t=stu[i];
stu[i]=stu[i+1];
stu[i+1]=t;
}
if((fp=fopen("student_number","wb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
fwrite(&n,sizeof(n),1,fp);
if((fp=fopen("student_totalscore","wb"))==NULL) //按總分排序並保存至新的文件夾中。
{
printf("can't open file!\n");
exit(0);
}
for(i=0;i<n;i++)
{
printf("學號:%d 姓名:%s 學院代號:%d 班級號:%d 高數成績:%0.2f 英語成績:%0.2f c語言成績:%0.2f 總分:%0.2f 平均分:%0.2f\n",stu[i].num,stu[i].name,stu[i].x_num,stu[i].class_num,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].total,stu[i].average);
fwrite(&stu[i],LEN,1,fp);
}
fclose(fp);
}
//(2)按平均分統計各個分數段的學生人數(不及格,60-69,70-79,80-89,90-100)。
void each_score()
{
int e,d,c,b,a,i;
a=b=c=d=e=0;
for(i=0;i<n;i++)
{
if(stu[i].average<60) e++;
else if(stu[i].average<70) d++;
else if(stu[i].average<80) c++;
else if(stu[i].average<90) b++;
else a++;
}
printf("不及格人數為%d\n 60-69人數為%d\n 70-79人數為%d\n 80-89人數為%d\n 90-100人數為%d\n",e,d,c,b,a);
}
//(3)分別找出3門課程成績最高的學生,並輸出他們的信息。
void high_stu()
{
int max1,max2,max3,i;
max1=max2=max3=0;
for(i=0;i<n;i++)
{
if(stu[max1].score1<stu[i].score1) max1=i;
if(stu[max2].score2<stu[i].score2) max2=i;
if(stu[max3].score3<stu[i].score3) max3=i;
}
printf("高數最高成績學生信息:\n學號:%d 姓名:%s 學院代號:%d 班級號:%d 高數成績:%0.2f 英語成績:%0.2f c語言成績:%0.2f 總分:%0.2f 平均分:%0.2f\n",stu[max1].num,stu[max1].name,stu[max1].x_num,stu[max1].class_num,stu[max1].score1,stu[max1].score2,stu[max1].score3,stu[max1].total,stu[max1].average);
printf("英語最高成績學生信息:\n學號:%d 姓名:%s 學院代號:%d 班級號:%d 高數成績:%0.2f 英語成績:%0.2f c語言成績:%0.2f總分:%0.2f 平均分:%0.2f\n",stu[max2].num,stu[max2].name,stu[max2].x_num,stu[max2].class_num,stu[max2].score1,stu[max2].score2,stu[max2].score3,stu[max2].total,stu[max2].average);
printf("c語言最高成績學生信息:\n學號:%d 姓名:%s 學院代號:%d 班級號:%d 高數成績:%0.2f 英語成績:%0.2f c語言成績:%0.2f 總分:%0.2f 平均分:%0.2f\n",stu[max3].num,stu[max3].name,stu[max3].x_num,stu[max3].class_num,stu[max3].score1,stu[max3].score2,stu[max3].score3,stu[max3].total,stu[max3].average);
}
//(4)分別統計出3門課程的不及格率,並輸出。
void filled()
{
int i;
float f1,f2,f3,sf1,sf2,sf3;
f1=f2=f3=0;
for(i=0;i<n;i++)
{
if(stu[i].score1<60) f1++;
if(stu[i].score2<60) f2++;
if(stu[i].score3<60) f3++;
}
sf1=f1/n;
sf2=f2/n;
sf3=f3/n;
printf("高數不及格率為%0.2f\n",sf1);
printf("英語不及格率為%0.2f\n",sf2);
printf("c語言不及格率為%0.2f\n",sf3);
}
//統計模塊
void stat()
{
char ch;
int i;
if((fp=fopen("student_number","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
fread(&n,sizeof(n),1,fp);
if((fp=fopen("student","rb"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
for(i=0;i<n;i++)
fread(&stu[i],LEN,1,fp);
printf("選擇要進行的統計操作代號:\n1、按總分由高到低。\n2、按平均分統計各個分數段的學生人數(不及格,60-69,70-79,80-89,90-100)。\n3、找出3門課程成績最高的學生。\n4、統計出3門課程的不及格率。\n");
fflush(stdin);
ch=getchar();
switch(ch)
{
case '1': totall_score(); break;
case '2': each_score(); break;
case '3': high_stu(); break;
case '4': filled(); break;
default :printf("輸入代號有誤。\n");
}
begin:
printf("@是否繼續“統計”操作(y/n)?\n");
fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y') stat();
else if(ch=='n'||ch=='N') ;
else { printf("輸入有誤!\n"); goto begin;}
}
/*主選項*/
void action()
{
char ch;
printf("輸入想要進行操作的代碼:\n1、輸入學生信息;\n2、增加學生信息;\n3、刪除學生信息;\n4、修改學生信息;\n5、按不同條件對學生信息進行查詢操作;\n6、按不同條件對學生成績進行統計工作。\n");
fflush(stdin);
ch=getchar();
switch(ch)
{
case '1':creat();break; //輸入學生信息
case '2':add();break; //增加學生信息
case '3':del();break; //刪除學生信息
case '4':change();break; //修改學生信息
case '5':search();break; //按不同條件對學生信息進行查詢操作
case '6':stat();break; //按不同條件對學生成績進行統計工作
default:printf("輸入代號有誤。\n");
}
begin:
printf("#是否繼續進行“管理”操作?(y/n)\n");
fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y') action();
else if(ch=='n'||ch=='N') ;
else { printf("輸入有誤!\n"); goto begin;}
}
//主函數
void main()
{
printf("~~~~~~學生成績管理系統~~~~~~\n\n");
action();
}