c语言实现学生管理系统详解

C语言实现学生管理系统详解

本文将详细讲解如何使用C语言实现一个简单的学生管理系统,包括设计思路、代码实现和运行效果展示。

设计思路

学生管理系统是一种常见的信息管理系统,其主要功能包括添加、删除、查询、修改学生信息。在设计实现过程中,我们可以采用如下思路:

1. 学生信息结构体的定义和存储

我们定义一个结构体(student)来表示每个学生的信息,包括姓名、学号、性别、年龄、成绩等字段。我们可以使用动态数组来存储学生信息,实现动态添加、删除学生信息的功能。

2. 学生信息的添加

用户在程序运行时可以选择添加一批学生信息,将信息保存到结构体数组中。

3. 学生信息的删除

程序运行时支持根据学号或者姓名来删除学生信息。

4. 学生信息的查询

程序支持根据学号或者姓名来查询学生信息,同时支持打印出全部学生信息。

5. 学生信息的排序

程序支持根据成绩或者年龄对学生信息进行排序。

代码实现

基于上述设计思路,我们可以通过编写C语言代码来实现学生管理系统。以下是示例代码:

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

#define MAX_STUDENT 1000  // 最大学生数

// 学生信息结构体
struct student {
    char name[20];     // 姓名
    char id[20];       // 学号
    char sex[5];       // 性别
    int age;           // 年龄
    float score;       // 成绩
};

// 全局变量
struct student* students[MAX_STUDENT];
int student_count = 0;

// 打印菜单
void print_menu() {
    printf("********************************************\n");
    printf("*          欢迎来到学生管理系统           *\n");
    printf("* 1. 添加学生信息                          *\n");
    printf("* 2. 删除学生信息                          *\n");
    printf("* 3. 查询学生信息                          *\n");
    printf("* 4. 显示所有学生信息                      *\n");
    printf("* 5. 学生成绩排序                          *\n");
    printf("* 0. 退出程序                              *\n");
    printf("********************************************\n");
}

// 添加学生信息
void add_student() {
    if (student_count >= MAX_STUDENT) {
        printf("学生数量已满,无法添加新的学生信息");
        return;
    }

    printf("请输入学生姓名:");
    char name[20];
    scanf("%s", name);

    printf("请输入学生学号:");
    char id[20];
    scanf("%s", id);

    printf("请输入学生性别:");
    char sex[5];
    scanf("%s", sex);

    printf("请输入学生年龄:");
    int age;
    scanf("%d", &age);

    printf("请输入学生成绩:");
    float score;
    scanf("%f", &score);

    struct student* s = (struct student*)malloc(sizeof(struct student));
    strcpy(s->name, name);
    strcpy(s->id, id);
    strcpy(s->sex, sex);
    s->age = age;
    s->score = score;
    students[student_count++] = s;

    printf("学生信息添加成功\n");
}

// 删除学生信息
void delete_student() {
    printf("请输入你要删除学生的学号或姓名:");
    char search[20];
    scanf("%s", search);

    int found = 0;
    for (int i = 0; i < student_count; i++) {
        if (strcmp(students[i]->name, search) == 0 || strcmp(students[i]->id, search) == 0) {
            // 找到目标学生,删除其信息
            free(students[i]);
            students[i] = NULL;
            student_count--;
            found = 1;
            printf("学生信息删除成功\n");
            break;
        }
    }

    if (!found) {
        printf("未找到要删除的学生信息\n");
    }
}

// 查询学生信息
void search_student() {
    printf("请输入你要查询学生的学号或姓名:");
    char search[20];
    scanf("%s", search);

    int found = 0;
    for (int i = 0; i < student_count; i++) {
        if (strcmp(students[i]->name, search) == 0 || strcmp(students[i]->id, search) == 0) {
            // 找到目标学生,输出其信息
            printf("姓名:%s 学号:%s 性别:%s 年龄:%d 成绩:%f\n",
                students[i]->name, students[i]->id, students[i]->sex, students[i]->age, students[i]->score);
            found = 1;
        }
    }

    if (!found) {
        printf("未找到要查询的学生信息\n");
    }
}

// 显示学生信息
void show_all_student() {
    for (int i = 0; i < student_count; i++) {
        printf("姓名:%s 学号:%s 性别:%s 年龄:%d 成绩:%f\n",
            students[i]->name, students[i]->id, students[i]->sex, students[i]->age, students[i]->score);
    }
}

// 成绩排序
int cmp_score(const void* a, const void* b) {
    struct student* s1 = *(struct student**)a;
    struct student* s2 = *(struct student**)b;
    return s1->score > s2->score ? -1 : 1;  // 按分数降序排序
}

void sort_student_by_score() {
    qsort(students, student_count, sizeof(struct student*), cmp_score);
    printf("学生成绩排序成功\n");
}

int main() {
    int option;
    do {
        print_menu();
        printf("请输入选项(0-5):");
        scanf("%d", &option);

        switch (option) {
        case 1:
            add_student();
            break;
        case 2:
            delete_student();
            break;
        case 3:
            search_student();
            break;
        case 4:
            show_all_student();
            break;
        case 5:
            sort_student_by_score();
            break;
        case 0:
            printf("感谢使用学生管理系统,下次再见!\n");
            break;
        default:
            printf("输入的选项有误,请重新输入\n");
            break;
        }
    } while (option != 0);

    // 释放学生信息内存
    for (int i = 0; i < student_count; i++) {
        free(students[i]);
    }

    return 0;
}

运行效果展示

下面是一个简单的运行效果展示,仅供参考。

********************************************
*          欢迎来到学生管理系统           *
* 1. 添加学生信息                          *
* 2. 删除学生信息                          *
* 3. 查询学生信息                          *
* 4. 显示所有学生信息                      *
* 5. 学生成绩排序                          *
* 0. 退出程序                              *
********************************************
请输入选项(0-5):1
请输入学生姓名:Tom
请输入学生学号:123456
请输入学生性别:male
请输入学生年龄:20
请输入学生成绩:90
学生信息添加成功
请输入选项(0-5):4
姓名:Tom 学号:123456 性别:male 年龄:20 成绩:90.000000
请输入选项(0-5):2
请输入你要删除学生的学号或姓名:123456
学生信息删除成功
请输入选项(0-5):4
请输入选项(0-5):0
感谢使用学生管理系统,下次再见!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言实现学生管理系统详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Fate/EXTELLA启动应用程序错误怎么办 0xc000007b错误的解决方法

    Fate/EXTELLA启动应用程序错误解决方案 问题描述 当尝试启动Fate/EXTELLA游戏时,可能会出现以下错误: “无法启动应用程序程序,因为计算机上找不到XXX.dll。请尝试重新安装该程序以解决该问题。” “应用程序无法正确启动(0xc000007b)。单击确定关闭应用程序。” 如果你在运行Fate/EXTELLA时遇到以上错误,那么你所面临的…

    C 2023年5月23日
    00
  • 利用C++实现通讯录管理系统的完整代码

    关于“利用C++实现通讯录管理系统的完整代码”的攻略如下: 步骤一:分析需求 在开始写代码之前,我们需要先仔细分析需求。通讯录管理系统有哪些功能呢?比如添加联系人、显示联系人、删除联系人等等。要想写好代码,先要清晰的了解需求。 步骤二:设计数据结构 在考虑具体的实现之前,我们需要确定一个数据结构来组织我们的数据。在通讯录管理系统中,最核心的数据结构就是通讯录…

    C 2023年5月23日
    00
  • win10系统下 VS2019点云库PCL1.12.0的安装与配置教程

    下面是在Win10系统下安装VS2019和PCL1.12.0库的完整攻略: 准备工作 安装Visual Studio 2019 安装CMake 安装PCL1.12.0 访问PCL官网(https://pointclouds.org/downloads/)下载点云库PCL的最新版1.12.0。 解压下载的文件到任意目录(以C:/Program Files (x…

    C 2023年5月23日
    00
  • @Async异步线程池以及线程的命名方式

    下面我将为您详细讲解“@Async异步线程池以及线程的命名方式”的攻略。 什么是@Async异步线程池 在Spring中,使用@Async注解来使用异步线程。@Async用于在方法执行时,将方法内的操作放在异步线程中执行,以达到并发执行的效果。在异步方法中,可以使用Future类型来获取异步方法返回的结果。 Spring的@Async注解默认使用的是Simp…

    C 2023年5月23日
    00
  • 彩虹六号围攻显示0xc0000005错误怎么办

    彩虹六号围攻显示0xc0000005错误的解决方法 问题描述 彩虹六号围攻是一款热门的战术射击游戏,在玩家使用该游戏过程中可能会遇到显示0xc0000005错误的问题。 该问题的表现形式为游戏会在启动时崩溃,并显示错误代码0xc0000005。 解决方法 该问题通常是由于游戏文件损坏、操作系统问题或者驱动冲突造成的。以下是一些可能的解决方法。 方法一:重新安…

    C 2023年5月23日
    00
  • Python实现将json文件生成C语言的结构体的脚本分享

    下面为你提供 Python 实现将 json 文件生成 C 语言的结构体的脚本分享的完整攻略,具体步骤如下: 1. 安装必要的库 在使用过程中,需要使用 Python 的 json 模块和 os 模块,需要安装,可以使用下面的命令进行安装: pip install json pip install os 2. 读取 json 文件 使用 Python 的 j…

    C 2023年5月23日
    00
  • Javascript实用方法之json合并的场景分析

    Javascript实用方法之json合并的场景分析 在开发中,JSON合并是一项非常常见的需求。本篇攻略将介绍典型的JSON合并场景及其解决方案。 场景分析 假设有两个JSON对象,分别为: let object1 = { name: ‘John’, age: 25, location: { city: ‘New York’, country: ‘USA’…

    C 2023年5月23日
    00
  • C++ 程序抛出异常后执行顺序说明

    当一个 C++ 程序在运行过程中遇到了异常情况,它可以通过抛出异常来通知上层代码进行异常处理。在此过程中,C++ 运行时会自动执行一些有序的操作步骤,以保证程序能够正确地处理异常。下面我们就来详细讲解一下这些操作步骤。 C++ 异常抛出和捕获机制 在 C++ 中,我们可以使用 throw 语句来抛出一份异常。其语法形式如下: throw exception_…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部