
基于链表表的学生信息管理系统”
实验内容:编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的链裏结点类
型,包括:学号、姓名、班级、专业、3门成绩。

需要创建1.txt
grad name spec class score1 score2 score3
2201 Amy cs 2018-1 98 95 98
2202 Bob cs 2018-2 91 74 59
2203 Cindy cs 2018-2 98 84 79
2204 Dell law 2018-1 86 94 99
2205 Emy law 2018-1 98 86 89
#include<string.h>
#include<stdlib.h>
#include<iomanip>
#include<fstream>
#include<time.h>
#include<typeinfo>
int length;
char a[10],b[10],c[10],d[10],e[10],f[10],g[10];//标题
struct student
{
char grad[10];//学号
char name[10];//姓名
char spec[10];//专业
char stu_class[10];//班级
int score1;
int score2;
int score3;
}stu[30];
int Init()//初始化
{
int i = 0;
FILE *p = fopen("1.txt", "r"); //打开文件
if(p==NULL)
return 0;
fscanf(p,"%s%s%s%s%s%s%s",&a,&b,&c,&d,&e,&f,&g);//读取标题
while (!feof(p)) //检测流上的文件结束符,如果文件结束,则返回非0值
{ //将文件中数据读取到结构体数组
fscanf(p,"%s%s%s%s%d%d%d",&stu[i].grad,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3);
i++;
}
length = i;
fclose(p);
return 1;
}
void Input()//从键盘输入一个学生信息存入文件和结构体数组。
{
printf("请输入学生信息:\n");
printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
int i = length;
scanf("%s%s%s%s%d%d%d",&stu[i].grad,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3);
FILE *p = fopen("1.txt", "a"); //打开文件
fprintf(p,"\n%s %s %s %s %d %d %d",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
fclose(p);
printf("写入文件成功!\n");
length++;
}
void Output()//输入学号,将对应的学生信息格式化输出。
{
char *grad;
printf("请输入查询的学号:");
scanf("%s",grad);
printf("学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
for(int i=0;i<length;i++)
if(strcmp(stu[i].grad,grad)==0)
printf("%s %s %s %s %d %d %d \n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
}
void Save()//将某个学生信息存入一个新的文件。
{
printf("请输入学生信息:\n");
printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
int i = length;
scanf("%s%s%s%s%d%d%d",&stu[i].grad,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3);
FILE *p = fopen("other.txt", "w"); //打开文件
fprintf(p,"%s %s %s %s %s %s %s\n",a,b,c,d,e,f,g);
fprintf(p,"%s %s %s %s %d %d %d",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
fclose(p);
printf("写入文件成功!\n");
}
void Max()//求所有学生某门课程的最高分及对应的学生的姓名。
{
int i;
int max[3]={0,0,0};
for(i=0;i<length;i++)
if(max[0]<stu[i].score1)
max[0]=stu[i].score1;
printf("课程1最高分:%d分----",max[0]);
for(i=0;i<length;i++)
if(stu[i].score1 == max[0])
printf("%s ",stu[i].name);
printf("\n");
for(i=0;i<length;i++)
if(max[1]<stu[i].score2)
max[1]=stu[i].score2;
printf("课程2最高分:%d分----",max[1]);
for(i=0;i<length;i++)
if(stu[i].score2 == max[1])
printf("%s ",stu[i].name);
printf("\n");
for(i=0;i<length;i++)
if(max[2]<stu[i].score3)
max[2]=stu[i].score3;
printf("课程3最高分:%d分----",max[2],stu[i].name);
for(i=0;i<length;i++)
if(stu[i].score3 == max[2])
printf("%s ",stu[i].name);
printf("\n");
}
void Fetch()//从文件中随机读取某个学生的信息。
{
int i = time(NULL) % length;
printf("第%d名学生\n",i+1);
printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
printf("%s %s %s %s %d %d %d \n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
}
void Sort_select()//按总平均成绩由低到高进行简单选择排序。
{
struct student tmp;
char str[6];
int i,j,t,n,k;
float avg[length],avg_temp;
printf("请输入专业:\n");
scanf("%s",str);
for(i=0;i<length;i++)
avg[i] = float(stu[i].score1 + stu[i].score2 + stu[i].score3) / 3;
//简单选择排序
for(i=0; i<length; i++) //做n-1趟选取
{
k = i;
for(j=i+1;j<=length;j++)
if(avg[j] < avg[k] && strcmp(stu[i].spec,str)==0 && strcmp(stu[j].spec,str)==0)
k = j; //k为最小值
if(i!=k)//交换
{
tmp=stu[k]; avg_temp = avg[k];
stu[k]=stu[i]; avg[k] = avg[i];
stu[i]=tmp; avg[i] = avg_temp;
}
}
printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3 平均分\n");
for(i=0;i<length;i++)
if(strcmp(stu[i].spec,str)==0)
printf("%5s %-6s %3s %s %3d %3d %3d %-6.2f\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,avg[i]);
}
void Sort_buble()//按总平均成绩由高到低进行冒泡排序。
{
struct student tmp;
char str[6];
float avg[length],avg_temp;
int i,j;
printf("请输入班级:\n");
scanf("%s",str);
for(i=0;i<length;i++)
avg[i] = float(stu[i].score1 + stu[i].score2 + stu[i].score3) / 3;
//冒泡排序
for(i=0;i<length;i++)
for(j=0;j<length;j++)
if(avg[i]>avg[j] && strcmp(stu[i].stu_class,str)==0 && strcmp(stu[j].stu_class,str)==0)
{
tmp = stu[i]; avg_temp = avg[i];
stu[i] = stu[j]; avg[i] = avg[j];
stu[j] = tmp; avg[j] = avg_temp;
}
printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3 平均分\n");
for(i=0;i<length;i++)
if(strcmp(stu[i].stu_class,str)==0)
printf("%5s %-6s %3s %s %3d %3d %3d %-6.2f\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,avg[i]);
}
void Sort_insert()//按课程1成绩由低到高进行直接插入排序。
{
int i,j,len=0;
char str[6];
struct student tmp;
struct student insert[100];
printf("请输入班级:\n");
scanf("%s",str);
for(i=0;i<length;i++)
if(strcmp(stu[i].stu_class,str)==0) //筛选出某个班上的学生进行插入排序
{
insert[len] = stu[i];
len++;
}
for(i=1;i<len;i++)//循环从第2个元素开始
{
if(insert[i].score1 < insert[i-1].score1)
{
tmp = insert[i];
for(j = i-1; j >= 0 && insert[j].score1 > tmp.score1; j--)
insert[j+1] = insert[j];
insert[j+1] = tmp;
}
}
printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
for(i=0;i<len;i++)
printf("%5s %-6s %3s %s %3d %3d %3d\n",insert[i].grad,insert[i].name,insert[i].spec,insert[i].stu_class,insert[i].score1,insert[i].score2,insert[i].score3);
}
void my_Sort_insert()//按课程1成绩由低到高进行直接插入排序。
{
int i,j=0,len=0,location[50];
char str[6];
struct student tmp;
struct student insert[100];
printf("请输入班级:\n");
scanf("%s",str);
for(i=0;i<length;i++)
if(strcmp(stu[i].stu_class,str)==0) //筛选出某个班上的学生进行插入排序
{
insert[len] = stu[i];
location[j++] = i;//存储位置
len++;
}
for(i=1;i<len;i++)//循环从第2个元素开始
{
if(insert[i].score1 < insert[i-1].score1)
{
tmp = insert[i];
for(j = i-1; j >= 0 && insert[j].score1 > tmp.score1; j--)
insert[j+1] = insert[j];
insert[j+1] = tmp;
}
}
for(i=0;i<len;i++)
stu[location[i]] = insert[i];
printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
for(i=0;i<length;i++)
printf("%5s %-6s %3s %s %3d %3d %3d\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
}
void Search()//查找某班总分在某分数段以上的学生
{
int i,k=0,score;
char str[6];
printf("请输入班级和分数:\n");
scanf("%s%d",str,&score);
printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3 总分\n");
for(i=0;i<length;i++)
if(strcmp(stu[i].stu_class,str)==0 && stu[i].score1+stu[i].score2+stu[i].score3 > score)
{
printf("%5s %-6s %3s %s %3d %3d %3d %d\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score1+stu[i].score2+stu[i].score3);
k++;
}
printf("%s班总分%d以上的一共有%d人。\n",str,score,k);
}
void Sort_total_score()//Self:全体总分排序
{
struct student tmp;
int i,j;
//根据总分进行从大到小冒泡排序
for(i=0;i<length;i++)
for(j=0;j<length;j++)
if(stu[i].score1+stu[i].score2+stu[i].score3 > stu[j].score1+stu[j].score2+stu[j].score3)
{
tmp = stu[i];
stu[i] = stu[j];
stu[j] = tmp;
}
for(i=0;i<length;i++)
printf("%5s %-6s %3s %s %3d %3d %3d %d\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score1+stu[i].score2+stu[i].score3);
}
void Sort_grad()//Self:全体学号排序
{
struct student tmp;
int i,j;
//根据学号进行从大到小冒泡排序
for(i=0;i<length;i++)
for(j=0;j<length;j++)
if(strcmp(stu[i].grad,stu[j].grad) > 0 )
{
tmp=stu[i];
stu[i]=stu[j];
stu[j]=tmp;
}
for(i=0;i<length;i++)
printf("%5s %-6s %3s %s %3d %3d %3d\n",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
}
int main()
{
int i,j,k;
if(Init()==0)
{
printf("文件不存在!");
return 0;
}
printf("菜单\n1.输入学生信息\n2.输出学生信息\n3.写入文件\n4.查找课程最高分\n5.随机读取学生信息\n6.同专业平均分简单选择排序\n7.同班级平均分冒泡排序\n");
printf("8.同班级按课程1分数直接插入排序\n9.综合查找\n10.全体总分排序\n11.全体学号排序\n12.重现菜单\n0.退出\n");
printf("请输入选项:");
scanf("%d",&k);
while(k)
{
switch(k)
{
case 0:
break;
case 1:
Input();
break;
case 2:
Output();
break;
case 3:
Save();
break;
case 4:
Max();
break;
case 5:
Fetch();
break;
case 6:
Sort_select();
break;
case 7:
Sort_buble();
break;
case 8:
Sort_insert();
//my_Sort_insert();
break;
case 9:
Search();
break;
case 10:
Sort_total_score();
break;
case 11:
Sort_grad();
break;
case 12:
printf("菜单\n1.写入文件\n2.输出学生信息\n3.写入新文件\n4.查找课程最高分\n5.随机读取学生信息\n6.同专业平均分简单选择排序\n7.同班级平均分冒泡排序\n");
printf("8.同班级按课程1分数直接插入排序\n9.综合查找\n10.全体总分排序\n11.全体学号排序\n12.重现菜单\n0.退出\n");
break;
default:
printf("输入有误,请重新输入!\n");
}
printf("请输入选项:");
scanf("%d",&k);
}
return 0;
}
void write()
{
int i = length;
FILE *p = fopen("1.txt", "w"); //打开文件
fprintf(p,"%s %s %s %s %s %s %s\n",a,b,c,d,e,f,g);
for(i=0;i<length;i++)
fprintf(p,"%s %s %s %s %d %d %d",stu[i].grad,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
fclose(p);
}