数据结构程序设计

项目一:计算机项目大赛赛事统计
【问题描述】
参加计算机设计大赛的n个学校编号为1到n,赛事分成m个项目,项目编号为1到m,比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分 报表。
【基本要求】
1)每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;
2)能统计各学校的总分;
3)可以按照学校编号或名称查询,学校的总分、各项目的总分排序输出;
4)可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;
5)数据存入文件并能随时查询
【设计要求】
1)输入数据形式和范围:可以输入学校的名称,赛事项目的名称。
2)输出形式:有中文提示,各学校分数为整数
3)界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,完成相关功能的要求。
4)存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。
【测试数据】
要求使用全部合法数据,整体非法数据,局部非法数据。进行程序测试,以保证程序的稳定。
【实现提示】
假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩。
【问题分析和任务定义】
对于数据的输入,要注意要求中每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;输入时要符合要求;
需要统计的数据:
1、每个学校的总分 ;
2、每种比赛的分数排名;
3、每个学校的获奖情况 ;
4、每种比赛的获奖情况;
5、某个学校,某个比赛获奖情况。
需要实现的功能:
1、能统计各学校的总分;
2、各项目总分排序输出;
3、按学校编号或姓名查询某个项目的获奖情况;
4、可以按照项目编号查询前三名。
【逻辑分析】
变量类型:
1、设置队伍结构体,包括:队伍名,参赛项目编号,学校名称,项目得分;
2、设置学校结构体,包括:学校编号,学校名称,学校队伍数量;
3、设置项目结构体,包括:项目编号,参赛队伍;
变量说明:
1、m,n,k:分别表示参赛学校数,参赛项目数,参赛队伍总数;
2、a[600][6]:每行存储的是对应school类的参赛队伍;
3、b[60][20]:每行存储的是对应项目的参赛队伍;
4、b1[60][3]:每行表示队伍前三名得分数;
函数说明:
1、void Prim():对数据初始化;
2、void classify():对a[600][6],b[60][20]进行初始化;
3、void sort():对a[600][6],b[60][20]每行进行冒泡排序,由大到小;
4、void Grade():获得每个项目前三名成绩;
5、void Sum(int h):查询学校总分;
6、void print1():输出各项目;
7、void print2(int h):输出某个项目获奖情况;
8、void print3(int h):某学校获奖情况;
9、void print4(int h,int y):某学校,某项目获奖情况;
【物理分析】
伪代码:
struct Team{int 得分,项目编号;string 队伍名,学校名};
struct School{int 学校编号,队伍数量;string 学校名};
struct Contest{int 项目编号,队伍数量};
Team team[600]; //存储参赛队伍
School school[100]; //存储参赛学校
Contest contest[60];
int n;
int m;
int k;
Team a[600][6];
Team b[60][20];
int b1[60][3];
void Prim(){对数据初始化;};
void classify(){对a[600][6],b[60][20]进行初始化;};
void sort(){对a[600][6],b[60][20]每行进行冒泡排序,由大到小;};
void Grade(){获得每个项目前三名成绩;};
void Sum(int h){查询学校总分;};
void print1(){输出各项目;};
void print2(int h){输出某个项目获奖情况;};
void print3(int h){某学校获奖情况;};
void print4(int h,int y){某学校,某项目获奖情况;};
int change(){将学校名称转换为学校编号;};
void Add(){添加数据;};
项目二:校园导游资询
【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【测试数据】
以江苏科技大学长山校区为例。
【实现提示】
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网,顶点和边均含有相关信息.
【实验数据图】
在这里插入图片描述
选取实验数据中的部分点,构成的拓扑图为
在这里插入图片描述
【问题分析和任务定义】
研究图论中最短距离求法,设计一个界面,为参观的人提供如下选择:
1.选取景点,弹出景点简介。
2.计算游客所在地点到所去地点的最短路径。
3.给出景点无向图(带有权值)。
【逻辑分析】
变量的定义:
1、用A[11][11]表示邻接矩阵用
2、p[11][11]表示最短路径的直接后继。
函数的使用:
1、Floyd()进行对A[11][11]与p[11][11]进行赋值操作,并计算出结果;
2、Inquire()进行查询景点的介绍;
4、Go()用来查询两点间最短路径;
3、main()进行调用。
算法的使用:这里我使用的是Floyd算法,他的思想是用0-n-1的中间序号点依次的取之间距离的最小值,即:A[i][j]=min{A[i][j],A[i][k]+A[k][j]};十在第n-1次处理过之后得到的最终的A[i][j]就是i,j两个地点之间最短的距离。在同时用p[i][j]进行后继追踪,找出后继,进行存储。需要注意的是在处理非邻接关系的权值时要用一个MAX来处理,这里选择权值为10000;
【物理分析】
int A[11][11];
string a[11];
int p[11][11];
void Floyd();//对后继元素p[11][11]和 A[11][11]进行赋值与计算最短路径操作;
void Go(int i, int j);//表示输出最短路径;
void Inquire() ; //查询景点介绍;
void Input(); //地点编号转换为地点名称;
int menu();//菜单系统
int main();//对函数进行调用

项目三:算术表达式求解

【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入)
【测试数据】
(30+270)/3-123
5+(9*(62-37)+15)*6
要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【实现提示】
可以设计以下辅助函数
status isNumber(char ReadInChar); //视ReadInchar 是否是数字而返 回 TRUE 或 FALSE 。
int TurnToInteger(char IntChar); // 将字符’0’.’9’ 转换为整数 9
【问题分析和任务定义】
利用顺序栈模板,将符号与数字压入不同的两个栈,通过优先级桌面确定运算顺序,优先级桌面分别从两个栈中取出元素进行数学运算。
【逻辑分析】

输入形式

输入采用的是char型字符输入,所以在输入时采用的是英文括号。

存储结构

SeqStack模板类
私有成员:栈顶指针,存放栈元素数组(设置存取数量为100)
公有函数:构造函数,析构函数,入栈函数(Push),出栈函数(Pop),判断函数,获取栈顶元素(GetTop)等

运行中主要函数

int isSingle(char ch) //判断是否为数字而返回TRUE或FALSE
int order(char op) //将运算符号内部赋值给数字
void Evaluate(char op) //根据操作符运算优先级进行计算
void CalAnyExp() //进行运算符号优先级顺序并计算

调用关系图

在这里插入图片描述

【物理设计】
1.Seqstack类
const int StackSize = 100;
template
class SeqStack
{
public:
SeqStack();
~SeqStack() {};
void Push(T x); //将数据压栈
T Pop(); //将栈顶元素推出
T GetTop(); //取栈顶元素
bool Empty(); //判断是否为空
int Top() { return top; } //返回栈顶值}
2.其他类型数据结构
SeqStack Single; //字符型SeqStack类
SeqStack Num; //int型SeqStack类
3.isSingle函数’;//判断是否是字符或操作符
4.order函数;
5.Evaluate函数;//进行计算;
6.CalAnyExp函数;//对输入字符进行操作;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值