用C语言程序编写一个菜单驱动的学生成绩管理程序。某个学生班-一个学 期的学生成绩管理,设课程数量为5门课程,学生人数为10人。
1、程序功能
(1)从键盘输入包括学号、姓名、各门课程及成绩(学生基本信息及所选科目成绩的录入);
(2)计算每个人的总分和平均分,并按照平均分排序;
(3)具有查询的功能;
(4)具有学生增加和减少功能;
(5)将原始数据和计算后的数据保存在磁盘文件student.xt中。
2、系统菜单
[1]输入(键盘输入若干条记录,相当于初始化)
[2]插入(插入一 条新记录)
[3] 查找(输入一个学生学号,输出其学生基本信息和各科成绩)[4] 删除(按姓名或学号查找, 删除一条学生记录)
[5] 统计(若按1, 则输入学生的学号统计该生的总分及平均分;若按2,则输入课程求该门课程的总平均分)
[6]排序(按学 号或按其他字段属性进行排序)
[7]存盘(将所有 数据以文件的形式存盘)
[0]退出(退出系统 )
参考下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define N 10
struct student {
int num;
char name[1024];
int score[3];
};
typedef struct student stu;
void input(stu* p) {//输入
for (int i = 0; i < N; ++i) {
printf("请输入第%d个学生的信息\n", i + 1);
printf("请输入num\n");
scanf("%d", &(p + i)->num);
printf("请输入姓名\n");
scanf("%s", &(p + i)->name);
for (int j = 0; j < 3; ++j) {
printf("请输入score%d\n", j + 1);
scanf("%d", &(p + i)->score[j]);
}
}
}
void print(stu* p) {//输出
printf("%d\t", p->num);
printf("%s\t", p->name);
for (int j = 0; j < 3; ++j) {
printf("%d\t", p->score[j]);
}
}
double aver(stu* p) {//计算平均分
double sum = 0;
for (int i = 0; i < 3; ++i) {
sum += p->score[i];
}
return sum / N;
}
int excellect(stu* p) {//判断最高分,返回下标
double sum = 0;
double max = 0;
int record = 0;
for (int i = 0; i < N; ++i) {
sum = 0;
for (int j = 0; j < 3; ++j) {
sum += (p + i)->score[j];
}
if (max < sum) {
max = sum;
record = i;
}
}
return record;
}
void main() {
stu a[N];
stu* p = a;
input(p);
printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均\n");
for (int i = 0; i < N; i++) {
print(p + i);
printf("%f\n", aver(p + i));
}
printf("最高分的学生数据如下\n学号\t姓名\t成绩1\t成绩2\t成绩3\t平均\n");
int n = excellect(p);
print(p + n);
printf("%f\n", aver(p + n));
system("pause");
}
根据问题描述,我们需要编写一个学生成绩管理程序,实现几个主要功能。下面是一个基本的解决方案,包含了所需的功能和关键提示。
首先,我们需要使用一个结构体来表示学生的基本信息和成绩记录。结构体中包含学生的学号、姓名和一个数组来保存每门课程的成绩。
#define MAX_COURSES 5
#define MAX_NAME_LENGTH 20
typedef struct {
int studentId;
char name[MAX_NAME_LENGTH];
int grades[MAX_COURSES];
} Student;
接下来,我们需要一个数组来保存所有的学生记录,以及一个变量来跟踪当前已录入的学生数量。
#define MAX_STUDENTS 100
Student students[MAX_STUDENTS];
int numStudents = 0; // 当前已录入的学生数量
接下来,我们可以根据需求实现每个功能:
void addStudent() {
if (numStudents >= MAX_STUDENTS) {
printf("学生数量已达到上限,无法继续录入。\n");
return;
}
Student newStudent;
printf("请输入学生的学号: ");
scanf("%d", &newStudent.studentId);
printf("请输入学生的姓名: ");
scanf("%s", newStudent.name);
printf("请输入学生每门课程的成绩: ");
for (int i = 0; i < MAX_COURSES; i++) {
scanf("%d", &newStudent.grades[i]);
}
students[numStudents] = newStudent;
numStudents++;
}
// 计算学生的总分
int calculateTotalScore(Student student) {
int total = 0;
for (int i = 0; i < MAX_COURSES; i++) {
total += student.grades[i];
}
return total;
}
// 计算学生的平均分
double calculateAverageScore(Student student) {
int total = calculateTotalScore(student);
return (double) total / MAX_COURSES;
}
// 比较函数,用于排序
int compareStudents(const void* a, const void* b) {
Student* studentA = (Student*) a;
Student* studentB = (Student*) b;
double avgA = calculateAverageScore(*studentA);
double avgB = calculateAverageScore(*studentB);
// 按照平均分进行排序
if (avgA < avgB) {
return -1;
} else if (avgA > avgB) {
return 1;
} else {
return 0;
}
}
void sortStudents() {
qsort(students, numStudents, sizeof(Student), compareStudents);
printf("学生按照平均分排序完毕。\n");
}
void searchStudent() {
int studentId;
printf("请输入要查询学生的学号: ");
scanf("%d", &studentId);
for (int i = 0; i < numStudents; i++) {
if (students[i].studentId == studentId) {
printf("学号: %d\n", students[i].studentId);
printf("姓名: %s\n", students[i].name);
printf("成绩: ");
for (int j = 0; j < MAX_COURSES; j++) {
printf("%d ", students[i].grades[j]);
}
printf("\n");
return;
}
}
printf("未找到该学生。\n");
}
void insertStudent() {
if (numStudents >= MAX_STUDENTS) {
printf("学生数量已达到上限,无法继续插入。\n");
return;
}
Student newStudent;
printf("请输入要插入学生的学号: ");
scanf("%d", &newStudent.studentId);
printf("请输入要插入学生的姓名: ");
scanf("%s", newStudent.name);
printf("请输入要插入学生每门课程的成绩: ");
for (int i = 0; i < MAX_COURSES; i++) {
scanf("%d", &newStudent.grades[i]);
}
int position;
printf("请指定插入的位置(从0~%d): ", numStudents);
scanf("%d", &position);
if (position < 0 || position > numStudents) {
printf("无效的插入位置。\n");
return;
}
// 从指定位置开始,后移数组元素
for (int i = numStudents; i > position; i--) {
students[i] = students[i-1];
}
students[position] = newStudent;
numStudents++;
}
void deleteStudent() {
int studentId;
printf("请输入要删除学生的学号: ");
scanf("%d", &studentId);
int position = -1;
for (int i = 0; i < numStudents; i++) {
if (students[i].studentId == studentId) {
position = i;
break;
}
}
if (position == -1) {
printf("未找到该学生。\n");
return;
}
// 从指定位置开始,前移数组元素
for (int i = position; i < numStudents-1; i++) {
students[i] = students[i+1];
}
numStudents--;
printf("已删除该学生。\n");
}
// 将学生记录保存到文件
void saveStudentsToFile() {
FILE* file = fopen("student.txt", "w");
if (file == NULL) {
printf("无法打开文件。\n");
return;
}
for (int i = 0; i < numStudents; i++) {
fprintf(file, "%d %s", students[i].studentId, students[i].name);
for (int j = 0; j < MAX_COURSES; j++) {
fprintf(file, " %d", students[i].grades[j]);
}
fprintf(file, "\n");
}
fclose(file);
}
void printMenu() {
printf("==============\n");
printf("学生成绩管理系统\n");
printf("==============\n");
printf("1. 录入学生基本信息和成绩记录\n");
printf("2. 计算每个学生的总分和平均分,并按照平均分排序\n");
printf("3. 查询学生基本信息和成绩\n");
printf("4. 添加和删除学生记录\n");
printf("5. 保存数据到磁盘文件\n");
printf("0. 退出系统\n");
printf("请选择操作: ");
}
void menu() {
int choice;
do {
printMenu();
scanf("%d", &choice);
switch (choice) {
case 1:
addStudent();
break;
case 2:
sortStudents();
break;
case 3:
searchStudent();
break;
case 4:
printf("请输入操作: (1. 插入 2. 删除): ");
int operation;
scanf("%d", &operation);
switch (operation) {
case 1:
insertStudent();
break;
case 2:
deleteStudent();
break;
default:
printf("无效的操作。\n");
break;
}
break;
case 5:
saveStudentsToFile();
break;
case 0:
printf("感谢使用学生成绩管理系统,再见!\n");
break;
default:
printf("无效的选择。\n");
break;
}
printf("\n");
} while (choice != 0);
}
`c int main() { menu(); return 0; }