学生管理系统——用链表实现

前言

该程序是大一上学期的课设,在上学期的基础上对此程序进行了细节上的优化,以及将程序分成多个文件,第一次对多文件开发有了了解(再也不要将几千行代码放在一个文件内了)

在这里插入图片描述

一、 软件功能描述

假设学生成绩信息描述如下:
学号,姓名,身份证号,性别,民族,家庭住址,课程成绩,年龄
要求:程序能够实现,(1)增加、删除、修改学生的基本信息;(2)查询功能:查询学生人数;按性别查询学生人数;按民族查询学生人数;统计学生的平均分数;给学生排榜;按课程统计学生分数;查询获得某课程的最高分的学生信息;(3)、存储学生信息:将学生信息按格式存到文件中。

二、程序主要模块

2.1 程序基本功能的实现

Longlong

2.2各模块功能说明:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2.3文件结构

文件名称文件内容
main.c用来运行主程序
tool.h定义结构体以及函数的声明
seek_function定义用于查找的函数
print_function定义用于列出学生信息的函数
change+del_function定义用于修改信息和删除信息的函数
tool.c菜单函数、文件操作、增加学生的函数

三、函数原型及说明

3.0.main模块函数

a)load_data(node* head)
函数作用:将同目录下可能存在的students.txt文件数据录入程序。
参数解释:将链表头节点的地址传入,将文件中的数据录入文件并插入到链表尾部
b)menu()
函数作用:显示主菜单。
c)work(node* head)
函数作用:选择函数,负责调用其他函数功能。
参数解释 :将链表头节点的地址传入,以便其他函数调用时,传入头节点的地址。

3.1.录入学生信息模块

a)input(node* head, char*name,char* id_status ,char* nation,char*\ address,int ID, char* sex,\ int math_grade,int chin_grade,int english_grade,int c_grade,int\ pe_grade,int total_sore,int age);
函数作用:新建节点,录入新同学的信息
参数解释:传入头节点的地址,以及新学生的各个结构变量。
2.查询学生信息
a) seek_id(node* head, int num)
函数作用:按照学号查找学生的信息
参数解释:1.传入头节点的地址,以便接下来的遍历2.要查找的学号。
b) seek_name(node* head, char* name)
函数作用:按照名字查找学生的信息

参数解释:1.传入头节点的地址,以便接下来的遍历2.要查找的姓名
c)seek_grade(node* head, char* grade)
函数作用:输入学科来查找该学科的最高分学生的信息

参数解释:1.传入头节点的地址,以便接下来的遍历2.要查找的学科。
d) seek_nation(node* head,char* nation)
函数作用:按照民族查找学生的信息

参数解释:1.传入头节点的地址,以便接下来的遍历2.要查找的民族
e) seek_num(node* head)
函数作用:遍历链表,统计男女生人数以及总人数
参数解释:传入头节点的地址,以便接下来的遍历

3.3.删除学生信息

a)del_id(node* head, int num)
函数作用:输入学号来删除该学号的学生。
参数解释:传入头节点的地址,以便接下来的遍历。
b) del_name(node* head, char* name)
函数作用: 输入姓名来删除该学号的学生。
参数解释:传入头节点的地址,以便接下来的遍历。

3.4.显示学生信息

a) print_id(node* head1)
函数作用:按照学号由小到大的顺序打印学生名单。
参数解释:传入头节点的地址,以便接下来的遍历。
b)print_grade(node* head1)
函数作用:按照平均分由高到低的顺序打印学生名单。
参数解释:传入头节点的地址,以便接下来的遍历。

3.5.修改学生数据

a) change_id(node* head, int id)
函数作用:按照学号筛选来修改学生数据。
参数解释:1.传入头节点的地址,以便接下来的遍历2.要修改学生的学号
b) change_name(node* head, char* name)
函数作用:按照名字筛选来修改学生数据。
参数解释:1.传入头节点的地址,以便接下来的遍历2.要修改学生的名字

3.6.退出程序及存档

a)save_data(node* head)
函数作用:将数据存入同一目录下的students.txt文件,如果该文件不存在,则会新建一个students.txt文件.
参数解释:1.传入头节点的地址,以便接下来的遍历。

四、细节优化

4.1 开始程序有三秒的加载效果,一列”--------”依次增加。

在这里插入图片描述

4.2.输入数字时,如果输入了不符合要求的选项或者是字符串,都会显示重新输入

这里利用了 fflush函数。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.3 支持学号查重,录入新学生时,如果学号已经存在,则会提示录入失败

在这里插入图片描述

五、总结

在课设开始前我是比较得意的,因为上学期写过一个我当时比较满意的学生管理系统(当时,当时,当时)。想着这学期的课设时间我随便水水,写写报告就完事了。直到课设开始后,首先的问题就是,上学期写的那个结构体的元素只有五个,而这学期增加到了12个!!!
我先干的事情就是将我的那个版本的元素增加,费了不少时间。其次就是,我上学期那个版本细节太差了,1是没有文件操作,纯手动输入数据,2是信息汇总的时候,没有一个好看的表格。我记得课设前期我的想法就是先将各种细节完善好,再上文件操作(因为不熟悉,想放到最后做) 然后就开始了我的细节优化之路。比如,性别只能输入男或女呀,还有学号只能输入10位,还有身份证只能18位,以及信息汇总时时,学会了%xd、%xs的格式化用法,还有就是,之前在菜单选择上,只要输入字符,就会无限循环。后来经过同学的提醒,学会了用fflus函数清空缓存区。这些都是很大的收获,还有最大的收获,就是对链表又加深了印象,上学期时间比较仓促,学链表学了一天,然后开始敲学管,很多对链表的操作都不了解,只是有个大概理解,比如在链表内实现排序、还有尾插、头插的概念。这学期做课设的时候,与同学交流也很多,通过与他们交流链表知识点,对链表也有了更深的概念,当然,仅仅是单链表,什么双向链表、循环链表啥的除外。

六、内心tips

(这是我被算法打击后过来水的一篇文章)

七 源码(部分)

t o o l . h tool.h tool.h

#ifndef  __SOMEFILE_H__

#define   __SOMEFILE_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>
extern int count;
typedef struct node {
    char name[20];//姓名 
    char id_status[19];//身份证号 
    char nation[16];//民族
    char address[50];//地址
    int ID; //学号 
    int age;//年龄 
    char sex[3];//性别 
    int math_grade;//数学成绩 
    int chin_grade;//语文成绩 
    int english_grade;//英语成绩 
    int c_grade;//c语言成绩  
    int pe_grade; //体育成绩 
    int total_sore;//总分 
    struct node* next; //指针域 
}node;
void input(node* head, char*name,char* id_status ,char* nation,char* address,int ID, char* sex,\
int math_grade,int chin_grade,int english_grade,int c_grade,int pe_grade,int total_sore,int age);//录入新学生 
void work(node* head);//工作 
void seek_id(node* head, int num);//按照学号查找
void seek_name(node* head, char* name);//按照姓名查找
void seek_grade(node* head,    char* grade);//按照成绩查找
void seek_nation(node* head,char* nation);//按照民族查找
void seek_num(node* head);//人数查找
void del_id(node* head, int num);//按照学号删除
void del_name(node* head, char* name);//按照名字删除
void print_id(node* head1);//学号排名
void print_grade(node* head1);//成绩排名
void print_common(node* head);//普通汇总
void change_id(node* head, int id);//按照学号修改
void change_name(node* head, char* name);//按照名字修改
void menu();//菜单函数
void load_data(node* head);//读取文件
void save_data(node* head);//保存数据
#endif

m a i n . c main.c main.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>
#include"tool.h"

int count=0;
system("color F3");
int main()
{
    
    node* head = (node*)malloc(sizeof(node));//创建头结点 
    head->next = NULL;
    load_data(head);//读取文件
    

    int u=3;
    printf("载入数据中,请稍等");
    while(u>=0)
    {
        Sleep(1000);
        printf("---------");
        u--;    
    }
    printf("加载完毕\n");
    
    menu();
    while (1)
    {
        work(head);
    }
    
    return 0;
}

全部源码请转—>
通过链表实现的学生信息管理系统————大一上课设

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值