基于数组的学生管理系统【C语言版】
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define N 5
struct Student{
int num;
char name[25];
char major[10];
int classNo;
int score[4];
};
typedef struct Student STU;
void Input(STU *p);
void Output(STU *p);
void Save(STU *p);
int Fetch(STU *st,int n,char *filename);
void Max(STU stu[],int m);
double average_person(STU *p);
void sort_select(STU *p);
void Sort_Buble(STU *p);
void Sort_insert(STU *p);
void Search(STU *p);
void Ask();
void main()
{
int choose;
int i,j,m,n;
char filename[10];
STU stu[N];
STU *p;
p=stu;
while(1)
{
printf("\n——————————————————————————————————————————\n");
printf("|///// # 已经进入 大连海事大学--学生信息管理系统 # //////\n");
printf("———————————————————————————————————————————\n\n\n");
printf("|///#No.1 ---- 输入学生个人信息 ---- \n");
printf("|///#No.2 ---- 输出学生个人信息 ---- \n");
printf("|///#No.3 ---- 保存学生信息 ---- \n");
printf("|///#No.4 ---- 读取学生信息 ---- \n");
printf("|///#No.5 ---- 输出某门课程的最高分和分数最高的学生的姓名 ----\n");
printf("|///#No.6 ---- 对某专业的学生按总平均成绩进行简单选择排序 ---- \n");
printf("|///#No.7 ---- 按平均成绩对某班学生进行冒泡排序 ---- \n");
printf("|///#No.8 ---- 对某班学生按某门课程成绩进行直接插入排序 ---- \n");
printf("|///#No.9 ---- 按照班级和成绩的查找某位学生信息 ---- \n");
printf("\n **注意:若是输入其他数字直接退出系统//**\n\n\n");
printf("———————————————————————————————————————————\n\n\n");
printf("请输入选择的功能编号:");
scanf("%d",&choose);
switch(choose)
{
case 1:
{
for(i=0;i<N;i++)
{
Input(stu+i);
}
Ask();
break;
}
case 2:{
printf("请输入想要输出第几个学生的信息:\n");
scanf("%d",&n);
if (n>=0 && n<N)
Output(stu+n-1);
else
printf("没有这名学生!请重新输入!");
Ask();
break;
}
case 3:{
getchar();
Save(stu);
printf("文件保存成功!\n");
Ask();
break;
}
case 4:
{
printf("请输入读入的文件名:");
scanf("%s",filename);
printf("请输入要提取信息的位置号:");
scanf(" %d",&j);
if (j>=0 && j<=N)
{
if ( Fetch(stu,j,filename)==0)
printf("提取失败!\n");
}
Ask();
break;
}
case 5:
{
printf("请输入想求最高分的科目代号(1,2,3),总成绩代号:4:\n");
scanf("%d",&m);
Max(p,m);
Ask();
break;
}
case 6:
{
getchar();
printf("对某专业的学生,按总平均成绩由低到高排序结果为:\n");
sort_select(stu);
Ask();
break;
}
case 7:
{
Sort_Buble(stu);
Ask();
break;
}
case 8:
{
Sort_insert(stu);
Ask();
break;
}
case 9:
{
getchar();
Search(stu);
Ask();
break;
}
default:
{
break;
}
}
if((choose<1)||(choose>10))
break;
}
}
void Input(STU *p)
{
int j;
printf("请输入学生的学号:\n");
scanf("%d",&p->num);
getchar();
printf("请输入学生的姓名 \n");
gets(p->name);
printf("请输入学生的专业 软件工程:soft/网络工程:net/计算机科学与技术:computer \n");
gets(p->major);
printf("请输入学生的班级 1班/2班,:\n");
scanf("%d",&p->classNo);
getchar();
printf("请分别按顺序输入学生的三门成绩:高数/英语/物理 \n");
for(j=0;j<3;j++)
{
printf("请输入第%d门成绩 :\n",j+1);
scanf("%d",&p->score[j]);
getchar();
}
p->score[3]=p->score[0]+p->score[1]+p->score[2];
}
void Output(STU *p)
{
printf("学号:%d\t| 姓名%s\t| 专业:%s\t| 班级:%d\t| 高数成绩:%d\t| 英语成绩:%d\t| 物理成绩:%d\n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
}
double average_person(STU *p){
return(((p->score[0])+(p->score[1])+(p->score[2]))/3.0);
}
void Save(STU *p)
{
FILE *fp;
char filename[20];
int i;
printf("请输入要保存的文件名称:\n");
gets(filename);
if((fp=fopen(filename,"wb"))==NULL)
{
printf("新建文件失败 请重试请重新输入\n");
return;
}
for(i=0;i<N;i++)
{
if(fwrite(p++,sizeof(STU),1,fp)!=1)
printf("文件写入失败 请重新输入\n");
}
fclose(fp);
}
int Fetch(STU *p,int n,char *filename)
{
FILE *fp;
if((fp=fopen(filename,"rb"))==NULL)
{
fclose(fp);
return 0;
}
fseek(fp,(long)sizeof(STU)*n,0);
if ( (fread(p,sizeof(STU),1,fp)) != 1)
{
printf("文件录入失败 请重新输入:");
fclose(fp);
return 0;
}
Output(p);
fclose(fp);
return 1;
}
void Max(STU stu[],int m)
{
int i,index;
int y[N];
STU *p;
p=stu;
for(i=1;i<=N;i++)
y[i-1]=i-1;
switch(m)
{
case 1:
{
for(i=1;i<N;i++)
if((p+y[0])->score[0]<(p+y[i])->score[0])
{
index=y[0];
y[0]=y[i];
y[i]=index;
}
p=p+y[0];
printf("\t第1门最高分为:");
printf("%d\n",p->score[0]);
printf("\t得最高分的同学名字是:");
puts(p->name);
break;
}
case 2:
{
for(i=1;i<N;i++)
if((p+y[0])->score[1]<(p+y[i])->score[1])
{
index=y[0];
y[0]=y[i];
y[i]=index;
}
p=p+y[0];
printf("\t第2门最高分为:");
printf("%d\n",p->score[1]);
printf("\t得最高分的同学名字是:");
puts(p->name);
break;
}
case 3:
{
for(i=1;i<N;i++)
if((p+y[0])->score[2]<(p+y[i])->score[2])
{
index=y[0];
y[0]=y[i];
y[i]=index;
}
p=p+y[0];
printf("\t第3门最高分为:");
printf("%d\n",p->score[2]);
printf("\t得最高分的同学名字是:");
puts(p->name);
break;
}
case 4:
{
for(i=1;i<N;i++)
if((p+y[0])->score[3]<(p+y[i])->score[3])
{
index=y[0];
y[0]=y[i];
y[i]=index;
}
p=p+y[0];
printf("\t总成绩最高分为:");
printf("%d\n",p->score[2]);
printf("\t得最高分的同学名字是:");
puts(p->name);
break;
}
default:
break;
}
}
void sort_select(STU *p)
{
int i,j,k;
char b[15];
double t,aver[N];
STU a;
printf("请选择一个专业(请输入已经录入的专业名称):\n");
gets(b);
for(i=0;i<N;i++)
{
aver[i]=average_person(p+i);
}
for(i=0;i<N-1;i++)
{
k=i;
for(j=i+1;j<N;j++)
if(aver[k]>aver[j])
k=j;
t=aver[i];
aver[i]=aver[k];
aver[k]=t;
a=*(p+i);*(p+i)=*(p+k);*(p+k)=a;
}
for(i=0;i<N;i++){
if(strcmp((p+i)->major,b)==0){
printf("专业:%s\t班级:%d\t姓名:%s\t平均成绩:%5.3f\n",(p+i)->major,(p+i)->classNo,(p+i)->name,aver[i]);
}
}
}
void Sort_Buble(STU *p)
{
int i,j,b;
double t,aver[N];
STU a;
printf("选择一个班级(请输入已经创建的班级):\n");
scanf("%d",&b);
for(i=0;i<N;i++)
{
aver[i]=average_person(p+i);
}
for(i=0;i<N;i++)
for(j=0;j<N-1-i;j++)
if(aver[j]<aver[j+1])
{
t=aver[j];
aver[j]=aver[j+1];
aver[j+1]=t;
a=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=a;
}
for(i=0;i<N;i++)
if((p+i)->classNo==b){
printf("姓名:%s\t平均分=%5.3f\n",(p+i)->name,aver[i]);
}
}
void Sort_insert(STU *p)
{
int i,j,id,q,tem;
int score[N];
char b[10];
int k=0;
STU *m;
m=p;
getchar();
printf ("请输入需要查看成绩的班级(请输入已经录入的专业):");
gets(b);
printf ("请输入需要查看成绩的班级(请输入已经录入的班级):");
scanf ("%d",&q);
printf ("请输入需要查看分数的课程(1,2,3)\n");
scanf ("%d",&id);
getchar();
for (i=0; i<N; i++,p++)
{
if(strcmp(p->major,b)==0)
{ if(p->classNo==q){
score[k]=p->score[id-1];
k++;
}
}
}
for (i=1; i<k; i++)
if (score[i-1]>score[i])
{
tem=score[i];
j=i-1;
do
{
score[j+1]=score[j];
j--;
}
while (j>=0&&tem<score[j]);
score[j+1]=tem;
}
printf ("对该班级的学生,按第%d科成绩由低到高进行直接插入排序为:\n",id);
for (i=0; i<k; i++)
{
p=m;
for (j=0; j<N; j++,p++)
{
if (strcmp(p->major,b)==0 && (p->score[id]==score[i]) && (p->classNo==q))
{
Output(p);
printf("\n");
}
}
}
}
void Search(STU *head)
{
STU *p;
int b,k,sum_scores;
int limit_score;
k=0 ;
printf ("请输入该学生的班级号 \n");
scanf ("%d",&b);
getchar();
printf ("请输入总成绩>=**的学生(**为分数)\n");
scanf ("%d",&limit_score);
printf (" \t\t\t\t%d班总成绩>=%d的学生信息为:\t\t\t\t \n",b,limit_score);
for (p=head;p<head+N;p++)
{
sum_scores=(p->score[0])+(p->score[1])+(p->score[2]);
if((p->classNo)==b)
{
if (sum_scores >= limit_score)
{
printf ("该学生信息为:\n");
Output(p);
printf("\n");
k++;
}
}
}
if (k==0)
printf ("查找的学生信息不存在:\n");
}
void Ask()
{
int c;
printf("\n已实现所选功能 输出编号进行下一步操作:\n\n 1: 继续选择其他功能 2: 不再选择直接退出系统\n");
scanf("%d",&c);
if (c==2)
exit(0);
}