大胆相信我,我这科拿了满分嗷~
目录
1.实验内容
编写并调试程序,实现学校各专业班级学生信息的管理。10个学生的信息存储在文件
studentInit.dat
中。在
头文件student.h
中定义学生信息的结构体类型,包括:学号、姓名、专业、班级、3门成绩;和符号常量N(学生数)。(同一班级的学生可以属于不同的专业,同一专业的学生可以属于不同的班级)
#define N 10
struct Student{
char num[15];//学号
char name[15];//姓名
char major[10];//专业(computer,software,network)
int classNo;//班级(1-2)
int score[3];//3门课的成绩(0-2)
};
typedef struct Student STU;
2.实验要求
-
main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。
STU student[N]; //保存输入的N名学生信息
1.从文件中读入n个学生信息
2.从文件中任意读取一个(0<=n<=%d)学生的信息
3.输入班级与成绩要求进行查找
4.所有学生中某门课程的最高分的学生
5.所有学生按平均成绩由低到高进行简单选择排序
6.对某个班级的学生按平均成绩由高到低进行起泡排序
7.对某个专业的学生按某门课程成绩由低到高进行直接插入排序
8.存储更新后的学生信息
- 定义函数void Input(STU *p, int n):从文件sutdentInit中输入n个学生的信息。
- 定义函数void Output(STU *p):将p所指的某个学生信息表格化屏幕输出。
- 定义函数STU Fetch(int studentIndex):从文件中随机读取第studentIndex个(0<= studentIndex <=N-1)学生的信息。
- 定义函数void Search(STU *p, int classNo, char s, int scoreSum);:实现班级和成绩的综合查找(如1班,总分>240的同学)。
-
定义函数int Max(STU *p, int scoreIndex):求所有学生、下标为scoreIndex的课程分数最高的学生序号(在数组中的下标),学生序号作为
返回值
。 - 定义函数void Sort_select(STU *p): 对所有学生,按平均成绩由低到高进行简单选择排序。
-
定义函数void Sort_buble(STU *p, int n); 对某个班级的学生,按平均成绩由高到低进行起泡排序。
定义局部变量:
STU stu_class_ave[N]; //按平均成绩排序后的某个班级的学生信息;
int count; //实际元素个数
-
定义函数void Sort_insert(STU *p, int n, char *major):对某个专业的学生,按某门课程成绩由低到高进行直接插入排序。
定义局部变量:
STU stu_class_ subject [N]; //按某门课程成绩排序后的某个专业的学生信息;
int count; //实际元素个数
- 定义函数void Save(STU *p,int n) :将学生信息存入文件。
3.功能结构图和算法流程图
系统功能结构图
函数Sort_select的算法流程图
4.程序清单
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"student.h"
STU stu[10],store[10];//定义全局变量
//声明函数
void Input(STU *p);//从文件student.dat中输入n个学生信息
void Output(STU *p);//将p所指的某个学生信息表格式化屏幕输出
void SaveStudent(STU *p,int n);//向文件中保存信息
void LoadStudent(STU *p,int n); //向文件中读取信息
void Read(STU *p);//从文件中读取n个学生信息并保存
void Fetch(STU *p);//从文件中读取第n个学生的信息
void Search(STU *p);//输入班级与成绩要求进行查找
int Max(STU *p);//返回所有学生中第scoreIndex科分数最高的学生序号
void Sort_select(STU *p);//对所有学生按平均成绩由低到高进行简单选择排序
void Sort_buble(STU *p);//对某个班级学生,按平均成绩由高到低起泡排序
void Sort_insert(STU *p);//对某个专业的学生按某门课程由低到高进行直接插入排序
void Store();//存储更新后的学生信息
int main(){
int n;
//进行功能选项
printf("\n请输入功能编号,运行相应功能\n");
printf("1.从文件中读入n(0<n<10)个学生信息\n");
printf("2.从文件中随机读取第n个(0<=n<=9)学生的信息\n");
printf("3.输入班级与成绩要求进行查找\n");
printf("4.所有学生某门课程的最高分和分数最高的学生信息\n");
printf("5.所有学生按平均成绩由低到高进行简单选择排序\n");
printf("6.对某个班级的学生按平均成绩由高到低进行起泡排序\n");
printf("7.对某个专业的学生按某门课程由低到高进行直接插入排序\n");
printf("8.存储更新后的学生信息\n");
printf("其他.退出\n\n");
while(scanf("%d",&n)!=EOF){
if(n<1||n>8)
break;
switch(n){
case 1:
Read(stu);
break;
case 2:
Fetch(stu);
break;
case 3:
Search(stu);
break;
case 4:
Output(stu+Max(stu)-101);
break;
case 5:
Sort_select(stu);
break;
case 6:
Sort_buble(stu);
break;
case 7:
Sort_insert(stu);
break;
case 8:
Store();
break;
}
printf("\n\n请输入功能编号,运行相应功能\n");
printf("1.从文件中读入n(0<n<10)个学生信息\n");
printf("2.从文件中随机读取第n个(0<=n<=9)学生的信息\n");
printf("3.输入班级与成绩要求进行查找\n");
printf("4.所有学生某门课程的最高分和分数最高的学生信息\n");
printf("5.所有学生按平均成绩由低到高进行简单选择排序\n");
printf("6.对某个班级的学生按平均成绩由高到低进行起泡排序\n");
printf("7.对某个专业的学生按某门课程由低到高进行直接插入排序\n");
printf("8.存储更新后的学生信息\n");
printf("其他.退出\n\n");
}
return 0;
}
void Input(STU *p){//录入学生信息
printf("下面,请录入学生的信息\n");
FILE *fp;char filename[10];
printf("请输入文件名:");
scanf("%s",&filename);
printf("请输入10个学生的信息,并用空格隔开:\n");
for(int i=0;i<10;i++){
scanf("%s",stu[i].num);
scanf("%s",stu[i].name);
scanf("%s",stu[i].major);
scanf("%d",&stu[i].classNo);
for(int j=0;j<=2;j++){
scanf("%d",&stu[i].score[j]);
}
}
//写入文件
if((fp=fopen(filename,"wb"))==NULL) {
printf("Cannot open this file.");
exit(0);
}
fwrite(stu,sizeof(stu),10,fp);
fclose(fp);
}
void Output(STU *p){//将p所指的某个学生信息表格式化屏幕输出
printf("%s\t%8s\t%8s\t%d\t%d\t%d\t%d\t\n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
}
void LoadStudent(STU *p,int n){//向文件中读取信息
FILE *fp;
char filename[20];
printf("\n请输入打开文件名:\n");
gets(filename);
fp=fopen(filename,"rb");
fread(p,sizeof(STU),n,fp);
fclose(fp);
}
void Read(STU *p){//从文件中读取n个学生信息并保存
int m;
printf("请输入读入学生信息个数:\n");
scanf("%d",&m);
getchar();
LoadStudent(p,m);
printf("\n学号\t 姓名\t\t专业 \t班级 成绩1 成绩2 成绩3 \t\n");
for(int i=0;i<m;i++)
Output(p+i);
}
void Fetch(STU *p){//从文件中读取第n个学生的信息
int n;
printf("请输入需要查找第几个学生的信息:\n");
scanf("%d",&n);
getchar();
LoadStudent(p,n);
printf("\n学号\t 姓名\t\t专业 \t班级 成绩1 成绩2 成绩3 \t\n");
Output(p+n-1);
store[0]=p[n-1];
}
void Search(STU *p){//输入班级与成绩要求进行查找
int i,j,q=0;
char k;
printf("请输入要查询的班级:");
scanf("%d",&i);getchar();
if(i>3){
printf("查询错误,无此班级,请重新输入\n");
}
else{
printf("请输入条件(>或<)和成绩,用空格隔开:");
scanf("%c",&k);
scanf("%d",&j);
if(k=='<')
{
printf("\n学号\t 姓名\t\t专业 \t班级 成绩1 成绩2 成绩3 \t\n");
for(int m=0;m<10;m++)
if(p[m].score[0]+p[m].score[1]+p[m].score[2]<j&&p[m].classNo==i){//寻找并输出符合要求的学生信息
Output(p+m);
store[m]=p[m];
q++;
}
}
if(k=='>')
{
printf("\n学号\t 姓名\t\t专业 \t班级 成绩1 成绩2 成绩3 \t\n");
for(int m=0;m<10;m++)
if(p[m].score[0]+p[m].score[1]+p[m].score[2]>j&&p[m].classNo==i){//寻找并输出符合要求的学生信息
Output(p+m);
store[m]=p[m];
q++;
}
}
if(q==0){
printf("查无此人,请重新输入\n");
}
}
q=0;
}
int Max(STU*p){//返回所有学生中第scoreIndex科分数最高的学生序号
int scoreIndex;
printf("请输入查询科目:");
scanf("%d",&scoreIndex);
char n[10];
int m=p[0].score[scoreIndex-1];
strcpy(n,p[0].num);
for(int i=1;i<10;i++){//寻找并记录符合要求的学生序号
if(p[i].score[scoreIndex-1]>m){
m=p[i].score[scoreIndex-1];
strcpy(n,p[i].num);
}
}
m=(n[0]-'0')*100+(n[1]-'0')*10+(n[2]-'0');
printf("\n学号\t 姓名\t\t专业 \t班级 成绩1 成绩2 成绩3 \t\n");
store[0]=p[m-101];
return m;
}
void Sort_select(STU *p){//对所有学生按平均成绩由低到高进行简单选择排序
int m=0,sum[10];
int i=0,d[10];
for(i=0;i<10;i++){
sum[i]=p[i].score[0]+p[i].score[1]+p[i].score[2];
}//计算各学生总分
for(i=0;i<10;i++){
m=0;
for(int j=0;j<10;j++){
if(sum[j]<sum[m]){
m=j;
}
}
d[i]=m;
sum[m]=1000;
}//选择法排序
printf("\n学号\t 姓名\t\t专业 \t班级 成绩1 成绩2 成绩3 \t\n");
for(i=0;i<10;i++){
Output(&p[d[i]]);
store[i]=p[d[i]];
}
}
void Sort_buble(STU *p){//对某个班级学生,按平均成绩由高到低起泡排序
int banji;
printf("输入查询班级:");
scanf("%d",&banji);
if(banji<1||banji>3) printf("查无此班,请重新输入");
else{
char asort[10][10];
int m=0,temp=0,k=0,sum[10],afsort[10];
int i=0,numeber;
int sco[10];
for(i=0;i<10;i++){
sum[i]=p[i].score[0]+p[i].score[1]+p[i].score[2];
}//计算各学生总分
for(i=0;i<10;i++){
if(banji==p[i].classNo){
sco[k]=sum[i];
afsort[k]=i;
k++;
}
}//将所需班级学生挑出
for(i=0;i<k;i++){
for(int j=0;j<k-1;j++){
if(sco[j]<sco[j+1]){
temp=sco[j];
sco[j]=sco[j+1];
sco[j+1]=temp;
temp=afsort[j];
afsort[j]=afsort[j+1];
afsort[j+1]=temp;
}
}
}//起泡法排序
printf("\n学号\t 姓名\t\t专业 \t班级 成绩1 成绩2 成绩3 \t\n");
for(i=0;i<k;i++){
Output(&p[afsort[i]]);
store[i]=p[afsort[i]];
}
}
}
void Sort_insert(STU *p){//对某个专业的学生按某门课程由低到高进行直接插入排序
char maj[10];
int sub;
int i,j,k,cont=0;
STU afsort[10],t;
printf("请输入需查询专业:\n");
scanf("%s",maj);
if(!strcmp(maj,"network")||!strcmp(maj,"computer")||!strcmp(maj,"software")){
printf("请输入需查询成绩的科目:\n");
scanf("%d",&sub);
if(sub<4&&sub>0){
for(i=0;i<10;i++){
if(!strcmp(maj,p[i].major)){//寻找并记录符合条件的学生信息
afsort[cont]=p[i];
cont++;
}
}
for(j=1;j<cont;j++){//插入法排序
t=afsort[j];
for(i=0;i<j;i++){
if(afsort[i].score[sub-1]>t.score[sub-1]) break;
}
for(k=j;k>i;k--)
afsort[k]=afsort[k-1];
afsort[i]=t;
}
printf("\n学号\t 姓名\t\t专业 \t班级 成绩1 成绩2 成绩3 \t\n");
for(i=0;i<cont;i++){
Output(afsort+i);
store[i]=afsort[i];
}
}
else printf("无此科目,请重新输入\n");
}
else printf("无此专业,请重新输入\n");
}
void Store(){//存储更新后的学生信息
FILE *fp;
char filename[15];
printf("请输入要储存的文件名\n");
getchar();
gets(filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("Wrong.\n");
exit(0);
}
fwrite(store,sizeof(store),10,fp);
fclose(fp);
}
5.程序运行截图
Input、Search、Max、Sort_buble、Sort_insert函数的调用及执行结果的界面截图