学生成绩表的特点,分析逻辑结构、存储方式,实现学生成绩表的建立、 插入、删除、查找、总分的排序等基本操作的实现。用c语言方式
时间: 2023-12-20 14:07:11 浏览: 38
学生成绩表是一个用于存储学生信息和成绩的数据结构。其特点如下:
1. 数据量大:一个学校或一个学院的学生数量可能非常庞大,因此需要考虑如何高效地存储和管理大量的学生数据。
2. 数组结构:通常采用数组结构来存储学生信息和成绩,因为数组的随机访问速度较快,便于查找和排序。
3. 多维结构:考虑到每个学生可能有多个科目的成绩,因此需要使用多维数组或结构体来存储成绩信息。
逻辑结构:
学生成绩表的逻辑结构可以采用线性表结构,即每个学生的信息和成绩按照顺序依次存储在数组中。
存储方式:
学生成绩表的存储方式可以采用顺序存储结构,即使用数组来存储学生信息和成绩。也可以采用链式存储结构,即每个学生的信息和成绩存储在一个结构体中,通过指针链接起来形成链表。
实现基本操作:
以下是一个简单的基于顺序存储结构的学生成绩表的实现,包括建立、插入、删除、查找和排序等基本操作。
```c
#include <stdio.h>
#include <string.h>
#define MAX_STUDENT 100 // 最大学生数
#define MAX_NAME 20 // 最大姓名长度
// 学生结构体
typedef struct student {
char name[MAX_NAME]; // 姓名
char id[10]; // 学号
char class[10]; // 班级
float score[3]; // 成绩
float totalScore; // 总分
} Student;
// 学生数组
Student students[MAX_STUDENT];
// 学生数
int count = 0;
// 添加学生
void addStudent() {
if (count >= MAX_STUDENT) {
printf("已达到最大学生数!\n");
return;
}
Student student;
printf("请输入学生姓名:");
scanf("%s", student.name);
printf("请输入学生学号:");
scanf("%s", student.id);
printf("请输入学生班级:");
scanf("%s", student.class);
printf("请输入学生语文成绩:");
scanf("%f", &student.score[0]);
printf("请输入学生数学成绩:");
scanf("%f", &student.score[1]);
printf("请输入学生英语成绩:");
scanf("%f", &student.score[2]);
student.totalScore = student.score[0] + student.score[1] + student.score[2];
students[count] = student;
count++;
printf("添加成功!\n");
}
// 删除学生
void deleteStudent() {
char id[10];
printf("请输入要删除的学生学号:");
scanf("%s", id);
int index = -1;
for (int i = 0; i < count; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
if (index == -1) {
printf("未找到该学生!\n");
return;
}
for (int i = index; i < count - 1; i++) {
students[i] = students[i + 1];
}
count--;
printf("删除成功!\n");
}
// 查询学生
void queryStudent() {
char keyword[20];
printf("请输入查询关键字:");
scanf("%s", keyword);
printf("查询结果如下:\n");
printf("姓名\t学号\t班级\t语文\t数学\t英语\t总分\n");
for (int i = 0; i < count; i++) {
if (strstr(students[i].name, keyword) != NULL || strstr(students[i].id, keyword) != NULL ||
strstr(students[i].class, keyword) != NULL) {
printf("%s\t%s\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n", students[i].name, students[i].id,
students[i].class, students[i].score[0], students[i].score[1], students[i].score[2], students[i].totalScore);
}
}
}
// 计算总分
void calculateTotalScore() {
for (int i = 0; i < count; i++) {
students[i].totalScore = students[i].score[0] + students[i].score[1] + students[i].score[2];
}
printf("总分计算完成!\n");
}
// 按总分排序
void sortByTotalScore() {
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - i - 1; j++) {
if (students[j].totalScore < students[j + 1].totalScore) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("按总分排序完成!\n");
}
int main() {
int choice;
while (1) {
printf("\n学生成绩表\n");
printf("1. 添加学生\n");
printf("2. 删除学生\n");
printf("3. 查询学生\n");
printf("4. 计算总分\n");
printf("5. 按总分排序\n");
printf("6. 退出\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
addStudent();
break;
case 2:
deleteStudent();
break;
case 3:
queryStudent();
break;
case 4:
calculateTotalScore();
break;
case 5:
sortByTotalScore();
break;
case 6:
return 0;
default:
printf("无效选择!\n");
break;
}
}
return 0;
}
```
以上是一个简单的基于顺序存储结构的学生成绩表的实现,可以根据实际需求进行修改和完善。