1、 课 程 设 计 报 告 一一 课程设计目的及要求课程设计目的及要求 学生通讯系统学生通讯系统 学生通信录信息包括:姓名、学号、年龄、性别、家庭住址、联系电话、寝室号等信息。 现要求编写程序来完成如下功能: 学生通信录信息的输入 学生的通信录信息删除和修改 学生的通信录信息查询和统计功能 学生的通信录信息输出显示。 二二 课程设计具体实现课程设计具体实现 1总体设计总体设计 学生通讯管理系统学生通讯管理系统 管理员管理员登陆系统登陆系统 普通用户普通用户登陆系统登陆系统 修 改 信 息 修 改 信 息 删 除 信 息 删 除 信 息 查 找 信 息 查 找 信 息 增 加 信 息 增 加 信
2、息 修 改 密 码 修 改 密 码 只 修 改 学 号 只 修 改 学 号 只 修 改 姓 名 只 修 改 姓 名 全 部 修 改 全 部 修 改 密码校验密码校验 退 出 系 统 退 出 系 统 2详细设计详细设计 在进行系统的各项功能介绍之前,有必要先说一下我所选的课程项设计的主要思 路。 这个系统的核心部分就是结构体链表,它贯穿整个程序。一切数据的增、删、查、 改都要以它为支撑。整个程序其实就是在操作一张很大的链表。我在 15 周时就已经开 始考虑课程设计题目,当时是想先做一个关于面向过程的课题,立马就考虑的先用结构 体链表做为数据的容器。而且已经做成型了。后来老师您把题目给改了,要求都
3、用面向 对象做,我是考虑过用 vector 或者是 list 来做数据的容器的,但想想程序几经初成型, 就不改变容器了,就直接把类的对象做为结构体的数据部分,程序当然也有较大改动, 但基本框架是没有变的。 先来说链表的构造,在主菜单下选择功能之前,链表就已经认构造完毕,程序按行 读取文本文件,每读一行,便对其进行分割。分割出来的字符串为学生类对象对应的每 一项信息。在分割字符串时,我按字符进行分割(当然,在数据存储时也是按行 存储,且每项信息以分开) ,其关键代码如下: void read_info() /读取文件 head=NULL; Student s; /构造学生类对象 ifstream
4、 in(“student_info.txt“); string read; int no; while(getline(in,read) /按行读取 no=0; int i; while(read.find_first_of(“)!=-1) string temp; i=read.find_first_of(“); temp=read.substr(0,i); if(no=0) s.name=temp; /赋予姓名 if(no=1) s.tel=temp; /赋予电话 if(no=2) s.xuehao=temp;/赋予学号 if(no=3) s.sex=temp; /赋予性别 if(no=4
5、) s.banji=temp; /赋予班级 no+; read=read.substr(i+1); s.dizhi=read; /赋予地址 if(s.name.size()0 /插入链表 in.close(); void insert_into_list(Student st) struct list*curr,*ne; curr=(struct list*)new(struct list); /申请空间 curr-student=st; ne=head; if(head=NULL) /如果头指针为空插入第一条数据 head=curr; curr-next=NULL; else while(n
6、e-next!=NULL) ne=ne-next;/遍历结构体,直到尾 ne-next=curr; curr-next=NULL; Txt文件才的储存形式如下: 所以, 能正确的读取所有数据在于字符串的分割, 当然用此种方法读到的数据全是字符 串, 只是本系统为学生通讯系统, 并不需要其他类型的数据, 如有必要, 字符串也可以转化。 就这样, 当文件按行读取完毕时, 链表中的每个结构体都包含有一个不同的学生类对象, 至此,链表已初始化完毕。 在程序接下来的运行过程中,对数据的操作就是直接操作链表的节点。 下面对系统功能进行介绍: i. 登陆系统: 通过欢迎界面后,将进入登陆方式选择界面,如图: ii. 若选择以普通用户身份登录系统,会出现以下界面: 普通用户的功能包括:1.增加数据;2.查询数据;3.浏览数据;4.数据统计 1) 增加数据功能的界面如下: 用户根据系统提示,对单个学生信息进行逐项输入,按回车键结束输入。除姓名