首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C语言实战项目--学生成绩管理系统(附带全套源代码)

C语言实战项目--学生成绩管理系统(附带全套源代码)

作者头像
@VON
发布2025-12-17 10:03:52
发布2025-12-17 10:03:52
7750
举报
项目介绍

大一大二的计算机类学生可以直接应用,该项目功能十分简洁,有利于进行期末答辩。应用到的知识点在学习的过程中老师都会讲解,并没有难理解的部分。数据采用链表的形式进行存储,没有与文件进行交接。采用的编译软件是vs2022,如果使用dev或者clion第一行代码记得去掉。

本系统所用到的知识点和前两篇系统中的知识点相似,在这里不在对各各部分知识点进行过多赘述。如果想要了解各各部分知识点,欢迎去浏览前两篇系统。链接如下:

图书管理系统

企业员工管理系统

特色:排序功能是本文章的一大特色,针对此功能使用了指针。对学生的增删改查都可以使用姓名或者学号对其进行操作,本文使用了found对信息进行标注,这点也值得去借鉴。如果有更好的改进方法欢迎提出。

项目应用技术

循环和菜单显示

while (1) 循环确保程序在执行完一个功能后继续等待用户输入。

stumenu() 函数用于显示功能菜单,用户可以根据菜单选择操作。

功能选项

1. 添加学生信息 (addstu)

调用 addstu(child) 函数,用于向系统中添加新的学生信息。

2. 查询学生信息

提供两种查询方式:按姓名查询和按学号查询。

根据用户输入的方式,调用 namefind(child)numfind(child) 函数来实现查询操作。

3. 删除学生信息

提供两种删除方式:按姓名删除和按学号删除。

根据用户输入的方式,调用 namedel(child)numdel(child) 函数来实现删除操作。

4. 修改学生信息

提供两种修改方式:按姓名修改和按学号修改。

根据用户输入的方式,调用 namechange(child)numchange(child) 函数来实现修改操作。

5. 成绩分析 (advgrade)

调用 advgrade(child) 函数,进行学生成绩分析或高级分析操作。

6. 学生排序 (sordstu)

调用 sordstu(child) 函数,对学生信息进行排序操作。

7. 打印学生信息 (printstu)

调用 printstu(child) 函数,将当前所有学生信息打印输出。

0. 退出程序

输入 0 可以退出程序,调用 exit(0) 函数。

默认情况

如果用户输入了不在菜单选项内的数字,会提示输入有误,并继续显示菜单供用户选择。

输入验证

对于涉及用户输入的地方(如查询方式、删除方式、修改方式),代码使用 scanf 函数获取用户的选择,并进行简单的输入验证和错误处理,确保用户输入的是有效选项。

项目功能代码展示

1.头文件的声明以及结构体的定义

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 添加stdlib.h以包含malloc和free函数声明
int numstu = 0;//全局变量记录学生人数
// 学生信息
typedef struct student {
    int id;        // 学号
    char name[20]; // 姓名(增大数组以容纳更长的名字)
    char sex[3];   // 性别(使用字符类型)
    int age;       // 年龄
    int math;      // 高数成绩
    int eng;       // 英语成绩
    int cyy;       // C语言成绩
    struct student* next;
} stu;

1.预处理指令 #define _CRT_SECURE_NO_WARNINGS

这是针对某些编译器(比如Visual Studio)的预处理指令,用于避免编译器产生关于安全函数的警告信息。

2.头文件包含

<stdio.h>:包含了标准输入输出函数,如 printfscanf

<string.h>:包含了字符串处理函数,如 strcpystrlen

<stdlib.h>:包含了内存分配函数 mallocfree 的声明,用于动态内存管理。

3.全局变量 numstu

numstu 用于记录当前系统中的学生人数,初始化为0,会在程序中随着学生信息的添加而增加。

4.结构体 student 的定义

typedef struct student { ... } stu;

id:整数类型,用于存储学生的学号。

name:字符数组,长度为20,用于存储学生的姓名。这里给出了注释,建议增大数组以容纳更长的名字。

sex:字符数组,长度为3,用于存储学生的性别。

age:整数类型,用于存储学生的年龄。

mathengcyy:分别是整数类型,用于存储学生的高数、英语和C语言成绩。

next:指向下一个学生信息结构体的指针,支持链表形式的存储方式。

2.函数声明

代码语言:javascript
复制
// 函数声明
stu* initstu();
void addstu(stu* child);
void printstu(stu* child);
void namedel(stu* child);
void numdel(stu* child);
void numchange(stu* child);
void namechange(stu* child);
void namefind(stu* child);
void numfind(stu* child);
void advgrade(stu* child);
void mpstu(int arrstu[], stu** array, int n);
void sordstu(stu* child);
void arrarray(stu* child, stu** array, int max_size);
void funstu(stu *child);
void stumenu();

注:因为本系统中所使用的函数都是在主函数(main)下面,所以要进行声明。如果主函数在最下面则不需要声明操作。

3.主函数

代码语言:javascript
复制
// 主函数
int main() {
    stu* child = initstu();
    while (1)
    {
        funstu(child);
    }
    return 0;
}

主函数只对链表进行了初始化操作,为了增加代码的可读性,我选择将功能函数进行打包,存放到了funstu函数当中,只需要在主函数中添加一个死循环便可完成功能函数的不断调用。

4.菜单界面

代码语言:javascript
复制
//菜单界面
void stumenu()
{
    printf("*******************************************************\n");
    printf("*           欢迎进入学生成绩管理系统v1.0              *\n");
    printf("*******************************************************\n");
    printf("*               1.输入学生信息                        *\n");
    printf("*               2.查询学生信息                        *\n");
    printf("*               3.删除学生信息                        *\n");
    printf("*               4.修改学生信息                        *\n");
    printf("*               5.计算平均分                          *\n");
    printf("*               6.对学生信息进行排序                  *\n");
    printf("*               7.打印全部学生信息                    *\n");
    printf("*               0.退出系统                            *\n");
    printf("*******************************************************\n");
}

因为是控制台程序,界面优化方面并没有进行过多的操作,只是为了不显得太唐突,简单做了一个菜单显示界面。

5.功能函数

代码语言:javascript
复制
//功能界面
void funstu(stu *child)
{
    int a;
    while (1)
    {
        stumenu();
        printf("请输入你要使用的功能:");
        scanf("%d", &a);
        switch (a)
        {
        case 1:
            addstu(child);
            break;
        case 2:
            int b;
            printf("****************请输入你要查询的方式*****************\n");
            printf("*******************1.按姓名查询**********************\n");
            printf("*******************2.按学号查询**********************\n");
            scanf("%d", &b);
            if (b == 1) namefind(child);
            else if (b == 2) numfind(child);
            else printf("输入有误!!!\n");
            break;
        case 3:
            printf("****************请输入你要删除的方式*****************\n");
            printf("*******************1.按姓名删除**********************\n");
            printf("*******************2.按学号删除**********************\n");
            int c;
            scanf("%d", &c);
            if (c == 1) namedel(child);
            else if (c == 2) numdel(child);
            else printf("输入有误!!!\n");
            break;
        case 4:
            printf("****************请输入你要删除的方式*****************\n");
            printf("*******************1.按姓名删除**********************\n");
            printf("*******************2.按学号删除**********************\n");
            int d;
            scanf("%d", &d);
            if (d == 1) namechange(child);
            else if (d == 2) numchange(child);
            else printf("输入有误!!!\n");
            break;
        case 5:
            advgrade(child);
            break;
        case 6:
            sordstu(child);
            break;
        case 7:
            printstu(child);
            break;
        case 0:
            exit(0);
            break;
        default:
            printf("输入有误!!!\n");
            break;
        }
    }
}

对学生信息的增、删、改、查、排序...进行打包,通过主菜单的不断循环即可实现其功能,当然也可以不用功能函数将其进行打包,完全可以将此函数放在主函数中,但是可读性会有所下降。

6.初始化学生信息

代码语言:javascript
复制
// 初始化学生信息
stu* initstu() 
{
    stu* child = (stu*)malloc(sizeof(stu));
    if (child == NULL) {
        perror("分配内存失败");
        exit(EXIT_FAILURE);
    }
    child->next = NULL;
    return child;
}

因为学生的信息是使用链表进行存储的,所以要对头部进行初始化操作。

注:分配内存的格式一定要牢记,别忘记头文件#include<stdlib.h>的使用。

7.增加学生信息

代码语言:javascript
复制
// 增加学生信息
void addstu(stu* child) 
{
    stu* node = (stu*)malloc(sizeof(stu));
    if (node == NULL) {
        perror("分配内存失败");
        exit(EXIT_FAILURE);
    }
    printf("请输入你想要添加学生的信息:\n");
    printf("学号:");
    scanf("%d", &node->id);
    printf("姓名:");
    scanf("%s", node->name);
    printf("性别:");
    scanf("%s", node->sex);
    printf("年龄:");
    scanf("%d", &node->age);
    printf("高数成绩:");
    scanf("%d", &node->math);
    printf("英语成绩:");
    scanf("%d", &node->eng);
    printf("C语言成绩:");
    scanf("%d", &node->cyy);

    node->next = NULL;
    numstu += 1;
    while (child->next != NULL) {
        child = child->next;
    }
    child->next = node;
}

为了更好的使用此系统,以及下面其余功能的操作,建议多录入几个学生的信息。在这里我输入了3名同学的信息。

8.删除学生信息

代码语言:javascript
复制
//删除学生信息
//按姓名删除
void namedel(stu* child)
{
    int found = 0;
    char name[100];
    printf("请输入你要删除学生的姓名:");
    scanf("%s", name);
    stu* temp = child->next;
    stu* pre = child;
    while (temp != NULL)
    {
        if (strcmp(temp->name, name) == 0)
        {
            found = 1;
            pre->next = temp->next;
            free(temp);
            break;
        }
        printf("删除成功\n");
        temp = temp->next;
        pre = pre->next;
    }
    if(found==0) printf("没有找到该生!!!\n");
}
//按学号删除 
void numdel(stu* child)
{
    int found = 0;
    int idnum=0;
    printf("请输入你要删除学生的学号:");
    scanf("%d", &idnum);
    stu* temp = child->next;
    stu* pre = child;
    while (temp != NULL)
    {
        if (temp->id==idnum)
        {
            found = 1;
            pre->next = temp->next;
            free(temp);
            printf("删除成功\n");
            break;
        }
        temp = temp->next;
        pre = pre->next;
    }
    if (found == 0) printf("没有找到该生!!!\n");
}

9.修改学生信息

代码语言:javascript
复制
//修改学生信息
//按姓名修改
void namechange(stu* child)
{
    int found = 0;
    char name[20];
    stu* temp = child->next;
    printf("请输入你要修改学生的姓名:");
    scanf("%s", name);
    while (temp != NULL)
    {
        if (strcmp(temp->name, name) == 0)
        {
            found = 1;
            printf("请输入你想要修改学生的信息\n");
            printf("学号:");
            scanf("%d", &temp->id);
            printf("姓名:");
            scanf("%s", temp->name);
            printf("性别:");
            scanf("%s", temp->sex);
            printf("年龄:");
            scanf("%d", &temp->age);
            printf("高数成绩:");
            scanf("%d", &temp->math);
            printf("英语成绩:");
            scanf("%d", &temp->eng);
            printf("C语言成绩:");
            scanf("%d", &temp->cyy);
            printf("修改成功!\n");
            break;
        }
        temp = temp->next;
    }
    if (found == 0) printf("没有找到该学生!\n");
}
//按学号修改
void numchange(stu* child)
{
    int id;
    int found = 0;
    stu* temp = child->next;
    printf("请输入你要修改学生的学号:");
    scanf("%d", &id);
    while (temp != NULL)
    {
        if (temp->id==id)
        {
            found = 1;
            printf("请输入你想要修改学生的信息\n");
            printf("学号:");
            scanf("%d", &temp->id);
            printf("姓名:");
            scanf("%s", temp->name);
            printf("性别:");
            scanf("%s", temp->sex);
            printf("年龄:");
            scanf("%d", &temp->age);
            printf("高数成绩:");
            scanf("%d", &temp->math);
            printf("英语成绩:");
            scanf("%d", &temp->eng);
            printf("C语言成绩:");
            scanf("%d", &temp->cyy);
            printf("修改成功!\n");
            break;
        }
        temp = temp->next;
    }
    if (found == 0) printf("没有找到该学生!\n");
}

10.查找学生信息

代码语言:javascript
复制
//查找学生信息
//按姓名查找
void namefind(stu* child)
{
    int found = 0;
    char name[20];
    stu* temp = child->next;
    printf("请输入你要查找学生的姓名:");
    scanf("%s", name);
    while (temp != NULL)
    {
        if (strcmp(temp->name, name) == 0)
        {
            found = 1;
            printf("===============================该生信息如下=============================\n");
            printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
            printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", temp->id, temp->name, temp->sex, temp->age, temp->math, temp->eng, temp->cyy);
            break;
        }
        temp = temp->next;
    }if (found == 0) printf("没有查询到该生。\n");
}
//按学号查找
void numfind(stu* child)
{
    int id;
    int found = 0;
    stu* temp = child->next;
    printf("请输入你要查找学生的学号:");
    scanf("%d", &id);
    while (temp != NULL)
    {
        if (temp->id == id)
        {
            found = 1;
            printf("==============================该生信息如下=============================\n");
            printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
            printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", temp->id, temp->name, temp->sex, temp->age, temp->math, temp->eng, temp->cyy);
            break;
        }
        temp = temp->next;
    }
    if (found == 0) printf("没有查询到该生。\n");
}

11.计算平均分

代码语言:javascript
复制
//计算平均分
void advgrade(stu* child)
{
    char grade[20];
    double sum=0;
    printf("请输入你要查询的科目:");
    scanf("%s", grade);
    stu* temp = child->next;
    stu* adv = child->next;
    while (temp != NULL)
    {
        if (strcmp("高数", grade) == 0)
        {
            while (adv != NULL)
            {
                sum += adv->math;
                adv = adv->next;
            }
            sum =sum / numstu;
            printf("高数平均成绩为:%.2lf\n", sum);
            break;
        }
        else if (strcmp("英语", grade) == 0)
        {
            while (adv != NULL)
            {
                sum += adv->eng;
                adv = adv->next;
            }
            sum =sum / numstu;
            printf("英语平均成绩为:%.2lf\n", sum);
            break;
        }
        else if (strcmp("C语言", grade) == 0)
        {
            while (adv != NULL)
            {
                sum += adv->cyy;
                adv = adv->next;
            }
            sum = sum / numstu;
            printf("C语言平均成绩为:%.2lf\n", sum);
            break;
        }
        else
        {
            printf("输入有误!!!\n");
            break;
        }
        temp = temp->next;
    }
}

注:查询的结果会自动保存两位小数,C语言查询时"C"一定要大写!!!

12.对学生信息进行排序

代码语言:javascript
复制
// 冒泡排序函数,接受 stu 结构体指针数组和数组长度作为参数
void mpstu(int arrstu[], stu** array, int n)
{
    stu *temp;
    for (int i = 0; i < n; i++) 
    {
        for (int j = 0; j < n - i - 1; j++) 
        {
            // 比较节点的 id 字段,需要使用指针访问
            if (arrstu[j]>arrstu[j+1])
            {
                temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}

void arrarray(stu* child, stu** array, int max_size)
{
    stu* head = child->next;
    int count = 0;
    //遍历链表,将结点存入数组
    while (head != NULL && count < max_size)
    {
        array[count] = head;
        head = head->next;
        count++;
    }
}

void sordstu(stu* child) 
{
    stu* arr[100];
    int arrstu[100] = { 0 };//定义一个整形数组,存储id
    int max_size = 100;
    arrarray(child, arr, max_size);
    stu* temp = arr[0];
    for (int i = 0; i < numstu; i++)
    {
        arrstu[i] = temp->id;
        temp = temp->next;
    }
    mpstu(arrstu,arr, numstu);
    printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
    for (int a = 0; a < numstu; a++)
    {
        printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", arr[a]->id, arr[a]->name, arr[a]->sex, arr[a]->age, arr[a]->math, arr[a]->eng, arr[a]->cyy);
    }
}
  1. 结构体定义和链表操作
    • stu 结构体的定义包含学生的各种信息,如学号 (id)、姓名 (name)、性别 (sex)、年龄 (age)、以及各科成绩等。
    • 链表操作中,stu 结构体中的 next 字段用于指向下一个节点,通过这个指针可以遍历整个链表。
  2. 将链表节点存入数组 (arrarray 函数):
    • arrarray 函数接受一个链表头指针 child,将链表中的节点依次存储到 array 数组中。这个函数主要通过遍历链表来实现,将每个节点的指针存储到数组中,直到达到数组的最大容量或链表结束。
  3. 冒泡排序 (mpstu 函数):
    • mpstu 函数实现了冒泡排序算法,对 arrstu 数组进行排序,同时保证 array 数组中的指针顺序也随之调整。排序的依据是比较学生的学号 (id)。
  4. 主函数 sordstu 的实现
    • sordstu 函数是整个程序的主函数,它首先调用 arrarray 函数将链表中的节点指针存入 arr 数组中。
    • 然后通过遍历 arr 数组,将每个学生节点的学号 (id)提取出来存入 arrstu 数组中,为后续的排序做准备。
    • 调用 mpstu 函数对 arrstuarr 数组进行排序。
    • 最后,使用 printf 函数输出排序后的学生信息,包括学号、姓名、性别、年龄以及各科成绩等信息。
  5. 知识点总结
    • 链表操作:使用链表来存储和组织数据。
    • 数组操作:通过数组来对链表中的节点进行排序。
    • 冒泡排序算法:简单的排序算法,用于对学号进行排序。
    • 指针操作:在 arrarraympstu 函数中使用了指针操作,对链表节点进行访问和交换。

13.输出所有学生信息

代码语言:javascript
复制
//输出所有学生信息
void printstu(stu* child)
{
    printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
    stu* hand = child->next;
    while (hand != NULL)
    {
        printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", hand->id, hand->name, hand->sex, hand->age, hand->math, hand->eng, hand->cyy);
        hand = hand->next;
    }
}

14.退出系统

项目全套代码展示

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 添加stdlib.h以包含malloc和free函数声明
int numstu = 0;//全局变量记录学生人数
// 学生信息
typedef struct student {
    int id;        // 学号
    char name[20]; // 姓名(增大数组以容纳更长的名字)
    char sex[3];   // 性别(使用字符类型)
    int age;       // 年龄
    int math;      // 高数成绩
    int eng;       // 英语成绩
    int cyy;       // C语言成绩
    struct student* next;
} stu;

// 函数声明
stu* initstu();
void addstu(stu* child);
void printstu(stu* child);
void namedel(stu* child);
void numdel(stu* child);
void numchange(stu* child);
void namechange(stu* child);
void namefind(stu* child);
void numfind(stu* child);
void advgrade(stu* child);
void mpstu(int arrstu[], stu** array, int n);
void sordstu(stu* child);
void arrarray(stu* child, stu** array, int max_size);
void funstu(stu *child);
void stumenu();

// 主函数
int main() {
    stu* child = initstu();
    while (1)
    {
        funstu(child);
    }
    return 0;
}
//菜单界面
void stumenu()
{
    printf("*******************************************************\n");
    printf("*           欢迎进入学生成绩管理系统v1.0              *\n");
    printf("*******************************************************\n");
    printf("*               1.输入学生信息                        *\n");
    printf("*               2.查询学生信息                        *\n");
    printf("*               3.删除学生信息                        *\n");
    printf("*               4.修改学生信息                        *\n");
    printf("*               5.计算平均分                          *\n");
    printf("*               6.对学生信息进行排序                  *\n");
    printf("*               7.打印全部学生信息                    *\n");
    printf("*               0.退出系统                            *\n");
    printf("*******************************************************\n");
}
//功能界面
void funstu(stu *child)
{
    int a;
    while (1)
    {
        stumenu();
        printf("请输入你要使用的功能:");
        scanf("%d", &a);
        switch (a)
        {
        case 1:
            addstu(child);
            break;
        case 2:
            int b;
            printf("****************请输入你要查询的方式*****************\n");
            printf("*******************1.按姓名查询**********************\n");
            printf("*******************2.按学号查询**********************\n");
            scanf("%d", &b);
            if (b == 1) namefind(child);
            else if (b == 2) numfind(child);
            else printf("输入有误!!!\n");
            break;
        case 3:
            printf("****************请输入你要删除的方式*****************\n");
            printf("*******************1.按姓名删除**********************\n");
            printf("*******************2.按学号删除**********************\n");
            int c;
            scanf("%d", &c);
            if (c == 1) namedel(child);
            else if (c == 2) numdel(child);
            else printf("输入有误!!!\n");
            break;
        case 4:
            printf("****************请输入你要删除的方式*****************\n");
            printf("*******************1.按姓名删除**********************\n");
            printf("*******************2.按学号删除**********************\n");
            int d;
            scanf("%d", &d);
            if (d == 1) namechange(child);
            else if (d == 2) numchange(child);
            else printf("输入有误!!!\n");
            break;
        case 5:
            advgrade(child);
            break;
        case 6:
            sordstu(child);
            break;
        case 7:
            printstu(child);
            break;
        case 0:
            exit(0);
            break;
        default:
            printf("输入有误!!!\n");
            break;
        }
    }
}

// 初始化学生信息
stu* initstu() 
{
    stu* child = (stu*)malloc(sizeof(stu));
    if (child == NULL) {
        perror("分配内存失败");
        exit(EXIT_FAILURE);
    }
    child->next = NULL;
    return child;
}

// 增加学生信息
void addstu(stu* child) 
{
    stu* node = (stu*)malloc(sizeof(stu));
    if (node == NULL) {
        perror("分配内存失败");
        exit(EXIT_FAILURE);
    }
    printf("请输入你想要添加学生的信息:\n");
    printf("学号:");
    scanf("%d", &node->id);
    printf("姓名:");
    scanf("%s", node->name);
    printf("性别:");
    scanf("%s", node->sex);
    printf("年龄:");
    scanf("%d", &node->age);
    printf("高数成绩:");
    scanf("%d", &node->math);
    printf("英语成绩:");
    scanf("%d", &node->eng);
    printf("C语言成绩:");
    scanf("%d", &node->cyy);

    node->next = NULL;
    numstu += 1;
    while (child->next != NULL) {
        child = child->next;
    }
    child->next = node;
}
//删除学生信息
//按姓名删除
void namedel(stu* child)
{
    int found = 0;
    char name[100];
    printf("请输入你要删除学生的姓名:");
    scanf("%s", name);
    stu* temp = child->next;
    stu* pre = child;
    while (temp != NULL)
    {
        if (strcmp(temp->name, name) == 0)
        {
            found = 1;
            pre->next = temp->next;
            free(temp);
            break;
        }
        printf("删除成功\n");
        temp = temp->next;
        pre = pre->next;
    }
    if(found==0) printf("没有找到该生!!!\n");
}
//按学号删除 
void numdel(stu* child)
{
    int found = 0;
    int idnum=0;
    printf("请输入你要删除学生的学号:");
    scanf("%d", &idnum);
    stu* temp = child->next;
    stu* pre = child;
    while (temp != NULL)
    {
        if (temp->id==idnum)
        {
            found = 1;
            pre->next = temp->next;
            free(temp);
            printf("删除成功\n");
            break;
        }
        temp = temp->next;
        pre = pre->next;
    }
    if (found == 0) printf("没有找到该生!!!\n");
}
//修改学生信息
//按姓名修改
void namechange(stu* child)
{
    int found = 0;
    char name[20];
    stu* temp = child->next;
    printf("请输入你要修改学生的姓名:");
    scanf("%s", name);
    while (temp != NULL)
    {
        if (strcmp(temp->name, name) == 0)
        {
            found = 1;
            printf("请输入你想要修改学生的信息\n");
            printf("学号:");
            scanf("%d", &temp->id);
            printf("姓名:");
            scanf("%s", temp->name);
            printf("性别:");
            scanf("%s", temp->sex);
            printf("年龄:");
            scanf("%d", &temp->age);
            printf("高数成绩:");
            scanf("%d", &temp->math);
            printf("英语成绩:");
            scanf("%d", &temp->eng);
            printf("C语言成绩:");
            scanf("%d", &temp->cyy);
            printf("修改成功!\n");
            break;
        }
        temp = temp->next;
    }
    if (found == 0) printf("没有找到该学生!\n");
}
//按学号修改
void numchange(stu* child)
{
    int id;
    int found = 0;
    stu* temp = child->next;
    printf("请输入你要修改学生的学号:");
    scanf("%d", &id);
    while (temp != NULL)
    {
        if (temp->id==id)
        {
            found = 1;
            printf("请输入你想要修改学生的信息\n");
            printf("学号:");
            scanf("%d", &temp->id);
            printf("姓名:");
            scanf("%s", temp->name);
            printf("性别:");
            scanf("%s", temp->sex);
            printf("年龄:");
            scanf("%d", &temp->age);
            printf("高数成绩:");
            scanf("%d", &temp->math);
            printf("英语成绩:");
            scanf("%d", &temp->eng);
            printf("C语言成绩:");
            scanf("%d", &temp->cyy);
            printf("修改成功!\n");
            break;
        }
        temp = temp->next;
    }
    if (found == 0) printf("没有找到该学生!\n");
}
//查找学生信息
//按姓名查找
void namefind(stu* child)
{
    int found = 0;
    char name[20];
    stu* temp = child->next;
    printf("请输入你要查找学生的姓名:");
    scanf("%s", name);
    while (temp != NULL)
    {
        if (strcmp(temp->name, name) == 0)
        {
            found = 1;
            printf("===============================该生信息如下=============================\n");
            printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
            printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", temp->id, temp->name, temp->sex, temp->age, temp->math, temp->eng, temp->cyy);
            break;
        }
        temp = temp->next;
    }if (found == 0) printf("没有查询到该生。\n");
}
//按学号查找
void numfind(stu* child)
{
    int id;
    int found = 0;
    stu* temp = child->next;
    printf("请输入你要查找学生的学号:");
    scanf("%d", &id);
    while (temp != NULL)
    {
        if (temp->id == id)
        {
            found = 1;
            printf("==============================该生信息如下=============================\n");
            printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
            printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", temp->id, temp->name, temp->sex, temp->age, temp->math, temp->eng, temp->cyy);
            break;
        }
        temp = temp->next;
    }
    if (found == 0) printf("没有查询到该生。\n");
}
//计算平均分
void advgrade(stu* child)
{
    char grade[20];
    double sum=0;
    printf("请输入你要查询的科目:");
    scanf("%s", grade);
    stu* temp = child->next;
    stu* adv = child->next;
    while (temp != NULL)
    {
        if (strcmp("高数", grade) == 0)
        {
            while (adv != NULL)
            {
                sum += adv->math;
                adv = adv->next;
            }
            sum =sum / numstu;
            printf("高数平均成绩为:%.2lf\n", sum);
            break;
        }
        else if (strcmp("英语", grade) == 0)
        {
            while (adv != NULL)
            {
                sum += adv->eng;
                adv = adv->next;
            }
            sum =sum / numstu;
            printf("英语平均成绩为:%.2lf\n", sum);
            break;
        }
        else if (strcmp("C语言", grade) == 0)
        {
            while (adv != NULL)
            {
                sum += adv->cyy;
                adv = adv->next;
            }
            sum = sum / numstu;
            printf("C语言平均成绩为:%.2lf\n", sum);
            break;
        }
        else
        {
            printf("输入有误!!!\n");
            break;
        }
        temp = temp->next;
    }
}
// 冒泡排序函数,接受 stu 结构体指针数组和数组长度作为参数
void mpstu(int arrstu[], stu** array, int n)
{
    stu *temp;
    for (int i = 0; i < n; i++) 
    {
        for (int j = 0; j < n - i - 1; j++) 
        {
            // 比较节点的 id 字段,需要使用指针访问
            if (arrstu[j]>arrstu[j+1])
            {
                temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}

void arrarray(stu* child, stu** array, int max_size)
{
    stu* head = child->next;
    int count = 0;
    //遍历链表,将结点存入数组
    while (head != NULL && count < max_size)
    {
        array[count] = head;
        head = head->next;
        count++;
    }
}

void sordstu(stu* child) 
{
    stu* arr[100];
    int arrstu[100] = { 0 };//定义一个整形数组,存储id
    int max_size = 100;
    arrarray(child, arr, max_size);
    stu* temp = arr[0];
    for (int i = 0; i < numstu; i++)
    {
        arrstu[i] = temp->id;
        temp = temp->next;
    }
    mpstu(arrstu,arr, numstu);
    printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
    for (int a = 0; a < numstu; a++)
    {
        printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", arr[a]->id, arr[a]->name, arr[a]->sex, arr[a]->age, arr[a]->math, arr[a]->eng, arr[a]->cyy);
    }
}

//输出所有学生信息
void printstu(stu* child)
{
    printf("学号\t姓名\t性别\t年龄\t高数成绩\t英语成绩\tC语言成绩\n");
    stu* hand = child->next;
    while (hand != NULL)
    {
        printf("%d\t%s\t%s\t%d\t%d\t\t%d\t\t%d\n", hand->id, hand->name, hand->sex, hand->age, hand->math, hand->eng, hand->cyy);
        hand = hand->next;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目介绍
  • 项目应用技术
    • 循环和菜单显示
    • 功能选项
  • 项目功能代码展示
    • 1.头文件的声明以及结构体的定义
    • 2.函数声明
    • 3.主函数
    • 4.菜单界面
    • 5.功能函数
    • 6.初始化学生信息
    • 7.增加学生信息
    • 8.删除学生信息
    • 9.修改学生信息
    • 10.查找学生信息
    • 11.计算平均分
    • 12.对学生信息进行排序
    • 13.输出所有学生信息
    • 14.退出系统
  • 项目全套代码展示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档