数据结构课程设计
文章目录
项目1:中国计算机设计大赛赛事统计
一.问题重述
【问题描述】
参加计算机设计大赛的n个学校编号为1~ n,赛事分成m个项目,项目的编号为1~m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。
【基本要求】
1)每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;
2)能统计各学校的总分;
3)可以按照学校编号或名称,学校的总分、各项目的总分排序输出;
4)可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;
5)数据存入文件并能随时查询
【设计要求】
1)输入数据形式和范围:可以输入学校的名称,赛事项目的名称。
2)输出形式:有中文提示,各学校分数为整数
3)界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,可以完成相关功能的要求。
4)存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。
【测试数据】
要求使用全部合法数据,整体非法数据,局部非法数据。进行程序测试,以保证程序的稳定。
【实现提示】
假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩。
二.问题分析
1.设置一个管理系统,实现统计总分、按照不同要求进行排序输出、可进行项目和学校的互查的操作。
2.设置合理的菜单,完成相应的要求。
3.将数据存入文档,并进行非法数据测试。
三.逻辑设计
【类别设计】
【Competition类】
包含:
学校基本信息、项目基本信息、成绩获得情况。
作用:
(1)实现初始化学校和项目的基本信
(2)实现赛后成绩统计。
(3)实现可查询功能。
【Array类】
包含:
项目编号、分数。
作用:
帮助实现项目与成绩分配间的过程
【Menu类】
(其实没必要写类,但是我类写顺手了,就这样吧。 )
包含:
菜单
作用:
展示菜单
【函数关系调用图】
【流程图】
四.物理设计
【类别详情】
(1)Competition类**
class Competition
{
public:
int get_m();
int get_n();
Competition();
Array array[200];
void Grade();
void S_sort();
void P_sort();
void S_prize();
void P_prize();
void Document();
private:
int Queue[50];
string P_name[10];
int m;
int P_Grade;
map<int, int, greater<int>> mapSchool;
map<int, int, greater<int>> mapProject[10];
string S_name[50];
int n;
int S_Grade[50];
int P_grade[50][10];
};
(2)Array类
class Array
{
public:
int p;
int s;
};
(3)Menu类
class Menu
{
public:
void menu();
};
五.结果分析
【错误输入的情况】
1.对菜单输入不存在的数值进行访问,出现提示:您输入的数值有误,请重新输入!
2.对某学校的某项目的获奖情况的功能输入不存在的数值进行访问,出现提示:未能查询到该学校编号,请重新输入!
3.对某项目的前三获奖学校的功能输入不存在的数值进行访问,出现提示:本届大赛未开通此项目,请您输入正确的项目编号!
项目2:校园导游咨询
一.问题重述
【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【测试数据】
以江苏科技大学长山校区为例。
【实现提示】
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网.顶点和边均含有相关信息.
二.问题分析
设计一个校园导航系统,给出自制地图,根据所给定的地图进行景点介绍及路径查询。
三.逻辑设计
【类别设计】
(1)view类
包含:
景点名称
景点编号
景点简介
作用:
为初始化景点项目而构建数组
(2)System类
包含:
路径
两景点间的长度
最短路径
作用:
初始化景点项目
运用弗洛伊德算法找寻最短路径
打印最短路径
【算法使用】
弗洛伊德算法
基本思想:
弗洛伊德算法定义了两个二维矩阵:
矩阵D记录顶点间的最小路径
例如D[0][3]= 10,说明顶点0 到 3 的最短路径为10;
矩阵P记录顶点间最小路径中的中转点
例如P[0][3]= 1 说明,0 到 3的最短路径轨迹为:0 -> 1 -> 3。
它通过3重循环,k为中转点,v为起点,w为终点,循环比较D[v][w] 和 D[v][k] + D[k][w] 最小值,如果D[v][k] + D[k][w] 为更小值,则把D[v][k] + D[k][w] 覆盖保存在D[v][w]中。
图示理解:
核心代码:
//这里是弗洛伊德算法的核心部分
//k为中间点
for(k = 0; k < G.vexnum; k++){
//v为起点
for(v = 0 ; v < G.vexnum; v++){
//w为终点
for(w =0; w < G.vexnum; w++){
if(D[v][w] > (D[v][k] + D[k][w])){
D[v][w] = D[v][k] + D[k][w];//更新最小路径
P[v][w] = P[v][k];//更新最小路径中间顶点
}
}
}
}
原文链接:https://blog.csdn.net/jeffleo/article/details/53349825
【校园地图】
江苏科技大学长山校区选取16个景点,具体详情如下:
路径的权重赋值如下:
【景点指南】
编号 | 名称 |
---|---|
1 | 西苑食堂 |
2 | 东苑食堂 |
3 | 北苑食堂 |
4 | 好友多超市 |
5 | 图书馆 |
6 | 经世楼 |
7 | 明德楼 |
8 | 笃学楼 |
9 | 文理大楼 |
10 | 西操场 |
11 | 东操场 |
12 | 文体中心 |
13 | 西区快递站 |
14 | 海韵湖 |
15 | 计算机学院楼 |
16 | 7号组团 |
【流程图】
【函数调用图】
四.物理设计
【类别详情】
(1)view类
class View
{
public:
char name[30];
int number;
char introduce[200];
};
(2)System类
class System
{
public:
void Init();
void Introduce();
void Floyd();
void Print(int i, int j);
void MinDistance();
View view[M_Vnum];
private:
int shortest[M_Vnum][M_Vnum];
int path[M_Vnum][M_Vnum];
int length[M_Vnum][M_Vnum];
};
五.结果分析
【错误输入的情况】
当输入非该校区所有的景点时,会进行提示:景点编号不存在,请重新输入!
项目3:算术表达式求解
一.问题重述
【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】
(30+270)/3-123
5+(9*(62-37)+15)*6
要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【实现提示】
可以设计以下辅助函数
status isNumber(char ReadInChar); //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 。
int TurnToInteger(char IntChar); // 将字符’0’.’9’ 转换为整数 9
二.问题分析
设计一个计算器,通过运用双栈法进行四则运算。
三.逻辑设计
本项目通过运用双栈法,一面存放数字,一面存放运算符,通过比较运算符优先级的大小进行适当的操作。同时要考虑到各种非法输入 eg: 除0、负数运算、运算符在一开始输入、运算符连续输入、左右括号不匹配…等问题
【流程图】
【函数调用关系图】
四.物理设计
int expr(const char*);
void Init(dStack_t**);
void operate(dStack_t*);
int IsOpr(char);
char Precede(char, char);
void PushNum(dStack_t*, int);
int PopNum(dStack_t*);
int GetTopNum(dStack_t*);
void PushOpr(dStack_t*, char);
char PopOpr(dStack_t*);
char GetTopOpr(dStack_t*);
五.结果分析