C语言学生管理系统

C语言学生系统管理

前言 

 "在许多学校中,C语言通常被选为学生的编程入门语言。许多教师会布置C语言的期末大作业,其中一个常见的题目是学生信息管理系统。以往的练习题通常只需要几十行代码就能完成,但完整编写这个系统却需要约400行代码。完成这个系统的编写不仅是对整个学期所学知识的深入理解和实践,还可以拓展课外知识。由于篇幅较长,建议收藏后慢慢阅读。"

1、题目详情

一、学生信息管理程序 基本要求:
1.要求实现学生信息的 添加、删除、修改、查找、统计、指定插入学生信息位置、浏览、排序、退出等9个功能,每个功能模块均能实现从模块中退出,从而完成一个学生管理系统所需功能。

2.要使用结构体来实现对学生信息的存储。

3.学生信息需至少包括:学号,姓名, 成绩信息.

4.系统制作完成后应实现类似下图所示界面:

2、系统设计(主要函数)

2.1结构体的创建

题目要求需要使用结构体来对学生信息进行储存,所以需要创建一个结构体,同时也要注意结构体中需要包含学生的那些信息。

typedef struct {
    int number;//学号
	char name[20];//姓名
    int sort;//成绩
}StudentType;
typedef struct {
    StudentType r[Maxsize];//学生信息数组
    int count;//记录学生人数
}Student;
2.2main函数

这段代码是一个简单的主函数,它调用了两个函数:DisplayMenu() 和 choice()。通过DisplayMenu()函数,程序展示了一个菜单,为用户提供了不同的选择。而通过choice()函数,程序引导用户做出一个具体的选择。最后,函数返回0,表示程序顺利执行结束。这段代码虽然简短,却是整个程序的核心,负责引导用户进入程序的主要功能。

int main()
{
    DisplayMenu();
    choice();
    return 0;
}
2.3DisplayMenu函数

这段代码定义了一个名为DisplayMenu()的函数,用于展示一个学生管理系统的菜单界面,包括各种操作选项。

void DisplayMenu()//展示界面
{
    printf("========= 学生管理系统 =========\n");
    printf("1. 添加学生信息\n");
    printf("2. 删除学生信息\n");
    printf("3. 修改学生信息\n");
    printf("4. 查找学生信息\n");
    printf("5. 统计学生个数\n");
    printf("6. 指定学生插入位置\n");
    printf("7. 显示所有学生信息\n");
    printf("8. 对学生进行排序(姓名)\n");
    printf("0. 退出程序\n");
    printf("=================================\n\n");

}
2.4Ins函数

这段代码定义了一个名为Ins()的函数,用于录入学生信息。函数首先要求用户输入要录入的学生信息个数,然后逐个录入每位学生的学号、姓名和成绩。最后,打印出录入结束的提示信息。这个函数实现了向学生管理系统中添加新的学生信息的功能。

void Ins(Student* l)//学生信息录入
{
    int i, n;
    printf("*********************************\n");
    printf("请输入录入学生信息个数:");
    scanf_s("%d", &n);
    l->count = n;
    for (i = 1; i <= n; i++)
    {
        printf("---------------------------------\n");
        printf("第%d个学生信息:", i);
        printf("学生学号:");
        scanf("%d", &l->r[i].number);
        fflush(stdin);
        printf("\t      学生姓名:");
        scanf("%s", l->r[i].name );
        fflush(stdin);
        printf("\t      学生成绩:");
        scanf("%d", &l->r[i].sort);
        fflush(stdin);
    }
    printf("---------------------------------\n");
    printf("录入学生信息结束!\n");
    printf("*********************************\n");
}
2.5remove函数

这段代码定义了一个名为remove()的函数,用于删除学生信息。函数要求用户输入要删除的学生位置,如果位置合法,则删除该学生信息并将后续学生信息前移,最后更新学生总数。删除成功后给出提示。

void remove(Student* l) //删除学生信息
{
    int n, i, flag = 1; 
    while (flag)
    {
        printf("请输入删除学生的所在位置:");
        scanf("%d", &n);
        if (n > l->count || n <= 0) 
        {
            printf("输入错误,请再次输入!\n");
        }
        else 
        {
            for (i = n; i < l->count; i++) 
            {
                strcpy(l->r[i].name, l->r[i + 1].name);
                l->r[i].number  = l->r[i + 1].number ;
                l->r[i].sort  = l->r[i + 1].sort ;
            }
            l->count--; 
            printf("删除成功!\n");
            flag = 0; 
        }
    }
}
2.6print_info函数

这段代码的功能就是输出学生的信息。

void print_info(Student* l, int i)//输出学生信息
{
    printf("学号:%d\n", l->r[i].number);
    printf("\t   姓名:%s\n", l->r[i].name);
    printf("\t   成绩:%d\n", l->r[i].sort);
}

2.7change函数

这段代码定义了一个名为change()的函数,用于修改已经输入的学生信息。用户需输入要修改的学生位置,然后可以输入新的学号、姓名和成绩来更新该学生信息。如果位置无效,会提示输入错误。修改成功后会给出相应提示。

int change(Student* l)//修改学生信息
{
    int n, pos, x,i,w, flag;
    char name[20];
    printf("请选择查找该学生的方式:1.学号 2.姓名\n");
    printf("请输入你的选择:");
    scanf("%d", &n);
    fflush(stdin);
    switch (n)
    {
    case 1:
        printf("请输入你要查找的学号:");
        scanf("%d", &w);
        for (i = 1; i <= l->count; i++)
        {
            if (l->r[i].number == w)
                break;
        }
        pos = i;
        break;

    case 2:
        printf("请输入你要查找的姓名:");
        scanf("%s", name);
        for (i = 1; i <= l->count; i++)
        {
            if (strcmp(l->r[i].name , name)==0)
                break;
        }
        pos = i;
        break;

    default:
        printf("输入错误!\n");
        return 0;
    }
    printf("查找成功!\n");
    printf("学生信息为:");
    print_info(l, pos);
    printf("请选择要修改的信息:1.学号 2.姓名 3.成绩\n");
    scanf("%d", &x);
    fflush(stdin);
    switch (x)
    {
    case 1:
        printf("请输入修改后的学号:");
        scanf("%d", &l->r[pos].number);
        for (int i = 1; i < pos; i++)
        {
            if (l->r[pos].number == l->r[i].number)
                flag = 0;
        }
        for (int i = pos + 1; i <= l->count; i++)
        {
            if (l->r[pos].number == l->r[i].number)
                flag = 0;
        }
        if (flag == 0)
            printf("更改失败,此学号存在!\n");
        else
        {
            printf("修改成功!\n");
            printf("学生信息为:");
            print_info(l, pos);
        }

        break;
    case 2:
        printf("请输入修改后的姓名:");
        scanf("%s", l->r[pos].name);
        printf("修改成功!\n");
        printf("学生信息为:");
        print_info(l, pos);
        break;

    case 3:
        printf("请输入修改后的成绩:");
        scanf("%d", &(l->r[pos].sort));
        printf("修改成功!\n");
        printf("学生信息为:");
        print_info(l, pos);
        break;

    default:
        printf("输入错误!\n");
        break;
    }
    return 0;
}
2.8Binsrch_函数

这段代码定义了一个名为searchByName()的函数,用于根据学生姓名查找学生信息。用户需要输入要查找的学生姓名,程序会遍历学生信息列表,找到匹配的姓名并输出对应的学号和成绩。如果找不到匹配的姓名,会提示未找到该学生。

int Binsrch_(Student l)查找(按姓名查找)
{
    int i, flag,w=0,h=0;//flag作为查找的判断标志
    char name[20];

    printf("请输入查找的姓名:");
    scanf("%s", name);
    fflush(stdin);
    for (i = 1; i <= l.count; i++)
    {
        h++;
        if (strcmp(l.r[i].name, name) == 0)
        {
            printf("查找成功!\n");
            printf("学生信息为:");
            print_info(&l, i);
            flag = 0;
            w = 1;
            break;
        }
    }
    return w;
}
2.9Search函数

这段代码定义了一个名为search()的函数,用于根据学生学号或姓名查找学生信息。用户需输入要查找的学生学号或姓名,程序会遍历学生信息列表,找到匹配的学生并输出其学号、姓名和成绩。如果找不到匹配的学生信息,会提示未找到匹配的学生。

int Search(Student l)//查找学生信息
{
    printf("-----------------------------\n");
    int i,n,number,flag=1;//flag作为是否继续查找的标志
    int pos,w;
    printf("请选择查找学生的方式:\n\t1.学号查找\n\t2.姓名查找\n");
    printf("请输入你的选择:");
    scanf("%d", &n);
    fflush(stdin);
    while (flag)
    {
        switch (n)
        {
        case 1:
            pos=Binsrch(l);
            if (pos == 0)
            {
                printf("查找失败!请确定是否再次查找!\n");
                printf("请输入你的选择:1.是 2.否");
                scanf("%d",&w);
                fflush(stdin);
                if (w == 1)
                    flag = 1;
                else
                    flag = 0;
                
            }
            else
            {
                printf("查找成功!\n");
                printf("学生信息为:");
                print_info(&l,pos);
                flag = 0;
            }
            break;
        case 2: {
            pos = Binsrch_(l);
            if (pos == 1)
                flag = 0;
            else
            {
                printf("查找失败!请确定是否再次查找!\n");
                printf("请输入你的选择:1.是 2.否");
                scanf("%d", &w);
                fflush(stdin);
                if (w == 1)
                    flag = 1;
                else
                    flag = 0;
            }
        }break;
        default:break;
        }
    }
    return 0;
}
2.10Ins_change函数

这段代码定义了一个名为insert()的函数,用于在指定位置插入学生信息。用户需要输入要插入的位置,程序会将该位置之后的学生信息依次向后移动,然后用户可以输入新的学生学号、姓名和成绩来插入到指定位置。插入成功后会给出相应提示。如果输入的位置无效,会提示位置无效。

int Ins_change(Student* l)//指定插入学生信息位置
{
    int n, i,flag=1,flag_=1;
    Student New;
    printf("-----------------------------\n");
   
       printf("请输入插入学生信息的位置:");
       scanf("%d", &n); 
       if (n > l->count || n < 1)
       {
           printf("输入失败!\n");
           flag = 1;
       }
       else
       {
           printf("请输入你想加入学生的信息:");
           while (flag_)
           {
               printf("\n\t学生学号:");
               scanf("%d", &New.r[1].number);
               fflush(stdin);

               for (int i = 1; i <= l->count; ++i)
               {
                   if (l->r[i].number == New.r[1].number)
                   {
                       printf("学号已存在,请重新输入!\n");
                       flag_ = 1;
                       break;
                   }
                   if (i == l->count)
                       flag_ = 0;
               }
           }
           printf("\t学生姓名:");
           scanf("%s", New.r[1].name);
           fflush(stdin);
           printf("\t学生成绩:");
           scanf("%d", &New.r[1].sort);
           fflush(stdin);

           for (int i = l->count; i >= n; --i)
           {
               l->r[i + 1] = l->r[i];
           }

           l->r[n].number = New.r[1].number;
           strcpy(l->r[n].name, New.r[1].name);
           l->r[n].sort = New.r[1].sort;
           l->count++;
           printf("插入成功!\n");
       }
        printf("-----------------------------\n");
        return 0;
 }

3、整个程序代码

#define  _CRT_SECURE_NO_WARNINGS

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

#define Maxsize 100
typedef struct {
    int number;//学号
	char name[20];//姓名
    int sort;//成绩
}StudentType;
typedef struct {
    StudentType r[Maxsize];//学生信息数组
    int count;//记录学生人数
}Student;

void DisplayMenu()//展示界面
{
    printf("========= 学生管理系统 =========\n");
    printf("1. 添加学生信息\n");
    printf("2. 删除学生信息\n");
    printf("3. 修改学生信息\n");
    printf("4. 查找学生信息\n");
    printf("5. 统计学生个数\n");
    printf("6. 指定学生插入位置\n");
    printf("7. 显示所有学生信息\n");
    printf("8. 对学生进行排序(姓名)\n");
    printf("0. 退出程序\n");
    printf("=================================\n\n");

}

void Ins(Student* l)//学生信息录入
{
    int i, n;
    printf("*********************************\n");
    printf("请输入录入学生信息个数:");
    scanf_s("%d", &n);
    l->count = n;
    for (i = 1; i <= n; i++)
    {
        printf("---------------------------------\n");
        printf("第%d个学生信息:", i);
        printf("学生学号:");
        scanf("%d", &l->r[i].number);
        fflush(stdin);
        printf("\t      学生姓名:");
        scanf("%s", l->r[i].name );
        fflush(stdin);
        printf("\t      学生成绩:");
        scanf("%d", &l->r[i].sort);
        fflush(stdin);
    }
    printf("---------------------------------\n");
    printf("录入学生信息结束!\n");
    printf("*********************************\n");
}

void remove(Student* l) //删除学生信息
{
    int n, i, flag = 1; 
    while (flag)
    {
        printf("请输入删除学生的所在位置:");
        scanf("%d", &n);
        if (n > l->count || n <= 0) 
        {
            printf("输入错误,请再次输入!\n");
        }
        else 
        {
            for (i = n; i < l->count; i++) 
            {
                strcpy(l->r[i].name, l->r[i + 1].name);
                l->r[i].number  = l->r[i + 1].number ;
                l->r[i].sort  = l->r[i + 1].sort ;
            }
            l->count--; 
            printf("删除成功!\n");
            flag = 0; 
        }
    }
}

void print_info(Student* l, int i)//输出学生信息
{
    printf("学号:%d\n", l->r[i].number);
    printf("\t   姓名:%s\n", l->r[i].name);
    printf("\t   成绩:%d\n", l->r[i].sort);
}


int change(Student* l)//修改学生信息
{
    int n, pos, x,i,w, flag;
    char name[20];
    printf("请选择查找该学生的方式:1.学号 2.姓名\n");
    printf("请输入你的选择:");
    scanf("%d", &n);
    fflush(stdin);
    switch (n)
    {
    case 1:
        printf("请输入你要查找的学号:");
        scanf("%d", &w);
        for (i = 1; i <= l->count; i++)
        {
            if (l->r[i].number == w)
                break;
        }
        pos = i;
        break;

    case 2:
        printf("请输入你要查找的姓名:");
        scanf("%s", name);
        for (i = 1; i <= l->count; i++)
        {
            if (strcmp(l->r[i].name , name)==0)
                break;
        }
        pos = i;
        break;

    default:
        printf("输入错误!\n");
        return 0;
    }
    printf("查找成功!\n");
    printf("学生信息为:");
    print_info(l, pos);
    printf("请选择要修改的信息:1.学号 2.姓名 3.成绩\n");
    scanf("%d", &x);
    fflush(stdin);
    switch (x)
    {
    case 1:
        printf("请输入修改后的学号:");
        scanf("%d", &l->r[pos].number);
        for (int i = 1; i < pos; i++)
        {
            if (l->r[pos].number == l->r[i].number)
                flag = 0;
        }
        for (int i = pos + 1; i <= l->count; i++)
        {
            if (l->r[pos].number == l->r[i].number)
                flag = 0;
        }
        if (flag == 0)
            printf("更改失败,此学号存在!\n");
        else
        {
            printf("修改成功!\n");
            printf("学生信息为:");
            print_info(l, pos);
        }

        break;
    case 2:
        printf("请输入修改后的姓名:");
        scanf("%s", l->r[pos].name);
        printf("修改成功!\n");
        printf("学生信息为:");
        print_info(l, pos);
        break;

    case 3:
        printf("请输入修改后的成绩:");
        scanf("%d", &(l->r[pos].sort));
        printf("修改成功!\n");
        printf("学生信息为:");
        print_info(l, pos);
        break;

    default:
        printf("输入错误!\n");
        break;
    }
    return 0;
}
int Binsrch(Student l)//折半查找(按学号查找)
{
    int number;
    printf("请输入查找的学号:");
    scanf("%d", &number);
    fflush(stdin);
    int low = 1, hight = l.count , mid;
    while (low <= hight) 
    {
        mid = (low + hight) / 2;
        if (l.r[mid].number  == number) 
            return (mid); 
        else if (l.r[mid].number  < number) 
            low = mid + 1; 
        else
            hight = mid - 1;
    }
    return 0;
}

int Binsrch_(Student l)查找(按姓名查找)
{
    int i, flag,w=0,h=0;//flag作为查找的判断标志
    char name[20];

    printf("请输入查找的姓名:");
    scanf("%s", name);
    fflush(stdin);
    for (i = 1; i <= l.count; i++)
    {
        h++;
        if (strcmp(l.r[i].name, name) == 0)
        {
            printf("查找成功!\n");
            printf("学生信息为:");
            print_info(&l, i);
            flag = 0;
            w = 1;
            break;
        }
    }
    return w;
}

int Search(Student l)//查找学生信息
{
    printf("-----------------------------\n");
    int i,n,number,flag=1;//flag作为是否继续查找的标志
    int pos,w;
    printf("请选择查找学生的方式:\n\t1.学号查找\n\t2.姓名查找\n");
    printf("请输入你的选择:");
    scanf("%d", &n);
    fflush(stdin);
    while (flag)
    {
        switch (n)
        {
        case 1:
            pos=Binsrch(l);
            if (pos == 0)
            {
                printf("查找失败!请确定是否再次查找!\n");
                printf("请输入你的选择:1.是 2.否");
                scanf("%d",&w);
                fflush(stdin);
                if (w == 1)
                    flag = 1;
                else
                    flag = 0;
                
            }
            else
            {
                printf("查找成功!\n");
                printf("学生信息为:");
                print_info(&l,pos);
                flag = 0;
            }
            break;
        case 2: {
            pos = Binsrch_(l);
            if (pos == 1)
                flag = 0;
            else
            {
                printf("查找失败!请确定是否再次查找!\n");
                printf("请输入你的选择:1.是 2.否");
                scanf("%d", &w);
                fflush(stdin);
                if (w == 1)
                    flag = 1;
                else
                    flag = 0;
            }
        }break;
        default:break;
        }
    }
    return 0;
}

int Ins_change(Student* l)//指定插入学生信息位置
{
    int n, i,flag=1,flag_=1;
    Student New;
    printf("-----------------------------\n");
   
       printf("请输入插入学生信息的位置:");
       scanf("%d", &n); 
       if (n > l->count || n < 1)
       {
           printf("输入失败!\n");
           flag = 1;
       }
       else
       {
           printf("请输入你想加入学生的信息:");
           while (flag_)
           {
               printf("\n\t学生学号:");
               scanf("%d", &New.r[1].number);
               fflush(stdin);

               for (int i = 1; i <= l->count; ++i)
               {
                   if (l->r[i].number == New.r[1].number)
                   {
                       printf("学号已存在,请重新输入!\n");
                       flag_ = 1;
                       break;
                   }
                   if (i == l->count)
                       flag_ = 0;
               }
           }
           printf("\t学生姓名:");
           scanf("%s", New.r[1].name);
           fflush(stdin);
           printf("\t学生成绩:");
           scanf("%d", &New.r[1].sort);
           fflush(stdin);

           for (int i = l->count; i >= n; --i)
           {
               l->r[i + 1] = l->r[i];
           }

           l->r[n].number = New.r[1].number;
           strcpy(l->r[n].name, New.r[1].name);
           l->r[n].sort = New.r[1].sort;
           l->count++;
           printf("插入成功!\n");
       }
        printf("-----------------------------\n");
        return 0;
 }


void count(Student l)//统计学生信息
{
    printf("\n\t统计学生信息\n");
    printf("************************************\n");
    printf("该系统一共收录了%d个学生!\n", l.count);
    int i;
    float average,sum = 0.00;
    for (i = 1; i < l.count; i++)
    {
        sum += l.r[i].sort;
    }
    average = sum / l.count;
    printf("录入的学生平均成绩为:%.2f", average);
    printf("************************************\n");

}

void Show(Student l)//显示全部学生信息
{
    printf("\n\t显示全部学生信息\n");
    printf("************************************\n");
    printf("该系统一共收录了%d个学生!\n", l.count);
    int i;
    printf("学号\t姓名\t成绩\n");
    for (i = 1; i <= l.count; i++)
    {
        printf("%d\t%s\t%d\n", l.r[i].number, l.r[i].name, l.r[i].sort);
    }
    printf("\n************************************\n");
}

int End()//结束学生系统
{
    printf("************************************\n");
    printf("退出学生系统成功!");
    return 0;
}

void sort(Student* l)//按学生姓名进行排序
{
    int i, j;
    for (i = 1; i <= l->count; i++)
    {
        for (j = 1; j <= l->count - i; j++)
        {
            if (l->r[j].sort > l->r[j + 1].sort)
            {
                // 交换学生信息
                int temp_number = l->r[j].number;
                int temp_sort = l->r[j].sort;
                char temp_name[20];
                strcpy(temp_name, l->r[j].name);
                strcpy(l->r[j].name, l->r[j + 1].name);
                l->r[j].number = l->r[j + 1].number;
                l->r[j].sort = l->r[j + 1].sort;
                strcpy(l->r[j + 1].name, temp_name);
                l->r[j + 1].number = temp_number;
                l->r[j + 1].sort = temp_sort;
            }
        }
    }
    printf("排序完成!\n");

    // 输出排序后的学生信息
    printf("排序后的学生信息:\n");
    for (i = 1; i <= l->count; i++)
    {
        printf("学号:%d\n", l->r[i].number);
        printf("\t   姓名:%s\n", l->r[i].name);
        printf("\t   成绩:%d\n", l->r[i].sort);
    }
}




void choice()
{
    int n,flag=1;
    Student l;
    while (flag)
    {
        printf("请输入你选择的功能:");
        scanf("%d", &n);
        switch (n)
        {
        case 1:Ins(&l); break;
        case 2:remove(&l); break;
        case 3:change(&l); break;
        case 4:Search(l); break;
        case 5:count(l); break;
        case 6:Ins_change(&l); break;
        case 7:Show(l); break;
        case 8:sort(&l); break;
        case 0:End();  flag = 0; break;
        default:break;
        }
    }
}

int main()
{
    DisplayMenu();
    choice();
    return 0;
}

4、运行截图展示(部分)

最后

完成这个系统的过程确实需要花费大量时间和精力,涉及到大量的代码编写和逻辑设计。感谢您的辛勤付出和分享。如果您觉得这个系统对您有帮助,欢迎点赞、收藏,留言反馈。如果您有任何问题或需要进一步帮助,也欢迎私信我,我会尽力回复您的。感谢您的支持和理解!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值