主要功能介绍:学生的输入,查询,插入,删除,输出,以及平均分,排名,挂科率,以及补考名单的实现
功能实现方式:根据数组以及多重函数的引用实现功能(详细解释见代码中注释)
以下是成绩管理系统的代码实现和程序的运行情况:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#define max 100//给定结构体数组的最大值
int size = 0;//全局变量,表示已经系统内录入学生的个数 并初始化
//显示学生属性的信息
typedef struct Information//使Information成为一个类型
{
char student_name[20];//学生的名字
int student_class;
int student_number;//学生的学号
float student_english;
float student_math;
float student_C;
}information;
void menu()
{
printf("\n");
printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
printf(“\n");
printf(" 学生成绩管理系统\n");
printf("\n”);
printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\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(" 10—输出各科的补考名单(包括学号、姓名、成绩) \n");
printf(" 11—对学生按学号排序 \n");
printf(" 12—修改成绩 \n");
printf(" 0—退出 \n");
}
//1.学生输入
//定义一个函数add_student,zihao表示要录入学生的个数
void add_student(information im[], int zihao)
{
int i;
int count = size + zihao;
//count加完之后的人数
for (i = size; i < count; i++)
{
printf(“请录入学生的名字:\n”);
scanf("%s", &im[i].student_name); printf(“请录入学生的学号:\n”);
scanf("%d", &im[i].student_number); printf(“请录入学生的班级:\n”);
scanf("%d", &im[i].student_class); printf(“请录入学生的英语成绩:\n”);
scanf("%f", &im[i].student_english); printf(“请录入学生的数学成绩:\n”);
scanf("%f", &im[i].student_math); printf(“请录入学生的C语言成绩:\n”);
scanf("%f", &im[i].student_C); size++;
}
//end of for
printf(“输入成功,共输入%d人成绩”, i);
}
//2.学生插入(按位置插入)
void st_insert(information im[], int win)
{
int i;
if (win < 1 || win > size + 1){
printf(“错误!\n”);
//输入数大于总人数,错误
return;
}
for (i = size; i > win - 1; i–)
{
im[i] = im[i - 1];
//向右移一个位置,左侧用来插入新信息
}
printf(“请录入插入学生的名字:\n”);
scanf("%s", &im[i].student_name);
printf(“请录入插入学生的学号:\n”);
scanf("%d", &im[i].student_number); printf(“请录入插入学生的班级:\n”);
scanf("%d", &im[i].student_class); printf(“请录入插入学生的英语成绩:\n”);
scanf("%f", &im[i].student_english); printf(“请录入插入学生的数学成绩:\n”);
scanf("%f", &im[i].student_math); printf(“请录入插入学生的C语言成绩:\n”);
scanf("%f", &im[i].student_C);
size += 1;
printf(“插入成功!\n”);
}
//3.学生查询
void check_oneStudent(information im[], int student_number)
{
int i; //是实现学生信息的查询
for (i = 0; i < size; i++)
{
if (im[i].student_number == student_number)
{
printf(“名字 = %s\t学号 = %d\t班级 = %s\t英语成绩 = %0.2f\t数学成绩 = %0.2f\tC语言成绩 = %0.2f\n\n”,
im[i].student_name, im[i].student_number, im[i].student_class, im[i].student_english, im[i].student_math, im[i].student_C);
return;
}//end of if
}//end of for printf(“没有该学生的信息!\n”);}
//4.学生删除
void del_studentinfor(information im[], int student_number)
{
int i, j; //找到给定的编号,并删除对应编号的信息
for (i = 0; i < size; i++)
{
//通过比较找到对应编号,然后删除
if (im[i].student_number == student_number)
{
//通过移动数组元素来删除信息
for (j = i; j < size - 1; j++)
{
im[j] = im[j + 1];
} //end of for
size–;
printf(“删除成功!\n”);
return;
}//end of if
}//end of for printf(“没有该学生\n”);
}
//5.学生输出
void check_student(information im[])
{
int i;
if (size == 0){
printf(“没有学生信息录入!”);
}
for (i = 0; i < size; i++)
{
printf(“名字 : %s\t学号 : %d\t班级 : %s\t\n英语成绩 = %0.2f\t数学成绩 = %0.2f\tC语言成绩 = %0.2f\n\n”,
im[i].student_name, im[i].student_number, im[i].student_class, im[i].student_english, im[i].student_math, im[i].student_C);
}//end of for
}
//6.计算每名学生的平均分并输出
void aveGrade(information im[])
{
int i;
float ave = 0;
//定义ave
for (i = 0; i < size; i++) {
//平均分求值公式
ave = (im[i].student_english + im[i].student_math + im[i].student_C) / 3;
printf(“学号%d 姓名%s的平均成绩 = %0.2f\n”, im[i].student_number, im[i].student_name, ave);
}
}
//7.每科的平均分并输出
void ev_grade(information im[]){
int i, j = 0;
float sum1 = 0.0, sum2 = 0.0, sum3 = 0.0;
//j为单科考试人数,sum为单科总分数
for (i = 0; i < size; i++)
{
sum1 = sum1 + im[i].student_english;
sum2 = sum2 + im[i].student_math;
sum3 = sum3 + im[i].student_C;
j++;
}
printf(“英语平均成绩: %0.2f\n”, sum1 / j);
printf(“数学平均成绩: %0.2f\n”, sum2 / j);
printf(“C语言平均成绩: %0.2f\n”, sum3 / j);
}
//8.统计每门课程的及格率并输出
void evsub_ave(information im[])
{
int i, j = 0, count1 = 0, count2 = 0, count3 = 0;
float w; for (i = 0; i < size; i++)
{
if (im[i].student_english >= 60)
{
count1++;
}
if (im[i].student_math >= 60)
{
count2++;
}
if (im[i].student_C >= 60)
{
count3++;
}
j++;
}
w = 100.0f / j; //强转
//count及格人数
printf(“英语及格率为:%0.2f\n”, count1 * w);
printf(“数学及格率为:%0.2f\n”, count2 * w);
printf(“C语言及格率为:%0.2f\n”, count3 * w);
}
//9.输出各科的补考名单
void rebuild(information im[])
{
int i, flag = 1; printf(“英语补考名单:\n”);
for (i = 0; i < size; i++)
{
if (im[i].student_english < 60)
{
printf(“姓名:%s\t”, im[i].student_name);
printf(“学号:%d\t”, im[i].student_number);
printf(“英语成绩:%0.2f\n”, im[i].student_english);
flag = 0;
}
}
if (flag == 1){
printf(“没有补考的!\n”);
}
else{
flag = 1;
}
printf(“数学补考名单:\n”);
for (i = 0; i < size; i++)
{
if (im[i].student_math < 60)
{
printf(“姓名:%s\t”, im[i].student_name);
printf(“学号:%d\t”, im[i].student_number);
printf(“数学成绩:%0.2f\n”, im[i].student_math);
flag = 0;
}
}
if (flag == 1){
printf(“没有补考的!\n”);
}
else{
//再次定义
flag = 1;
}
printf(“C语言补考名单:\n”);
for (i = 0; i < size; i++)
{
if (im[i].student_C < 60)
{
printf(“姓名:%s\t”, im[i].student_name);
printf(“学号:%d\t”, im[i].student_number);
printf(“C语言成绩:%0.2f\n”, im[i].student_C);
flag = 0;
}
}
if (flag == 1){
printf(“没有补考的!\n”);
}
}
//10.对学生按学号排序(由小到大)
//采用冒泡排序
void num_sort(information im[])
{
int i, j;
information stu_temp; for (i = 0; i < size; i++)
{
for (j = 0; j
if (im[j].student_number > im[j + 1].student_number)
{
stu_temp = im[j];
im[j] = im[j + 1];
im[j + 1] = stu_temp;
}
}
}
printf(“排序后的结果:\n”);
for (i = 0; i < size; i++)
{
printf("%d\t", im[i].student_number);
}
}
//11.对学生的平均分排序(由大到小)
//同样采用冒泡排序
void ave_sort(information im[])
{
int i, j;
float ave[300], ave_temp;
information stu_temp; for (i = 0; i < size; i++)
{
ave[i] = (im[i].student_english + im[i].student_math + im[i].student_C) / 3;
}
for (i = 0; i < size - 1; i++)
{
for (j = 0; j
if (ave[j] < ave[j + 1])
{
stu_temp = im[j];
im[j] = im[j + 1];
im[j + 1] = stu_temp; ave_temp = ave[j];
ave[j] = ave[j + 1];
ave[j + 1] = ave_temp;
}
}
}
printf(“排序后的结果:\n”);
for (i = 0; i < size; i++)
{
printf("%0.2f\t", ave[i]);
}
}
//12.修改成绩
void gai(information im[], int student_number)
{
int i;
int j = 0;
//找出你要改的人
for (i = 0; i < size; i++)
{
//筛选
if (im[i].student_number == student_number)
{
printf(“以下是学号为%d的学生的信息名字,请确认\n 名字= %s\t学号 = %d\t班级 = %s\t英语成绩 = %0.2f\t数学成绩 = %0.2f\tC语言成绩 = %0.2f\n\n”,
im[i].student_number, im[i].student_name, im[i].student_number, im[i].student_class, im[i].student_english, im[i].student_math, im[i].student_C);
printf(“现在选择你要修改的成绩;名字代号为;1\t学号代号为;2\t班级代号为;3\t英语成绩代号为;4\t数学成绩代号为;5\tC语言成绩代号为;6\t返回代号为0”);
scanf("%d", &j);
switch (j)
{
case 1:
scanf("%s", im[i].student_name);
break;
case 2:
scanf("%d", &im[i].student_number);
break;
case 3:
scanf("%s", im[i].student_class);
break;
case 4:
scanf("%f", &im[i].student_english);
break;
case 5:
scanf("%f", &im[i].student_math);
break;
case 6:
scanf("%f", &im[i].student_C);
break;
case 0:
break;
}
return;
}//end of if
}//end of for printf(“没有该学生的信息!\n”);}
int main()
{
information student[max];
int zihao;
int value = -1;
int student_id, win;
char user[10] = “wen\0”;
char key[10] = “123456\0”;
char user2[100], key2[100];
printf(“请输入用户名:\n”);
scanf("%s", &user2);
printf(“请输入密码:\n”);
scanf("%s", &key2);
if (strcmp(user, user2) != 0 || strcmp(key, key2) != 0)
{
//非法输入!
printf(“非法输入!用户名或密码错误!\n”);
return 0;
system(“pause”);
}
else
{
while (value != 0)//按"0"退出操作
{
menu();
printf(“请选择所要执行的操作:\n”);
scanf("%d", &value);
switch (value)//根据value的值来执行相应的操作
{
//1—学生输入
case 1:
printf(“请输入你要录入学生信息的个数:”);
scanf("%d", &zihao);
add_student(student, zihao);
break;
//2—学生插入
case 2:
printf(“请输入插入学生的位置:\n”);
scanf("%d", &win);
st_insert(student, win);
break;
//3—学生查询
case 3:
printf(“请输入要查询的学生的学号:”);
scanf("%d", &student_id);
check_oneStudent(student, student_id);
break;
//4—学生删除
case 4:
printf(“请输入要删除的学生的学号:”);
scanf("%d", &student_id);
del_studentinfor(student, student_id);
break;
//5—学生输出
case 5:
check_student(student);
break;
//6—计算每名学生的平均分并输出
case 6:
aveGrade(student);
break;
//7—计算每科的平均分并输出
case 7:
ev_grade(student);
break;
//8—对学生的平均分排序
case 8:
ave_sort(student);
break;
//9—统计每门课程的及格率并输出
case 9:
evsub_ave(student);
break;
//10—输出各科的补考名单(包括学号、姓名、成绩)
case 10:
rebuild(student);
break;
//11—对学生按学号排序
case 11:
num_sort(student);
break;
//12—改成绩
case 12:
printf(“请输入要改的学生的学号;”);
scanf("%d", &student_id);
gai(student, student_id);
break;
//0—退出
case 0:
printf(“退出成功!”);
break;
default:
printf(“输入信息错误!!”);
} //end of switch
}//end of while
}
system(“pause”);
}
总结:此成绩管理系统实现较为仓促,没有用链表,而是用最简单的数组实现;目录外观,功能运行也可以进一步优化。