前言
该程序是大一上学期的课设,在上学期的基础上对此程序进行了细节上的优化,以及将程序分成多个文件,第一次对多文件开发有了了解(再也不要将几千行代码放在一个文件内了)
一、 软件功能描述
假设学生成绩信息描述如下:
学号,姓名,身份证号,性别,民族,家庭住址,课程成绩,年龄
要求:程序能够实现,(1)增加、删除、修改学生的基本信息;(2)查询功能:查询学生人数;按性别查询学生人数;按民族查询学生人数;统计学生的平均分数;给学生排榜;按课程统计学生分数;查询获得某课程的最高分的学生信息;(3)、存储学生信息:将学生信息按格式存到文件中。
二、程序主要模块
2.1 程序基本功能的实现
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;
}
全部源码请转—>
通过链表实现的学生信息管理系统————大一上课设