一、设计任务与目标
对一个有N个学生的班级,每个学生有M门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。
二、实现功能
(1)本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。
(2)本系统显示这样的菜单:
请选择系统功能项:
a、成绩录入
b、成绩显示
c、成绩保存
d、成绩排序
e、成绩修改(要求先输入密码)
f、成绩统计
1)显示每门课程成绩最高的学生的基本信息
2)显示每门课程的平均成绩
3)显示超过某门课程平均成绩的学生人数
g、退出系统
(3)执行一个具体的功能之后,程序将重新显示菜单。
(4)将学生成绩保存到文件中。
三、程序源码
菜单
void menu() //菜单
{
printf("========================================\n");
printf("| 欢迎来到班级成绩管理系统! \n");
printf("| a:成绩录入\n");
printf("| b:成绩显示\n");
printf("| c:成绩保存\n");
printf("| d:成绩排序\n");
printf("| e:成绩修改\n");
printf("| f:成绩统计\n");
printf("| g:退出系统\n");
printf("========================================\n");
printf("请输入你的选择: ");
}
录入学生成绩
void inputScores() //成绩录入
{
if (courseCount == 0)
{
printf("请输入课程数量:");
scanf("%d", &courseCount); //输入课程数量
for (int i = 0; i < courseCount; i++) //输入课程名字
{
Course course;
printf("请输入第 %d 门课程名字:", i+1);
scanf("%s", course.name);
courses[i] = course;
}
}
Student stu;
printf("请输入学生学号:");
scanf("%s", stu.id); //输入学生学号
printf("请输入学生名字:");
scanf("%s", stu.name); //输入学生姓名
for (int j = 0; j < courseCount; j++) //输入课程成绩
{
printf("请输入 %s 课程成绩:", courses[j].name);
scanf("%d", &stu.scores[j]);
}
students[studentCount++] = stu;
}
显示所录入的学生成绩
void displayScores() //成绩显示
{
if (studentCount == 0)
{
printf("No student\n");
return;
}
printf(" 学号 姓名 ");
for (int i = 0; i < courseCount; i++) //输出课程名字
{
printf(" %s", courses[i].name);
}
printf("\n");
for (int i = 0; i < studentCount; i++) //输出学生信息
{
printf("%s %s", students[i].id, students[i].name); //输出学生学号,姓名
for (int j = 0; j < courseCount; j++) //输出学生成绩
{
printf(" %d", students[i].scores[j]);
}
printf("\n");
}
}
保存录入的学生成绩
void saveScores() //成绩保存
{
FILE* fp;
fp = fopen("scores.txt", "w"); //打开文件
if (fp == NULL)
{
printf("open scores.txt failed!\n");
return;
}
fprintf(fp, "%d\n", courseCount); //输出文件信息
for (int i = 0; i < courseCount; i++) //输出课程名字
{
fprintf(fp, "%s\n", courses[i].name);
}
fprintf(fp, "%d\n", studentCount); //输出学生信息
for (int i = 0; i < studentCount; i++)
{
fprintf(fp, "%s\n%s\n", students[i].id, students[i].name); //输出学生学号,姓名
for (int j = 0; j < courseCount; j++) //输出学生成绩
{
fprintf(fp, "%d ", students[i].scores[j]);
}
fprintf(fp, "\n");
}
fclose(fp); //关闭文件
}
对录入的课程成绩进行排序
void sort(int l,int r, int pos) //对课程的成绩进行排序
{
if (r <= l) return;
int i = l, j = r;
int key = students[l].scores[pos];
while (i <= j)
{
while (students[i].scores[pos] > key) i++;
while (students[j].scores[pos] < key) j--;
if (i <= j)
{
Student temp = students[i];
students[i] = students[j];
students[j] = temp;
i++;
j--;
}
}
sort(l, j, pos);
sort(i, r, pos);
}
比较学生成绩
int compare(char a[], char b[]) //比较学生的成绩
{
int la = strlen(a);
int lb = strlen(b);
if (la < lb) return -1;
if (la > lb) return 1;
int len = 0;
while (len < la)
{
if (a[len] < b[len]) return -1;
if (a[len] > b[len]) return 1;
len++;
}
return 0;
}
对程序进行排序
void orderScores() //成绩排序
{
printf("Enter course name:"); //输入需要进行成绩排序的课程名字
char name[PROFILE_LENGTH];
scanf("%s", name);
int i = courseCount;
for (i = 0; i < courseCount; i++)
{
if (compare(courses[i].name, name) == 0)
break;
}
if (i == courseCount)
{
printf("No course %s\n", name);
return;
}
sort(0, studentCount - 1, i);
}
修改已经录入但录入出错的学生成绩
void changeScores() //成绩修改
{
printf("Enter password:"); //输入密码
char pwd[PROFILE_LENGTH];
scanf("%s", pwd); //输入密码
if (compare(password, pwd) != 0)
{
printf("密码错误!\n");
return;
}
printf("Enter student id:");
char id[PROFILE_LENGTH];
scanf("%s", id); //输入学生学号
int i = studentCount;
for (i = 0; i < studentCount; i++)
{
if (compare(students[i].id, id) == 0)
break;
}
if (i == studentCount)
{
printf("No student %s\n", id);
return;
}
printf("Courses: ");
for (int j = 0; j < courseCount; j++) //输出课程名字
{
printf(" %s", courses[j].name);
}
printf("\nEnter the scores:");
for (int j = 0; j < courseCount; j++) //输入更改后的成绩
{
scanf("%d", &students[i].scores[j]);
}
}
统计已经录入的学生成绩
void statisticScores() //成绩统计
{
for (int j = 0; j < courseCount; j++)
{
printf("%s:\n", courses[j].name);
int max = 0;
int pos = studentCount;
double aver = 0.0;
for (int i = 0; i < studentCount; i++) //比较学生成绩,找出成绩最高的学生
{
aver = aver + students[i].scores[j];
if (students[i].scores[j] > max)
{
max = students[i].scores[j];
pos = i;
}
}
aver /= studentCount; //计算平均成绩
int count = 0;
for (int i = 0; i < studentCount; i++) //计算超过平均成绩的人数
{
if (students[i].scores[j] > aver)
{
count ++;
}
}
if (pos == studentCount)
{
printf("No student\n");
break;
}
else
{
printf("成绩最高学生:");
printf(" %s %s %d\n", students[pos].id, students[pos].name, max);
printf("平均成绩:");
printf(" %.2lf\n", aver);
printf("超过平均成绩的人数:");
printf(" %d\n", count);
}
}
}
四、效果展示
菜单
录入学生成绩(这里录入了6位学生的成绩,录入完毕后进行保存)
显示已经录入的学生成绩
保存已经录入的成绩,保存后的成绩存放在“scores.txt”文件中
按照课程将录入的成绩进行排序(分数从高到低)
修改已经录入的学生成绩
找出每个课程成绩最高的学生,统计出平均成绩和超过平均成绩的人数文章来源:https://www.toymoban.com/news/detail-489089.html
文章来源地址https://www.toymoban.com/news/detail-489089.html
到了这里,关于班级成绩管理系统(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!