简单的学生成绩管理系统 (约95行)
这个程序演示了结构体、文件I/O、循环和条件判断,它可以将学生的信息(学号、姓名、成绩)保存到一个文件中,并支持添加、显示和查询功能。

(图片来源网络,侵删)
功能:
- 添加学生信息:将学生数据写入
students.dat文件。 - 显示所有学生:从文件中读取并打印所有学生信息。
- 按学号查询:根据学号查找并显示特定学生的信息。
- 退出程序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
struct Student {
int id; // 学号
char name[50]; // 姓名
float score; // 成绩
};
// 函数声明
void addStudent();
void displayStudents();
void searchStudent();
void clearInputBuffer();
int main() {
int choice;
while (1) {
printf("\n--- 学生成绩管理系统 ---\n");
printf("1. 添加学生\n");
printf("2. 显示所有学生\n");
printf("3. 按学号查询\n");
printf("4. 退出\n");
printf("请输入您的选择 (1-4): ");
// 检查输入是否为整数
if (scanf("%d", &choice) != 1) {
printf("输入无效,请输入数字1-4,\n");
clearInputBuffer();
continue;
}
switch (choice) {
case 1:
addStudent();
break;
case 2:
displayStudents();
break;
case 3:
searchStudent();
break;
case 4:
printf("感谢使用,再见!\n");
exit(0); // 退出程序
default:
printf("无效的选择,请重新输入,\n");
}
}
return 0;
}
// 添加学生信息
void addStudent() {
struct Student s;
FILE *fp;
printf("\n--- 添加学生信息 ---\n");
printf("请输入学号: ");
scanf("%d", &s.id);
clearInputBuffer(); // 清除输入缓冲区中的换行符
printf("请输入姓名: ");
fgets(s.name, sizeof(s.name), stdin);
s.name[strcspn(s.name, "\n")] = 0; // 移除fgets读取的换行符
printf("请输入成绩: ");
scanf("%f", &s.score);
fp = fopen("students.dat", "ab"); // 以二进制追加模式打开文件
if (fp == NULL) {
printf("无法打开文件!\n");
return;
}
fwrite(&s, sizeof(struct Student), 1, fp);
fclose(fp);
printf("学生信息添加成功!\n");
}
// 显示所有学生信息
void displayStudents() {
struct Student s;
FILE *fp;
int count = 0;
printf("\n--- 所有学生信息 ---\n");
printf("------------------------------------------------\n");
printf("学号\t姓名\t\t成绩\n");
printf("------------------------------------------------\n");
fp = fopen("students.dat", "rb"); // 以二进制读取模式打开文件
if (fp == NULL) {
printf("文件不存在或为空!\n");
return;
}
while (fread(&s, sizeof(struct Student), 1, fp) == 1) {
printf("%d\t%s\t\t%.2f\n", s.id, s.name, s.score);
count++;
}
fclose(fp);
if (count == 0) {
printf("文件中没有学生信息,\n");
} else {
printf("------------------------------------------------\n");
printf("共找到 %d 名学生,\n", count);
}
}
// 按学号查询学生
void searchStudent() {
struct Student s;
FILE *fp;
int searchId, found = 0;
printf("\n--- 按学号查询 ---\n");
printf("请输入要查询的学号: ");
scanf("%d", &searchId);
fp = fopen("students.dat", "rb");
if (fp == NULL) {
printf("文件不存在!\n");
return;
}
while (fread(&s, sizeof(struct Student), 1, fp) == 1) {
if (s.id == searchId) {
printf("\n找到学生信息:\n");
printf("学号: %d\n", s.id);
printf("姓名: %s\n", s.name);
printf("成绩: %.2f\n", s.score);
found = 1;
break;
}
}
fclose(fp);
if (!found) {
printf("未找到学号为 %d 的学生,\n", searchId);
}
}
// 清除输入缓冲区
void clearInputBuffer() {
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
单向链表的基本操作 (约100行)
这个程序展示了如何用C语言实现一个单向链表,包括创建、插入、删除、遍历和销毁链表等核心操作,这是数据结构学习中的经典案例。
功能:
- 创建链表:从用户输入创建链表。
- 插入节点:在链表头部或尾部插入新节点。
- 删除节点:根据值删除第一个匹配的节点。
- 遍历链表:打印链表中所有节点的值。
- 销毁链表:释放所有节点占用的内存。
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct Node {
int data;
struct Node *next;
};
// 函数声明
struct Node* createNode(int data);
void insertAtEnd(struct Node **head, int data);
void deleteNode(struct Node **head, int key);
void printList(struct Node *node);
void freeList(struct Node *head);
int main() {
struct Node *head = NULL; // 链表头指针
int choice, value;
while (1) {
printf("\n--- 单向链表操作 ---\n");
printf("1. 在尾部插入节点\n");
printf("2. 删除值为 key 的节点\n");
printf("3. 打印链表\n");
printf("4. 销毁链表并退出\n");
printf("请输入您的选择 (1-4): ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要插入的整数值: ");
scanf("%d", &value);
insertAtEnd(&head, value);
printf("节点 %d 已插入,\n", value);
break;
case 2:
printf("请输入要删除的节点值: ");
scanf("%d", &value);
deleteNode(&head, value);
break;
case 3:
printf("\n--- 当前链表 ---\n");
printList(head);
break;
case 4:
freeList(head);
printf("链表已销毁,程序退出,\n");
exit(0);
default:
printf("无效的选择,请重新输入,\n");
}
}
return 0;
}
// 创建一个新节点
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if (newNode == NULL) {
printf("内存分配失败!\n");
exit(1);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 在链表尾部插入一个节点
void insertAtEnd(struct Node **head, int data) {
struct Node* newNode = createNode(data);
// 如果链表为空,新节点就是头节点
if (*head == NULL) {
*head = newNode;
return;
}
// 否则,遍历到链表末尾
struct Node* last = *head;
while (last->next != NULL) {
last = last->next;
}
last->next = newNode;
}
// 删除链表中第一个值为 key 的节点
void deleteNode(struct Node **head, int key) {
struct Node* temp = *head;
struct Node* prev = NULL;
// 如果头节点就是要删除的节点
if (temp != NULL && temp->data == key) {
*head = temp->next; // 改变头指针
free(temp); // 释放旧头节点
printf("节点 %d 已删除,\n", key);
return;
}
// 否则,遍历链表查找要删除的节点
while (temp != NULL && temp->data != key) {
prev = temp;
temp = temp->next;
}
// 如果没找到值为 key 的节点
if (temp == NULL) {
printf("未找到值为 %d 的节点,\n", key);
return;
}
// 从链表中移除节点
prev->next = temp->next;
free(temp);
printf("节点 %d 已删除,\n", key);
}
// 打印链表
void printList(struct Node *node) {
if (node == NULL) {
printf("链表为空,\n");
return;
}
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
// 释放整个链表的内存
void freeList(struct Node *head) {
struct Node* tmp;
while (head != NULL) {
tmp = head;
head = head->next;
free(tmp);
}
}
冒泡排序算法实现 (约80行)
这个程序专注于一个核心算法——冒泡排序,它通过一个简单的菜单让用户输入数组,然后对数组进行排序并显示结果,这是一个很好的算法入门示例。

(图片来源网络,侵删)
功能:
- 输入数组:用户手动输入一组整数。
- 冒泡排序:对输入的数组进行升序排序。
- 显示数组:打印排序前后的数组内容。
#include <stdio.h>
#define MAX_SIZE 100
// 函数声明
void inputArray(int arr[], int *size);
void printArray(int arr[], int size);
void bubbleSort(int arr[], int size);
int main() {
int arr[MAX_SIZE];
int size = 0;
int choice;
while (1) {
printf("\n--- 冒泡排序演示 ---\n");
printf("1. 输入数组\n");
printf("2. 对数组进行冒泡排序\n");
printf("3. 显示数组\n");
printf("4. 退出\n");
printf("请输入您的选择 (1-4): ");
scanf("%d", &choice);
switch (choice) {
case 1:
inputArray(arr, &size);
break;
case 2:
if (size == 0) {
printf("请先输入数组!\n");
} else {
bubbleSort(arr, size);
printf("数组已排序完成,\n");
}
break;
case 3:
if (size == 0) {
printf("数组为空,无内容可显示,\n");
} else {
printArray(arr, size);
}
break;
case 4:
printf("程序退出,\n");
exit(0);
default:
printf("无效的选择,请重新输入,\n");
}
}
return 0;
}
// 让用户输入数组元素
void inputArray(int arr[], int *size) {
printf("\n--- 输入数组 ---\n");
printf("请输入数组元素的数量 (最多 %d 个): ", MAX_SIZE);
scanf("%d", size);
if (*size <= 0 || *size > MAX_SIZE) {
printf("无效的数量,数量将设置为0,\n");
*size = 0;
return;
}
printf("请输入 %d 个整数:\n", *size);
for (int i = 0; i < *size; i++) {
printf("元素 %d: ", i + 1);
scanf("%d", &arr[i]);
}
}
// 打印数组
void printArray(int arr[], int size) {
printf("\n--- 当前数组 ---\n");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
// 冒泡排序算法实现
void bubbleSort(int arr[], int size) {
int i, j, temp;
// 外层循环控制排序轮数
for (i = 0; i < size - 1; i++) {
// 内层循环进行相邻元素比较和交换
// 每一轮排序后,最大的元素会“冒泡”到最后,所以内层循环可以减少 i 次
for (j = 0; j < size - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换 arr[j] 和 arr[j+1]
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
如何编译和运行
- 将任意一个示例代码复制并粘贴到一个文本编辑器中(如 VS Code, Sublime Text, Notepad++ 等)。
- 将文件保存为
.c后缀,student_system.c。 - 打开终端或命令提示符。
- 使用GCC编译器进行编译:
gcc student_system.c -o student_system
- 运行生成的可执行文件:
- 在 Windows 上:
student_system.exe - 在 Linux 或 macOS 上:
./student_system
- 在 Windows 上:
希望这些示例能对您有所帮助!

(图片来源网络,侵删)
