一、该系统实现的功能
- 录入学生信息;
- 将输入的学生信息能够存入一个文件中,并能在这个文件中读取出这些学生信息;
- 显示所有学生信息;
- 搜索某个学生的信息;
- 更改某个学生的信息;
- 根据学生成绩对学生进行排序;
二、一些需要我们学习的小点
在我们的代码中还涉及到一些重要的知识点,其中比较大头的是文件操作和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;
}