使用c语言实现学生信息管理系统


一、该系统实现的功能

  1. 录入学生信息;
  2. 将输入的学生信息能够存入一个文件中,并能在这个文件中读取出这些学生信息;
  3. 显示所有学生信息;
  4. 搜索某个学生的信息;
  5. 更改某个学生的信息;
  6. 根据学生成绩对学生进行排序;

二、一些需要我们学习的小点

在我们的代码中还涉及到一些重要的知识点,其中比较大头的是文件操作和c语言中提供的qsort函数的使用,如果不了解这两方面的知识,最好看一下下面两篇文章:

C语言:文件操作
C语言中提供的排序算法 qsort 的使用

三、学生信息管理系统代码

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

char* filename;

typedef struct Student {
    char name[30];
    int age;
    bool male;
    float scores;
} Student,*PStudent;

PStudent students_scanf(PStudent students,size_t n) {//向结构体student中输入信息
    for(int i=0; i<n; ++i) {
        fscanf(stdin,"%s%d%d%f",students[i].name,&students[i].age,&students[i].male,&students[i].scores);
    }
    return students;
}

void students_print(const PStudent students,size_t n) { //打印结构体student 
        fprintf(stdout,"%s %d %d %f\n",students[i].name,students[i].age,students[i].male,students[i].scores);
    }
}
void students_save(const char* file,const PStudent students,size_t n) { //将结构体中的信息录入文件中
    FILE* pfile = fopen(file,"w");
    if(NULL == pfile) {
        printf("file %s open error\n",file);
        return;
    }
    fprintf(pfile,"%d\n",n);
    for(int i=0; i<n; ++i) {
        fprintf(pfile,"%s %d %d %f\n",students[i].name,students[i].age,students[i].male,students[i].scores);
    }
    fclose(pfile);
    pfile = NULL;
}
size_t students_size(const char* file) { // 获取文件中的student的数量
    FILE* pfile = fopen(file,"r");
    if(NULL == pfile) {
        printf("file %s open error\n",file);
        return 0;
    }
    int n;
    fscanf(pfile,"%d",&n);
    fclose(pfile);
    pfile = NULL;
    return n;
}
PStudent students_load(const char* file,PStudent students,size_t n) {// 将文件中的信息存入students中
    FILE* pfile = fopen(file,"r");
    if(NULL == pfile) {
        printf("file %s open error\n",file);
        return students;
    }
    int num;
    fscanf(pfile,"%d",&num);
    if(num < n) {
        printf("WARNNING:fact count of students is less:%d\n",num);
    }
    for(int i=0; i<n; ++i) {
        int res = fscanf(pfile,"%s%d%d%f",students[i].name,&students[i].age,&students[i].male,&students[i].scores);
        if(EOF == res) break;
    }
    fclose(pfile);
    pfile = NULL;
    return students;
}

PStudent students_search(const char* name,PStudent students,size_t n) { // 搜索某个学生信息
    for(int i=0; i<n; ++i) {
        if(strcmp(name,students[i].name) == 0) {
            return students+i;
        }
    }
    return NULL;
}
int students_scores_up(const void* a,const void* b) { // 自大到小排列学生信息
    return ((PStudent)a)->scores > ((PStudent)b)->scores?-1:1;
}
int students_scores_down(const void* a,const void* b) { // 自小到大排列学生信息
    return ((PStudent)a)->scores < ((PStudent)b)->scores?-1:1;
}


void NewStudent(PStudent students,size_t count) { // 向文件中新增学生信息
    Student s;
    students_scanf(&s,1);
    Student students2[count+1];
    for(int i=0; i<count; ++i) {
        students2[i] = students[i];
    }
    students2[count] = s;
    students_save(filename,students2,count+1);

}
void ShowAllStudents(PStudent students,size_t count) {// 展示文件中所有的学生信息
    if(0 != count) {
        students_print(students,count);
    } else {
        printf("No Students Info\n");
    }
}

void SearchStudent(PStudent students,size_t count) {// 在文件中搜索某个学生信息
    if(0 != count) {
        char name[30];
        printf("input name of student:");
        scanf("%s",name);
        PStudent s = students_search(name,students,count);
        if(NULL == s) {
            printf("No student %s\n",name);
        } else {
            students_print(s,1);
        }
    } else {
        printf("No Students Info\n");
    }
}
void EditStudent(PStudent students,size_t count) {// 重新编辑某个学生信息
    if(0 != count) {
        char name[30];
        printf("input name of student:");
        scanf("%s",name);
        PStudent s = students_search(name,students,count);
        if(NULL == s) {
            printf("No student %s\n",name);
        } else {
            students_print(s,1);
            printf("input new info:");
            students_scanf(s,1);
            students_save(filename,students,count);
        }
    } else {
        printf("No Students Info\n");
    }
}
void DeleteStudent(PStudent students,size_t count) {// 删除文件中的某个学生信息
    if(0 != count) {
        char name[30];
        printf("input name of student:");
        scanf("%s",name);
        PStudent s = students_search(name,students,count);
        if(NULL == s) {
            printf("No student %s\n",name);
        } else {
            students_print(s,1);
            *s = students[count-1];
            students_save(filename,students,count-1);
        }
    } else {
        printf("No Students Info\n");
    }
}
void SortStudent(PStudent students,size_t count) { // 对文件中的学生信息进行排列
    if(0 != count) {
        qsort(students,count,sizeof(Student),students_scores_up);
        students_print(students,count);
    } else {
        printf("No Students Info\n");
    }
}
void Exit(PStudent students,size_t count) { // 退出程序
    exit(0);
}
int main(int argc,char* argv[]) {
    if(argc != 2) {
        printf("Usage:%s filename\n",argv[0]);
        return 1;
    }
    filename = argv[1];
    char* menus[] = {
        "Exit",
        "New Student",
        "Show All Students",
        "Search Student",
        "Edit Student",
        "Delete Student",
        "Sort By Scores",
    };

    for(int i=0; i<sizeof(menus)/sizeof(menus[0]); ++i) {
        printf("%d. %s\n",i,menus[i]);
    }

    typedef void (*func_t)(PStudent,size_t);// 使用函数指针来实现不同函数的调用,相比较switch-case更加便捷

    func_t funcs[] = {Exit,NewStudent,ShowAllStudents,SearchStudent,EditStudent,DeleteStudent,SortStudent};
    while(true) {
        int count = students_size(filename);
        Student students[count];
        students_load(filename,students,count); // read from file
        printf("Select option:");
        int option;
        scanf("%d",&option);
        if(option >= 0 && option <=6) {
            funcs[option](students,count);
        } else {
            printf("ERROR:%d option is not existed!\n",option);
        }
    }
    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值