C 课程设计

发布 2022-09-30 15:42:28 阅读 1442

(一)算法分析。

用分治算法解平面最接近点对问题:

一维的情形: s中的n个点为x轴上的n个实数x1,x2,..xn。

最接近点对即为这n个实数中相差最小的2个实数。我们可以先将x1,x2,..xn排好序,然后,用一次线性扫描就可以找出最接近点对。

对这种一维的简单情形,我们尝试用分治法来求解,并希望能推广到二维的情形。

图1 一维情形的分治法。

假设我们用x轴上某个点m将s划分为2个子集s1和s2,使得s1=;s2=。这样一来,对于所有p∈s1和q∈s2有p递归地在s1和s2上找出其最接近点对和,并设δ=min,s中的最接近点对或者是,或者是,或者是某个,其中p3∈s1且q3∈s2。如图1所示。

我们注意到,如果s的最接近点对是,即|p3-q3|<δ则p3和q3两者与m的距离不超过δ,即|p3-m|<δq3-m|<δ也就是说,p3∈(m-δ,m],q3∈(m,m+δ]由于在s1中,每个长度为δ的半闭区间至多包含一个点(否则必有两点距离小于δ),并且m是s1和s2的分割点,因此(m-δ,m]中至多包含s中的一个点。同理,(m,m+δ]中也至多包含s中的一个点。由图1可以看出,如果(m-δ,m]中有s中的点,则此点就是s1中最大点。

同理,如果(m,m+δ]中有s中的点,则此点就是s2中最小点。

因此,我们用线性时间就能找到区间(m-δ,m]和(m,m+δ]中所有点,即p3和q3。从而我们用线性时间就可以将s1的解和s2的解合并成为s的解。

选取分割点的选取通过分治法中“平衡子问题”的方法加以解决。即:m=[max(s)+min(s)]/2。

这个算法看上去比用排序加扫描的算法复杂,然而这个算法可以向二维推广。

二维的情形: 此时s中的点为平面上的点,它们都有2个坐标值x和y。为了将平面上点集s线性分割为大小大致相等的2个子集s1和s2,我们选取一垂直线l(方程:

x=m)来作为分割直线。其中m为s中各点x坐标的中位数。由此将s分割为s1=和s2=。

从而使s1和s2分别位于直线l的左侧和右侧,且s=s1∪s2 。由于m是s中各点x坐标值的中位数,因此s1和s2中的点数大致相等。

递归地在s1和s2上解最接近点对问题,我们分别得到s1和s2中的最小距离δ1和δ2。现设δ=min(δ1,δ2)。

若s的最接近点对(p,q)之间的距离d(p,q)<δ则p和q必分属于s1和s2。不妨设p∈s1,q∈s2。那么p和q距直线l的距离均小于δ。

因此,我们若用p1和p2分别表示直线l的左边和右边的宽为δ的2个垂直长条,则p∈s1,q∈s2,如图2所示。

图2 距直线l的距离小于δ的所有点。

在一维的情形,距分割点距离为δ的2个区间(m-δ,m](m,m+δ]中最多各有s中一个点。因而这2点成为唯一的末检查过的最接近点对候选者。

二维的情形则要复杂些,此时,p1中所有点与p2中所有点构成的点对均为最接近点对的候选者。在最坏情况下有n2/4对这样的候选者。但是p1和p2中的点具有以下的稀疏性质,它使我们不必检查所有这n2/4对候选者。

考虑p1中任意一点p,它若与p2中的点q构成最接近点对的候选者,则必有d(p,q)<δ满足这个条件的p2中的点有多少个呢?容易看出这样的点一定落在一个δ×2δ的矩形r中,如图3所示。

图3 包含点q的δ×2δ的矩形r

由δ的意义可知p2中任何2个s中的点的距离都不小于δ。由此可以推出矩形r中最多只有6个s中的点。事实上,我们可以将矩形r的长为2δ的边3等分,将它的长为δ的边2等分,由此导出6个(δ/2)×(2δ/3)的矩形。

如图4(a)所示。

图4 矩形r中点的稀疏性。

若矩形r中有多于6个s中的点,则由鸽舍原理易知至少有一个δ×2δ的小矩形中有2个以上s中的点。设u,v是这样2个点,它们位于同一小矩形中,则。

因此d(u,v)≤5δ/6<δ 这与δ的意义相矛盾。也就是说矩形r中最多只有6个s中的点。图4(b)是矩形r中含有s中的6个点的极端情形。

由于这种稀疏性质,对于p1中任一点p,p2中最多只有6个点与它构成最接近点对的候选者。因此,在分治法的合并步骤中,我们最多只需要检查6×n/2=3n对候选者,而不是n2/4对候选者。

我们只知道对于p1中每个s1中的点p最多只需要检查p2中的6个点,但是我们并不确切地知道要检查哪6个点。为了解决这个问题,我们可以将p和p2中所有s2的点投影到垂直线l上。由于能与p点一起构成最接近点对候选者的s2中点一定在矩形r中,所以它们在直线l上的投影点距p在l上投影点的距离小于δ。

由上面的分析可知,这种投影点最多只有6个。因此,若将p1和p2中所有s的点按其y坐标排好序,则对p1中所有点p,对排好序的点列作一次扫描,就可以找出所有最接近点对的候选者,对p1中每一点最多只要检查p2中排好序的相继6个点。

二)程序**。

学生成绩系统的原**。

#include

#include

#include

#include

using namespace std;

#define t 2 //t代表两个学期。

#define c 4 //c代表四个班级。

#define p 30 //p代表每个班级最多为30人。

#define s 5 //s代表学生的5门课程。

int n=0; /定义n为一个全局变量,用来储存实际从键盘输入的班级人数。

class stu

void stu::mendsco()

void stu::add(int n,int m){

int i,l=0,number,temp;//number用来储存需要添加的人数。

cout<<"请输入需要添加的人数:";cin>>number;

temp=people[n][m];

people[n][m]=people[n][m]+number;//该班的人数加上number

cout<<"请输入这"<

C 课程设计

自动走迷宫小游戏。根据课堂讲授内容,做相应的自主练习,消化课堂所讲解的内容 通过调试典型例题或习题积累调试c 程序的经验 通过完成辅导教材中的编程题,逐渐培养学生的编程能力 用计算机解决实际问题的能力。同时在设计的过程中发现自己的不足之处,对以前所学过的知识理解的更加深刻,掌握得更加牢固。迷宫生成。...

c 课程设计

哈尔滨 课程设计报告。课程 c 学号 姓名 班级 教师 1.管理系统的功能说明。课程信息管理 能够增加数据,删除数据,显示数据,修改数据,按姓名和首字母查询数据和一些基本的程序功能。2.存储数据的描述。coursenumber 课程号coursename 课程名subject 所属专业xingzhi...

C课程设计

面向对象程序设计课程设计。一 设计要求。1 课程设计以3 4人为一组,每人一个模块 2 课程设计时间为1周 在处理系统的时候,要从分析系统的需求入手,根据系统需求进行详细分析,明确系统功能,然后设计系统整体架构以及划分系统模块,按照模块分配小组中每个组员的具体任务,完成设计。二 系统设计规范。1 命...