班级考试成绩据管系统(1:中 学个班级 A个学生,每个学生每学期有 B 门课,共C个学期。高中B 门课的学分,语数外为 1.5,物化生为 1。大学 B 门课的学分依次为1至BA的范围:41-45 (41为A1,42为A243为A3,44为A445为A5)B的范围:5-6(5为B1.6为B2)
C的范围:4-8(4为C1.5为C2.6为C3.7为C4.8为C5)
请自行编制“某班成绩数据库.txt”文件,内含各门课原始成绩,并完成以下程序要求。程序功能要求:
a 可从自行编制的“某班成绩数据库.txt”文件中读取学生的全部成绩数据。b 可计算出每个学生的加权平均成绩,然后由高到底排序输出全班总成绩表(内含全班同学各科成绩及加权平均成绩)
c 可计算出各科平均成绩,然后按科目难度排序输出。
d 可计算出某门课的各分数段成绩分布,例如 90-100 分,8 人。依次类推。
e 可查询、修改某人某学期某课的成绩。
f 可查询并输出某学生的全部成绩。
g可查询并输出某学生不及格科目名称
h 可查询并输出某门课不及格学生名单。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 学生结构体,包括学号、姓名、成绩和加权平均分
typedef struct
{
char student_id[20];
char name[100];
float scores[6][3];
float weightedAverage;
} Student;
// 科目平均成绩结构体
typedef struct
{
char name[100];
float average;
} Avg;
Student students[43];
int studentNum = 0;
// 计算学生的加权平均成绩,考虑不同课程的 double 类型权重
void cal(Student *student)
{
double Sum = 0.0;
double total = 0.0;
int i, j;
double creditWeight;
for (i = 0; i < 6; i++)
{
for (j = 0; j < 3; j++)
{
creditWeight = 1.0; // 默认为1.0,即每门课程的学分权重为1.0
if (i < 3)
{
creditWeight = 1.5; // 前三门课程每学期1.5学分
}
Sum += student->scores[i][j] * creditWeight;
total += creditWeight;
}
}
student->weightedAverage = Sum / total;
}
void sort(Student students[])
{
int i, j;
Student temp;
for (i = 0; i < studentNum - 1; i++)
{
for (j = 0; j < studentNum - i - 1; j++)
{
if (students[j].weightedAverage < students[j + 1].weightedAverage)
{
// 交换学生数据
temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
void display(Student students[])
{
int i;
int semester, course;
printf("按加权平均成绩排序的学生列表:\n");
printf("学号\t\t姓名\t\t加权平均成绩\n");
sort(students);
for (i = 0; i < studentNum; i++)
{
printf("%s\t\t%s\t\t%.2f\n", students[i].student_id, students[i].name, students[i].weightedAverage);
printf("学期\t语文\t数学\t英语\t物理\t化学\t生物\n");
for (semester = 0; semester < 3; semester++)
{
printf("%d\t", semester + 1);
for (course = 0; course < 6; course++)
{
printf("%.2f\t", students[i].scores[course][semester]);
}
printf("\n");
}
printf("\n");
}
}
// 从文件中读取学生数据并初始化数组
void read(Student students[])
{
FILE *fp = fopen("修改后的数据.txt", "r");
int semester, course;
if (fp == NULL)
{
printf("无法打开文件。\n");
return;
}
while (!feof(fp))
{
if (fscanf(fp, "%s %s", students[studentNum].student_id, students[studentNum].name) != 2)
{
break;
}
// 读取18个成绩数据,依次存储到成绩数组中
for (course = 0; course < 6; course++)
{
for (semester = 0; semester < 3; semester++)
{
if (fscanf(fp, "%f", &students[studentNum].scores[course][semester]) != 1)
{
// 读取成绩失败,可能到达文件末尾或文件格式不匹配
break;
}
}
}
// 计算学生的加权平均成绩
cal(&students[studentNum]);
studentNum++;
}
fclose(fp);
}
// 计算各科平均成绩并按科目难度排序后输出
// 计算各门科目的平均成绩并排序
void calculateAndSortSubjectAverages(Student students[])
{
Avg subjectAverages[6];
// 初始化科目名称
strcpy(subjectAverages[0].name, "语文");
strcpy(subjectAverages[1].name, "数学");
strcpy(subjectAverages[2].name, "英语");
strcpy(subjectAverages[3].name, "物理");
strcpy(subjectAverages[4].name, "化学");
strcpy(subjectAverages[5].name, "生物");
// 计算每门课程的平均成绩
for (int course = 0; course < 6; course++)
{
float courseTotal = 0.0;
for (int i = 0; i < studentNum; i++)
{
for (int semester = 0; semester < 3; semester++)
{
courseTotal += students[i].scores[course][semester];
}
}
subjectAverages[course].average = courseTotal / (studentNum * 3);
}
// 使用冒泡排序按平均成绩排序
for (int i = 0; i < 6 - 1; i++)
{
for (int j = 0; j < 6 - i - 1; j++)
{
if (subjectAverages[j].average > subjectAverages[j + 1].average)
{
// 交换科目平均成绩
Avg temp = subjectAverages[j];
subjectAverages[j] = subjectAverages[j + 1];
subjectAverages[j + 1] = temp;
}
}
}
// 输出排序后的科目平均成绩
printf("按平均成绩排序的科目平均成绩:\n");
for (int course = 0; course < 6; course++)
{
printf("%s 平均成绩:%.2f\n", subjectAverages[course].name, subjectAverages[course].average);
}
}
const char *getCourseName(int courseIndex)
{
switch (courseIndex)
{
case 0:
return "语文";
case 1:
return "数学";
case 2:
return "英语";
case 3:
return "物理";
case 4:
return "化学";
case 5:
return "生物";
default:
return "未知科目";
}
}
void tongji(Student students[], int courseIndex, int sID)
{
int numStudents = studentNum;
int numRanges = 5; // 分数段的数量
int fenshuduan[5];
int i, score;
// 初始化分数段人数统计数组
for (i = 0; i < numRanges; i++)
{
fenshuduan[i] = 0;
}
// 统计各分数段人数
for (i = 0; i < numStudents; i++)
{
score = students[i].scores[courseIndex][sID];
if (score >= 90)
{
fenshuduan[0]++;
}
else if (score >= 80)
{
fenshuduan[1]++;
}
else if (score >= 70)
{
fenshuduan[2]++;
}
else if (score >= 60)
{
fenshuduan[3]++;
}
else
{
fenshuduan[4]++;
}
}
// 输出分数段成绩分布
printf("课程 %d:%s学期 %d 的成绩分布:\n", courseIndex + 1, getCourseName(courseIndex), sID + 1);
printf("90-100 分:%d 人\n", fenshuduan[0]);
printf("80-89 分:%d 人\n", fenshuduan[1]);
printf("70-79 分:%d 人\n", fenshuduan[2]);
printf("60-69 分:%d 人\n", fenshuduan[3]);
printf("0-59 分:%d 人\n", fenshuduan[4]);
}
// 查询和修改学生成绩
void update(Student students[])
{
char studentID[10];
int sID;
int courseIndex;
float score;
int studentIndex = -1;
char choice;
float newScore;
int i;
printf("请输入要查询/修改的学生学号:");
scanf("%s", studentID);
// 查找匹配学号的学生
for (i = 0; i < studentNum; i++)
{
if (strcmp(students[i].student_id, studentID) == 0)
{
studentIndex = i;
break;
}
}
if (studentIndex != -1)
{
printf("请输入要查询/修改的学期索引(0-%d):", 3 - 1);
scanf("%d", &sID);
printf("请输入要查询/修改的课程索引(0-%d):", 6 - 1);
scanf("%d", &courseIndex);
if (sID >= 0 && sID < 3 && courseIndex >= 0 && courseIndex < 6)
{
// 查询成绩
score = students[studentIndex].scores[courseIndex][sID];
printf("学生 %s 第 %d 学期第 %d 门课成绩为:%.2f\n", students[studentIndex].name, sID + 1, courseIndex + 1, score);
// 询问用户是否要修改成绩
printf("是否要修改成绩(Y/N):");
scanf(" %c", &choice);
if (choice == 'Y' || choice == 'y')
{
printf("请输入新的成绩:");
scanf("%f", &newScore);
students[studentIndex].scores[courseIndex][sID] = newScore;
printf("成绩已修改为 %.2f\n", newScore);
}
else
{
printf("未修改成绩。\n");
}
}
else
{
printf("无效的学期或课程索引。\n");
}
}
else
{
printf("未找到匹配学号的学生。\n");
}
}
// 查询并显示某学生的全部成绩(根据姓名)
void search2(Student students[])
{
char searchName[100];
int found = 0;
int i;
int semester, course;
printf("请输入要查询的学生姓名:");
scanf("%s", searchName);
for (i = 0; i < studentNum; i++)
{
if (strcmp(students[i].name, searchName) == 0)
{
found = 1;
printf("学生 %s(学号:%s)的全部成绩:\n", students[i].name, students[i].student_id);
for (semester = 0; semester < 3; semester++)
{
printf("第 %d 学期成绩:\n", semester + 1);
printf("课程\t成绩\n");
for (course = 0; course < 6; course++)
{
printf("%s\t%.2f\n", getCourseName(course), students[i].scores[course][semester]);
}
printf("\n");
}
}
}
if (!found)
{
printf("未找到姓名为 %s 的学生。\n", searchName);
}
}
void search1(Student students[])
{
char ID[100];
int found = 0;
int i;
int semester, course;
float score;
printf("请输入要查询的学生学号:");
scanf("%s", ID);
for (i = 0; i < studentNum; i++)
{
if (strcmp(students[i].student_id, ID) == 0)
{
found = 1;
printf("学生 %s(学号:%s)的不及格科目:\n", students[i].name, students[i].student_id);
for (semester = 0; semester < 3; semester++)
{
for (course = 0; course < 6; course++)
{
score = students[i].scores[course][semester];
if (score < 60.0) // 假设及格分数为60
{
printf("第 %d 学期,课程 %d 不及格(成绩:%.2f)\n", semester + 1, course + 1, score);
}
}
}
}
}
if (!found)
{
printf("未找到学号为 %s 的学生。\n", ID);
}
}
// 查询并按学期显示某门课不及格的学生名单
void search3(Student students[])
{
int courseIndex, sID;
int found = 0; // 用于标记是否找到不及格学生
int i, j;
float score;
printf("请输入要查询的科目索引(0-4)和学期索引(1-3):");
scanf("%d %d", &courseIndex, &sID);
if (courseIndex < 0 || courseIndex >= 5 || sID < 1 || sID > 3)
{
printf("无效的科目或学期索引。\n");
return;
}
printf("第 %d 学期,课程 %d(%s)不及格的学生名单:\n", sID, courseIndex, getCourseName(courseIndex));
printf("| %-15s | %-12s | %-6s |\n", "学生姓名", "学号", "成绩");
printf("|---------------|--------------|--------|\n");
for (i = 0; i < studentNum; i++)
{
score = students[i].scores[courseIndex][sID - 1]; // 注意学期索引需要减1
if (score < 60.0) // 假设及格分数为60
{
found = 1;
printf("| %-15s | %-12s | %-6.2f |\n", students[i].name, students[i].student_id, score);
}
}
if (!found)
{
printf("该门课程在指定学期没有不及格学生。\n");
}
}
int main()
{
read(students);
int course;
int sID;
int choice;
while (1)
{
system("cls");
printf("╭──────────────────────────────╮\n");
printf("│ │\n");
printf("│ 学生菜单 │\n");
printf("│ │\n");
printf("│ 1. 计算并排序每个学生的 │\n");
printf("│ 加权平均成绩 │\n");
printf("│ │\n");
printf("│ 2. 计算并排序各科平均成绩 │\n");
printf("│ │\n");
printf("│ 3. 计算并显示某门课的 │\n");
printf("│ 分数段分布 │\n");
printf("│ │\n");
printf("│ 4. 查询和修改学生成绩 │\n");
printf("│ │\n");
printf("│ 5. 查询并显示某学生的 │\n");
printf("│ 全部成绩 │\n");
printf("│ │\n");
printf("│ 6. 查询并显示某学生不及格 │\n");
printf("│ 科目 │\n");
printf("│ │\n");
printf("│ 7. 查询并显示某门课不及格 │\n");
printf("│ 学生名单 │\n");
printf("│ │\n");
printf("│ 8. 退出 │\n");
printf("│ │\n");
printf("╰──────────────────────────────╯\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice)
{
case 1:
cal(students);
display(students);
break;
case 2:
calculateAndSortSubjectAverages(students);
break;
case 3:
printf("请输入您要查找的科目: 0.语文 1.数学 2.英语 3.物理 4.化学 5.生物");
scanf("%d", &course);
printf("请输入您要查找的学期:");
scanf("%d", &sID);
tongji(students, course, sID);
break;
case 4:
update(students);
break;
case 5:
search2(students);
break;
case 6:
search1(students);
break;
case 7:
search3(students);
break;
case 8:
printf("谢谢使用,再见!\n");
return 0;
default:
printf("无效选项,请重新选择。\n");
}
system("pause");
}
return 0;
}