目录
项目一:计算机设计大赛赛事统计
- 1 问题描述及要求
- 2 问题分析和任务认定
- 3 逻辑设计
- 4 物理设计
项目二:校园导游咨询
- 1 问题描述及要求
- 2 问题分析和任务认定
- 3 逻辑设计
- 4 物理设计
项目三: 算数表达式求解
- 1 问题描述及要求
- 2 问题分析和任务认定
- 3 逻辑设计
- 4 物理设计
项目一:计算机设计大赛赛事统计
一、问题描述及要求
【问题描述】
参加计算机设计大赛的n个学校编号为1~n,赛事分成m个项目,项目的编号为1~m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。
【基本要求】
1)每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;
2)能统计各学校的总分;
3)可以按照学校编号或名称查询,学校的总分、各项目的总分排序输出;
4)可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;
5)数据存入文件并能随时查询
【设计要求】
1)输入数据形式和范围:可以输入学校的名称,赛事项目的名称。
2)输出形式:有中文提示,各学校分数为整数
3)界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,完成相关功能的要求。
4)存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。
【测试数据】
要求使用全部合法数据,整体非法数据,局部非法数据。进行程序测试,以保证程序的稳定。
【实现提示】
假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩。
二、问题分析和任务定义
做什么?
该题要求做一个赛事统计程序,通过输入(或者随机数)初始学校编号,项目的编号,名称,以及比赛成绩,编写函数,使程序主要实现以下功能:
1)统计各个学校总分;
2)按学校的编码或者名称查询学校的总分和各项目的总分
3)按照学校编号查询学校获奖情况
4)按照项目编号查询前三名的学校
5)数据存入文件并随时查询
限制条件?
1)3<赛事项目数量<=10
2)学校名称长度不超过20个字符
3)每个学校每个参赛队伍只能参加一个赛事项目
4)输出形式:有中文提示,各学校分数为整数
三、逻辑设计
1 数据类型
- Team结构体 表示参赛队伍,包括:队伍编号 参加的项目id 参赛成绩
- School结构体 表示参赛学校,包括 :学校的名称 编号 参赛的队伍 学校的总分 各项 目的总分
- projectype结构体 表示比赛项目,包括:项目编号 项目名称
struct team {
int id; //队伍id
int projectid;//该队伍参赛的项目
int projectscores;//项目得分
};
struct school
{
int id;//学校id
string name;//学校名称
team A[7];// 每所学校6支参赛队伍
int totalscores;//总分
int totalprojectscores[6];//各个项目的分数
};
struct projectype {
int id; //项目id
string name;//项目名称
};
2 主要模块
- 菜单界面 为每个操作设立菜单,根据菜单提示,进行操作的选择,完成相关功能的实现
- 输入操作 对相关数据进行初始化,例如学校名称,项目名称,项目得分等等
- 信息处理 包括对竞赛成绩进行排序产生获奖名单,根据学校编号查询各个学校总分,获奖 情况。
- 信息存储 将输入的信息保存至文件中。
- 输出操作 将用户查询的信息进行输出,例如学校的总分,项目前三名的学校等信息。
3 基本操作说明
void initialize() | 初始化参赛学校,项目,队伍等信息,随机数生成分数 |
void get_schoolstotalscores() | 获取每个学校的总分 |
void schooltotalscores(int i) | 学校编号查学校总分 |
void print_projectscores(int i) | 学校编号查学校各个项目总分排序输出 |
int getschoolid(string s) | 由学校的名字得到学校的编号 |
void schooltotalscores_byname(string name) | 由学校名称查询学校总分 |
void print_projectscores_byname(string name) | 由学校的名称查询学校的各项目的排列输出 |
void isaward(int i ,int j) | 根据学校编号查询某个项目的获奖情况 |
void awardschool(int i) | 根据项目编号查询取得前三名的学校 |
void readfile() | 文件查询 |
函数调用关系:
四 物理设计
Initialize函数:
- 利用for循环和随机数初始化学校的编号,名称,项目的编号,名称,学校队伍的编号,项目得分。
- 为保证每个项目至少有十支队伍参加,队伍进行项目初始时,固定分配每个项目有一个队伍参加,剩下一个队伍随机产生参加的项目。这样十所学校,每个项目至少十支队伍参赛。
- 项目的总分将项目各个学校该项目成绩累加
- 学校总分,将队伍的项目成绩累加
void schooltotalscores(int i)
- 判断学校编号是否符合1-10的要求;
- 符合则输出学校总分;
- 否则重新输入,重复2操作。
void print_projectscores(int i)
- 检查学校编号是否符合1-10的要求;
- 若符合,创建pair<分数,编号> 结构,vector容器存储,用sort函数排序,最后将编号和分数输出;
- 否则重新输入编号,重复2操作。
void isaward(int i ,int j)
- 检查学校编号和项目编号是否输入正确
- 若正确,建立一个标志数组,初始化都为0;
- 对参加该项目的队伍进行遍历,如果分数大于当前队伍编号则加1。
- 若当前队伍对应的flag的值小于3,则获奖了,位次为flag+1;
- 否则输出未获奖
3. 否则重新输入编号,重复2操作。
void awardschool(int i)
- 输入项目编号,并进行检查。
- 若正确,遍历参加该项目的队伍,对成绩进行排序,取前三名输出学校名字
- 否则重新输入编号,重复2操作。
项目二:校园导游咨询
一、问题描述及要求
【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1) 设计你所在学校的校园平面图,所含少景点不于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【测试数据】
以江苏科技大学长山校区为例。
【实现提示】
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网,顶点和边均含有相关信息.
二、问题分析和任务认定
做什么?
本题设计一个校园导游咨询,以江科大长山校区为例,实现:1 任意景点相关信息的查询 2任意景点之间的最短路径。
设计的基本步骤:
1)获取江科大的景点,包括景点之间的距离。
2)创建景点的结构体,包括景点的名称,代号,简介等信息。
3)以景点为基础创建校园平面图,包括景点个数,边的个数,景点的邻接矩阵。
4)以图为基础求各景点的最短路径。
限制条件?
1)景点不于10个
2)校园的道路是双向通行的
三、逻辑设计
1 数据结构
struct node {
string name; //景点名称
string intro;//景点的简介
int code; //代号
};
struct undigraph {
int nodenum; //顶点数
int edgenum; //边数
node vertex[MNum]; //顶点
int matrix[MNum][MNum];//邻接矩阵
char topo[MNum][MNum];//拓扑图
};
2 基本操作说明:
struct node | 景点的结构体 |
struct undigraph | 无向图的结构体 |
int Init(undigraph & Tu) | 初始化无向图 |
void ShortestPath(undigraph G, string a1,string a2) | 以景点名称求最短路径 |
void Show_information(undigraph Tu) | 查询景点信息 |
函数关系调用图:
四、物理设计
Dijstra算法:
1. 初始化两个集合,S集合和V集合。
S集合初始只有源顶点即顶点A,V集合初始为除了源顶点以外的其他所有顶点,dist字典值都为-1;紧接着,根据邻接矩阵,找出与A存在边的顶点list,遍历list,依次更新dist字典(比如list={B,C},则依次更新字典键为B,C 的距离值),求出与 A 距离最近的顶点,并从V集合中移除到S集合中;
- 抓出S集合的最后一个元素,根据邻接矩阵,找出V集合中与之存在边的顶点list,遍历list,求出与之距离最小的顶点,并从V集合中移除到S集合中。
3 dist更新,分情况讨论,
1)如果遍历到的顶点不是与之最小的顶点,则直接更新dist字典,比如list={D,E},则依次更新字典键为D,E的距离值,
2)如果遍历到的顶点是与之最小的顶点,则需要判断dist[此顶点]与当前的距离,如果后者小,才更新dist[此顶点],否则不更新。
4. 重复2和3,直到V集合元素为空为止。
项目三:算数表达式求解
一、问题描述及要求
【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】
(30+2*70)/3-12*3
5+(9*(62-37)+15)*6
要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【实现提示】
可以设计以下辅助函数
status isNumber(char ReadInChar); //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 。
int TurnToInteger(char IntChar); // 将字符’0’.’9’ 转换为整数 9
二、问题分析和任务认定
做什么?
本题要求设计一个整数四则运算的表达式计算器,包含括号,可多层嵌入。
限制条件?
1)整数类型的四则运算
2)括号可以多层嵌入
三、逻辑设计
1. 设计思路
运用两个栈,一个数字栈(存放数字),一个符号栈(存放运算符)。
规则:
1)如果输入的是数字就直接压数字栈
2)如果输入的是左括号就压符号栈
3)如果输入右括号寻找左括号,直至将括号间的符号全部弹出
4)如果输入的是+-,就要求从符号栈栈顶开始,把所有优先级大于等于+-的符号弹出进行运算
5)如果输入的是“*” “/”,就看符号栈栈顶优先级是否等于* /,是的话就弹出。
2 基本操作说明
void menu() | 菜单 |
void clear() | 清屏 |
void quit() | 退出程序 |
void calculate(stack<int> &num, char s) | 一次计算 |
int priority(char s) | 符号优先级的设定 |
void function(char *a) | 对两个栈进行入栈出栈以及计算 |
bool isNumber(char a) | 判断是否是数字 |
int error(char * a) | 纠错 |
函数调用关系图:
四、物理设计
void function(char *a)函数:
1)如果输入的是数字就直接压数字栈。
2)如果输入的是左括号就压符号栈。
3)如果输入右括号寻找左括号,直至将括号间的符号全部弹出。
4)如果输入的是+-,就要求从符号栈栈顶开始,把所有优先级大于等于+-的符号弹出进行运算。
5)如果输入的是“*” “/”,就看符号栈栈顶优先级是否等于* /,是的话就弹出。