学生管理系统
题目详情
一、学生信息管理程序 基本要求:
1.要求实现学生信息的添加、删除、修改、查询、显示所有信息、排序、存档、读档、退出、使用帮助这10功能模块,每个功能模块均能实现从模块中退出,从而完成一个学生管理系统所需功能。
2.要使用结构体来实现对学生信息的存储。
3.学生信息包括:姓名,性别,年龄, 成绩
4.为防止用户误触进入子菜单,在子菜单内提供返回主菜单服务
5.系统制作完成后应实现类似下图所示界面:
整体思路
分别创建main.c,score.c,score.h文件,main.c为主函数,可以利用一个switch函数选择要要运行的功能函数,score.c为功能函数,存放增删改查等功能模块,score.h存放头文件和结构体的定义。
正文
结构体的创建
题目要求需要使用结构体来对学生信息进行储存,所以需要创建一个结构体,同时也要注意结构体中需要包含学生的那些信息。
struct Student
{
char name[20];
char sex[10];
int age;
int score;
};
struct Class
{
struct Student stu_arr[100];
int count; // 记录学生的个数
};
main函数
1.为班级结构体申请内存
2.定义一个变量loop用来控制程序是否结束
3.利用switch函数实现不同的功能
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "score.h"
int main(int argc, const char *argv[])
{
int chose = 0;
int loop = 1;
struct Class *cls_p =(struct Class *)malloc(sizeof(struct Class));
if (cls_p == NULL)
{
printf("malloc failed!\n");
return -1;
}
cls_p->count = 0;
while (loop)
{
menu();
printf("请输入你的选择 > ");
scanf("%u", &chose);
switch (chose)
{
case INSERT:
insert_stu(cls_p);
break;
case DELECT:
delete_stu(cls_p);
break;
case UPDATE:
update_stu(cls_p);
break;
case SELECT:
select_stu(cls_p);
break;
case PRINT:
print_all_stu(cls_p);
break;
case SORT:
sort_stu(cls_p);
break;
case SAVE:
save(cls_p);
break;
case LOAD:
load(cls_p);
break;
case QUIT:
tuichu(&loop);
break;
case HELP:
help();
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
if (!loop) {
break;
}
}
if (cls_p != NULL) {
free(cls_p);
cls_p = NULL;
}
return 0;
}
menu函数
用来输出主菜单界面
void menu()
{
printf("\n");
printf("********************************************\n");
printf("* 学生信息管理系统 *\n");
printf("********************************************\n");
printf("****************系统功能菜单****************\n");
printf("------------------- --------------------\n");
printf("** 1、增加学生信息 * 2、删除学生信息 **\n");
printf("********************************************\n");
printf("** 3、修改学生信息 * 4、查询学生信息 **\n");
printf("********************************************\n");
printf("** 5、显示当前信息 * 6、进行成绩排序 **\n");
printf("********************************************\n");
printf("** 7、保存当前信息 * 8、载入学生信息 **\n");
printf("********************************************\n");
printf("** 9、退出当前系统 * 10、使用帮助 **\n");
printf("********************************************\n");
printf("------------------- --------------------\n");
}
print_info函数
用来打印单个学生的信息
void print_info(struct Student *stu)
{
printf("姓名:%-10s性别:%-5s年龄:%-5d成绩:%-5d\n",
stu->name,stu->sex, stu->age,stu->score);
}
inster_stu函数
输入学生信息并插入,再插入之前先判断班级是否人满,输入姓名后在判断是否重复,并提供按1返回主菜单选项(后面将不再赘述)
int insert_stu(struct Class *cls)
{
int i;
struct Student stu;
if (cls->count == (NUM)) {
printf("班级学生已经满了,插入失败!\n");
return -1;
}
printf("(返回请按1)\n");
printf("请输入插入学生的姓名:\n");
scanf("%s", stu.name);
if(strcmp(stu.name,"1")==0)
return -1;
for (i = 0; i < cls->count;i++) {
if (!strcmp(cls->stu_arr[i].name, stu.name)) {
printf("学生已经存在,请重新插入!\n");
return -1;
}
}
printf("请输入插入学生的性别:\n");
scanf("%s",stu.sex);
printf("请输入插入学生的年龄:\n");
scanf("%d",&stu.age);
printf("请输入插入学生的成绩:\n");
scanf("%d",&stu.score);
if (stu.sex=="男" || stu.sex =="女") {
printf("输入的性别不合理,请重新选择,并插入数据!\n");
return -1;
}
cls->stu_arr[cls->count] = stu; // 再末尾插入学员信息
cls->count++; // 学员人数加1
printf("插入成功\n");
return 0;
}
delete_stu函数
输入姓名并删除该学生信息,删除之前先判断班级内是否有学生(后面将不再赘述)
int delete_stu(struct Class *cls)
{
int i;
char name[20];
int tmp =-1;
if (cls->count == 0) {
printf("班级没有学生,请先插入学生的信息!\n");
return -1;
}
printf("(返回请按1)\n");
printf("请输入要删除的学生的姓名: ");
scanf("%s", name);
if(strcmp(name,"1")==0)
return -1;
for (i = 0; i < cls->count;i++) {
if (!strcmp(cls->stu_arr[i].name, name)) {
tmp = i; // 记录查找到的学生的位置
}
}
if(tmp == -1) {
printf("没有再班级中查找到对应的学生,请重新选择!\n");
return -1;
} else {
for (; tmp < cls->count; tmp++) {
cls->stu_arr[tmp] = cls->stu_arr[tmp+1];
}
cls->count--;
}
printf("删除成功\n");
return 0;
}
update_stu函数
每次都要选择要修改学生的具体信息,且每次只能修改一项
int update_stu(struct Class *cls)
{
int i;
char name[20] = {0};
int score;
int tmp = -1;
if (cls->count == 0) {
printf("班级没有学生,请先插入学生的信息!\n");
return -1;
}
printf("请输入要修改的学生的姓名> ");
scanf("%s", name);
for (i = 0; i < cls->count;i++) {
if (!strcmp(cls->stu_arr[i].name, name)) {
tmp = i;
}
}
if(tmp == -1) {
printf("没有再班级中查找到对应的学生,请重新选择!\n");
return -1;
} else {
printf("已查找到对应的学生,请输入要修改的类!\n(1.姓名 2.性别 3.年龄 4.成绩)\n");
int flag=1,t;
while (flag)
{
scanf("%d",&t);
switch (t)
{
case 1:
printf("请输入要修改的姓名为:\n");
scanf("%s", name);
strcpy(cls->stu_arr[tmp].name,name);
flag=0;
break;
case 2:
printf("请输入要修改的性别为:\n");
char sex[10];
scanf("%s", sex);
strcpy(cls->stu_arr[tmp].sex,sex);
flag=0;
break;
case 3:
printf("请输入要修改的年龄为:\n");
int age;
scanf("%d", &age);
cls->stu_arr[tmp].age = age;
flag=0;
break;
case 4:
printf("请输入要修改的成绩为:\n");
int score;
scanf("%d", &score);
cls->stu_arr[tmp].score =score;
flag=0;
break;
default:
printf("输出有误,请重新输入!\n");
}
}
}
printf("修改成功\n");
return 0;
}
select_stu函数
输入学生姓名并打印具体信息
int select_stu(struct Class *cls)
{
int i;
char name[20];
int tmp = -1;
if (cls->count == -1) {
printf("班级没有学生,请先插入学生的信息!\n");
return -1;
}
printf("(返回请按1)\n");
printf("请输入要查询的学生的姓名: ");
scanf("%s", name);
if(strcmp(name,"1")==0)
return -1;
for (i = 0; i < cls->count;i++) {
if (!strcmp(cls->stu_arr[i].name, name)) {
tmp = i; // 记录查找到的学生的位置
}
}
if(tmp == -1) {
printf("没有再班级中查找到对应的学生,请重新选择!\n");
return -1;
} else {
printf("查询成功!\n");
print_info(&cls->stu_arr[tmp]);
}
return 0;
}
print_all_stu函数
打印所有学生信息
int print_all_stu(struct Class *cls)
{
if (cls->count == 0) {
printf("班级没有学生,请先插入学生的信息!\n");
return -1;
}
printf("打印成功\n");
int i;
for (i = 0; i < cls->count;i++) {
print_info(cls->stu_arr + i);
}
printf("班级学员的个数为:%d\n", cls->count);
}
sort_stu函数
给目前所有学生按照成绩进行排序
int sort_stu(struct Class *cls)
{
if (cls->count == 0) {
printf("班级没有学生,请先插入学生的信息!\n");
return -1;
}
printf("排序成功\n");
int i, j, flag;
struct Student temp;
for (i = 0; i < cls->count-1; i++) {
for (flag = 0, j = 0; j < cls->count - i-1; j++) {
if (cls->stu_arr[j].score < cls->stu_arr[j+1].score) {
temp = cls->stu_arr[j];
cls->stu_arr[j] = cls->stu_arr[j+1];
cls->stu_arr[j+1] = temp;
flag = 1;
}
}
if ( flag == 0) {
break;
}
}
}
save函数
输入文件名,并将目前所有学生信息存入进去
int save(struct Class *cls)
{
int i;
FILE* fp;
char filename[20];
printf("(返回请按1)\n");
printf("请输入要保存的文件名:\n");
scanf("%s", filename);
if(strcmp(filename,"1")==0)
return -1;
if ((fp = fopen(filename, "w")) == NULL)
{
printf("打开文件失败!\n");
return -1;
}
for (i = 0; i < cls->count; i++)
if (fwrite(&cls->stu_arr[i], sizeof(struct Student), 1, fp) != 1)
printf("保存失败!!\n");
printf("保存成功!!!\n");
fclose(fp);
return 0;
}
load函数
输入文件名,并将文件内的学生信息导入进系统
int load(struct Class *cls)
{
int i, k = 0;//k代表刷新过程中学生人数
FILE* fp;
char filename[20];
printf("(返回请按1)\n");
printf("请输入需要载入的文件名:\n");
fgets(filename,20,stdin);
filename[strlen(filename)-1]='\0';
if(strcmp(filename,"1")==0)
return -1;
if ((fp = fopen(filename, "r")) == NULL)//打开文件
{
printf("打开文件失败!\n");
return -1;
}
for (i = 0; i < 100; i++)
{
if (fread(&cls->stu_arr[i], sizeof(struct Student), 1, fp) == 1)
k++;//记录学生人数
}
cls->count = k;
if (k == 0)
printf("载入失败!!!\n");
else
printf("载入成功!!!\n");
fclose(fp);
return 0;
}
tuichu函数
选择是否退出程序
void tuichu(int *loop)
{
int h;//控制是否确认退出
printf("即将退出,确认请按1,取消请按0\n");
scanf("%d", &h);
if (h == 1)
{
*loop = 0;
printf("成功退出,感谢使用!\n");
}
if (h == 0)
{
printf("退出已取消!\n");
}
}
help函数
打印注意事项
void help()
{
printf("\n这是一个学生信息管理系统,为了帮助您更快的了解使用它,请先仔细阅读以下注意事项:\n");
printf("\n 注意事项: \n ");
printf("\n 1、请根据提示进行操作!\n");
printf("\n 2、初次使用请先选择增加学生信息!\n");
printf("\n 3、修改或者增加学生信息后切记保存!\n");
printf("\n 4、如果数据有错误,请先修改再保存!\n");
printf("\n 5、如果您不小心误触进入子菜单,按‘1’可以返回主菜单!\n");
printf("\n 6、若您之前使用过,下次进入系统可以直接载入学生信息!\n");
printf("\n 7、保存或者刷新时,输入的文件名后缀请使用.txt,比如: stu.txt!\n");;
printf("\n 8、学生信息包括:姓名、性别、年龄、成绩等!\n");
printf("\n 9、使用遇到任何问题请与我联系,邮箱:2058742633@qq.com\n");
printf("\n 10、最后感谢您的使用!\n");
}
score.c文件
#include "score.h"
#include <string.h>
#include <stdlib.h>
void menu()
{
printf("\n");
printf("********************************************\n");
printf("* 学生信息管理系统 *\n");
printf("********************************************\n");
printf("****************系统功能菜单****************\n");
printf("------------------- --------------------\n");
printf("** 1、增加学生信息 * 2、删除学生信息 **\n");
printf("********************************************\n");
printf("** 3、修改学生信息 * 4、查询学生信息 **\n");
printf("********************************************\n");
printf("** 5、显示当前信息 * 6、进行成绩排序 **\n");
printf("********************************************\n");
printf("** 7、保存当前信息 * 8、载入学生信息 **\n");
printf("********************************************\n");
printf("** 9、退出当前系统 * 10、使用帮助 **\n");
printf("********************************************\n");
printf("------------------- --------------------\n");
}
void print_info(struct Student *stu)
{
printf("姓名:%-10s性别:%-5s年龄:%-5d成绩:%-5d\n",
stu->name,stu->sex, stu->age,stu->score);
}
int insert_stu(struct Class *cls)
{
int i;
struct Student stu;
if (cls->count == (NUM)) {
printf("班级学生已经满了,插入失败!\n");
return -1;
}
printf("(返回请按1)\n");
printf("请输入插入学生的姓名:\n");
scanf("%s", stu.name);
if(strcmp(stu.name,"1")==0)
return -1;
printf("请输入插入学生的性别:\n");
scanf("%s",stu.sex);
printf("请输入插入学生的年龄:\n");
scanf("%d",&stu.age);
printf("请输入插入学生的成绩:\n");
scanf("%d",&stu.score);
if (stu.sex=="男" || stu.sex =="女") {
printf("输入的性别不合理,请重新选择,并插入数据!\n");
return -1;
}
for (i = 0; i < cls->count;i++) {
if (!strcmp(cls->stu_arr[i].name, stu.name)) {
printf("学生已经存在,请重新插入!\n");
return -1;
}
}
cls->stu_arr[cls->count] = stu; // 再末尾插入学员信息
cls->count++; // 学员人数加1
printf("插入成功\n");
return 0;
}
int delete_stu(struct Class *cls)
{
int i;
char name[20];
int tmp =-1;
if (cls->count == 0) {
printf("班级没有学生,请先插入学生的信息!\n");
return -1;
}
printf("(返回请按1)\n");
printf("请输入要删除的学生的姓名: ");
scanf("%s", name);
if(strcmp(name,"1")==0)
return -1;
for (i = 0; i < cls->count;i++) {
if (!strcmp(cls->stu_arr[i].name, name)) {
tmp = i; // 记录查找到的学生的位置
}
}
if(tmp == -1) {
printf("没有再班级中查找到对应的学生,请重新选择!\n");
return -1;
} else {
for (; tmp < cls->count; tmp++) {
cls->stu_arr[tmp] = cls->stu_arr[tmp+1];
}
cls->count--;
}
printf("删除成功\n");
return 0;
}
int update_stu(struct Class *cls)
{
int i;
char name[20] = {0};
int score;
int tmp = -1;
if (cls->count == 0) {
printf("班级没有学生,请先插入学生的信息!\n");
return -1;
}
printf("请输入要修改的学生的姓名> ");
scanf("%s", name);
for (i = 0; i < cls->count;i++) {
if (!strcmp(cls->stu_arr[i].name, name)) {
tmp = i;
}
}
if(tmp == -1) {
printf("没有再班级中查找到对应的学生,请重新选择!\n");
return -1;
} else {
printf("已查找到对应的学生,请输入要修改的类!\n(1.姓名 2.性别 3.年龄 4.成绩)\n");
int flag=1,t;
while (flag)
{
scanf("%d",&t);
switch (t)
{
case 1:
printf("请输入要修改的姓名为:\n");
scanf("%s", name);
strcpy(cls->stu_arr[tmp].name,name);
flag=0;
break;
case 2:
printf("请输入要修改的性别为:\n");
char sex[10];
scanf("%s", sex);
strcpy(cls->stu_arr[tmp].sex,sex);
flag=0;
break;
case 3:
printf("请输入要修改的年龄为:\n");
int age;
scanf("%d", &age);
cls->stu_arr[tmp].age = age;
flag=0;
break;
case 4:
printf("请输入要修改的成绩为:\n");
int score;
scanf("%d", &score);
cls->stu_arr[tmp].score =score;
flag=0;
break;
default:
printf("输出有误,请重新输入!\n");
}
}
}
printf("修改成功\n");
return 0;
}
int select_stu(struct Class *cls)
{
int i;
char name[20];
int tmp = -1;
if (cls->count == -1) {
printf("班级没有学生,请先插入学生的信息!\n");
return -1;
}
printf("(返回请按1)\n");
printf("请输入要查询的学生的姓名: ");
scanf("%s", name);
if(strcmp(name,"1")==0)
return -1;
for (i = 0; i < cls->count;i++) {
if (!strcmp(cls->stu_arr[i].name, name)) {
tmp = i; // 记录查找到的学生的位置
}
}
if(tmp == -1) {
printf("没有再班级中查找到对应的学生,请重新选择!\n");
return -1;
} else {
printf("查询成功!\n");
print_info(&cls->stu_arr[tmp]);
}
return 0;
}
int print_all_stu(struct Class *cls)
{
if (cls->count == 0) {
printf("班级没有学生,请先插入学生的信息!\n");
return -1;
}
printf("打印成功\n");
int i;
for (i = 0; i < cls->count;i++) {
print_info(cls->stu_arr + i);
}
printf("班级学员的个数为:%d\n", cls->count);
}
int sort_stu(struct Class *cls)
{
if (cls->count == 0) {
printf("班级没有学生,请先插入学生的信息!\n");
return -1;
}
printf("排序成功\n");
int i, j, flag;
struct Student temp;
for (i = 0; i < cls->count-1; i++) {
for (flag = 0, j = 0; j < cls->count - i-1; j++) {
if (cls->stu_arr[j].score < cls->stu_arr[j+1].score) {
temp = cls->stu_arr[j];
cls->stu_arr[j] = cls->stu_arr[j+1];
cls->stu_arr[j+1] = temp;
flag = 1;
}
}
if ( flag == 0) {
break;
}
}
}
int save(struct Class *cls)
{
int i;
FILE* fp;
char filename[20];
printf("(返回请按1)\n");
printf("请输入要保存的文件名:\n");
scanf("%s", filename);
if(strcmp(filename,"1")==0)
return -1;
if ((fp = fopen(filename, "w")) == NULL)
{
printf("打开文件失败!\n");
return -1;
}
for (i = 0; i < cls->count; i++)
if (fwrite(&cls->stu_arr[i], sizeof(struct Student), 1, fp) != 1)
printf("保存失败!!\n");
printf("保存成功!!!\n");
fclose(fp);
return 0;
}
int load(struct Class *cls)
{
int i, k = 0;//k代表刷新过程中学生人数
FILE* fp;
char filename[20];
printf("(返回请按1)\n");
printf("请输入需要载入的文件名:\n");
getchar();
fgets(filename,20,stdin);
filename[strlen(filename)-1]='\0';
if(strcmp(filename,"1")==0)
return -1;
if ((fp = fopen(filename, "r")) == NULL)//打开文件
{
printf("打开文件失败!\n");
return -1;
}
for (i = 0; i < 100; i++)
{
if (fread(&cls->stu_arr[i], sizeof(struct Student), 1, fp) == 1)
k++;//记录学生人数
}
cls->count = k;
if (k == 0)
printf("载入失败!!!\n");
else
printf("载入成功!!!\n");
fclose(fp);
return 0;
}
void tuichu(int *loop)
{
int h;//控制是否确认退出
printf("即将退出,确认请按1,取消请按0\n");
scanf("%d", &h);
if (h == 1)
{
*loop = 0;
printf("成功退出,感谢使用!\n");
}
if (h == 0)
{
printf("退出已取消!\n");
}
}
void help()
{
printf("\n这是一个学生信息管理系统,为了帮助您更快的了解使用它,请先仔细阅读以下注意事项:\n");
printf("\n 注意事项: \n ");
printf("\n 1、请根据提示进行操作!\n");
printf("\n 2、初次使用请先选择增加学生信息!\n");
printf("\n 3、修改或者增加学生信息后切记保存!\n");
printf("\n 4、如果数据有错误,请先修改再保存!\n");
printf("\n 5、如果您不小心误触进入子菜单,按‘1’可以返回主菜单!\n");
printf("\n 6、若您之前使用过,下次进入系统可以直接载入学生信息!\n");
printf("\n 7、保存或者刷新时,输入的文件名后缀请使用.txt,比如: stu.txt!\n");;
printf("\n 8、学生信息包括:姓名、性别、年龄、成绩等!\n");
printf("\n 9、使用遇到任何问题请与我联系,邮箱:2058742633@qq.com\n");
printf("\n 10、最后感谢您的使用!\n");
}
score.h文件
#ifndef __SCORE_H__
#define __SCORE_H__
#include <stdio.h>
#define NUM 100
#define INSERT 1
#define DELECT 2
#define UPDATE 3
#define SELECT 4
#define PRINT 5
#define SORT 6
#define SAVE 7
#define LOAD 8
#define QUIT 9
#define HELP 10
struct Student
{
char name[20];
char sex[10];
int age;
int score;
};
struct Class
{
struct Student stu_arr[100];
int count; // 记录学生的个数
};
void menu();
int insert_stu(struct Class *cls);
int delete_stu(struct Class *cls);
int update_stu(struct Class *cls);
int select_stu(struct Class *cls);
int print_all_stu(struct Class *cls);
int sort_stu(struct Class *cls);
int save();
int load();
void tuichu(int *loop);
void help();
#endif // __SCORE_H__
运行结果
1.开始界面
2.先查看使用帮助
3.分别插入三个学生信息并查看
3.进行排序并查看,再存档
4.删除李四并查看
5.载入之前存档的信息并查看
6.选择插入学生并直接返回主菜单
7.退出程序