数据结构-程序设计

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

一、问题描述:

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

二、基本要求:

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

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

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

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

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

三、设计要求:

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

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

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

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

四、问题分析:

1.功能分析:

1.要能够进行信息的输入;
2.能够将数据保存到文件中(例如:文本文档,EXCEL等);
3.能够将数据从文件中打印出来;
4.能够统计总分;
5.能够根据学校编号和名称去得到总分;
6.能够实现排序输出:

  • [ 按学校编号排序]
  • [ 按学校总分排序 ]
  • [ 按项目总分排序]

7.按学校编号和参加项目的编号查询是否获奖;
8.按项目编号查询该项目获得前三的学校。

2.条件限制:

1.每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;
2.假设3<赛事项目数量<=10;
3.假设每个项目设三个奖项:一等奖,二等奖,三等奖,每个奖项均只有一个队伍名额,且每个队伍的分数不能相同。
4.每个学校的每个参赛队伍只能参加一个赛事项目

五、逻辑设计:

1.模块划分

1)主函数模块
2)菜单函数模块
3)输入数据函数模块
4)读取文件函数模块
5)查询总分模块
6)排序函数模块
7)查询获奖或项目前三的函数模块

2.抽象数据类型
ADT 赛事统计
	Data
		由用户输入或者从文件读取
	Operation
		savetofile
		输入:无
		功能:将数据保存到文件中
		输出:无
		readfromfile
		输入:无
		功能:将文件中的数据读取出来
		输出:无
		inputData
		输入:学校数量n,项目数量m
		功能:输入学校和项目数据,并且保存到文件中
		输出:无
		outputSumScore
		输入:无
		功能:统计总分并且能够按照学校编号或名称查找该学校总分
		输出:该学校总分
		outputSortScore
		输入:无
		功能:按照学校编号排序、按照学校总分排序、按照项目总分排序
		输出:所要求的的排序结果
		search
		输入:无
		功能:按学校编号和项目编号确定该项目是否获奖、按项目编号得到该比赛的前三名
		输出:获奖情况/该比赛的前三名
		menu
		输入:无
		功能:选择我们要使用的功能
		输出:选择该功能产生的结果
endADT
3.模块之间的调用关系图

在这里插入图片描述

六、物理设计:

1.存储结构:

1)定义一个结构体item,存放项目信息,包括该项目的编号、名字、成绩以及是否获奖;
2)定义一个关于item的结构体school,来操作一个学校所参加的项目信息;
3)再定义一个关于school的结构数组allschool,用来操作每个学校参加的所有项目
4)定义一个结构体shooldata,存放该学校关于某个项目的信息,包括该学校的编号和成绩;
5)定义一个关于schooldata的结构体itemdata,来操作所有参加该项目的学校信息。
6)再定义一个关于itemdata的结构数组allitem,用来操作所有的每个项目所参加的学校信息

2.各函数的伪码算法:

1)inputData函数

1.初始化:首先依次输入:学校编号、学校名称、学校参加的项目数量,再输入该学校参加的项目编号、项目名称、项目得分;
2.利用输入的一个学校对应多个项目的关系转化为一个项目对应多个学校的关系:

 2.1 项目计数器 k从0循环到m-1;
  	2.1.1 学校计数器i从0循环到n-1;
  		2.1.1.1 学校项目计数器j从0循环到学校的项目总数-1;
  			2.1.1.1.1如果该学校所参加的项目的名称恰好等于外围的项目名称;
  			   2.1.1.1.1.1 将该学校的编号和名称记录下来;

3 调用savetofile函数,将数据保存到文件中

2)outputSumScore函数

1.计算每个学校的总分;
2.选择想要查询的学校编号;

  1. 学校计数器从0循环到n-1;

    3.1遍历到学校编号与所要查询的编号一致;

4.输出该学校的总分

3)outputSortScore函数

3.1按照学校编号排序

1.先定义一个指示数组temp[N],大小为n,用来标记学校编号由小到大的排序;
2.学校计数器i从0循环到n-1;令temp[i]=i;
3.利用冒泡排序,将学校编号由小到大的下标保存在temp[N]中;
4.利用for循环,输出学校编号和学校的总分;

3.2按照学校分数排序

1.先定义一个指示数组temp[N],大小为n,用来标记学校总分由大到小的排序;
2.学校计数器i从0循环到n-1;令temp[i]=i;
3.利用冒泡排序,将学校总分由大到小的下标保存在temp[N]中;
4.利用for循环,输出学校编号和学校的总分;

3.3按照项目总分排序

1.选择项目编号
2.先定义一个指示数组temp[N],大小为n,用来标记该项目各参赛学校得分由大到小的排序;
3.学校计数器i从0循环到n-1;令temp[i]=i;
4.利用冒泡排序,将该项目各参赛学校得分由大到小的下标保存在temp[N]中;
5.利用for循环,输出学校编号和学校的总分;

4)search函数

1.定义变量k,此时k为项目编号,且将下面过程放入while循环中,循环条件为k<=m;
1.1先定义一个指示数组temp[N],大小为n,用来标记该项目各参赛学校得分由大到小的排序;
1.2学校计数器i从0循环到n-1;令temp[i]=i;
1.3利用冒泡排序,将该项目各参赛学校得分由大到小的下标保存在temp[N]中;
1.4然后将第三名的分数保存allitem[k-1].third,并且将前三名的学校编号记录于allitem[k-1].reward_schoolnumber[3];
2.利用双层for循环遍历每个学校的每个项目,若是其项目分数大于该项目第三名的分数,那么我就可以将if_prize的值变为true;
3.输入想查找的学校编号和项目编号,然后判断if_prize的值,如果为true,则获奖,否则不获奖;
4.输入想查询前三名的项目编号choice,即可通过allitem[choice-1].reward_schoolnumber[3]获得前三名的学校编号

3.函数算法框架

在这里插入图片描述

七、测试数据:

在这里插入图片描述

项目2:校园导游咨询

一、问题描述:

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

二、基本要求:

(1)设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息
(2) 为来访客人提供图中任意景点相关信息的查询;
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。

三、问题分析:

1.功能分析:

1)能够查询每个景点的信息,包括该景点代号、名称、简介;
2)能够根据起始点和结束点,计算出这两点之间的最短距离以及该最短距离实现的路径;
3)补充:为了方便用户去游览学校,增加了查询所有两点之间的最短距离以及该最短距离实现的路径。

2.条件限制:

1)所含景点不少于10个;
2)校园的道路是双向通行的

三、逻辑设计:

1.模块划分:
  1. 主函数模块;
  2. 查询景点信息模块;
  3. 查询任意两点最短距离和路径模块;
  4. 查询所有景点间的最短距离和路径模块;
  5. 菜单模块
2.抽象数据类型:
ADT 校园导游查询
	Data
		 输入的景点信息:景点代号、名称、简介
	Operation
		Initialization
		前提条件:已经定义了一个图的对象
		输入:	  景点个数
		功能:	  记录景点信息以及各个景点之间存在的路径,方便后续操作
		输出:	  各个景点的基础信息
		后置条件:无
		display
		输入:	  无
		功能:	  输出各个景点的信息以供展示
		输出:	  各个景点的信息
		SearchInformation
		输入:	  景点代号
		功能:	  查询该景点信息
		输出:	  该景点的所有信息
		FindShortestPath
		输入:	  两个景点的代号
		功能:	  查询这两个景点之间的最短距离及路径
		输出:	  这两个景点之间的最短距离及路径
		FindAllPath
		输入:	  无
		功能:	  查询所有景点之间的最短距离及路径
		输出:	  所有景点之间的最短距离及路径
endADT
3.模块之间的调用关系图:

在这里插入图片描述

四、物理设计:

1.存储结构:

1)定义一个结构体Graph,来存储图的信息,包括景点个数,各个景点的名称、代号以及简介;
2)使用邻接矩阵,表示有向图。
附:虽然我构建的为无向图,但是我还是将无向图双向化变成有向图,是为了使用Floyd算法

2.各函数伪码算法:
  1. Initialization函数:

1.首先定义一个整型数组,保存景点代号,然后通过for循环依次赋给结构体Graph的对象;
2.再定义一个字符串数组,用来保存景点名称,然后通过for循环依次赋给结构体Graph的对象;
3.再定义一个字符串数组,用来保存景点简介,然后通过for循环依次赋给结构体Graph的对象;
4.如果无向图中给了确定的值,就给图的带权邻接矩阵赋值;否则,则对那两点之间的距离赋值为999;

  1. Floyd函数:

1.设置一个NN的二维数组A,用来存放图中所有顶点对之间的最短路径长度的n阶方阵;
2.设置一个N
N的二维数组P,P[i][j]用来保存的是由i到顶点j的最短路径中i的直接后继;
3.将Graph的对象g的带权邻接矩阵通过两个for循环赋值给A;
4.遍历k=0到n-1,并且对A中的每个元素A[i][j]作如下计算:A[i][j]=min{A[i][j],A[i][k]+A[k][j]},即如果A[i][j]<A[i][k]+A[k][j],则A[i][j]=A[i][k]+A[k][j],并且P[i][j]=P[i][k];

  1. Path函数:

1.如果起始点start不等于finish,并且A[start-1][finish-1]<999,那么我们设置变量k,使得k=P[start-1][finish-1],用来保存经过的景点代号;
2.通过while循环,只要k!=finish-1,就一直把P[k][finish-1]赋值给k,最后输出路径;
3.否则,最短路线就是g.name[start-1]到g.name[finish-1];

  1. FindShortestPath函数:

1.调用Floyd函数;
2.调用Path函数

  1. FindAllPath函数:

1.调用Floyd函数;
2.计数器i从0循环到g.vertice_num-1
3.计数器j从0循环到g.vertice_num-1;
4.如果i==j,则continue;否则调用调用Path函数

3.函数算法框架

在这里插入图片描述

五、测试数据:

1)以江苏科技大学长山校区为例,并从中随机选取11个景点如下图:
在这里插入图片描述
2)所选取的11个景点的信息为:

代号景点名称
1学生宿舍
2西苑食堂
3文体中心
4环化学院楼
5东苑食堂
6笃学楼
7明德楼
8文理大楼
9图书馆
10计算机学院楼
11旅游实训楼

3)下面是我给出的带权无向图:
在这里插入图片描述

项目3:算术表达式求解

一、问题描述:

设计一个简单的算术表达式计算器。

二、基本要求:

实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入)。

三、问题分析:

1.功能分析:

1)实现标准整数类型的四则运算表达式的求值 ;
2)能够实现多层括号的嵌套

2.条件限制:

1)分母不能为0;
2)要将中缀表达式转化为后缀表达式求解
3)含有小数点的要带小数点一起计算,例如将“.5”看作一个整体

3. 中缀表达式与后缀表达式的区别:

1)中缀表达式是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间,例如:3+4;
2)后缀表达式又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)

四、逻辑设计:

1.模块划分:

1)主函数模板;
2)优先级处理模块;
3)操作函数模块;
4)中缀表达式转换为后缀表达式模块;
5)读取文件计算模块;

2.抽象数据类型:
ADT 算数表达式求解
	Data
		输入的算术表达式
	Operation
		operation
		输入:	  一个操作符
		功能:	  计算使用该操作符操作最上面两个操作数的结果并且压入操作数栈
		输出:	  无
		readfromfiledo
		前置条件:文件中已经存在表达式
		输入:	  无
		功能:	  从文件中读取后缀表达式并进行计算
		输出:	  最终的计算结果
		后置条件:无
		left_priority
		输入:	  一个操作符
		功能:	  判断该操作符的优先级数
		输出:	  输出优先级数
		right_priority
		输入:	  一个操作符
		功能:	  判断该操作符的优先级数
		输出:	  输出优先级数
		convert
		输入:	  所要求的表达式
		功能:	  由中缀表达式转化为后缀表达式并且保存在文件中
		输出:	  无
endADT
3.模块之间的调用关系图:

在这里插入图片描述

五、物理设计:

1.存储结构:

1)定义顺序栈的模板类,并且在该类中书写了一些常用的函数,方便后续对栈进行操作;
2)定义了一个名为calculator的类,并且在该类中定义了两个栈:用于储存操作数的操作数栈operandstack和用于储存操作符的操作符栈operatorstack

2.各函数伪码算法:
  1. operation函数:

1.定义俩实型变量,num2来存储第一次出栈的元素,num1来存储第二次出栈的元素;
2.再根据提供的操作符进行相应的计算
3.将得到的结果压入操作数栈operandstack中

  1. readfromfiledo函数:

1.首先打开文件,如果文件不能打开要报错;
2.打开文件后,一次遍历其中的元素
3.如果是“加减乘除”则利用operation函数进行计算;如果是‘|’则读取其后面的数字,并且将改数字压入操作数栈operandstack中;
4.最后如果操作数栈非空,则运行出栈函数,得到计算结果

  1. left_priority函数:

利用switch函数,将左边的操作符,即操作符栈内栈顶元素优先级各个运算符的优先级用数字进行标记

操作符优先级大小
‘(’1
‘+’2
‘-’2
‘*’3
‘/’3
‘#’0
  1. right_priority函数:

利用switch函数,将各个运算符的优先级用数字进行标记

操作符优先级大小
‘(’4
‘+’2
‘-’2
‘*’3
‘/’3
‘#’0
  1. convert函数:

1.遇到数字,读入数值写入文件并且在数值前加’|‘;
2.遇到小数点,例如".5"作为整体数值写入文件并且在数值前加’|';
3.遇到右圆括号,则将运算符栈中左圆括号后压入操作符弹出并写入文件;
4.遇到其他操作符,需要比较operatorstack栈顶的运算符和当前扫描的操作符的优先级大小
5.如果当前扫描的操作符的优先级大,那么将该操作符压入operatorstack操作符栈;否则,则需不断遍历,将栈中比当前操作符优先级大的操作符都写入文件中,最后再将当前操作符,压入栈中;
6.检验:只要操作符栈非空,就一直将其写入文件;
7.关闭文件

  1. key函数:

1.输入所要计算的表达式;
2.调用convert函数,将中缀表达式转化为后缀表达式,并且写入文件中;
3.调用readfromfiledo函数,读取文件并进行计算;
4.输出结果

3.函数算法框架:

在这里插入图片描述

六、测试数据:

1)(30+270)/3-123
2.) 5+(9*(62-37)+15)*6
要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值