基于数组的“学生信息管理系统”
实验内容: 编写并调试程序,实现学校各专业班级学生信息的管理。
定义学生信息的结构体类型,包括:学号、姓名、专业、班级、3门成绩。N定义为符号常量,定义N名学生信息的结构体数组。
实验要求:
(1) main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。
(2) 定义函数Input:从键盘输入一个学生信息。
(3) 定义函数Output:将某个学生信息格式化输出。
(4) 定义函数Save:将某个学生信息存入文件。
(5) 定义函数Fetch:从文件中随机读取某个学生的信息。
(6) 定义函数Max:求所有学生某门课程的最高分和分数最高的学生的姓名。
(7) 定义函数Sort_select:对某个专业的学生,按总平均成绩 由低到高进行简单选择排序。
(8) 定义函数Sort_buble:对某个班级的学生,按总平均成绩由高到低进行起泡排序。
(9) 定义函数Sort_insert:对某个班级的学生,按某门课程成绩由低到高进行直接插入排序。定义函数Search:实现班级和成绩的综合查找(如1班,总分240分以上同学)。
这是初稿,所以很多冗余的地方,懒得省,所以比较长,并且用的是比较简单的语言,不足之处多多见谅。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define N 10
int menu(void); //菜单函数
void choose(void); //选择选项函数
void Input(void);
void Output(void);
void Save(void);
void Fetch(void);
void Max(void);
void Sort_select(void);
void Sort_buble(void);
void Sort_insert(void);
void Search(void);
struct student
{
int No; //学号
char name[10];
char major[10]; //专业
char cla[5]; //班级
int CScore; //C语言成绩
int EScore; //英语成绩
int MScore; //数学成绩
}stu[N];
struct sco_stu //排序时用到
{
int No;
char name[10];
int average;
};
int menu(void)
{
int mchoice;
printf("********************菜单********************\n\n");
printf("0、退出程序\n");
printf("1、输入学生信息\n");
printf("2、输出学生信息\n");
printf("3、保存学生信息到文件\n");
printf("4、从文件中随机读取一个学生信息\n");
printf("5、求所有学生某门课程的最高分和分数最高的学生的姓名\n");
printf("6、对某个专业的学生,按总平均成绩由低到高进行简单选择排序\n");
printf("7、对某个班级的学生,按总平均成绩由高到低进行起泡排序\n");
printf("8、对某个班级的学生,按某门课程成绩由低到高进行直接插入排序\n");
printf("9、实现班级和成绩的综合查找\n");
printf("---------------------------------------------------------------\n");
printf("请输入选项:");
scanf("%d", &mchoice);
printf("\n");
while(mchoice > 9) //当输入超过9时需要重新输入正确的数据
{
printf("请输入0-9:");
scanf("%d", &mchoice);
}
return mchoice;
}
void choose(void)
{
int choice;
choice = menu();
while(0 <= choice && choice <= 9)
{
switch(choice)
{
case 1:
Input();
break;
case 2:
Output();
break;
case 3:
Save();
break;
case 4:
Fetch();
break;
case 5:
Max();
break;
case 6:
Sort_select();
break;
case 7:
Sort_buble();
break;
case 8:
Sort_insert();
break;
case 9:
Search();
break;
case 0:
printf("已退出程序\n");
exit(0);
}
choice = menu();
}
}
void Input(void)
{
int i,en;
for(i = 0; i < N; i++)
{
if(stu[i].No == 0) //学号为0时说明该单元为空,才能存入信息,否则进行+1操作,查询下一个单元是否为空
{
printf("输入信息请按1,停止输入请按0\n"); //可以随时继续输入信息或者停止输入
scanf("%d", &en);
if(en == 0)
return;
else
{
printf("请输入以下信息:\n");
printf("学号(1-100):");
scanf("%d", &stu[i].No);
printf("姓名:");
scanf("%s", stu[i].name);
printf("专业:");
scanf("%s", stu[i].major);
printf("班级:");
scanf("%s", stu[i].cla);
printf("C语言成绩:");
scanf("%d", &stu[i].CScore);
printf("英语成绩:");
scanf("%d", &stu[i].EScore);
printf("数学成绩:");
scanf("%d", &stu[i].MScore);
printf("\n");
}
}
}
}
void Output(void)
{
int i;
int flag = 0; //flag为错误提示
int no;
printf("请输入要输出信息的学生学号:");
scanf("%d", &no);
for(i = 0; i < N; i++)
{
if(stu[i].No == no)
{
printf("学号:%d\n", stu[i].No);
printf("姓名:%s\n", stu[i].name);
printf("专业:%s\n", stu[i].major);
printf("班级:%s\n", stu[i].cla);
printf("C语言成绩:%d\n", stu[i].CScore);
printf("英语成绩:%d\n", stu[i].EScore);
printf("数学成绩:%d\n", stu[i].MScore);
printf("\n");
flag++;
}
}
if(flag == 0) //当查找完整个数组后没有找到学生信息时,flag为0,则报错
{
printf("没有该学生学号,需要重新输入学号\n\n");
Output();
}
}
void Save(void)
{
FILE *fp;
int i, sno;
int flag = 0; //错误标志位
fp = fopen("manager", "a"); //已附加方式打开只写文件,写入的文件会被加到文件尾
printf("请输入要保存进文档里的学生信息学号:")