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

本文详述了三个数据结构课程设计项目:计算机设计大赛赛事统计、校园导游咨询和算术表达式求解器。每个项目涉及问题描述、分析、逻辑与物理设计,涵盖了数据输入、处理、存储和输出等功能需求,旨在提升编程与算法应用能力。
摘要由CSDN通过智能技术生成

目录

项目一:计算机设计大赛赛事统计

  • 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函数:

  1. 利用for循环和随机数初始化学校的编号,名称,项目的编号,名称,学校队伍的编号,项目得分。
  2. 为保证每个项目至少有十支队伍参加,队伍进行项目初始时,固定分配每个项目有一个队伍参加,剩下一个队伍随机产生参加的项目。这样十所学校,每个项目至少十支队伍参赛。
  3. 项目的总分将项目各个学校该项目成绩累加
  4. 学校总分,将队伍的项目成绩累加

void schooltotalscores(int i)  

  1. 判断学校编号是否符合1-10的要求;
  2. 符合则输出学校总分;
  3. 否则重新输入,重复2操作。

void print_projectscores(int i)

  1. 检查学校编号是否符合1-10的要求;
  2. 若符合,创建pair<分数,编号> 结构,vector容器存储,用sort函数排序,最后将编号和分数输出;
  3. 否则重新输入编号,重复2操作。

void isaward(int i ,int j) 

  1. 检查学校编号和项目编号是否输入正确
  2. 若正确,建立一个标志数组,初始化都为0;
  1. 对参加该项目的队伍进行遍历,如果分数大于当前队伍编号则加1。
  2. 若当前队伍对应的flag的值小于3,则获奖了,位次为flag+1;
  3. 否则输出未获奖

3. 否则重新输入编号,重复2操作。

void awardschool(int i)

  1. 输入项目编号,并进行检查。
  2. 若正确,遍历参加该项目的队伍,对成绩进行排序,取前三名输出学校名字
  3. 否则重新输入编号,重复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集合中;

  1. 抓出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 isNumberchar ReadInChar);  //ReadInchar 是否是数字而返回 TRUE FALSE
int TurnToIntegerchar 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)如果输入的是“*” “/”,就看符号栈栈顶优先级是否等于* /,是的话就弹出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值