学生管理系统

题目详情

一、学生信息管理程序 基本要求:
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.退出程序
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值