12
小项目:学生成绩管理系统
Mini Project — Grade Manager
把前面学的全用上——结构体当学生、链表存全班、文件做持久化、菜单做交互。下面是骨架,你可以照着补全增删改查和排序。别直接抄,自己敲一遍跑通,这就是你的第一个 C 作品。
项目骨架:链表 + 文件 + 菜单
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Student {
char id[15]; // 学号
char name[20];
double score;
struct Student *next;
} Student;
// 头插一个学生(增)
Student *add_stu(Student *head, const char *id, const char *name, double sc) {
Student *s = (Student *)malloc(sizeof(Student));
strcpy(s->id, id);
strcpy(s->name, name);
s->score = sc;
s->next = head;
return s;
}
// 按学号查找(查)
Student *find_stu(Student *head, const char *id) {
for (Student *p = head; p; p = p->next)
if (strcmp(p->id, id) == 0) return p;
return NULL;
}
// 保存到文件(持久化)
void save(Student *head, const char *path) {
FILE *fp = fopen(path, "w");
for (Student *p = head; p; p = p->next)
fprintf(fp, "%s %s %.1f\n", p->id, p->name, p->score);
fclose(fp);
}
int main() {
Student *head = NULL;
head = add_stu(head, "2026001", "小明", 92.5);
head = add_stu(head, "2026002", "小红", 88.0);
Student *t = find_stu(head, "2026001");
if (t) printf("找到:%s %.1f\n", t->name, t->score);
save(head, "students.txt");
printf("已保存到 students.txt\n");
return 0;
}
运行结果
找到:小明 92.5
已保存到 students.txt
练给你留的扩展作业
① 加一个"按学号删除"功能(删链表节点要把前一个节点的 next 接到下一个)。② 加一个"按成绩从高到低排序"(插入排序或冒泡)。③ 启动时从 students.txt 读回数据。④ 做一个 while 循环菜单:1 增加 2 查询 3 删除 4 保存 5 退出。做完这四样,你的 C 就真的入门了。