Bootstrap

【C语言-学生管理系统】

前言

C语言,学生管理系统是比较基础的一个项目,涉及到了结构体、函数、数组、指针、文件读写等相关知识,可以通过完成一个学生管理系统来对我们所学的知识进行回顾,总结,并且也可以学习一些课外的知识,丰富我们自己。

题目要求

系统需要实现以下功能:
登录系统(通过输入用户名及密码判断是否可以登录)
录入学生信息
删除学生信息(通过姓名来删除学生信息)
修改学生成绩
查询学生成绩
查询所有学生的信息
查询所有学生成绩
学生成绩排序(冒泡排序)
查询单个学生
导入学生信息(通过文件导入学生信息)
保存学生信息(将学生信息保存至文件)
根据学号排序
查看班级平均分
退出系统(通过代码实现,不是Ctrl+C)
系统界面如下:
在这里插入图片描述

功能实现

定义结构体

typedef struct Student
{
    char num[20];
    char name[20];
    char sex;
    int age;
    int score;
} Student_t;
typedef struct class
{
    Student_t stu_arr[50]; // 这个班级最多有50个学生
    unsigned int index;    // 当前班级学生的个数
} class_t;                 // 班级的类

主函数

通过判断输入的账号密码来实现系统的的登录,通过switch语句来控制实现不同的功能。通过while循环以及goto语句来跳转退出系统。

int main(int argc, char const *argv[])
{
    int id = 0;
    int code = 0;
    int chose = 0;
    class_t *class = (class_t *)malloc(sizeof(class_t));
    if (class == NULL)
    {
        printf("malloc memory failed!\n");
        return -1;
    }
    class->index = 0;
    while (1)
    {
        printf("*********学生管理系统*********\n");
        printf("请输入登录账号->\n");
        scanf("%d", &id);
        printf("请输入登录密码->\n");
        scanf("%d", &code);
        if (id == 1001 && code == 1001)
        {
            printf("|******登录成功******|\n");
            while (1)
            {
                printf("请选择所需要的功能(输入0进入功能菜单):\n");
                scanf("%d", &chose);
                switch (chose)
                {
                case 0:
                    show();
                    break;
                case 1:
                    student_interp(class);
                    break;
                case 2:
                    student_delete(class);
                    break;
                case 3:
                    student_changed(class);
                    break;
                case 4:
                    student_inquire(class);
                    break;
                case 5:
                    student_print(class);
                    break;
                case 6:
                    student_score(class);
                    break;
                case 7:
                    student_sort(class);
                    student_score(class);
                    break;
                case 8:
                    student_one(class);
                    break;
                case 9:
                    readStu(class);
                    student_print(class);
                    break;
                case 10:
                    saveStu(class);
                    break;
                case 11:
                    student_sort_num(class);
                    student_print(class);
                    break;
                case 12:
                    printf("班级平均分为:%.2f\n",student_score_avg(class));
                    break;
                case 13:
                    goto END;
                default:
                    break;
                }
            }
        }
        else
        {
            printf("账号或密码错误\n");
        }
    }
    END :
    return 0;
}

功能函数

学生信息录入

录入学生信息,如果出现相同学号的录入,则录入失败;相关代码如下:

int student_interp(class_t *class)
{
    int i;
    Student_t stu;
    printf("请输入学生的 学号、姓名、性别、年龄、成绩:\n");
    BEGIN:
    scanf("%s %s %c %d %d", stu.num, stu.name, &stu.sex, &stu.age, &stu.score);
    if(stu.sex!='M'&&stu.sex!='W')
    {
        printf("输入的性别有误,请重新输入:\n");
        goto BEGIN;
    }
    if(stu.score>100)
    {
        printf("输入成绩有误,请重新输入:\n");
        goto BEGIN;
    }
    for (i = 0; i < class->index; i++)
    {
        if (strcmp(class->stu_arr[i].num, stu.num) == 0)
        {
            printf("该学生已经存在,请重新输入:\n");
            goto BEGIN;
        }
    }
    class->stu_arr[class->index] = stu;
    class->index++;
    printf("插入成功!\n");
    return 0;
}

删除学生信息

通过输入要删除学生的姓名来删除相应的学生,先判断有无学生信息,再删除。代码如下:

int student_delete(class_t *class)
{
    int i = 0;
    int j = 0;
    char name[20];
    if (class->index == 0)
    {
        printf("还没有学生,请输入\n");
        return -1;
    }
    printf("请输入要删除学生的姓名:");
    scanf("%s", name);
    for (i = 0; i < class->index; i++)
    {
        if (strcmp(name, class->stu_arr[i].name) == 0)
        {
            // print_info(&class->stu_arr[i]);
            for (j = i; j < class->index - 1; j++)
            {
                class->stu_arr[j] = class->stu_arr[j + 1];
            }
            class->index--;
            printf("删除成功!!!\n");
            break;
        }
        if (i == class->index)
        {
            printf("班级没有这个学员!\n");
            return -1;
        }
    }

    return 0;
}

修改学生的成绩

通过输入学生的姓名,来修改此学生的成绩,代码如下:

int student_changed(class_t *class)
{
    char name[20];
    int score = 0;
    int i = 0;
    if(class->index == 0){
        printf("还没有学生,请输入\n");
        return -1;
    }
    printf("请输入要修改学生的姓名:");
    scanf("%s",name);
    for(i = 0; i < class->index; i++){
        if(strcmp(name,class->stu_arr[i].name) == 0){
            printf("请输入要修改的成绩:");
            scanf("%d",&score); 
            class->stu_arr[i].score = score;            
            printf("修改成功\n");
            break;     
        }
    }
    if(i == class->index){
        printf("没有该学员!\n");
    }
    return 0;
}

查询学生成绩

通过姓名来查询学生的成绩;代码如下:

int student_inquire(class_t *class)
{
    char name[20];
    int i;
    if(class->index==0)
    {
        printf("还没有学生,请输入:\n");
        return -1;
    }
    printf("请输入要查询的学生:");
    scanf("%s",name);
    for(i = 0; i < class->index; i++){
        if(strcmp(name,class->stu_arr[i].name) == 0){
            printf("姓名:%-10s 成绩:%-5d\n",name,class->stu_arr[i].score);
            break;     
        }
    }
    if(i==class->index){
        printf("没有该学员!");
    }
    return 0;
}

查询所有学生的信息

遍历整个数组,把学生信息遍历出来;代码如下:

int student_print(class_t *class)
{
    int i;
    if(class->index == 0){
        printf("还没有学生,请输入\n");
        return -1;
    }
    for (i = 0; i < class->index; i++)
    {

        printf("所有学生信息:学号:%-10s 姓名:%-10s 性别:%-5c 年龄:%-5d 成绩:%-5d\n", class->stu_arr[i].num, class->stu_arr[i].name, class->stu_arr[i].sex, class->stu_arr[i].age, class->stu_arr[i].score);
    }
    return 0;
}

查询所有学生成绩

代码如下:

int student_score(class_t *class)
{
    if(class->index == 0){
        printf("还没有学生,请输入\n");
        return -1;
    }
    int i;
    for (i = 0; i < class->index; i++)
    {

        printf("姓名:%-10s 成绩:%-5d\n", class->stu_arr[i].name, class->stu_arr[i].score);
    }
    return 0;
}

根据成绩进行排序

使用冒泡排序,对学生的成绩进行排序,由高到低输出,这里我犯了一个低级的错误,就是先定义了一个int型的变量temp交换,最后发现只交换了成绩,学生的其他信息没有交换,最后发现应该定义一个学生变量temp;代码如下:

int student_sort(class_t *class)
{
    int i,j;
    Student_t temp;
     if(class->index==0)
    {
        printf("还没有学生,请输入:\n");
        return -1;
    }
    for(i=0;i<class->index-1;i++)
    {
        for(j=0;j<class->index-1-i;j++)
        {
            if(class->stu_arr[j].score<class->stu_arr[j+1].score)
            {
                temp=class->stu_arr[j];
                class->stu_arr[j]=class->stu_arr[j+1];
                class->stu_arr[j+1]=temp;
            }
           
        }
    }
    printf("成绩由高到低排序为:\n");
    return 0;
}

按学号排序

同上,按学号由低到高排序,注意的是这里学号是字符串,用strcmp函数比较;代码如下:

int student_sort_num(class_t *class)
{
    int i,j;
    Student_t temp;
     if(class->index==0)
    {
        printf("还没有学生,请输入:\n");
        return -1;
    }
    for(i=0;i<class->index-1;i++)
    {
        for(j=0;j<class->index-1-i;j++)
        {
            if(strcmp(class->stu_arr[j].num,class->stu_arr[j+1].num)>0)
            {
                temp=class->stu_arr[j];
                class->stu_arr[j]=class->stu_arr[j+1];
                class->stu_arr[j+1]=temp;
            }
           
        }
    }
    printf("学号由低到高排序:\n");
    return 0;
}

根据学号查询学生信息

输入学号,查看学生的基本信息;代码如下:

int student_one(class_t *class)
{
    char num[20];
    int i;
    if(class->index==0)
    {
        printf("还没有学生,请输入:\n");
        return -1;
    }
    printf("请输入要查询的学生学号:\n");
    scanf("%s",num);
    for(i = 0; i < class->index; i++){
        if(strcmp(num,class->stu_arr[i].num) == 0){
            printf("学号:%-10s 姓名:%-10s 性别:%-5c 年龄:%-5d 成绩:%-5d\n", class->stu_arr[i].num, class->stu_arr[i].name, class->stu_arr[i].sex, class->stu_arr[i].age, class->stu_arr[i].score);
            break;     
        }
    }
    if(i==class->index){
        printf("没有该学员!\n");
    }
    return 0;
}

统计班级的平均成绩

计算班级所有学生的成绩,算出平均成绩;代码如下:

float student_score_avg(class_t *class)
{
    int i;
    float avg=0,sum=0;
    for(i=0;i<class->index;i++)
    {
        sum=sum+class->stu_arr[i].score;
    }
    avg=sum/class->index;
    return avg;
}

读取学生的信息

实现从文件中导入学生信息,将文件的信息作为输入。代码如下:

void readStu(class_t *class){
    int i = 0;
    FILE * fp;
    fp = fopen("students.txt","a+");
    if(fp == NULL){
        printf("文件打开失败!\n");
        exit(0);
    }
 
    fscanf(fp,"%d",&class->index);
    for(i = 0;i < class->index;i++){
        fscanf(fp,"%s %s %c %d %d",class->stu_arr[i].num,class->stu_arr[i].name,&class->stu_arr[i].sex,&class->stu_arr[i].age,&class->stu_arr[i].score);
    }
    fclose(fp);
    printf("导入学生信息成功!\n");
}

保存文件信息

将系统输入的学生信息写入到文件中;代码如下:

int saveStu(class_t *class){
    int i = 0;
    if(class->index == 0){
        printf("还没有学生,请输入\n");
        return -1;
    }
    FILE * fp;
    fp = fopen("students.txt","w");
    if(fp == NULL){
        printf("文件打开失败!\n");
        exit(0);
    }
 
    fprintf(fp,"%d\n",class->index); 
    for(i = 0;i < class->index;i++){
        fprintf(fp,"%s %s %c %d %d\n",class->stu_arr[i].num,class->stu_arr[i].name,class->stu_arr[i].sex,class->stu_arr[i].age,class->stu_arr[i].score);
    }
    fclose(fp);
    printf("写入成功!\n");
}

完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Student
{
    char num[20];
    char name[20];
    char sex;
    int age;
    int score;
} Student_t;
typedef struct class
{
    Student_t stu_arr[50]; // 这个班级最多有50个学生
    unsigned int index;    // 当前班级学生的个数
} class_t;                 // 班级的类
void show();
int student_one(class_t *class);
int student_interp(class_t *class);
int student_delete(class_t *class);
int student_changed(class_t *class);
int student_inquire(class_t *class);
int student_print(class_t *class);
int student_score(class_t *class);
int student_sort(class_t *class);
int student_sort_num(class_t *class);
float student_score_avg(class_t *class);
void readStu(class_t *class);
int saveStu(class_t *class);
int main(int argc, char const *argv[])
{
    int id = 0;
    int code = 0;
    int chose = 0;
    class_t *class = (class_t *)malloc(sizeof(class_t));
    if (class == NULL)
    {
        printf("malloc memory failed!\n");
        return -1;
    }
    class->index = 0;
    while (1)
    {
        printf("*********学生管理系统*********\n");
        printf("请输入登录账号->\n");
        scanf("%d", &id);
        printf("请输入登录密码->\n");
        scanf("%d", &code);
        if (id == 1001 && code == 1001)
        {
            printf("|******登录成功******|\n");
            while (1)
            {
                printf("请选择所需要的功能(输入0进入功能菜单):\n");
                scanf("%d", &chose);
                switch (chose)
                {
                case 0:
                    show();
                    break;
                case 1:
                    student_interp(class);
                    break;
                case 2:
                    student_delete(class);
                    break;
                case 3:
                    student_changed(class);
                    break;
                case 4:
                    student_inquire(class);
                    break;
                case 5:
                    student_print(class);
                    break;
                case 6:
                    student_score(class);
                    break;
                case 7:
                    student_sort(class);
                    student_score(class);
                    break;
                case 8:
                    student_one(class);
                    break;
                case 9:
                    readStu(class);
                    student_print(class);
                    break;
                case 10:
                    saveStu(class);
                    break;
                case 11:
                    student_sort_num(class);
                    student_print(class);
                    break;
                case 12:
                    printf("班级平均分为:%.2f\n",student_score_avg(class));
                    break;
                case 13:
                    goto END;
                default:
                    break;
                }
            }
        }
        else
        {
            printf("账号或密码错误\n");
        }
    }
    END :
    return 0;
}
//菜单
void show()
{
                printf("=======================学生信息管理系统============================\n");
                printf("-----------------------------功能菜单------------------------------\n");
                printf("\t\t\t1.录入学生信息\n");
                printf("\t\t\t2.删除学生信息\n");
                printf("\t\t\t3.修改学生成绩\n");
                printf("\t\t\t4.查询学生成绩\n");
                printf("\t\t\t5.查询所有学生的信息\n");
                printf("\t\t\t6.查询所有学生成绩\n");
                printf("\t\t\t7.学生成绩排序\n");
                printf("\t\t\t8.查询单个学生\n");
                printf("\t\t\t9.导入学生信息\n");
                printf("\t\t\t10.保存学生信息\n");
                printf("\t\t\t11.根据学号排序\n");
                printf("\t\t\t12.查看班级平均分\n");
                printf("\t\t\t13.退出系统\n");
                printf("------------------------------------------------------------------\n");
                
}
//插入一个学生 (姓名, 性别, 年龄,成绩)
int student_interp(class_t *class)
{
    int i;
    Student_t stu;
    printf("请输入学生的 学号、姓名、性别、年龄、成绩:\n");
    BEGIN:
    scanf("%s %s %c %d %d", stu.num, stu.name, &stu.sex, &stu.age, &stu.score);
    if(stu.sex!='M'&&stu.sex!='W')
    {
        printf("输入的性别有误,请重新输入:\n");
        goto BEGIN;
    }
    if(stu.score>100)
    {
        printf("输入成绩有误,请重新输入:\n");
        goto BEGIN;
    }
    for (i = 0; i < class->index; i++)
    {
        if (strcmp(class->stu_arr[i].num, stu.num) == 0)
        {
            printf("该学生已经存在,请重新输入:\n");
            goto BEGIN;
        }
    }
    class->stu_arr[class->index] = stu;
    class->index++;
    printf("插入成功!\n");
    return 0;
}
//删除一个学生 (根据姓名删除一个学生)
int student_delete(class_t *class)
{
    int i = 0;
    int j = 0;
    char name[20];
    if (class->index == 0)
    {
        printf("还没有学生,请输入\n");
        return -1;
    }
    printf("请输入要删除学生的姓名:");
    scanf("%s", name);
    for (i = 0; i < class->index; i++)
    {
        if (strcmp(name, class->stu_arr[i].name) == 0)
        {
            // print_info(&class->stu_arr[i]);
            for (j = i; j < class->index - 1; j++)
            {
                class->stu_arr[j] = class->stu_arr[j + 1];
            }
            class->index--;
            printf("删除成功!!!\n");
            break;
        }
        if (i == class->index)
        {
            printf("班级没有这个学员!\n");
            return -1;
        }
    }

    return 0;
}
//修改学生成绩 (根据姓名修改成绩)
int student_changed(class_t *class)
{
    char name[20];
    int score = 0;
    int i = 0;
    if(class->index == 0){
        printf("还没有学生,请输入\n");
        return -1;
    }
    printf("请输入要修改学生的姓名:");
    scanf("%s",name);
    for(i = 0; i < class->index; i++){
        if(strcmp(name,class->stu_arr[i].name) == 0){
            printf("请输入要修改的成绩:");
            scanf("%d",&score); 
            class->stu_arr[i].score = score;            
            printf("修改成功\n");
            break;     
        }
    }
    if(i == class->index){
        printf("没有该学员!\n");
    }
    return 0;
}
//查询学生成绩 (根据姓名查询成绩)
int student_inquire(class_t *class)
{
    char name[20];
    int i;
    if(class->index==0)
    {
        printf("还没有学生,请输入:\n");
        return -1;
    }
    printf("请输入要查询的学生:");
    scanf("%s",name);
    for(i = 0; i < class->index; i++){
        if(strcmp(name,class->stu_arr[i].name) == 0){
            printf("姓名:%-10s 成绩:%-5d\n",name,class->stu_arr[i].score);
            break;     
        }
    }
    if(i==class->index){
        printf("没有该学员!");
    }
    return 0;
}
//查询所有学生的信息
int student_print(class_t *class)
{
    int i;
    if(class->index == 0){
        printf("还没有学生,请输入\n");
        return -1;
    }
    for (i = 0; i < class->index; i++)
    {

        printf("所有学生信息:学号:%-10s 姓名:%-10s 性别:%-5c 年龄:%-5d 成绩:%-5d\n", class->stu_arr[i].num, class->stu_arr[i].name, class->stu_arr[i].sex, class->stu_arr[i].age, class->stu_arr[i].score);
    }
    return 0;
}
//查询所有学生成绩
int student_score(class_t *class)
{
    if(class->index == 0){
        printf("还没有学生,请输入\n");
        return -1;
    }
    int i;
    for (i = 0; i < class->index; i++)
    {

        printf("姓名:%-10s 成绩:%-5d\n", class->stu_arr[i].name, class->stu_arr[i].score);
    }
    return 0;
}
//根据成绩进行排序(从高到低, 冒泡排序)
int student_sort(class_t *class)
{
    int i,j;
    Student_t temp;
     if(class->index==0)
    {
        printf("还没有学生,请输入:\n");
        return -1;
    }
    for(i=0;i<class->index-1;i++)
    {
        for(j=0;j<class->index-1-i;j++)
        {
            if(class->stu_arr[j].score<class->stu_arr[j+1].score)
            {
                temp=class->stu_arr[j];
                class->stu_arr[j]=class->stu_arr[j+1];
                class->stu_arr[j+1]=temp;
            }
           
        }
    }
    printf("成绩由高到低排序为:\n");
    return 0;
}
//根据学号查询学生信息
int student_one(class_t *class)
{
    char num[20];
    int i;
    if(class->index==0)
    {
        printf("还没有学生,请输入:\n");
        return -1;
    }
    printf("请输入要查询的学生学号:\n");
    scanf("%s",num);
    for(i = 0; i < class->index; i++){
        if(strcmp(num,class->stu_arr[i].num) == 0){
            printf("学号:%-10s 姓名:%-10s 性别:%-5c 年龄:%-5d 成绩:%-5d\n", class->stu_arr[i].num, class->stu_arr[i].name, class->stu_arr[i].sex, class->stu_arr[i].age, class->stu_arr[i].score);
            break;     
        }
    }
    if(i==class->index){
        printf("没有该学员!\n");
    }
    return 0;
}
//读取学生信息
void readStu(class_t *class){
    int i = 0;
    FILE * fp;
    fp = fopen("students.txt","a+");
    if(fp == NULL){
        printf("文件打开失败!\n");
        exit(0);
    }
 
    fscanf(fp,"%d",&class->index);
    for(i = 0;i < class->index;i++){
        fscanf(fp,"%s %s %c %d %d",class->stu_arr[i].num,class->stu_arr[i].name,&class->stu_arr[i].sex,&class->stu_arr[i].age,&class->stu_arr[i].score);
    }
    fclose(fp);
    printf("导入学生信息成功!\n");
}
//保存学生信息
int saveStu(class_t *class){
    int i = 0;
    if(class->index == 0){
        printf("还没有学生,请输入\n");
        return -1;
    }
    FILE * fp;
    fp = fopen("students.txt","w");
    if(fp == NULL){
        printf("文件打开失败!\n");
        exit(0);
    }
 
    fprintf(fp,"%d\n",class->index); 
    for(i = 0;i < class->index;i++){
        fprintf(fp,"%s %s %c %d %d\n",class->stu_arr[i].num,class->stu_arr[i].name,class->stu_arr[i].sex,class->stu_arr[i].age,class->stu_arr[i].score);
    }
    fclose(fp);
    printf("写入成功!\n");
}
//按学号排序
int student_sort_num(class_t *class)
{
    int i,j;
    Student_t temp;
     if(class->index==0)
    {
        printf("还没有学生,请输入:\n");
        return -1;
    }
    for(i=0;i<class->index-1;i++)
    {
        for(j=0;j<class->index-1-i;j++)
        {
            if(strcmp(class->stu_arr[j].num,class->stu_arr[j+1].num)>0)
            {
                temp=class->stu_arr[j];
                class->stu_arr[j]=class->stu_arr[j+1];
                class->stu_arr[j+1]=temp;
            }
           
        }
    }
    printf("学号由低到高排序:\n");
    return 0;
}
//统计班级平均成绩
float student_score_avg(class_t *class)
{
    int i;
    float avg=0,sum=0;
    for(i=0;i<class->index;i++)
    {
        sum=sum+class->stu_arr[i].score;
    }
    avg=sum/class->index;
    return avg;
}

项目效果演示

这几演示几种功能,其他的大家有兴趣可以试试。
登录
在这里插入图片描述
主界面
在这里插入图片描述
录入学生信息
在这里插入图片描述
修改学生成绩
在这里插入图片描述
查看学生成绩
在这里插入图片描述
导入学生信息
文件内容:
在这里插入图片描述
导入成功后:
在这里插入图片描述
保存学生信息
首先插入一个学生1005;
在这里插入图片描述
保存信息:
在这里插入图片描述
查看文件:
在这里插入图片描述
功能就演示到这里了。。。

;