对一个班某门课程成绩进行处理,写出用顺序表实现对一个班的一门课程成绩信 息的显示、查询、插入、删除功能,并对已排好序(非递减有序)的两个班成绩 合并,具体如下: 1.定义成绩顺序表结构体。 typedef struct SqList { ElemType*elem; int length; int capacity; }SqList,*Ptr; typedef Ptr SqListPtr;实现循环菜单显示选择,并完成以下菜单功能:
时间: 2023-06-06 12:07:15 浏览: 123
1. 显示班级成绩信息
2. 查询某个学生的成绩
3. 插入学生的成绩
4. 删除学生的成绩
5. 合并两个班级的成绩信息
6. 退出程序
其中,1和5可以同时显示学生成绩信息和合并后的成绩信息。
下面是具体的实现代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX_CAPACITY 100
typedef struct Score {
int id; // 学号
char name[20];// 姓名
int score; // 成绩
} Score;
typedef struct SqList {
Score *elem;
int length;
int capacity;
} SqList, *Ptr;
typedef enum {
Exit, Show, Query, Insert, Delete, Merge
} Menu;
SqListPtr initList();
void insert(SqListPtr list, Score score);
void delete(SqListPtr list, int id);
void merge(SqListPtr list1, SqListPtr list2);
void show(SqListPtr list);
int query(SqListPtr list, int id);
Menu menu();
int main() {
SqListPtr list1 = initList();
SqListPtr list2 = initList();
int choice, id, score;
// 输入第一个班的成绩信息
printf("请输入第一个班的学生成绩信息(输入 0 退出):\n");
while (1) {
printf("请输入学号 姓名 成绩:");
scanf("%d", &id);
if (id == 0) break;
char name[20];
scanf("%s %d", name, &score);
Score s = {id, name, score};
insert(list1, s);
}
// 输入第二个班的成绩信息
printf("请输入第二个班的学生成绩信息(输入 0 退出):\n");
while (1) {
printf("请输入学号 姓名 成绩:");
scanf("%d", &id);
if (id == 0) break;
char name[20];
scanf("%s %d", name, &score);
Score s = {id, name, score};
insert(list2, s);
}
while ((choice = menu()) != Exit) {
switch (choice) {
case Show:
show(list1);
show(list2);
break;
case Query:
printf("请输入要查询的学生学号:");
scanf("%d", &id);
int pos = query(list1, id);
if (pos >= 0) printf("学号:%d,姓名:%s,成绩:%d\n", list1->elem[pos].id, list1->elem[pos].name, list1->elem[pos].score);
else {
pos = query(list2, id);
if (pos >= 0) printf("学号:%d,姓名:%s,成绩:%d\n", list2->elem[pos].id, list2->elem[pos].name, list2->elem[pos].score);
else printf("没有找到该学生成绩信息!\n");
}
break;
case Insert:
printf("请输入要插入的学生成绩信息:学号 姓名 成绩:");
scanf("%d", &id);
char name[20];
scanf("%s %d", name, &score);
Score s = {id, name, score};
insert(list1, s);
break;
case Delete:
printf("请输入要删除的学生学号:");
scanf("%d", &id);
delete(list1, id);
delete(list2, id);
break;
case Merge:
merge(list1, list2);
break;
}
}
free(list1->elem);
free(list1);
free(list2->elem);
free(list2);
return 0;
}
SqListPtr initList() {
SqListPtr p = (SqListPtr) malloc(sizeof(SqList));
if (p == NULL) {
printf("初始化顺序表失败!\n");
exit(1);
}
p->elem = (Score *) malloc(sizeof(Score) * MAX_CAPACITY);
if (p->elem == NULL) {
printf("分配内存失败!\n");
exit(1);
}
p->length = 0;
p->capacity = MAX_CAPACITY;
return p;
}
void insert(SqListPtr list, Score score) {
if (list->length >= list->capacity) {
printf("顺序表已满,无法插入!\n");
return;
}
int pos = 0;
while (pos < list->length && score.id > list->elem[pos].id) pos++;
for (int i = list->length; i > pos; i--) {
list->elem[i] = list->elem[i - 1];
}
list->elem[pos] = score;
list->length++;
}
void delete(SqListPtr list, int id) {
int pos = 0;
while (pos < list->length && id != list->elem[pos].id) pos++;
if (pos < list->length) {
for (int i = pos; i < list->length - 1; i++) {
list->elem[i] = list->elem[i + 1];
}
list->length--;
} else {
printf("没有找到该学生成绩信息!\n");
}
}
void merge(SqListPtr list1, SqListPtr list2) {
int i = 0, j = 0;
while (i < list1->length && j < list2->length) {
if (list1->elem[i].id <= list2->elem[j].id) {
printf("学号:%d,姓名:%s,成绩:%d\n", list1->elem[i].id, list1->elem[i].name, list1->elem[i].score);
i++;
} else {
printf("学号:%d,姓名:%s,成绩:%d\n", list2->elem[j].id, list2->elem[j].name, list2->elem[j].score);
j++;
}
}
while (i < list1->length) {
printf("学号:%d,姓名:%s,成绩:%d\n", list1->elem[i].id, list1->elem[i].name, list1->elem[i].score);
i++;
}
while (j < list2->length) {
printf("学号:%d,姓名:%s,成绩:%d\n", list2->elem[j].id, list2->elem[j].name, list2->elem[j].score);
j++;
}
}
void show(SqListPtr list) {
for (int i = 0; i < list->length; i++) {
printf("学号:%d,姓名:%s,成绩:%d\n", list->elem[i].id, list->elem[i].name, list->elem[i].score);
}
}
int query(SqListPtr list, int id) {
int pos = 0;
while (pos < list->length && id != list->elem[pos].id) pos++;
if (pos < list->length) return pos;
else return -1;
}
Menu menu() {
printf("请选择菜单项:\n");
printf("1. 显示班级成绩信息\n");
printf("2. 查询某个学生的成绩\n");
printf("3. 插入学生的成绩\n");
printf("4. 删除学生的成绩\n");
printf("5. 合并两个班级的成绩信息\n");
printf("0. 退出程序\n");
Menu choice;
scanf("%d", &choice);
return choice;
}