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

Holy meat 2024-06-17 15:05:03 阅读 86

学生管理系统

前言题目要求功能实现定义结构体主函数功能函数学生信息录入删除学生信息修改学生的成绩查询学生成绩查询所有学生的信息查询所有学生成绩根据成绩进行排序按学号排序根据学号查询学生信息统计班级的平均成绩读取学生的信息保存文件信息 完整代码项目效果演示

前言

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;

在这里插入图片描述

保存信息:

在这里插入图片描述

查看文件:

在这里插入图片描述

功能就演示到这里了。。。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。