C语言学分管理系统设计与实现

本项目使用C语言实现了一个简单的学分管理系统,用于管理学生已完成的学分信息。系统包含添加、查询、修改、删除学生信息,以及显示可毕业学生的功能。

1. 系统设计

1.1 数据结构

使用结构体Student存储学生信息,包括学号、姓名、班级、入学时间以及各个类别课程的已完成学分。

struct Student {
    int id; // 学号
    char name[20]; // 姓名
    char class[10]; // 班级
    char entryDate[11]; // 入学时间 (YYYY-MM-DD)
    int basicCredits; // 基础课学分
    int majorCredits; // 专业课学分
    int electiveCredits; // 选修课学分
    int humanitiesCredits; // 人文类课程学分
    int experimentCredits; // 实验课程学分
};

使用链表存储所有学生信息。

1.2 功能模块

系统包含以下功能模块:

  1. 添加学生信息:输入学生的学号、姓名、班级、入学时间,并检查学号是否已存在。如果学号不存在,则将学生信息添加到链表中。
  2. 查询学生信息:输入学号,查找该学生的信息并显示。如果学生不存在,则提示用户。
  3. 修改学生信息:输入学号,查找该学生的信息,并允许用户修改已完成的学分。如果学生不存在,则提示用户。
  4. 删除学生信息:输入学号,查找该学生的信息并将其从链表中删除。如果学生不存在,则提示用户。
  5. 显示可毕业学生:遍历链表,判断每个学生的已完成学分是否满足毕业要求,并显示满足条件的学生信息。

1.3 菜单设计

系统运行后,首先显示主菜单,允许用户选择操作功能:

学分管理系统
-----------------
1. 添加学生信息
2. 查询学生信息
3. 修改学生信息
4. 删除学生信息
5. 显示可毕业学生
0. 退出系统

请输入您的选择:

2. 代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 学生结构体
struct Student {
    int id; // 学号
    char name[20]; // 姓名
    char class[10]; // 班级
    char entryDate[11]; // 入学时间 (YYYY-MM-DD)
    int basicCredits; // 基础课学分
    int majorCredits; // 专业课学分
    int electiveCredits; // 选修课学分
    int humanitiesCredits; // 人文类课程学分
    int experimentCredits; // 实验课程学分
};

// 链表节点
struct Node {
    struct Student student; // 学生信息
    struct Node* next; // 指向下一个节点
};

// 创建一个新的学生节点
struct Node* createNode(struct Student student) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    if (newNode == NULL) {
        printf("内存分配失败!
");
        exit(1);
    }
    newNode->student = student;
    newNode->next = NULL;
    return newNode;
}

// 插入学生信息到链表
struct Node* insertStudent(struct Node* head, struct Student student) {
    struct Node* newNode = createNode(student);
    newNode->next = head;
    return newNode;
}

// 查找学生信息
struct Node* findStudent(struct Node* head, int id) {
    struct Node* current = head;
    while (current != NULL) {
        if (current->student.id == id) {
            return current;
        }
        current = current->next;
    }
    return NULL; // 学生不存在
}

// 修改学生信息
void modifyStudent(struct Node* head, int id) {
    struct Node* studentNode = findStudent(head, id);
    if (studentNode != NULL) {
        printf("请输入要修改的学分信息:\n");
        printf("基础课学分:");
        scanf("%d", &studentNode->student.basicCredits);
        printf("专业课学分:");
        scanf("%d", &studentNode->student.majorCredits);
        printf("选修课学分:");
        scanf("%d", &studentNode->student.electiveCredits);
        printf("人文类课程学分:");
        scanf("%d", &studentNode->student.humanitiesCredits);
        printf("实验课程学分:");
        scanf("%d", &studentNode->student.experimentCredits);
        printf("修改成功!\n");
    } else {
        printf("学号 %d 的学生不存在!\n", id);
    }
}

// 删除学生信息
struct Node* deleteStudent(struct Node* head, int id) {
    struct Node* current = head;
    struct Node* previous = NULL;
    while (current != NULL) {
        if (current->student.id == id) {
            if (previous == NULL) {
                head = current->next; // 删除第一个节点
            } else {
                previous->next = current->next; // 删除中间节点
            }
            free(current);
            printf("学生 %d 已成功删除!\n", id);
            return head;
        }
        previous = current;
        current = current->next;
    }
    printf("学号 %d 的学生不存在!\n", id);
    return head;
}

// 显示学生信息
void displayStudent(struct Node* head, int id) {
    struct Node* studentNode = findStudent(head, id);
    if (studentNode != NULL) {
        printf("学号:%d\n", studentNode->student.id);
        printf("姓名:%s\n", studentNode->student.name);
        printf("班级:%s\n", studentNode->student.class);
        printf("入学时间:%s\n", studentNode->student.entryDate);
        printf("基础课学分:%d\n", studentNode->student.basicCredits);
        printf("专业课学分:%d\n", studentNode->student.majorCredits);
        printf("选修课学分:%d\n", studentNode->student.electiveCredits);
        printf("人文类课程学分:%d\n", studentNode->student.humanitiesCredits);
        printf("实验课程学分:%d\n", studentNode->student.experimentCredits);
    } else {
        printf("学号 %d 的学生不存在!\n", id);
    }
}

// 显示可毕业学生
void displayGraduates(struct Node* head) {
    struct Node* current = head;
    printf("可毕业的学生:\n");
    while (current != NULL) {
        if (current->student.basicCredits >= 50 &&
            current->student.majorCredits >= 50 &&
            current->student.electiveCredits >= 24 &&
            current->student.humanitiesCredits >= 8 &&
            current->student.experimentCredits >= 20) {
            printf("学号:%d, 姓名:%s\n", current->student.id, current->student.name);
        }
        current = current->next;
    }
}

// 主函数
int main() {
    struct Node* head = NULL; // 链表头指针
    int choice, id;
    struct Student student;

    do {
        printf("学分管理系统\n-----------------\n");
        printf("1. 添加学生信息\n");
        printf("2. 查询学生信息\n");
        printf("3. 修改学生信息\n");
        printf("4. 删除学生信息\n");
        printf("5. 显示可毕业学生\n");
        printf("0. 退出系统\n");

        printf("请输入您的选择:");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                printf("请输入学生信息:\n");
                printf("学号:");
                scanf("%d", &student.id);
                if (findStudent(head, student.id) != NULL) {
                    printf("学号已存在,请重新输入!\n");
                    break;
                }
                printf("姓名:");
                scanf("%s", student.name);
                printf("班级:");
                scanf("%s", student.class);
                printf("入学时间 (YYYY-MM-DD):");
                scanf("%s", student.entryDate);
                student.basicCredits = 0;
                student.majorCredits = 0;
                student.electiveCredits = 0;
                student.humanitiesCredits = 0;
                student.experimentCredits = 0;
                head = insertStudent(head, student);
                printf("学生信息已成功添加!\n");
                break;
            case 2:
                printf("请输入要查询的学号:");
                scanf("%d", &id);
                displayStudent(head, id);
                break;
            case 3:
                printf("请输入要修改的学号:");
                scanf("%d", &id);
                modifyStudent(head, id);
                break;
            case 4:
                printf("请输入要删除的学号:");
                scanf("%d", &id);
                head = deleteStudent(head, id);
                break;
            case 5:
                displayGraduates(head);
                break;
            case 0:
                printf("退出系统!\n");
                break;
            default:
                printf("无效的选择!\n");
        }

    } while (choice != 0);

    return 0;
}

3. 测试

  1. 添加多个学生信息。
  2. 查询学生信息。
  3. 修改学生信息。
  4. 删除学生信息。
  5. 显示可毕业学生。

4. 总结

本项目使用C语言实现了一个简单的学分管理系统,包含了添加、查询、修改、删除学生信息,以及显示可毕业学生的功能。该系统使用链表存储数据,并采用模块化编程方式,方便代码维护和扩展。

**注意:**该系统仅供学习参考,需要进一步完善才能应用于实际环境。例如:

  • 添加数据校验,确保输入数据的合法性。
  • 使用文件存储数据,以保证系统重启后数据不会丢失。
  • 增加其他功能,如统计学生数量、查询特定课程的学分等。
  • 使用图形界面,提高用户体验。

原文地址: https://www.cveoy.top/t/topic/oKIH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录