2018数据结构课程设计报告

声明:本文只是一份数据结构课程设计报告,可为各位的课设设计提供简明思路,但它不属于软件设计流程中任何一个环节的说明文档,请勿将其当成需求分析说明书做要求或使用。该项目的内容是展示在CMD上而非图形界面,现在因为工作原因已不再接课设单子,大学的课题在Github上基本全都能找得到(只要别整什么太离谱的),但如果想交流学习的话还是没问题的,QQ:2788636917。

一、引言

a) 编写目的

某大学软件工程专业的学生们在大二的时候都要做一份数据结构课程设计来检验自己的水平。为了凸显自己的能力,同学们所选的题目也是五花八门,令老师们看的头痛不已。今天这个课题,老师要求既要能快速浏览目前所有的课题和学生信息,又能对课题进行编辑修改,同时自带统计管理功能。该软件的使用者为该系统的开发者和负责课程设计的老师们。

b) 项目背景

该项目名称初步命名为:课程设计管理系统。分为六个模块:系统模块、数据插入模块、数据删除模块、数据修改模块、数据查询模块、数据库模块、数据模块和数据库连接模块。本项目的提出者和开发者均为计算机学院16级软件2班姚兴业。

c) 术语说明

一级界面:指菜单界面
二级界面:指所有直接通过一级界面进入的界面,也可称为信息类别选择界面
三级界面:指所有直接通过二级界面进入的界面,也可称为详细信息输入界面

d) 参考资料

在此处列出文档所引用的外部文档或其他项目资料

二、任务概述

a) 目标

本项目旨在开发出一个可以帮助教师们进行简单的课设项目管理和评分的帮助性软件

b) 运行环境

  • 系统需求:Windows 7及更高版本系统
  • 软件需求:安装有Microsoft Access 2007或以上版本
  • 硬件需求:该软件对硬件无明显需求,目前市面上主流的Windows系统计算机均可运行

c) 需求概述

本软件具备以下功能:
i. 添加功能: 通过系统向用户提供的选择界面来正确的添加学生信息或课程设计信息。在添加时将会限定学号和编号的唯一性,即当添加的学生学号或添加的课题编号重复时,系统将给出适当的提示并要求用户重新输入信息。
ii. 删除功能: 通过系统向用户提供的选择界面来帮助用户删除指定编号的信息。
iii. 修改功能: 用户将可以通过学号或编号来找到指定的学生或课题信息(如果它们存在的话),并通过系统提供的选择界面来对信息进行修改。
iv. 查询功能: 用户可以通过学号或编号来查询学生或者课题的信息,如果信息不存在,系统将会给出适当的提示。
v. 显示全部功能: 一键选择显示全部的学生信息或课题信息。
vi. 统计功能: 用户可以通过系统提供的选择界面来对当前已有的信息进行统计。
vii. 读取功能: 允许用户通过该功能向指定的Access数据库文件读取数据。
viii. 保存功能: 将当前数据保存至本地Access数据库文件中。

d) 条件与限制

本系统旨在方便老师们对数据的管理,同时为了能更有效地执行任务,用户应先将存在excel中的输入导入至Access数据库中以方便系统读取。

三、 总体设计

a) 处理流程

系统启动后将会直接进入主界面中,用户可以根据自己需要输入指令执行相应功能,在事务处理完毕后,用户可以通过退出指令退出系统。

b) 总体结构和模块

系统总体结构如下图所示:

这里写图片描述

c) 功能分配

i. 系统功能

  • 初始化系统
  • 刷新一级界面
  • 关闭系统

ii. 添加功能

  • 进入二级界面
  • 根据指令打开三级界面
  • 输入数据
  • 返回一级界面

iii. 删除功能

  • 进入二级界面
  • 根据指令打开三级界面
  • 确认编号/学号后删除数据
  • 返回一级界面

iv. 修改功能

  • 进入二级界面
  • 根据指令打开三级界面
  • 选择要修改的信息
  • 执行修改
  • 返回一级菜单

v. 查询功能

  • 进入二级菜单
  • 根据指令打开三级菜单
  • 根据编号/学号显示对应的信息
  • 返回一级菜单

vi. 显示全部功能

  • 进入二级菜单
  • 根据指令显示全部学生信息或课题信息

vii. 统计功能

  • 进入二级菜单
  • 根据指令进入三级菜单
  • 根据指令给出相关统计数据
  • 循环执行功能
  • 返回一级菜单

viii. 保存功能

  • 刷新界面
  • 确认是否保存
  • 执行相应功能
  • 返回一级菜单

ix. 读取功能

  • 刷新界面
  • 从Access数据库文件中读取数据
  • 刷新一级菜单

四、接口设计

a) 外部接口

i. 用户界面: 采用经典的Windows指令台风格,通过最简单的指令输入形式执行相应功能。
ii. 软件接口: 运行于Windows XP/7/8.1/10且具有Win32指令台的操作系统
iii. 硬件接口: 支持市面上常见的或更高档的微机和笔记本电脑。

b) 内部接口

i. 系统模块: 系统启动时自动调用,初始化界面后等待用户输入
ii. 数据插入模块: 由系统模块调用,启动后调用数据模块的增加功能
iii. 数据删除模块: 由系统模块调用,启动后调用数据模块的删除和查询功能
iv. 数据修改模块: 由系统模块调用,启动后调用数据模块的修改和查询功能
v. 数据查询模块: 由系统模块调用,启动后调用数据模块的查询功能
vi. 数据库模块: 由系统模块调用,启动后调用数据库连接模块。
vii. 数据库连接模块: 由数据库模块调用,启动后调用打开拦截、SQL语句查询、关闭连接等功能。
viii. 数据模块: 可由数据插入模块、数据删除模块、数据修改模块、数据查询模块等模块调用,启动后可根据需要调用增加、删除、修改、查询等功能。

五、 数据结构设计

a) 类结构设计

(此处仅展示方法签名,具体的实现写在相对应的.cpp文件中)

i. BinaryNode(二叉树节点)

template<class DataType>
struct BinaryNode
{
	DataType data;
	BinaryNode<DataType> *leftNode, *rightNode;
	BinaryNode<DataType>() { leftNode = rightNode = nullptr; }
	BinaryNode(DataType &element)
	{
		leftNode = rightNode = nullptr;
		data = element;
	};
};

ii. BinaryTree(二叉排序树)

template<class DataType>
class BinaryTree
{
private:
	BinaryNode<DataType> * root;
	DataType findMin(BinaryNode<DataType> *bt);
	void Release(BinaryNode<DataType> *bt);
	void PreOrder(BinaryNode<DataType> *bt) const;
	void InOrder(BinaryNode<DataType> *bt) const;
	void PostOrder(BinaryNode<DataType> *bt) const;
	BinaryNode<DataType>* isFind(DataType &element, BinaryNode<DataType> *bt);
	void Delete(DataType &element, BinaryNode<DataType> *bt);
	int length;
public:
	BinaryTree() { length = 0; root = NULL; }
	~BinaryTree() { Release(root); }
	void Release() { this->Release(root); }
	void PreOrder();
	void InOrder();
	void PostOrder();
	void Insert(DataType &element);
	DataType isFind(DataType &element);
	void Delete(DataType &element);

	int Length() { return this->length; }
};

iii. CurriculumDesign(课程设计实体类)

class CurriculumDesign
{
private:
	string design_name;
	string design_dataStruct;
	string author;
	Score design_score;
public:
	CurriculumDesign();
	CurriculumDesign(string design_name, string design_dataStruct = "NULL",
		string author = "NULL");
	~CurriculumDesign();

	string getInfo();
	string writeToFile();

	//getter & setter
	string get_design_name() { return this->design_name; }
	void set_design_name(string new_name) { this->design_name = new_name; }

	string get_design_dataStruct() { return this->design_dataStruct; }
	void set_design_dataStruct(string new_ds) { this->design_dataStruct = new_ds; }

	string get_author() { return this->author; }
	void set_author(string new_author) { this->author = new_author; }

	double get_design_score() { return this->design_score.get_total(); }
	void set_design_score(string type_score, double new_score);
	void set_design_score(Score score);

	// overload
	friend bool operator<(CurriculumDesign &left, CurriculumDesign &right);
	friend bool operator<(CurriculumDesign &left, double number);
	friend bool operator>(CurriculumDesign &left, CurriculumDesign &right);
	friend bool operator>(CurriculumDesign &left, double number);
	friend bool operator==(CurriculumDesign &left, CurriculumDesign &right);
	friend bool operator==(CurriculumDesign &left, double number);
	friend ostream &operator<<(ostream &out, CurriculumDesign &temp);
};

iv. Student(学生实体类)

class Student
{
private:
	string stu_name;
	int stu_ID;
	string stu_class;
	string design_name;
public:
	Student();
	Student(int stu_ID, string stu_name = "NULL", string stu_class = "NULL",
		string design_name = "NULL") :
		stu_ID(stu_ID), stu_name(stu_name), stu_class(stu_class),
		design_name(design_name) {}
	Student(const Student &obj);
	~Student();

	// getter & setter
	string get_stu_name() { return this->stu_name; }
	void set_stu_name(string new_name) { this->stu_name = new_name; }

	int get_stu_ID() { return this->stu_ID; }
	void set_stu_ID(int new_ID) { this->stu_ID = new_ID; }

	string get_stu_class() { return this->stu_class; }
	void set_stu_class(string new_class) { this->stu_class = new_class; }

	string get_design_name() { return this->design_name; }
	void set_design_name(string new_name) { this->design_name = new_name; }

	string getInfo();
	string writeToFile();

	// overload
	friend bool operator<(Student &left, Student &right);
	friend bool operator>(Student &left, Student &right);
	friend bool operator==(Student &left, Student &right);
	friend ostream &operator<<(ostream &out, Student &temp);
};

v. Management(管理类,Service部分)

/**
 * 每添加一个学生信息就对应添加一个课题信息,课题的作者即为学生名
 * 课题不可删除,每删除一个学生就对应删除一个课题
 * 学生的信息最初先添加在链表里,在课题打分后再添加到二叉树中进行排序
 * /

class Management
{
private:
	BinaryTree<CurriculumDesign> *design; // 存储所有已打分的课设信息
	StudentList *stu_list; // 存储所有学生的信息
	CurriculumDesignList *design_list; // 存储所有课设的信息
public:
	Management();
	~Management();

	void Insert(Student &stu, CurriculumDesign &design);
	bool Delete(int stu_ID);
	string Edit(int stu_ID, int new_info);
	string Edit(int stu_ID, string type_info, string new_info);
	void SearchAllStudent();
	void SearchAllDesign();
	bool Search(int stu_ID);
	bool Search(string design_name);

	Student Get(int stu_ID);
	CurriculumDesign Get(string design_name);
	string* InfoToFile_Design();
	string* InfoToFile_Student();
	int numOfStudent() { return stu_list->Length(); }
	int numOfDesign() { return design_list->Length(); }
	int numOfMarkedDesign();
	int numOfPassDesign();
	void Mark(int stu_ID, Score score);
	void MultipleMark();
	void RankingList();

	void ReadFile(string *str_stu, string *str_design);
};

vi. CurriculumDesignManagement (main函数部分方法)

Management admin; // 管理类实例化对象

void title(); // 标题
void footer(); // 结束语
void menu(); // 菜单
void Insert(); // 添加信息
void Delete(); // 删除信息
void Edit(); // 修改信息
void Search(); // 查询信息
int Calc_numOfStudent() { return admin.numOfStudent(); } // 统计学生总人数
int Calc_numOfMarkedDesign() { return admin.numOfMarkedDesign(); } // 统计已打分的课程数
int Calc_numOfPassDesign() { return admin.numOfPassDesign(); } // 统计及格人数
void SimpleMark();
void MultipleMark();
Score Grade();
void Save(); // 保存文件
void Load(); // 读取文件
bool isNumber(string str); // 判断str是否为纯数字串
int main();

b) 数据库结构设计

数据库采用Microsoft Access 2017,表结构设计如下:
i. Student

字段名类型字段长度备注
stu_namevarchar50主键
stu_classvarchar50
stu_IDvarchar50
design_namevarchar50

ii.CurriculumDesign

字段名类型字段长度备注
design_namevarchar50主键
design_dataStructvarchar50
authorvarchar50学生姓名
design_scorefloat-

c) 数据结构与程序的关系

i. 系统模块: 调用全局变量admin,根据用户输入的指令cmd来调用相应的函数
ii. 数据插入模块: 根据指令cmd调用admin中的两条插入函数。
iii. 数据删除模块: 根据指令cmd调用admin中的两条删除函数。
iv. 数据查询模块: 根据指令cmd调用admin中的四条查询函数。
v. 数据修改模块: 根据指令cmd调用admin中的两条编辑函数。

六、 运行设计

a) 运行模块的组合

所有类与函数均用英文全称命名,类内参数采用“[类名缩写][信息类型][数据名]”的格式来命名。如:学生的基本信息姓名的参数名为“stu_info_name”。

b) 运行控制

本软件控制流程如下:首先由用户启动软件,之后根据屏幕上的提示输入指令,系统根据指令触发事件及调用相关模块。

c) 运行时间

每个功能都快的感受不出来

七、 出错设计处理

a) 本软件在系统关键处采用try-catch代码块将危险代码包围起来,保证用户触发异常时系统可以正常运行下去。
b) 在用户执行删除或修改等破坏性操作时,系统将会提供确认机制。

八、 安全保密设计

此处留作日后使用,用户安全与软件安全相关部分均需记载于此。

九、 维护设计

本软件完全依照RUP过程开发并充分考虑了软件的可维护性,详细编写了概要设计文档,以利于未来的二次开发。

十、GitHub链接

有鉴于有人找我要这份课设的代码,故我将项目post到了我的Github项目中,需要的话直接clone下来就好,使用VS打开.sln文件即可加载整个项目,不过由于数据库已经丢失了,相关的部分可能需要同学们自己重新设计。

课程设计管理系统(https://github.com/w8692736/CurriculumDesign.git)

  • 20
    点赞
  • 175
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值