之前的课设,源码在下面。
要求:
学生成绩管理系统
主要内容:该系统实现对学生成绩的批量录入、修改、查询、浏览等功能。具体要求如下:
学生信息包括:学号、姓名、入学年月、4门课的成绩等8个成员,试设计学生成绩管理系统,使之能提供以下功能:
1、信息录入:录入每一位学生信息(包括学号、姓名、入学年月和4门课的成绩);
2、信息浏览:输出系统内所有学生的信息;
3、成绩修改:输入学号,修改该生某一门课的成绩;
4、分类查询:按学号或姓名查找学生,输出学生的成绩单;
5、统计学生总成绩:计算每个学生的总分及平均分,并根据学生的平均成绩进行排序;
6、统计每门课程的成绩:计算每一门课程学生的及格率、优秀率等。
用VS写的,可以直接复制的哦。
#define _CRT_SECURE_NO_WARNINGS
#define Length 60
#define Stu_Num 8
#include<stdio.h>
#include<string.h>
typedef struct {
float Math_Score,English_Score;
float C_language_Score, physics_Score;
}School_Class;
typedef struct {//学生信息
char StuID[Length];//学生学号
char Stuname[Length];//姓名
char in_school_time[Length];//入学时间
char Stusex[Length];//性别
School_Class Score; //各科成绩
float total_Score;
}Student;
typedef struct {//统计信息
//平均值
float Math_Score_average, English_Score_average;
float C_language_average, physics_Score_average;
//最大值
float Math_Score_Max, English_Score_Max;
float C_language_Max, physics_Score_Max;
//及格人数
int Math_Score_pass_count, English_Score_pass_count;
int C_language_pass_count, physics_Score_pass_count;
//及格率
float Math_Score_pass_rate, English_Score_pass_rate;
float C_language_pass_rate, physics_Score_pass_rate;
} Account_Score_;
Account_Score_ Account_Score;
Student stu[8];//八个学生
void Subject_average_Get_Show(Student* stu_arr, int size, int commond);
void Get_Single_Max_Score_Show(Student stu[], int n, int commond);
void Get_Single_Max_Score_Show(Student stu[], int n, int commond);
void Single_pass_rate_Get_Show(Student stu[], int n, int commond);
void All_Score_Sort_Handle(Student* stu, int size);
void Increase_Student_Information()//case2
{
int n = 0;
int i;
printf("输入几位学生的信息\n");
scanf(" %d", &n);//总共八位学生
for (i = 0; i < n; i++) {
printf("请输入第%d位学生的姓名:\n", i+1);
scanf(" %s",&stu[i].Stuname);
printf("请输入第%d位学生的性别:\n", i + 1);
scanf(" %s", &stu[i].Stusex);
printf("请输入第%d位学生的学号:\n", i + 1);
scanf(" %s", &stu[i].StuID);
printf("请输入第%d位学生的入学时间:\n", i + 1);
scanf(" %s", &stu[i].in_school_time);
printf("请输入第%d位学生的C语言成绩:\n", i + 1);
scanf(" %f", &stu[i].Score.C_language_Score);
printf("请输入第%d位学生的高数成绩:\n", i + 1);
scanf(" %f", &stu[i].Score.Math_Score);
printf("请输入第%d位学生的英语成绩:\n", i + 1);
scanf(" %f", &stu[i].Score.English_Score);
printf("请输入第%d位学生的物理成绩:\n", i + 1);
scanf(" %f", &stu[i].Score.physics_Score);
if (i == n-1) {
printf("录入成功");
}
}
}
void Search_stu()//case2
{
int Select;
char student_Id[Length], student_name[Length];
int i;
while (1)
{
printf("------------------------------\n");
printf("**-------1.按学号查询------**\n");
printf("**-------2.按姓名查询------**\n");
printf("**-------3.退出本菜单------**\n");
printf("-------------------------------\n");
scanf(" %d", &Select);
switch (Select)
{
case 1:printf("请输入需要查找学生的学号:\n");
scanf(" %s", student_Id);
for (i = 0; i < Stu_Num; i++)
{
if (strcmp(stu[i].StuID, student_Id) == 0)
{
printf("学号\t\t姓名\t性别\tC语言\t高数\t英语\t大物\n");
printf("%s\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].Score.C_language_Score, stu[i].Score.Math_Score, stu[i].Score.English_Score, stu[i].Score.physics_Score);
break;//防止下面的一定会输出
}
if (i == Stu_Num) {
printf("没有这个人\n");
}
}
break;
case 2:printf("请输入需要查找学生的名字:\n");
scanf(" %s", student_name);
for (i = 0; i < Stu_Num; i++)
{
if (strcmp(stu[i].Stuname, student_name)==0)//变量没对上
{
printf("学号\t\t姓名\t性别\tC语言\t高数\t英语\t大物\n");
printf("%s\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].Score.C_language_Score, stu[i].Score.Math_Score, stu[i].Score.English_Score, stu[i].Score.physics_Score);
break;
}
if (i == Stu_Num) {
printf("没有这个人\n");
}
}
break;
}
if (Select == 3)break;
}
}
void delete_student(Student* stu, int n, int index)
{
int i;
if (index < 0 || index >= n) {
printf("无效的索引值\n");
}
for ( i = index; i < n - 1; i++) {
stu[i] = stu[i + 1]; // 将后面的元素向前移动一位
}
n--; // 更新学生数量
printf("学生信息已删除\n");
}
void Handle_stu_Information()//case 4
{
int i,j;
int Select=0;
int Select_1;
char student_Id[Length], student_name[Length];
char input_Id_change[Length], input_name_change[Length];
char Delect[Length] = {"delect"};
while (1) {
if (Select == 0) {
printf("------------------------------\n");
printf("**-------1.开始修改学生信息------**\n");
printf("**-------2.退出本菜单------**\n");
printf("-------------------------------\n");
printf("------------------------------\n");
scanf("%d", &Select);
}
if (Select == 1) {
while (1) {
printf("**以下是所有已有的学生**\n");//制表符隔开
for (i = 0; i < 8; i++) {
printf(" 名字%s\t", stu[i].Stuname);
printf(" 学号%s\t\t\n", stu[i].StuID);
}
printf("------------------------------\n");
printf("**-------1.以学号为索引删除信息------**\n");
printf("**-------2.以名字为索引删除信息------**\n");
printf("---------3.退出子菜单------\n");
printf("------------------------------\n");
scanf(" %d", &Select_1);
switch (Select_1)
{
case 1://学号
printf("--输入你要修改学生的学号--\n");
scanf(" %s", student_Id);
for (i = 0; i < 8; i++) {
if (strcmp(stu[i].StuID, student_Id) == 0) {
printf("请输入你要修改的信息,若输入delect则删除此同学\n\n");
scanf(" %s", input_Id_change);
if (strcmp(input_Id_change, Delect) == 0) {
delete_student(stu, Stu_Num, i);
}
}
}
break;
case 2:
printf("--输入你要修改学生的姓名--\n");
scanf(" %s", student_name);
for (i = 0; i < 8; i++) {
if (strcmp(stu[i].Stuname, student_name) == 0) {
printf("请输入你要修改的信息,若输入delect则删除此同学\n\n");
scanf(" %s", input_name_change);
if (strcmp(input_name_change, Delect) == 0) {
delete_student(stu, Stu_Num, i);
}
}
}
}
if (Select_1 == 3) {
Select = 0;
Select_1=0;
break;
}
}
}
else if (Select == 2) {
break;
}
else printf("请输入正确的菜单指令");
}
}
void Account_Stu_All_Score()//case 5
{
int Select;
int Select_1;
int i, j;
while (1)
{
printf("-----------学生成绩汇总--------\n");
printf("**-------输入你要查询的科目------**\n");
printf("**-------1.高数------**\n");//以这个顺序写一个函数
printf("**-------2.大物------**\n");
printf("**-------3.英语------**\n");
printf("**-------4.C语言------**\n");
printf("**-------5.总成绩排名------**\n");
printf("**-------6.退出本菜单------**\n");
printf("-------------------------------\n");
scanf(" %d", &Select);
while (Select >= 1 && Select <= 4) {
printf("**-------输入你要查询的信息------**\n");
printf("**-------1.平均分------**\n");
printf("**-------2.最高分------**\n");
printf("**-------3.及格率------**\n");
printf("**-------4.退出子菜单------**\n");
scanf(" %d", &Select_1);
switch (Select_1)//平均分
{
case 1:
Subject_average_Get_Show(stu,Stu_Num, Select);//不仅算出来了,而且能够智能显示出来
break;
case 2:Get_Single_Max_Score_Show(stu,Stu_Num, Select);
break;
case 3:Single_pass_rate_Get_Show(stu, Stu_Num, Select);
}
if (Select_1 == 4) {
Select = 0;
break;
}
}
if (Select == 5) {
All_Score_Sort_Handle(stu, Stu_Num);
printf("排名如下\n");
for (i = 0; i < Stu_Num; i++) {
printf("第%d名%s 总分%f\n",i+1,stu[i].Stuname,stu[i].total_Score);
}
printf("按1退出\n");
scanf("%d", &Select_1);
if (Select_1 == 1) {
Select = 0;
}
}
if (Select == 6) {
break;
}
}
}
void Now_student_Information_Show()//case6
{
int Select;
int i;
while (1) {
printf("-----------当前所有学生信息查询--------\n");
printf("**-------1.开始查询-------------------**\n");
printf("**-------2.退出子菜单------------------**\n");
scanf(" %d", &Select);
if (Select == 1) {
printf("现有学生所有信息如下\n");
for (i = 0; i < Stu_Num; i++)
{
printf("学号\t\t姓名\t性别\t入学时间\tC语言\t高数\t英语\t大物\n");
printf("%s\t\t%s\t%s\t\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].in_school_time, stu[i].Score.C_language_Score, stu[i].Score.Math_Score, stu[i].Score.English_Score, stu[i].Score.physics_Score);
}
}
else if (Select == 2) {
break;
}
else printf("请输入正确的命令数字");
}
}
void ModifyScoreByID_Show(Student* stu, int n, char* id, float c_score) //配合case7
{
int i;
for (i = 0; i < n; i++) {
if (strcmp(stu[i].StuID, id) == 0) { // 找到需要修改成绩的学生
stu[i].Score.C_language_Score = c_score;
printf("已将学号为 %s 的学生的C语言成绩修改为 %.2f\n", id, c_score);
return; // 成功修改成绩后,直接返回
}
}
printf("找不到学号为 %s 的学生!\n", id);
}
void ModifyScoreByName_Show(Student* stu, int n, char* name, float c_score)//配合case7
{
int i;
for (i = 0; i < n; i++) {
if (strcmp(stu[i].Stuname, name) == 0) { // 找到需要修改成绩的学生
stu[i].Score.C_language_Score = c_score;
printf("已将姓名为 %s 的学生的C语言成绩修改为 %.2f\n", name, c_score);
return; // 成功修改成绩后,直接返回
}
}
printf("找不到姓名为 %s 的学生!\n", name);
}
void Handle_Stu_Score()//case7
{
int Select,Select_1;
char student_name[Length];
char student_id[Length];
float change_Score;
int i;
while (1)
{
printf("**-------输入你要修改的科目------**\n");
printf("**-------1.高数------**\n");//以这个顺序写一个函数
printf("**-------2.大物------**\n");
printf("**-------3.英语------**\n");
printf("**-------4.C语言------**\n");
printf("**-------5.退出子菜单-------**\n");
scanf("%d", &Select);
if (Select >= 1 && Select <= 4) {
while (1) {
printf("------------------------------\n");
printf("**-------1.以姓名为索引修改信息------**\n");
printf("**-------2.以学号为索引修改信息------**\n");
printf("**-------3.退出子菜单------**\n");
scanf("%d", &Select);
if (Select == 1) {
printf("输入你要修改学生的姓名");
scanf(" %s", student_name);
printf("输入你要你要修改的分数");
scanf(" %f", &change_Score);
ModifyScoreByName_Show(stu, Stu_Num, student_name, change_Score);
}
if (Select == 2) {
printf("输入你要修改学生的学号");
scanf(" %s", student_id);
printf("输入你要你要修改的分数");
scanf(" %f", &change_Score);
ModifyScoreByID_Show(stu, Stu_Num, student_id, change_Score);
}
if (Select == 3)break;
}
}
if (Select==5)
{
break;
}
}
}
int num_select = 0;
void menu_main_show()
{
printf("\n\n");
printf("* 学生信息管理系统 *\n");
printf(" 系统功能菜单 \n");
printf("---------------------- --------------------------\n");
printf("** 1、使用帮助 | 2、增加学生信息 **\n");
printf("** 3、查询学生信息 | 4、删除学生信息 **\n");
printf("** 5、统计学生总成绩 | 6、显示当前信息 **\n");
printf("** 7、修改学生成绩 **\n");
printf("** 8、退出系统 **\n");
printf("---------------------- ╮(╯▽╰)╭ --------------------------\n");
scanf("%d", &num_select);
switch (num_select)
{
case 1: printf("这是一个学生信息管理系统,为了帮助您更快的了解使用它,请先仔细阅读以下注意事项:\n");
printf(" 注意事项: \n ");
printf("1、请根据提示进行操作!\n");
printf("2.输入对应数字获取对应响应!\n");
printf("3.作者 xy燚(≧﹏ ≦)!\n");
printf("4.还有,老师菜菜捞捞 (≧﹏ ≦)!\n");
break;
case 2:Increase_Student_Information(); break;
case 3:Search_stu(); break;
case 4:Handle_stu_Information(); break;
case 5:Account_Stu_All_Score(); break;
case 6:Now_student_Information_Show(); break;
case 7:Handle_Stu_Score(); break;
}
}
void main()
{
while (1) {
menu_main_show();
if (num_select == 8) {
break;
}
}
printf("成功退出");
}
//float Average_Get(float* arr, int size)
//{
// int i;
// float sum = 0;
// for (i = 0; i < size; i++) {
// sum += *(arr + i);
// }
// return sum / size;
//}
//输出对应平均值的函数,减少代码长度,科目与select对应
void Subject_average_Get_Show(Student* stu_arr, int size,int commond)
{
float math_sum = 0, english_sum = 0, c_language_sum = 0, physics_sum = 0;
int i;
for (i = 0; i < size; i++) {//可以if
math_sum += (stu_arr + i)->Score.Math_Score;
english_sum += (stu_arr + i)->Score.English_Score;
c_language_sum += (stu_arr + i)->Score.C_language_Score;
physics_sum += (stu_arr + i)->Score.physics_Score;
}
Account_Score.C_language_average = c_language_sum / size;
Account_Score.English_Score_average = english_sum / size;
Account_Score.Math_Score_average = math_sum / size;
Account_Score.physics_Score_average = physics_sum / size;
if(commond==1)printf("高数平均值是 : %f\n", Account_Score.C_language_average);
if (commond == 2)printf("物理平均值是 : %f\n", Account_Score.physics_Score_average);
if (commond == 3)printf("英语平均值是 : %f\n", Account_Score.English_Score_average);
if (commond == 4)printf("C语言平均值是 : %f\n", Account_Score.Math_Score_average);
}
//计算单科最高分
void Get_Single_Max_Score_Show(Student stu[], int n,int commond)
{
int i;
Account_Score.Math_Score_Max = 0;
Account_Score.physics_Score_Max = 0;
Account_Score.English_Score_Max = 0;
Account_Score.C_language_Max = 0;
for ( i = 0; i < n; i++) {//没必要选择计算,算力充足,可以优化
if (stu[i].Score.Math_Score > Account_Score.Math_Score_Max) {
Account_Score.Math_Score_Max = stu[i].Score.Math_Score;
}
if (stu[i].Score.physics_Score > Account_Score.physics_Score_Max) {
Account_Score.physics_Score_Max = stu[i].Score.physics_Score;
}
if (stu[i].Score.English_Score > Account_Score.English_Score_Max) {
Account_Score.English_Score_Max = stu[i].Score.English_Score;
}
if (stu[i].Score.C_language_Score > Account_Score.C_language_Max) {
Account_Score.C_language_Max = stu[i].Score.C_language_Score;
}
}
if (commond == 1)printf("高数最高分是 %f", Account_Score.Math_Score_Max);
if (commond == 2)printf("大物最高分是 %f", Account_Score.physics_Score_Max);
if (commond == 3)printf("英语最高分是 %f", Account_Score.English_Score_Max);
if (commond == 4)printf("C语言最高分是 %f", Account_Score.C_language_Max);
}
//计算及格率并显示
void Single_pass_rate_Get_Show(Student stu[], int n,int commond)
{
int i;
Account_Score.Math_Score_pass_count = 0;
for (i = 0; i < Stu_Num; i++) {
if (stu[i].Score.Math_Score >= 60) {
Account_Score.Math_Score_pass_count++;
}
if (stu[i].Score.physics_Score >= 60) {
Account_Score.physics_Score_pass_count++;
}
if (stu[i].Score.English_Score >= 60) {
Account_Score.English_Score_pass_count++;
}
if (stu[i].Score.C_language_Score >= 60) {
Account_Score.C_language_pass_count++;
}
}
Account_Score.Math_Score_pass_rate = (float)Account_Score.Math_Score_pass_count / Stu_Num;
Account_Score.physics_Score_pass_rate = (float)Account_Score.physics_Score_pass_count / Stu_Num;
Account_Score.English_Score_pass_rate = (float)Account_Score.English_Score_pass_count / Stu_Num;
Account_Score.C_language_pass_rate = (float)Account_Score.C_language_pass_count / Stu_Num;
if (commond == 1)printf("高数及格率是 %f", Account_Score.Math_Score_pass_rate);
if (commond == 2)printf("大物及格率是 %f", Account_Score.physics_Score_pass_rate);
if (commond == 3)printf("英语及格率是 %f", Account_Score.English_Score_pass_rate);
if (commond == 4)printf("C语言及格率是 %f", Account_Score.C_language_pass_rate);
}
void All_Score_Sort_Handle(Student* stu, int size)
{
int i, j;
float total_score1;
float total_score2;
Student tmp;
for (i = 0; i < size - 1; i++)
{
for (j = 0; j < size - 1 - i; j++) {
total_score1 = stu[j].Score.Math_Score + stu[j].Score.English_Score + stu[j].Score.C_language_Score + stu[j].Score.physics_Score;
total_score2 = stu[j + 1].Score.Math_Score + stu[j + 1].Score.English_Score + stu[j + 1].Score.C_language_Score + stu[j + 1].Score.physics_Score;
if (total_score1 < total_score2) {
tmp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = tmp;
}
}
}
for (i = 0; i < Stu_Num; i++) {
stu[i].total_Score= stu[i].Score.Math_Score + stu[i].Score.English_Score + stu[i].Score.C_language_Score + stu[i].Score.physics_Score;
}
}
//sort 函数也可以像上面show一样封装,不过没必要
void Sort_math(Student* stu, int n)
{
// 冒泡排序
int i, j;
Student tmp;
for ( i = 0; i < n - 1; i++) {
for ( j = 0; j < n - 1 - i; j++) {
if (stu[j].Score.Math_Score < stu[j + 1].Score.Math_Score) {
tmp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = tmp;
}
}
}
}
void Sort_English(Student* stu, int n)
{
// 冒泡排序
int i, j;
Student tmp;
for ( i = 0; i < n - 1; i++) {
for ( j = 0; j < n - 1 - i; j++) {
if (stu[j].Score.English_Score < stu[j + 1].Score.English_Score) {
tmp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = tmp;
}
}
}
}
void Sort_C_Language(Student* stu, int n)
{
// 冒泡排序
int i, j;
Student tmp;
for ( i = 0; i < n - 1; i++) {
for ( j = 0; j < n - 1 - i; j++) {
if (stu[j].Score.C_language_Score < stu[j + 1].Score.C_language_Score) {
tmp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = tmp;
}
}
}
}
void Sort_physics(Student* stu, int n)
{
// 冒泡排序
int i, j;
Student tmp;
for ( i = 0; i < n - 1; i++) {
for ( j = 0; j < n - 1 - i; j++) {
if (stu[j].Score.physics_Score < stu[j + 1].Score.physics_Score) {
tmp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = tmp;
}
}
}
}
小到大
//void Sort_Handle(float* arr, int size) {
// int i, j;
// float tmp;
// for (i = 0; i < size - 1; i++) {
// for (j = 0; j < size - 1 - i; j++) {
// if (*(arr + j) > *(arr + j + 1)) {
// tmp = *(arr + j);
// *(arr + j) = *(arr + j + 1);
// *(arr + j + 1) = tmp;
// }
// }
// }
//}
void Modify_Score(Student* stu, int n, char* id, char* course_name, float new_score)
{
int i;
int course_index = -1; // 记录待修改成绩的课程在结构体中的索引
for (i = 0; i < n; i++) {
if (strcmp(stu[i].StuID, id) == 0) { // 找到需要修改成绩的学生
if (strcmp(course_name, "C语言") == 0) {
course_index = 0;
stu[i].Score.C_language_Score = new_score;
}
else if (strcmp(course_name, "高数") == 0) {
course_index = 1;
stu[i].Score.Math_Score = new_score;
}
else if (strcmp(course_name, "英语") == 0) {
course_index = 2;
stu[i].Score.English_Score = new_score;
}
else if (strcmp(course_name, "大物") == 0) {
course_index = 3;
stu[i].Score.physics_Score = new_score;
}
else {
printf("输入的课程名称错误!\n");
}
break;
}
}
if (i == n) {
printf("找不到学号为 %s 的学生!\n", id);
}
else if (course_index == -1) {
printf("找不到名称为 %s 的课程!\n", course_name);
}
else {
printf("已将学号为 %s 的学生的 %s 成绩修改为 %.2f\n", id, course_name, new_score);
}
}
成品是这样的哦