数据结构课程设计任务预习报告

项目1:中国计算机设计大赛赛事统计

1、问题分析和任务定义

【问题描述】

  参加计算机设计大赛的n个学校编号为1~n,赛事分成m个项目,项目的编号为1~m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。

【基本要求】

1)每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;

2)能统计各学校的总分;

3)可以按照学校编号或名称,学校的总分、各项目的总分排序输出;

4)可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;

5)数据存入文件并能随时查询

【设计要求】

1)输入数据形式和范围:可以输入学校的名称,赛事项目的名称。

2)输出形式:有中文提示,各学校分数为整数

3)界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,可以完成相关功能的要求。

4)存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。

【测试数据】

  要求使用全部合法数据,整体非法数据,局部非法数据。进行程序测试,以保证程序的稳定。

【实现提示】

  假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩。

2、逻辑设计

1、所需功能

学校ID、队伍名称、参加项目、所得分数。

定义一个统计各学校总分的函数

定义一个学校总分排名函数

定义一个某学校所有项目分数排名的函数

定义一个某学校某个项目的获奖情况(是否前三)

定义一个某项目的获奖情况(排名前三)

2、数据结构选择

定义一个School类,作为每个学校的数据结构,内含学校ID,学校名称,学校参赛队伍个数,总分等字段;

定义一个Team类,作为每支队伍的数据结构,内含所属学校ID,队伍名称,参加项目和所得分数等字段;

定义一个Event类,作为每个项目的数据结构,内含一个存储Team类对象的集合表示参加该项目的队伍以及项目id和名称;

定义一个类,作为功能实现的主类。其内容有,一个存储所有参赛项目的集合events、一个存储所有参赛学校的集合 schools,这里不设置队伍存储集合的原因是所有的队伍在创建项目时已在项目类中有专门的存储集合teams;

 3.主要算法函数

        a.项目添加函数:用于添加相应的项目;

        b.学校添加函数:用于添加参赛学校;

        c.队伍添加函数:用于添加参赛队伍,此函数为主要添加函数,若在添加过程中发现不存在当前所要添加的项目或学校,则弹出信息窗口提示错误,若学校参赛队伍达到上限,同上;

        d.学校总分计算函数:计算某学校的总分;

        e.以学校总分排名的函数:调用d函数,并按总分进行排序,排序结果仍储存在schools集合中;

         f.某学校的项目总分排名函数:返回一个res的字典集合,内含项目id和项目总分;

        g.单个项目获奖情况函数:对项目内的队伍按分数进行排名,索引为0,1,2即为前三;

        h.学校各项目获奖情况函数

3、物理设计

伪代码:

类Team:String 项目,String学校,int 成绩,get/set;                      
类School:String 名字,String 编码,int 队伍数,get/set;     
schools[n];
events[m];
teams[i];
total[m];
rank[m][total[m]];
prim(){初始化数据};
querySum(String str){在teams[i]中查询本校的队伍,并加队伍的总分加起来并输出};
queryScore(String str){从teams[i]挑选出各个项目的队伍,分别计算其总分,最后降序输出};
queryPrize(String str){根据项目在rank[m][3]中查找获奖队伍,若不在,则未获奖};
queryRank(String str){使用queryScore函数得到每个学校每个项目的总分,综合计算最后得出特定项目的前三学校};
main(){设计交互界面,根据需要调用上述函数}。

项目2:校园导游咨询

1、问题分析和任务定义

【问题描述】

设计一个校园导游程序,为来访的客人提供各种信息查询服务。

【基本要求】

(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介  等信息;以边表示路径,存放路径长度等相关信息。

  (2)  为来访客人提供图中任意景点相关信息的查询。

(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。

【测试数据】

以江苏科技大学长山校区为例。

【实现提示】

一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网.顶点和边均含有相关信息.

2、逻辑设计

 这道题主要是图的应用涉及到用弗洛伊德求两点之间的最短路径。我的DataType中有景点代号、景点名称、景点介绍这些成员,在图的信息中包括一个二维数组用来保存图中路径的信息,一维数组来保存节点信息,还有两个变量用来记录行和列的数目。

初始化时将每个景点的全部信息赋值给相应的变量,给字符串类型的变量赋值时可以使用赋值函数,然后再将可达路径的长度赋值给数组,将不可达的赋值为无穷大,将自己到自己的赋值为0.

显示景点信息时只需要遍历数组输出即可。查询信息时依旧是遍历数组,当找到与输入的信息相匹配的元素时,根据要求输出元素的信息即可;编辑信息时也是遍历数组,当找到与输入的信息相匹配的元素时,将该元素的信息替换成要编辑的信息即可。

求两个景点之间的最短路径时是用弗洛伊德算法,具体是:例如求vi和vj之间的最短距离,在vi和vj之间加入点v0,比较(vi,vj)和(vi,v0,vj)的路径长度,取其中较短者作为vi到vj的中间顶点序号不大于0的最短路径。以此类推,在vi和vj之间加入vk,这样经过n次比较之后,最后求得的必是从vi到vj的最短路径,按此方法,可以同时求得各对顶点间的最短路径。

3、物理设计

伪代码:

第一行输入两个整数n(1≤n≤20) 和 m(0≤m≤n*(n-1)/2);n 代表学校有 n 个景点,m 代表有 m 条路。
接下来 n 行输入景点信息:每行输入三个字符串str1,str2,str3分别表示景点名称,代号和简介。
接下来m行:每行三个整数u(1≤u≤n),v(1≤v≤n),w(1≤w≤100);u表示起点,v表示终点,w表示两景点间的距离。
接下来一行输入一个整数op(1≤op≤10)表示操作次数。
接下来op行,每行有一条命令,命令有三种形式。
1.Query 1 str:景点查询,表示查询景点str的相关信息。
2.Query 2 str1 str2:路径查询,表示查询景点str1到达景点str2的最短路径及长度。
3.Modify x str1 str2 str3:表示修改某个的景点信息 ,str1表示景点名称,str2表示景点代号,str3表示景点简介。
Query 1 str:输出一行,str的景点信息。
Query 2 str1 str2:输出两行,第一行输出最短路径长度,第二行输出最短路径(具体格式见输出样例)。
 

项目3:算术表达式求解

【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
 实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】
(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

2、逻辑设计

(1)主函数模块:

接收算数表达式,根据判断优先级函数返回值选择后续操作并输出结果。

(2)栈的基本操作模块:

包括栈的初始化、入栈、出栈、获取栈顶元素。

(3)判断运算符操作数模块:

判断用户输入的字符为运算符或操作数,进行分类操作。

(4)判断优先级模块:

判断输入符号和操作符栈顶元素的优先级。‘*’‘/’高于‘+’‘-’,‘(’高于‘+’‘-’‘*’‘/’,‘)’低于‘+’‘-’‘*’‘/’,‘#’低于所有运算符,当‘(’‘)’及‘#’‘#’相遇则返回‘=’,‘)’‘(’、‘#’‘)’、‘(’‘#’相遇则返回特殊符号‘!’判定用户输入语法错误。

(5)表达式求值模块:

取操作符栈顶元素及两个操作数栈顶元素进行运算.

3、物理设计

伪代码:

void InitStack1(SqStack1 &S1);//声明栈建立函数

void InitStack2(SqStack2 &S2);//声明栈建立函数

void evaluate(SqStack1 &S1,SqStack2 &S2);//确定如何入栈函数

void Push1(SqStack1 &S1,char e);//声明入栈函数

void Push2(SqStack2 &S2,float e);//声明入压栈函数

char GetTop1(SqStack1 &S1);//声明取栈顶元素函数

float GetTop2(SqStack2 &S2);//声明取栈顶元素函数

char Pop1(SqStack1 &S1);//声明出栈函数

float Pop2(SqStack2 &S2);//声明出栈函数

char Compare(char m,char n);//声明比较函数

float Operate(float a,char rheta,float b);//声明运算函数

void DispStack1(SqStack1 &S1);//从栈底到栈顶依次输出各元素

void DispStack2(SqStack2 &S2);//从栈底到栈顶依次输出各元素

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值