30行C代码示例,精简入门还是进阶基础?

99ANYc3cd6
预计阅读时长 40 分钟
位置: 首页 C语言 正文

简单的学生成绩管理系统 (约95行)

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

c语言程序代码100行
(图片来源网络,侵删)

功能:

  1. 添加学生信息:将学生数据写入 students.dat 文件。
  2. 显示所有学生:从文件中读取并打印所有学生信息。
  3. 按学号查询:根据学号查找并显示特定学生的信息。
  4. 退出程序
#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语言实现一个单向链表,包括创建、插入、删除、遍历和销毁链表等核心操作,这是数据结构学习中的经典案例。

功能:

  1. 创建链表:从用户输入创建链表。
  2. 插入节点:在链表头部或尾部插入新节点。
  3. 删除节点:根据值删除第一个匹配的节点。
  4. 遍历链表:打印链表中所有节点的值。
  5. 销毁链表:释放所有节点占用的内存。
#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行)

这个程序专注于一个核心算法——冒泡排序,它通过一个简单的菜单让用户输入数组,然后对数组进行排序并显示结果,这是一个很好的算法入门示例。

c语言程序代码100行
(图片来源网络,侵删)

功能:

  1. 输入数组:用户手动输入一组整数。
  2. 冒泡排序:对输入的数组进行升序排序。
  3. 显示数组:打印排序前后的数组内容。
#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;
            }
        }
    }
}

如何编译和运行

  1. 将任意一个示例代码复制并粘贴到一个文本编辑器中(如 VS Code, Sublime Text, Notepad++ 等)。
  2. 将文件保存为 .c 后缀,student_system.c
  3. 打开终端或命令提示符。
  4. 使用GCC编译器进行编译:
    gcc student_system.c -o student_system
  5. 运行生成的可执行文件:
    • 在 Windows 上: student_system.exe
    • 在 Linux 或 macOS 上: ./student_system

希望这些示例能对您有所帮助!

c语言程序代码100行
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
织梦会员自定义图片
« 上一篇 04-28
织梦后台采集器怎么用?
下一篇 » 04-28

相关文章

取消
微信二维码
支付宝二维码

目录[+]