数据结构课程设计

数据结构课程设计


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

一.问题重述

【问题描述】

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

【基本要求】

1)每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;
2)能统计各学校的总分;
3)可以按照学校编号或名称,学校的总分、各项目的总分排序输出;
4)可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;
5)数据存入文件并能随时查询

【设计要求】

1)输入数据形式和范围:可以输入学校的名称,赛事项目的名称。
2)输出形式:有中文提示,各学校分数为整数
3)界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,可以完成相关功能的要求。
4)存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。

【测试数据】

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

【实现提示】

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

二.问题分析

1.设置一个管理系统,实现统计总分、按照不同要求进行排序输出、可进行项目和学校的互查的操作。
2.设置合理的菜单,完成相应的要求。
3.将数据存入文档,并进行非法数据测试。

三.逻辑设计

【类别设计】

【Competition类】

包含:
学校基本信息、项目基本信息、成绩获得情况。
作用:
(1)实现初始化学校和项目的基本信
(2)实现赛后成绩统计。
(3)实现可查询功能。

【Array类】

包含:
项目编号、分数。
作用:
帮助实现项目与成绩分配间的过程

【Menu类】
(其实没必要写类,但是我类写顺手了,就这样吧。 )
包含:
菜单
作用:
展示菜单

【函数关系调用图】

在这里插入图片描述

【流程图】

流程图

四.物理设计

【类别详情】

(1)Competition类**

class Competition
{
public:
	int get_m();
	int get_n();
	Competition();
	Array array[200];
	void Grade();
	void S_sort();
	void P_sort();
	void S_prize();
	void P_prize();
	void Document();
private:
	int Queue[50];
	string P_name[10];
	int m;
	int P_Grade;
	map<int, int, greater<int>> mapSchool;
	map<int, int, greater<int>> mapProject[10];
	string S_name[50];
	int n;
	int S_Grade[50];
	int P_grade[50][10];
};

(2)Array类

class Array
{
public:
	int p;
	int s;
};

(3)Menu类

class Menu
{
public:
	void menu();
};

五.结果分析

【错误输入的情况】

1.对菜单输入不存在的数值进行访问,出现提示:您输入的数值有误,请重新输入!
2.对某学校的某项目的获奖情况的功能输入不存在的数值进行访问,出现提示:未能查询到该学校编号,请重新输入!
3.对某项目的前三获奖学校的功能输入不存在的数值进行访问,出现提示:本届大赛未开通此项目,请您输入正确的项目编号!


项目2:校园导游咨询

一.问题重述

【问题描述】

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

【基本要求】

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

【测试数据】

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

【实现提示】

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

二.问题分析

设计一个校园导航系统,给出自制地图,根据所给定的地图进行景点介绍及路径查询。

三.逻辑设计

【类别设计】

(1)view类
包含:
景点名称
景点编号
景点简介
作用:
为初始化景点项目而构建数组

(2)System类
包含:
路径
两景点间的长度
最短路径
作用:
初始化景点项目
运用弗洛伊德算法找寻最短路径
打印最短路径

【算法使用】

弗洛伊德算法

基本思想:
弗洛伊德算法定义了两个二维矩阵:

矩阵D记录顶点间的最小路径
例如D[0][3]= 10,说明顶点0 到 3 的最短路径为10;
矩阵P记录顶点间最小路径中的中转点
例如P[0][3]= 1 说明,0 到 3的最短路径轨迹为:0 -> 1 -> 3。
它通过3重循环,k为中转点,v为起点,w为终点,循环比较D[v][w] 和 D[v][k] + D[k][w] 最小值,如果D[v][k] + D[k][w] 为更小值,则把D[v][k] + D[k][w] 覆盖保存在D[v][w]中。

图示理解:
在这里插入图片描述
核心代码:

//这里是弗洛伊德算法的核心部分 
    //k为中间点 
    for(k = 0; k < G.vexnum; k++){
        //v为起点 
        for(v = 0 ; v < G.vexnum; v++){
            //w为终点 
            for(w =0; w < G.vexnum; w++){
                if(D[v][w] > (D[v][k] + D[k][w])){
                    D[v][w] = D[v][k] + D[k][w];//更新最小路径 
                    P[v][w] = P[v][k];//更新最小路径中间顶点 
                }
            }
        }
    }

原文链接:https://blog.csdn.net/jeffleo/article/details/53349825

【校园地图】

江苏科技大学长山校区选取16个景点,具体详情如下:

江苏科技大学长山校区

路径的权重赋值如下:

权重赋值
【景点指南】

编号名称
1西苑食堂
2东苑食堂
3北苑食堂
4好友多超市
5图书馆
6经世楼
7明德楼
8笃学楼
9文理大楼
10西操场
11东操场
12文体中心
13西区快递站
14海韵湖
15计算机学院楼
167号组团

【流程图】

流程图

【函数调用图】

函数调用图

四.物理设计

【类别详情】

(1)view类

class View
{
public:
	char name[30];
	int number;
	char introduce[200];
}

(2)System类

class System
{
public:
	void Init()void Introduce();
	void Floyd();
	void Print(int i, int j); 
	void MinDistance();
	View view[M_Vnum];
private:
	int shortest[M_Vnum][M_Vnum];
	int path[M_Vnum][M_Vnum];
	int length[M_Vnum][M_Vnum];
};

五.结果分析

【错误输入的情况】

当输入非该校区所有的景点时,会进行提示:景点编号不存在,请重新输入!


项目3:算术表达式求解

一.问题重述

【问题描述】

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

【基本要求】

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

【测试数据】

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

【实现提示】

可以设计以下辅助函数
status isNumber(char ReadInChar); //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 。
int TurnToInteger(char IntChar); // 将字符’0’.’9’ 转换为整数 9

二.问题分析

设计一个计算器,通过运用双栈法进行四则运算。

三.逻辑设计

本项目通过运用双栈法,一面存放数字,一面存放运算符,通过比较运算符优先级的大小进行适当的操作。同时要考虑到各种非法输入 eg: 除0、负数运算、运算符在一开始输入、运算符连续输入、左右括号不匹配…等问题

【流程图】

流程图

【函数调用关系图】

函数关系调用图

四.物理设计

int expr(const char*);    
void Init(dStack_t**);     
void operate(dStack_t*);       
int  IsOpr(char);                
char Precede(char, char);       
void PushNum(dStack_t*, int);   
int  PopNum(dStack_t*);         
int  GetTopNum(dStack_t*);      
void PushOpr(dStack_t*, char);  
char PopOpr(dStack_t*);       
char GetTopOpr(dStack_t*);     

五.结果分析

fushu
在这里插入图片描述


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值