|
|
8 months ago | |
|---|---|---|
| README.md | 8 months ago | |
README.md
SIMS-LITE
#include <stdio.h> #include <stdlib.h> #include <string.h>
#define MAX_STUDENTS 100
typedef struct { char id[20]; // 学号 char name[50]; // 姓名 float score; // 成绩 } Student;
typedef struct { Student students[MAX_STUDENTS]; int length; // 当前学生数量 } StudentList;
// 初始化学生列表 void InitList(StudentList *L) { L->length = 0; }
// (1) 逐个输入学生信息 void InputStudents(StudentList *L) { int n; printf("请输入学生人数(不超过%d): ", MAX_STUDENTS); scanf("%d", &n);
if (n <= 0 || n > MAX_STUDENTS) {
printf("输入人数不合法!\n");
return;
}
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的信息:\n", i+1);
printf("学号: ");
scanf("%s", L->students[L->length].id);
printf("姓名: ");
scanf("%s", L->students[L->length].name);
printf("成绩: ");
scanf("%f", &L->students[L->length].score);
L->length++;
}
printf("输入完成!\n");
}
// (2) 显示所有学生信息 void DisplayStudents(StudentList *L) { if (L->length == 0) { printf("没有学生信息!\n"); return; }
printf("学号\t姓名\t成绩\n");
printf("----------------------------\n");
for (int i = 0; i < L->length; i++) {
printf("%s\t%s\t%.1f\n",
L->students[i].id,
L->students[i].name,
L->students[i].score);
}
}
// (3) 在指定位置插入学生信息 void InsertStudent(StudentList *L) { if (L->length >= MAX_STUDENTS) { printf("学生列表已满,无法插入!\n"); return; }
int pos;
printf("请输入要插入的位置(1-%d): ", L->length + 1);
scanf("%d", &pos);
if (pos < 1 || pos > L->length + 1) {
printf("位置不合法!\n");
return;
}
Student s;
printf("请输入学生信息:\n");
printf("学号: ");
scanf("%s", s.id);
printf("姓名: ");
scanf("%s", s.name);
printf("成绩: ");
scanf("%f", &s.score);
// 将pos-1之后的元素后移
for (int i = L->length; i >= pos; i--) {
L->students[i] = L->students[i-1];
}
L->students[pos-1] = s;
L->length++;
printf("插入成功!\n");
}
// (4) 删除指定位置的学生记录 void DeleteStudent(StudentList *L) { if (L->length == 0) { printf("学生列表为空,无法删除!\n"); return; }
int pos;
printf("请输入要删除的位置(1-%d): ", L->length);
scanf("%d", &pos);
if (pos < 1 || pos > L->length) {
printf("位置不合法!\n");
return;
}
printf("删除的学生信息: %s %s %.1f\n",
L->students[pos-1].id,
L->students[pos-1].name,
L->students[pos-1].score);
// 将pos之后的元素前移
for (int i = pos; i < L->length; i++) {
L->students[i-1] = L->students[i];
}
L->length--;
printf("删除成功!\n");
}
// (5) 统计学生个数 void CountStudents(StudentList *L) { printf("当前学生人数: %d\n", L->length); }
// 直接插入排序 - 按姓名 void InsertionSortByName(StudentList *L) { int i, j; Student temp;
for (i = 1; i < L->length; i++) {
temp = L->students[i];
j = i - 1;
while (j >= 0 && strcmp(L->students[j].name, temp.name) > 0) {
L->students[j+1] = L->students[j];
j--;
}
L->students[j+1] = temp;
}
printf("按姓名排序完成!\n");
}
// 快速排序分区函数 - 按学号 int Partition(StudentList *L, int low, int high) { Student pivot = L->students[low];
while (low < high) {
while (low < high && strcmp(L->students[high].id, pivot.id) >= 0) {
high--;
}
L->students[low] = L->students[high];
while (low < high && strcmp(L->students[low].id, pivot.id) <= 0) {
low++;
}
L->students[high] = L->students[low];
}
L->students[low] = pivot;
return low;
}
// 快速排序递归函数 - 按学号 void QuickSort(StudentList *L, int low, int high) { if (low < high) { int pivotpos = Partition(L, low, high); QuickSort(L, low, pivotpos - 1); QuickSort(L, pivotpos + 1, high); } }
// (6) 排序功能 void SortStudents(StudentList *L) { if (L->length == 0) { printf("没有学生信息,无法排序!\n"); return; }
int choice;
printf("请选择排序方式:\n");
printf("1. 按姓名排序(直接插入排序)\n");
printf("2. 按学号排序(快速排序)\n");
printf("请选择: ");
scanf("%d", &choice);
switch (choice) {
case 1:
InsertionSortByName(L);
break;
case 2:
QuickSort(L, 0, L->length - 1);
printf("按学号排序完成!\n");
break;
default:
printf("无效选择!\n");
}
}
// (7) 折半查找 - 按学号 void BinarySearchById(StudentList *L) { if (L->length == 0) { printf("没有学生信息,无法查找!\n"); return; }
// 先确保按学号有序
QuickSort(L, 0, L->length - 1);
char targetId[20];
printf("请输入要查找的学号: ");
scanf("%s", targetId);
int low = 0, high = L->length - 1, mid;
while (low <= high) {
mid = (low + high) / 2;
int cmp = strcmp(L->students[mid].id, targetId);
if (cmp == 0) {
printf("查找成功!\n");
printf("学号: %s, 姓名: %s, 成绩: %.1f\n",
L->students[mid].id,
L->students[mid].name,
L->students[mid].score);
return;
} else if (cmp < 0) {
low = mid + 1;
} else {
high = mid - 1;
}
}
printf("未找到学号为 %s 的学生!\n", targetId);
}
// 显示菜单 void ShowMenu() { printf("\n简易学生信息管理系统\n"); printf("1. 输入学生信息\n"); printf("2. 显示所有学生信息\n"); printf("3. 插入学生信息\n"); printf("4. 删除学生信息\n"); printf("5. 统计学生人数\n"); printf("6. 排序学生信息\n"); printf("7. 查找学生信息\n"); printf("0. 退出系统\n"); printf("请选择操作: "); }
int main() { StudentList list; InitList(&list);
int choice;
do {
ShowMenu();
scanf("%d", &choice);
switch (choice) {
case 1:
InputStudents(&list);
break;
case 2:
DisplayStudents(&list);
break;
case 3:
InsertStudent(&list);
break;
case 4:
DeleteStudent(&list);
break;
case 5:
CountStudents(&list);
break;
case 6:
SortStudents(&list);
break;
case 7:
BinarySearchById(&list);
break;
case 0:
printf("感谢使用,再见!\n");
break;
default:
printf("无效选择,请重新输入!\n");
}
} while (choice != 0);
return 0;
}