C++课程设计Word文件下载.docx
- 文档编号:22956680
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:24
- 大小:210.02KB
C++课程设计Word文件下载.docx
《C++课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《C++课程设计Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
由此将S分割为S1={p∈S|px≤m}和S2={p∈S|px>
从而使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<
iostream>
sstream>
fstream>
iomanip>
usingnamespacestd;
#defineT2//T代表两个学期
#defineC4//C代表四个班级
#defineP30//P代表每个班级最多为30人
#defineS5//S代表学生的5门课程
intN=0;
//定义N为一个全局变量,用来储存实际从键盘输入的班级人数
classStu{//定义一个Stu类
private:
stringterm[T],clas[T][C],name[T][C][P];
intscore[T][C][P][S],total[T][C][P],average[T][C][P],people[T][C];
public:
voidsetsco();
//用来完成按学期,按班级对学生成绩的录入
voidmendsco();
//用来完成按学期,按班级对学生成绩的修改
voidadd(intn,intm);
//用来完成对某个班级进行增加学生的成绩
voidreduce(intn,intm);
//用来完成对某个班级进行减少学生
voidmend(intn,intm);
//用来完成对学生成绩的修改
voidtongji();
//用来完成统计学生的总分和平均分,并按平均分对学生进行排序
voidfind();
//用来完成对学生成绩的查找,以及不及格科目和学生名单
voidprint();
//用来完成按班级输入成绩
voidsave();
//用来保存学生的成绩
};
voidStu:
:
setsco(){
inti,j,k,l=0;
for(i=0;
i<
T;
i++){
cout<
<
"
请输入学期:
;
cin>
>
term[i];
//输入学期
for(j=0;
j<
C;
j++){
cout<
请输入班级:
clas[i][j];
//输入班级
请输入这个班级的人数:
N;
people[i][j]=N;
请输入这个班级"
N<
个同学的姓名和成绩:
endl;
for(k=0;
k<
k++){
cout<
姓名:
name[i][j][k];
//输入学生的姓名
汇编语言:
score[i][j][k][l++];
//输入学生的分数
离散数学:
数字逻辑:
C++语言:
大学英语:
l=0;
}
}
}
}
mendsco(){
inti,j,choice=1;
cout<
setw(30)<
1:
term[0]<
//输出学期供选择
2:
term[1]<
请选择一个学期:
i;
clas[i-1][0]<
//输出班级供选择
clas[i-1][1]<
3:
clas[i-1][2]<
4:
clas[i-1][3]<
请选择一个班级:
j;
while(choice){
添加人数"
减少人数"
setw(36)<
修改学生的成绩"
0:
回主菜单"
请输入一个数据:
choice;
switch(choice){
case1:
add(i-1,j-1);
break;
//调用add(intn,intm)函数
case2:
reduce(i-1,j-1);
//调用reduce(intn,intm)函数
case3:
mend(i-1,j-1);
//调用mend(intn,intm)函数
case0:
default:
cout<
错了,请重新输入一个数据(0-3):
add(intn,intm){
inti,l=0,number,temp;
//number用来储存需要添加的人数
请输入需要添加的人数:
number;
temp=people[n][m];
people[n][m]=people[n][m]+number;
//该班的人数加上number
请输入这"
number<
个学生的名字和成绩:
for(i=temp;
people[n][m];
name[n][m][i];
score[n][m][i][l++];
l=0;
reduce(intn,intm){
inti,j,k,number,l=0,flag1,flag2=0;
//number为需要减少的人数
stringflag;
//flag用来储存从键盘输入的学生的名字
请输入需要减少的人数:
个学生的姓名:
flag1=0;
flag2=people[n][m];
请输入第"
i+1<
flag;
for(j=0;
if(name[n][m][j]==flag){
for(k=j;
people[n][m]-1;
name[n][m][k]=name[n][m][k+1];
//把后面学生的名字递补到前面来
score[n][m][k][l]=score[n][m][k+1][l];
l++;
score[n][m][k][l]=score[n][m][k+1][l];
score[n][m][k][l]=score[n][m][k+1][l];
people[n][m]--;
//执行完上面的内容后,该班的人数减一
elseflag1++;
if(flag1==flag2){cout<
这个学生不存在,请重新输入!
i--;
mend(intn,intm){
inti,j=0,l;
//用来储存学生的姓名
请您输入需要修改学生成绩的姓名:
//从键盘输入学生的姓名
if(name[n][m][i]==flag){
该学生的成绩如下"
//输出学生的原来的成绩
score[n][m][i][l++]<
l=0;
现在请输入该生现在的新成绩:
elsej++;
if(j==people[n][m])cout<
该学生不存在,请下次再重新输入!
tongji(){
inti,j,k,l,m,n,flag=0;
stringflag1;
j--;
for(k=0;
people[i][j];
for(l=0;
l<
S;
l++)
total[i][j][k]+=score[i][j][k][l];
average[i][j][k]=total[i][j][k]/S;
term[i]<
clas[i][j]<
成绩单"
姓名"
setw(10)<
汇编语言"
setw(11)<
离散数学"
数字逻辑"
C++语言"
大学英语"
setw(8)<
总分"
平均分"
setw(6)<
排名"
for(m=0;
m<
people[i][j]-1;
m++)
for(n=0;
n<
people[i][j]-m;
n++)
if(average[i][j][n]>
average[i][j][n+1]){
swap(average[i][j][n],average[i][j][n+1]);
swap(name[i][j][n],name[i][j][n+1]);
for(l=0;
swap(score[i][j][n][l],score[i][j][n+1][l]);
score[i][j][k][l];
total[i][j][k]<
average[i][j][k]<
++flag<
find(){
inti,j=0,l,m,n,flag1,flag2=0;
n;
clas[n-1][0]<
clas[n-1][1]<
clas[n-1][2]<
clas[n-1][3]<
m;
n--;
m--;
请您输入需要查找学生成绩的姓名:
//从键盘输入需要查找学生的姓名
//如果找不到该学生,J就加一
l=0;
endl<
不及格的情况如下:
flag1=0;
if(score[n][m][i][l]<
60){cout<
score[n][m][i][l]<
flag1++;
}l++;
}l=0;
if(flag1)cout<
以上为"
name[n][m][i]<
同学不及格的科目."
elseflag2++;
if(!
flag2)cout<
该班没有不及格的人."
save(){
inti,j,k,l,m;
ofstreamout("
成绩系统.txt"
);
//学生的成绩将保存在成绩系统.txt中
out<
setw(40)<
//将学期进行保存
out<
//对班级进行保存
setw(14)<
for(l=0;
l++){
m=0;
out<
name[i][j][l];
//对学生的姓名进行保存
for(k=0,m=10;
k++)
{out<
setw(m)<
score[i][j][l][k];
m=m+2;
}//对学生的成绩进行保存
学生的成绩已经成功地保存了!
print(){
inti,j,k,l;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)