资源描述
学生考勤管理信息系统课程设计
———————————————————————————————— 作者:
———————————————————————————————— 日期:
2
个人收集整理 勿做商业用途
课程设计说明书
题目
学生考勤管理系统
系(部)
计算机科学与技术系
专业(班级)
10计科一班
姓名
学号
指导教师
起止日期
课 程 设 计 任 务 书
课程
数据结构课程设计
题目
序号
12
主
要
内
容
A
要
求
工
作
计
划
及
进
度
1. 14周星期一:
选题、交分组名单和课程设计题目;收集资料、需求分析;确定目标、设计方案并选择方案;系统设计;
2. 14周星期一至14周星期四:
程序设计;撰写课程设计报告;
3. 14周星期五:
提交课程设计报告,汇报演示。
指导教师签字
2010年11月30日
教研室审定意见
签字
2010年11 月 30 日
计划时间
指导老师
学生
课程设计的考核方式及评分方法
1) 考核方式
n 课程设计结束时,在机房当场验收。
n 教师提供测试数据,检查运行结果是否正确。
n 回答教师提出的问题。
n 学生提交课程设计文档(A4纸打印)
2) 评分方法
论文考核标准:参考《计算机系课程设计任务书》
论文:40%,软件:40%,答辩:20%
指导教师签名: 日期:
教研室主任签名: 日期:
系主任签名: 日期:
长沙学院课程设计鉴定表
姓名
学号
专业
计算机科学与技术
班级
10计科
设计题目
指导教师
王俊
指导教师意见:
评定等级: 教师签名: 日期:
答辩小组意见:
评定等级: 答辩小组长签名: 日期:
教研室意见:
教研室主任签名: 日期:
系(部)意见:
系主任签名: 日期:
说明
课程设计成绩分“优秀"、“良好"、“及格"、“不及格”四类;
摘要
本次课程设计是Android文件管理器
本学生考勤管理系统利用C语言,采用了数据结构程序设计思想以及文件管理的使用。拟一个简单的文件管理系统。树型结构,目录下可以是目录,也可以是文件,文件系统采用二叉树型存储结构,目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开,可实现文件目录的创建,显示,删除,改变,文件的创建,删除。对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止.用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
关键词:文件管理,二叉树存储结构,函数实现
目录
1 设计内容与要求 …………………………………………………………………………7
2.设计说明 …………………………………………………………………………………8
2。1 问题描述与功能设计………………………………………………………………8
2。2 算法与数据结构……………………………………………………………………9
2。3 函数定义………………………………………………………………………………11
2。4 测试……………………………………………………………………………………16
3 总结……………………………………………………………………………………………18
参考文献 ………………………………………………………………………………………18
附录A 源代码………………………………………………………………………………19
1设计内容与要求
设计题目:Android文件管理器
1.基本要求:
(1) 要求用数据结构二叉树树形结构思想来完成设计;
(2) 要求树型结构,目录下可以是目录,也可以是文件
(3) 以树的形式显示所有的文件和文件
(4) 通过输入文件名,实现文件搜索的功能
(5) 在树中增加一个新文件,正确的显示出来
(6) 在树中删除一个文件,正确的显示
(7) 输入一个文件名,实现文件搜索功能
(8) 程序调试通过后,完成程序文档的处理,加必要的注释
高级要求:
(1)显示文件的大小、创建日期,修改时间
(2)输入一个文件名,实现文件搜索功能
2. 创新要求
在基本要求达到后,可以进行创新设计。
3.设计方法和基本原理
1)问题描述:
Android手机上默认没有文件管理器,因此需要设计一个文件管理器,要求以树形结构显示每个文件和文件夹,并且可以方便的对文件或文件夹进行增,删操作,此外还可以将文件移至任意文件夹中,请用C实现主要结构和算法
2)设计思想
1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个简单的单用户文件系统。
2.文件存储空间的分配采用显式链接分配。为了实现创建和删除文件必须要有一棵初始的文件树存在,以便在文件树的根节点下实现创建和删除文件.
3。 数据结构与树结构。数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.
树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树中每个分叉点称为结点,起始结点称为树根,任意两个结点间的连接关系称为树枝,结点下面不再有分枝称为树叶。结点的前趋结点称为该结点的”双亲",结点的后趋结点称为该结点的"孩子”,同一结点的”孩子"之间互称”兄弟”.
4.文件目录结构采用多级目录结构。为了简单起见,可以使用文件结构体,结构体内容包括:文件名,文件目录识别标示,文件链接数,以及他的左孩子右孩子左兄弟右兄弟指
5. 要有分解函数对输入的命令进行分解.以识别那部分是哪部分是命令,哪部分是路径和文件名。
6。 最后要有执行函数。来执行输入的创建文件命令。
设计工作量:
(1)软件设计:完成问题陈述中所提到的所有需求功能.
(2)论文:要求撰写不少于3000个文字的文档,详细说明各阶段具体要求。
工作计划:13—14周
安排两周时间进行课程设计,软件开发步骤如下,第一周完成1~6,第二周完成7~10,论文同步进行;
(1)写出需求分析(做什么)
(2)分析系统中的各个实体之间的关系及其属性和行为
(3)设计系统的函数层次
(4)完成函数中函数的描述(包括属性和方法)
(5)完成类中各个成员函数的定义和实现
(6)代码编写
(7)功能调试
(8)撰写课程设计报告书
(9)答辩
2设计说明
2.1 问题描述与功能设计
1)问题描述:Android手机上默认没有文件管理器,因此需要设计一个文件管理器,要求以树形结构显示每个文件和文件夹,并且可以方便的对文件或文件夹进行增,删操作,此外还可以将文件移至任意文件夹中
2)功能设计:
1分析系统中的各个实体之间的关系及其属性和行为;
2设计系统的类层次,充分运用C++的复合、继承、多态等机制进行软件渐增式开发;
3完成类层次中各个类的描述(包括属性和方法)和具体实现用户界面需求
用户界面需求
对于一个好的软件有一个友好的用户界面是很重要的。用户界面应尽量做得简单、层次清晰明了
对考勤管理系统应实现的功能描述如下:
1用户信息管理
用户信息管理的基本功能是添加、修改、删除、浏览用户详细信息。
2信息管理
包括缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假及旷课)
3查询功能
考勤人员能够按学号、姓名查询某学生的考勤记录或按专业、班级查询某个班级的考勤记录
4统计功能
考勤人员可以统计学生的考勤记录
5修改功能
考勤人员具有修改学生考勤记录、如请假、旷课等记录
2.2 算法与数据结构
2.3 函数定义
//student.h文件中student类的定义
class Student{
public:
// 学生信息
char stuName[20];
int stuNum;
char stuClass[20];
// 缺课信息
char courseName[20];
int courseNum; // 第几节课
char courseType[20];
// 缺课日期
int year;
int month;
int day;
/*
* 创建链表用来存储学生信息
*/
bool CreateList(node &L)
{
L = new Node; // 动态分配内存,创建链表头结点
if(!L)
{
// 内存分配失败
return false;
}
L—>next = NULL; // 创建空链表成功,头结点指针域为空
return true;
}
//学生缺课类型
int chidaoCount = 0;//迟到
int zaotuiCount = 0; //早退
int kuangkeCount = 0; //旷课
int qingjiaCount = 0; //请假
char *queke[4] = {"迟到”, "早退", ”旷课", ”请假"};
2。4 界面设计
while(1)
{
cout<<"===========欢迎进入学生考勤管理系统====================\n”;
cout〈〈”1:新增学生信息(非降序插入) 2:按学号删除学生信息\n";
cout<〈”3:按学号修改学生信息 4:输出学生信息列表\n";
cout<<”5:按学号查询输出学生信息\n”;
cout〈<”6:统计学生缺课信息列表\n”;
cout〈<"请选择要执行的功能指令:(菜单指令如上)"<〈endl;
cout<<"=======================================================\n";
cin〉〉order;
switch(order)
{
case 1:
cout〈〈”==========新增学生信息面板(非降序插入)=============\n";
InputStu(stu);
InsertAscend(head, stu);
cout<<”是否返回系统菜单?(是输入0,否输入1退出系统)\n";
cin>〉k;
if(k)
{cout<<"您已退出学生考勤管理系统\n";
return 0;
}
break;
case 2:
cout〈〈"==========按学号删除学生信息=============\n";
cout〈<"请输入要删除的学生的学号:”;
cin〉〉stuNum;
DelFromNum(head, stuNum);
cout〈〈"是否返回系统菜单?(是输入0,否输入1退出系统)\n”;
cin>>k;
if(k)
{cout<〈”您已退出学生考勤管理系统\n";
return 0;
}
break;
case 3:
cout<<"==========按学号修改学生信息面板=============\n";
cout<<”请输入待修改的学生的工号:”;
cin>>stuNum;
FindFromNum(head, stuNum, preNode, curNode);
Modify(curNode->data);
cout〈<”是否返回系统菜单?(是输入0,否输入1退出系统)\n”;
cin〉〉k;
if(k)
{
cout<<”您已退出学生考勤管理系统\n”;
return 0;
}
break;
case 4:
cout<〈”==========输出学生信息列表面板=============\n”;
OutputStu(head);
cout<〈”是否返回系统菜单?(是输入0,否输入1退出系统)\n”;
cin>〉k;
if(k)
{
cout〈<"您已退出学生考勤管理系统\n”;
return 0;
}
break;
case 5:
cout〈<"==========按学号查询输出学生信息=============\n”;
cout<<"请输入要查询的学生的学号:”;
cin〉〉stuNum;
FindFromNum(head, stuNum, preNode, curNode);
cout〈〈setw(10)<〈”学号"<<setw(10)〈〈”姓名"<<setw(10)<<"班级"
<〈setw(10)<〈"课程名”〈〈setw(10)<〈”第几节”<<setw(10)<〈"缺课类型"
<〈setw(18)〈〈”日期”<〈endl;
print(curNode—>data);
cout<<"是否返回系统菜单?(是输入0,否输入1退出系统)\n”;
cin〉>k;
if(k)
{
cout<<"您已退出学生考勤管理系统\n";
return 0;
}
break;
case 6:
cout<<”=========统计学生缺课信息列表面板==========\n";
preNode = head;
while(preNode)
{
curNode = preNode—>next;
if(curNode && !strcmp(curNode-〉data。courseType, queke[0]))
chidaoCount++;
if(curNode && !strcmp(curNode-〉data。courseType, queke[1]))
zaotuiCount++;
if(curNode && !strcmp(curNode->data.courseType, queke[2]))
kuangkeCount++;
if(curNode && !strcmp(curNode->data.courseType, queke[3]))
qingjiaCount++;
preNode = curNode;
}
cout<<"迟到的学生有 "<<chidaoCount<<" 个!"<<endl;
cout<〈”早退的学生有 ”<〈zaotuiCount<<" 个!”<〈endl;
cout〈<"旷课的学生有 "<〈kuangkeCount<<" 个!"〈<endl;
cout〈〈”请假的学生有 "<〈qingjiaCount<〈" 个!”〈〈endl;
cout<〈"是否返回系统菜单?(是输入0,否输入1退出系统)\n”;
cin〉〉k;
if(k)
{
cout<<"您已退出学生考勤管理系统\n";
return 0;
}
break;
default:
cout〈<"输入不合法\n";
cout<<"是否返回系统菜单?(是输入0,否输入1退出系统)\n";
cin>〉k;
if(k)
{
cout<<"您已退出学生考勤管理系统\n”;
return 0;
}
break;
}
}
}
return 0;
return 0;
}
2。5 测试
输入学生信息
录入学生信息
查询学生信息
修改学生信息
统计学生信息
3 总结
本次实验是我上大学以来做的第二个课程设计,虽然平时也做过许多的实验,但是题目刚拿到手时仍然是手足无措,不知从何下手,首先面对的是编写程序的问题,面向对象的程序设计思想是我们这学期C++课程的主要内容,但我的底子薄,掌握的不是很好,所以运用起来有些困难;其次是以前没做过课程设计,有关课程设计方面的一些问题,例如,课程设计都包括哪些内容,需要写些什么,我都不是非常清楚。后来在老师、同学以及班导的帮助下,才对此有了一定的了解,有了属于自己的看法,不过程序编写过程中我也遇到了许多的麻烦,例如链表的使用,是上个学期最后的内容,不是很熟悉,经过反复的看书,终于得到了解决!
这次的课程设计是我真正发现在课堂上听懂是一回事,而当自己真正动手做时又是另外一回事。虽然最后问题都得到的解决,但未能实现保存文件,没能达到老师的要求,这也是本次课程设计的不足之处。
通过本次的课程设计,使我能够进一步掌握用程序设计语言解决实际问题的方法,在操作当中把所学到的用于实际的编程里去。使我能够提高分析问题、查阅资料、吸收新知识的能力,在分析解决问题时比以前有了很大的进步,一些常用的知识和一些常规的错误都能够解决。我认为实践周的程序设计是给我们学习的一个大好机会,使我们在这样的机会里学到了一定的知识,毕竟理论要通过实践来锻炼,也只有自己参与了这样的一个锻炼,才能更好的发现自己的不足并加以改进和完善!我清楚的认识到自己在这方面的不足之处,在这方面可以说欠缺的知识还很多很多,不能编出完全符合要求的程序。在以后的学习中我会更加努力,争取能编出更加符合要求的程序,给自己的课程设计交上一份满意的答卷,也给自己一点小小的信心!
最后感谢老师、同学、班导、学长的帮助,谢谢你们!!!
参考文献
[1] 钱能。 C++程序设计教程[M]. 北京:清华大学出版社,2005:315—324,415-418,423。
[2] 刘瑞新. Visual C++面向对象程序设计教程[M]。 北京:机械工业出版社,2005。
附录A 源代码
//student。h文件
#include〈string.h〉
class Student{
public:
// 学生信息
char stuName[20];
int stuNum;
char stuClass[20];
// 缺课信息
char courseName[20];//缺课名称
int courseNum; // 第几节课
char courseType[20];//缺课类型
// 缺课日期
int year;
int month;
int day;
Student()
{
memset(stuName, 0, sizeof(stuName));
stuNum = 0;
memset(stuClass, 0, sizeof(stuClass));
memset(courseName, 0, sizeof(courseName));
courseNum = 0;
memset(courseType, 0, sizeof(courseType));
year = 0;
month = 0;
day = 0;
}
~Student()
{
}
};
//studentManage。h文件
#include ”Student。h"
#include 〈iostream.h>
#include 〈iomanip.h>
//定义结点类型
struct Node
{
Student data;
Node *next;
};
typedef Node *node; // 类型定义node为指向Node结构的指针类型
/*
* 创建链表用来存储学生信息
*/
bool CreateList(node &L)
{
L = new Node; // 动态分配内存,创建链表头结点
if(!L)
{
// 内存分配失败
return false;
}
L—〉next = NULL; // 创建空链表成功,头结点指针域为空
return true;
}
// 定义输入学生信息的方法
void InputStu(Student &stu)
{
cout<〈”请输入学号:”;
cin〉>stu。stuNum;
cout〈〈”请输入学生姓名:”;
cin〉>stu.stuName;
cout<<”请输入学生班级:”;
cin〉>stu。stuClass;
cout〈〈"请输入学生缺课名称:";
cin>>stu。courseName;
cout〈<"请输入学生缺的第几节课:";
cin>〉stu。courseNum;
cout〈〈”请输入学生缺课类型:”;
cin〉〉stu.courseType;
cout〈〈"请输入学生缺课日期:"<〈endl;
cout〈〈"请输入年:";
cin〉>stu.year;
cout〈〈"请输入月:";
cin〉>stu。month;
cout〈<”请输入日:”;
cin>〉stu。day;
}
// 添加结点,非降序插入学生的信息
void InsertAscend(node L, Student stu)
{
node preNode = L; // preNode指向链表L的头结点
node curNode = L—〉next; // curNode指向链表L的第一个结点
// 第一个结点不为空,且worker.num大于curNode—>data.num,则执行循环
while(curNode && (stu.stuNum > curNode—〉data。stuNum))
{
preNode = curNode;
curNode = curNode—〉next;
}
// 插入新结点
preNode-〉next = new Node;
preNode—〉next-〉data = stu;
preNode->next—〉next = curNode;
}
// 打印一个student的信息
void print(Student stu)
{
cout〈<setw(10)<〈stu。stuNum〈<setw(10)〈<stu。stuName<〈setw(10)〈〈stu。stuClass
〈〈setw(10)〈<stu.courseName〈〈setw(10)<〈stu.courseNum〈<setw(10)〈<stu。courseType
〈<setw(10)〈〈stu。year〈〈”年"<<stu.month<〈"月"〈〈stu。day〈〈”日"〈<endl;
}
// 输出学生信息列表
void OutputStu(node L)
{
node tmp = L—>next;
cout〈〈setw(10)<〈"学号"<<setw(10)〈<”姓名"〈<setw(10)<<”班级”
〈<setw(10)<〈"课程名”〈〈setw(10)<<"第几节”<〈setw(10)〈<"缺课类型"
〈<setw(18)〈<”日期"〈<endl;
while(tmp)
{
print(tmp->data);
tmp = tmp—>next;
}
}
// 按学号号查找,用curNode返回查找到的结点的指针
// preNode指向curNode所指向的结点的前面一个结点
bool FindFromNum(node L, int stuNum, node &preNode, node &curNode)
{
preNode = L;
while(preNode)
{
curNode = preNode-〉next;
// 链表是按学号号非降序添加结点建立的
// curNode->data。num大于num则不需要再往后遍历
if(curNode && (curNode->data。stuNum 〉 stuNum))
break;
if(curNode && (stuNum == curNode—〉data.stuNum)) // 找到匹配的结点
return true;
preNode = curNode; // preNode指向下一个结点
}
return false;
}
// 按学号号删除结点
bool DelFromNum(node L, int stuNum)
{
node preNode, curNode;
if(FindFromNum(L, stuNum, preNode, curNode)) // 用curNode返回要删除的结点
{
// 删除结点
preNode-〉next = curNode-〉next;
delete curNode;
return true;
}
return false;
}
// 修改学生信息
void Modify(Student &stu)
{
InputStu(stu);
}
// 按学生缺课类型查找,用curNode返回查找到的结点的指针
// preNode指向curNode所指向的结点的前面一个结点
bool FindFromName(node L, char courseType[], node &preNode, node &curNode)
{
preNode = L;
while(preNode)
{
curNode = preNode-〉next;
if(curNode && !strcmp(curNode—>data.courseType, courseType)) // 找到与courseType匹配的结点
return true;
preNode = curNode;
}
return false;
}
//studentManage.cpp文件
#include "StudentManage。h"
int main()
{
int n, i, k;
int stuNum; // 学号
char stuName[20];
char stuType[20];
node head, preNode, curNode;
Student stu;
int order;
int chidaoCount = 0;
int zaotuiCount = 0;
int kuangkeCount = 0;
int qingjiaCount = 0;
char *queke[4] = {”迟到", ”早退", "旷课”, ”请假”};
if(CreateList(head))
{
cout<<”请输入待输入信息的学生个数:";
cin>>n;
for(i=0; i<n; i++)
{
cout<<"请输入第 "<〈i+1<〈"个学生的信息\n";
InputStu(stu);
InsertAscend(head, stu);
}
cout〈〈"您输入了 "〈<n〈〈" 个学生的信息\n”;
while(1)
{
cout<〈”===========欢迎进入学生考勤管理系统====================\n”;
cout〈〈”1:新增学生信息(非降序插入) 2:按学号删除学生信息\n”;
cout〈<”3:按学号修改学生信息 4:输出学生信息列表\n";
cout<<"5:按学号查询输出学生信息\n";
cout<〈"6:统计学生缺课信息列表\n”;
cout<<”请选择要执行的功能指令:(菜单指令如上)”<<endl;
cout<<”=======================================================\n";
cin〉>order;
switch(order)
{
case 1:
cout〈<"==========新增学生信息面板(非降序插入)=============\n";
InputStu(stu);
InsertAscend(head, stu);
cout<〈"是否返回系统菜单?(是输入0,否输入1退出系统)\n";
cin>〉k;
if(k)
{
cout<<"您已退出学生考勤管理系统\n”;
return 0;
}
break;
case 2:
cout<〈”==========按学号删除学生信息=============\n";
cout<〈”请输入要删除的学生的学号:";
cin>>stuNum;
DelFromNum(head, stuNum);
cout<<”是否返回系统菜单?(是输入0,否输入1退出系统)\n”;
cin>>k;
if(k)
{
cout<〈"您已退出学生考勤管理系统\n”;
return 0;
}
break;
case 3:
cout〈〈”==========按学号修改学生信息面板=============\n”;
cout〈<”请输入待修改的学生的工号:";
cin>>stuNum;
FindFromNum(head, stuNum, preNode, curNode);
Modify(curNode—>data);
cout〈〈”是否返回系统菜单?(是输入0,否输入1退出系统)\n";
cin>>k;
if(k)
{
cout〈<"您已退出学生考勤管理系统\n";
return 0;
}
break;
case 4:
cout〈〈"==========输出学生信息列表面板=============\n”;
OutputStu(head);
cout〈〈"是否返回系统菜单?(是输入0,否输入1退出系统)\n";
cin>〉k;
if(k)
{
cout<〈"您已退出学生考勤管理系统\n";
return 0;
}
break;
case 5:
cout<<”==========按学号查询输出学生信息=============\n”;
cout<<”请输入要查询的学生的学号:";
cin〉>stuNum;
FindFromNum(head, stuNum, preNode, curNode);
cout〈〈setw(10)〈〈”学号”<<setw(10)<<"姓名"〈<setw(10)〈〈”班级”
〈<setw(10)〈<”课程名"〈<setw(10)<〈”第几节”<〈setw(10)<<”缺课类型”
〈<setw(18)〈<"日期”<〈endl;
print(curNode—〉data);
cout<〈"是否返回系统菜单?(是输入0,否输入1退出系统)\n";
cin〉〉k;
if(k)
{
cout<<”您已退出学生考勤管理系统\n”;
return 0;
}
break;
case 6:
cout<〈"=========统计学生缺课信息列表面板==========\n";
preNode = head;
while(preNode)
{
curNode = preNode—〉next;
if(curNode && !strcmp(curNode->data。courseType, queke[0]))
chidaoCount++;
if(curNode && !strcmp(curNode->data。courseType, queke[1]))
zaotuiCount++;
if(curNode && !strcmp(curNode—>data.courseType, queke[2]))
kuangkeCount++;
if(c
展开阅读全文