C语言实现学生管理系统V2.1(结构体+文件读写)

实现功能

  • 添加学生
  • 删除学生
  • 修改学生
  • 查询学生
  • 显示所有学生信息
  • 读取学生信息
  • 写入学生信息
  • 菜单

简述

        该系统主要使用了结构体、数组、循环、条件语句,包含头文件string.h、windows.h,使用结构体做学生数据的存储结构,该结构体存放了学生的基本信息,包括学号、姓名、性别、年龄、院系、专业等相关信息,系统还实现了对于学生的CRUD操作。

运行截图

 代码 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define N 100       //最大学生数量为50


typedef struct Student{
    int id;         //编号
    char name[20];  //姓名
    char sex[20];   //性别
    int age;        //年龄
    char depart[40];   //院系
    char major[40];     //专业
}Student;

Student student[N];
int count = 0;          //当前学生数量


/* 以下是函数声明 */
void addStu();      //添加学生信息
void delStu();      //删除学生信息
void modStu();      //修改学生信息
int seaStuById();   //查询学生信息 - 根据ID
void showStu();     //显示学生信息
void print(int id); //显示一条学生信息
void menu();        //菜单
void readStu();     //读取学生信息
void saveStu();     //保存学生信息


/*
* 学生函数的实现
* 以下是函数实现
*/

//添加学生信息
void addStu(){
    printf("请输入学生编号(1 - N):");
    scanf("%d",&student[count].id);
    printf("请输入学生姓名:");
    scanf("%s",student[count].name);
    printf("请输入学生性别(男/女):");
    scanf("%s",student[count].sex);
    printf("请输入学生年龄:");
    scanf("%d",&student[count].age);
    printf("请输入学生院系:");
    scanf("%s",student[count].depart);
    printf("请输入学生专业:");
    scanf("%s",student[count].major);
    count++;
}

//删除学生信息
void delStu(){
    int id,i;
    printf("请输入学生编号:");
    scanf("%d",&id);
    int index;
    index = seaStuById(id);
    if(index == -1){
        printf("未查找到!\n");
        return;
    }

    //进行覆盖 - 删除指定条目
    for(i = index;i < N;i++){
        student[i].id = student[i+1].id;
        strcpy(student[i].name,student[i+1].name);
        strcpy(student[i].sex,student[i+1].sex);
        student[i].age = student[i+1].age;
        strcpy(student[i].depart,student[i+1].depart);
        strcpy(student[i].major,student[i+1].major);
    }
    count--;
    printf("删除成功!\n");
}

//修改学生信息
void modStu(){
    int id;
    printf("请输入学生编号:");
    scanf("%d",&id);
    int index;
    index = seaStuById(id);
    if(index == -1){
        printf("未查找到!\n");
        return;
    }

    printf("请输入学生编号(1 - N):");
    scanf("%d",&student[index].id);
    printf("请输入学生姓名:");
    scanf("%s",student[index].name);
    printf("请输入学生性别(男/女):");
    scanf("%s",student[index].sex);
    printf("请输入学生年龄:");
    scanf("%d",&student[index].age);
    printf("请输入学生院系:");
    scanf("%s",student[index].depart);
    printf("请输入学生专业:");
    scanf("%s",student[index].major);
    printf("修改成功!\n");
}

//查询学生信息 - 根据ID
int seaStuById(int id){
    int i;
    for(i = 0;i < count;i++){
        if(student[i].id == id){
            return i;
        }
    }
    return -1;      //查询失败 - 返回-1的意义在于可以根据返回值的不同做成功与否的验证
}

//显示学生信息
void showStu(){
    int i;
    printf("---------------------------------------------\n");
    printf("学生编号   姓名   性别  年龄  院系  专业\n");
    for(i = 0;i < count;i++){
        printf("%d   %s   %s   %d   %s   %s\n",student[i].id,student[i].name,student[i].sex,student[i].age,student[i].depart,student[i].major);
    }
    printf("---------------------------------------------\n");
}

//显示一条学生信息
void print(int id){
    int index;
    index = seaStuById(id);
    if(index == -1){
        printf("未查找到!\n");
        return;
    }

    printf("---------------------------------------------\n");
    printf("学生编号   姓名   性别  年龄  院系  专业\n");
        printf("%d   %s   %s   %d   %s   %s\n",student[index].id,student[index].name,student[index].sex,student[index].age,student[index].depart,student[index].major);
    printf("---------------------------------------------\n");
}

//菜单
void menu(){
    int choice,id;
    while(1){
        printf("---------------------------------------------\n");
        printf("0、退出\n");
        printf("1、添加学生信息\n");
        printf("2、删除学生信息\n");
        printf("3、修改学生信息\n");
        printf("4、查询学生信息\n");
        printf("5、显示学生信息\n");
        printf("6、读取学生信息\n");
        printf("7、写入学生信息\n");
        printf("---------------------------------------------\n");
        printf("请输入您的选择:");
        scanf("%d",&choice);
        switch(choice){
        case 0:
            exit(0);
            break;
        case 1:
            addStu();
            break;
        case 2:
            delStu();
            break;
        case 3:
            modStu();
            break;
        case 4:
            printf("请输入查找的学生编号:");
            scanf("%d",&id);
            print(id);
            break;
        case 5:
            showStu();
            break;
        case 6:
            readStu();
            break;
        case 7:
            saveStu();
            break;
        default:
            printf("输入有误!\n");
            break;
        }
        system("pause");
        system("cls");
    }
}

//读取学生信息
void readStu(){
    int i = 0;
    FILE * fp;
    fp = fopen("students.txt","a+");
    if(fp == NULL){
        printf("文件打开失败!\n");
        exit(0);
    }

    fscanf(fp,"%d",&count);
    for(i = 0;i < count;i++){
        fscanf(fp,"%d %s %s %d %s %s",&student[i].id,student[i].name,student[i].sex,&student[i].age,student[i].depart,student[i].major);
    }
    fclose(fp);
    printf("读取成功!\n");
}

//保存学生信息
void saveStu(){
    int i = 0;
    FILE * fp;
    fp = fopen("students.txt","w");
    if(fp == NULL){
        printf("文件打开失败!\n");
        exit(0);
    }

    fprintf(fp,"%d\n",count);
    for(i = 0;i < count;i++){
        fprintf(fp,"%d %s %s %d %s %s\n",student[i].id,student[i].name,student[i].sex,student[i].age,student[i].depart,student[i].major);
    }
    fclose(fp);
    printf("写入成功!\n");
}

int main()
{
    menu();
    return 0;
}

 说明

  该版本的代码主体是直接复用了V2.0版本,主要包括CRUD操作、显示数据等。

  主要添加了如下代码,也即文件读写部分的代码:

//读取学生信息
void readStu(){
    int i = 0;
    FILE * fp;      //定义FILE指针
    fp = fopen("students.txt","a+");        //以读写方式打开文件,如果没有则创建同名文件
    if(fp == NULL){
        printf("文件打开失败!\n");
        exit(0);
    }

    fscanf(fp,"%d",&count);     //从文件中读取数据保存到 count变量
    for(i = 0;i < count;i++){
        //从文件中读取数据保存到 结构体中
        fscanf(fp,"%d %s %s %d %s %s",&student[i].id,student[i].name,student[i].sex,&student[i].age,student[i].depart,student[i].major);
    }
    fclose(fp);         //关闭文件指针
    printf("读取成功!\n");
}

//保存学生信息
void saveStu(){
    int i = 0;
    FILE * fp;
    fp = fopen("students.txt","w");     //以只写方式打开文件
    if(fp == NULL){
        printf("文件打开失败!\n");
        exit(0);
    }

    fprintf(fp,"%d\n",count);           //读取count变量的值存储到文件的首行
    for(i = 0;i < count;i++){
        //保存已有的结构体对象保存到文件中
        fprintf(fp,"%d %s %s %d %s %s\n",student[i].id,student[i].name,student[i].sex,student[i].age,student[i].depart,student[i].major);
    }
    fclose(fp);
    printf("写入成功!\n");
}

总结

        该版本在V2.0基础上开发添加了文件读写的功能,也即现在系统支持保存和读取系统操作的文件,大致上满足了系统的功能需求。但是控制台的操作方式明显不符合当下软件使用的要求,因此更加美化的UI成为了必需,后续我们可以使用一些支持C语言的图形库对系统界面进行一定的优化。

   

  • 5
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言学生成绩管理系统设计中,使用结构体数组可以有效地存储和管理学生的信息和成绩。结构体是一种自定义的数据类型,它可以将不同类型的数据组合在一起,以方便地表示一个学生的信息。 通过使用结构体数组,我们可以定义一个包含多个学生结构体的数组,每个学生结构体可以包含学生的学号、姓名、年龄、性别等信息,还可以包括每个学生的成绩。这样,我们可以通过索引值来访问和操作每个学生的信息,方便快捷。 另外,用户权限管理是一个重要的功能,可以确保只有经过授权的用户才能使用系统的某些功能。我们可以通过为每个用户定义不同的权限等级来实现用户权限管理。比如,管理员可以有最高权限,可以对所有学生的成绩进行增加、修改和删除操作,而普通用户只能查询学生成绩。 在代码设计过程中,我们可以定义一个结构体来表示用户的信息,包括用户名和密码等。可以通过输入用户名和密码来验证用户身份,如果验证成功则可以根据用户权限级别决定是否给予操作权限。 综上所述,使用结构体数组和用户权限管理是设计C语言学生成绩管理系统的两个重要方面。这样可以方便地存储和管理学生成绩信息,并通过用户权限管理确保只有经过授权的用户能够使用系统的相应功能。 ### 回答2: C语言学生成绩管理系统可以通过使用结构体数组和用户权限管理来设计。 结构体数组可以用来存储学生的信息,每个结构体包含学生的姓名、学号、年级、科目和成绩等信息。通过使用结构体数组,可以方便地对学生信息进行存储、查找、修改和删除等操作。 用户权限管理可以用来控制系统的访问权限。可以定义几种用户角色,如管理员、教师和学生。不同的用户角色具备不同的权限,管理员可以对学生成绩进行管理,教师可以录入和修改学生成绩,学生只能查看自己的成绩。 在设计过程中,可以设置一个登录界面,用户输入用户名和密码进行登录,系统根据用户角色来判断用户的权限。管理员登录后可以对学生成绩进行增删改查操作,教师登录后可以录入和修改学生成绩,学生登录后只能查看自己的成绩。 在实现学生成绩管理功能时,可以使用结构体数组来存储学生信息,可以用循环来实现结构体数组的遍历和操作。可以通过输入学号或者姓名来查找学生信息,找到学生后可以对其成绩进行修改。可以使用条件语句来判断用户的权限,根据用户的选择来执行相应的操作。 综上所述,通过使用结构体数组和用户权限管理,可以设计一个完善的C语言学生成绩管理系统。系统具备存储学生信息的功能,可以按照权限对学生成绩进行管理,提供了方便、快捷的操作方式,实现了学生成绩的录入、修改、查询和删除等功能。 ### 回答3: C语言学生成绩管理系统设计使用结构体数组可以有效地存储和管理学生的成绩信息。结构体数组可以将每个学生的信息作为一个结构体对象存储在数组中,每个结构体对象包括学生的姓名、学号、各科成绩等信息。 通过结构体数组,我们可以方便地对学生成绩进行查询、修改、排序等操作。例如,可以通过学号或姓名来查找学生的成绩信息,并显示在屏幕上。同时,也可以对学生的成绩进行修改,如增加、删除、修改学生的考试成绩。 另外,结构体数组还可以用来实现用户权限管理。可以定义一个用户结构体对象,包括用户名、密码和权限等信息。通过结构体数组,可以管理多个用户的权限,区分不同用户的操作权限。在系统中,可以设置不同的权限级别,如管理员、教师、学生等。管理员具有最高权限,可以进行任何操作,而教师和学生可能受限于某些操作。 通过用户权限管理,可以控制不同用户对成绩管理系统的访问和操作权限,确保系统的安全性和数据的完整性。只有经过身份验证并具有相应权限的用户才能进行具体操作,防止了未授权的访问和误操作。 总之,C语言学生成绩管理系统设计使用结构体数组和用户权限管理可以实现学生成绩信息的存储、管理和查询,同时也能对用户进行权限管理,保证系统的安全性和数据的完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值