高级程序设计期末考试题.docx
《高级程序设计期末考试题.docx》由会员分享,可在线阅读,更多相关《高级程序设计期末考试题.docx(10页珍藏版)》请在冰豆网上搜索。
高级程序设计期末考试题
一、算法分析题(本大题共3小题,选做2题,每小题40分,共80分)
1.逃学威龙
John无心向学,总是打逃课的主意,他确信他的期末考试绝对能够考过,但是老师可不相信他,因此老师定下了一条规矩,最后的期末成绩将由平时成绩和考试成绩组成,各占50%的分数,也就是满分100分,其中平时成绩50分,考试成绩50分。
而老师为了不让同学们逃课,平时成绩将仅由出勤情况确定,每点名到一次逃课就要扣掉10分的平时成绩。
John很不满于老师这套想法,决心要将翘课进行到底,他有足够的信心和实力在期末考中得到满分,剩下的就只看平时成绩了,只要他在平时成绩中保留的分数>=10分,他这个学期就可以合格。
他甚至为此充分调查了老师的点名习惯,发现如下规律:
每个学期这门课程共有K个课时(K<=20),而对于某节课老师点不点名是一个独立的事件,并且老师在某一节课点名的概率是p(0.0<=p<=1.0),现在fish_ball想尽可能多的逃课,但是要保证他有90%以上的概率不挂掉这门课,问fish_ball这个学期最多能翘掉多少课?
输入规格:
第一行是一个整数C,C<=20,紧接着C组数据,每组数据包含一行,依次给出整数K(1<=K<=20)和p(0.0<=p<=1.0),如题目中所描述。
输出规格:
对于每组数据,输出一个整数,表示John这学期最多能够翘掉几堂课。
算法分析:
设John逃课次数为skipNum,课程总数为classNum,当skipNum<=classNum时,在skipNum次逃课中,John被点名的次数<=4的概率(RealPossibility)>=0.9(即90%),则John可以通过该课程。
RealPossibility等于在skipNum次中分别被点0、1、2、3、4次的概率之和,
即:
RealPossibility=
当满足RealPossibility>=0.9时求的的SkipNum最大值即为John最大可逃的课程数。
程序:
#include
#include"math.h"
structKE{intK;floatp;};
intclassNum;//ClassNum为课程总数
floatp;//P为每节课老师点名的次数
intskipNum=5;//skipNum为John逃课次数
doublegetPossibility(inta,intb,doublep);//用于求a(skipNum)次逃课中被点b次的概率
doublegetRealPossble(inta2,intb2,doublep2);//求skipNum次中分别被点0-4次的概率和
voidmain()
{
intC;
cout<<"Input:
"<cin>>C;
KE*ke=newKE[C];
for(inti=0;i{
cin>>ke[i].K>>ke[i].p;
}
cout<<"Output:
"<for(i=0;i{classNum=ke[i].K;
p=ke[i].p;
while
(1)
{
if((getRealPossble(skipNum,4,p)>0.9)&&(skipNumskipNum++;
else
{
break;
}
}
cout<}
}
doublegetRealPossble(inta2,intb2,doublep2)
{
doublesumP=0;
inttempCt=b2;
while(tempCt>=0)
{
sumP=sumP+getPossibility(a2,tempCt,p2);
tempCt--;
}
returnsumP;
}
/*******GetPossibility*********/
doublegetPossibility(inta,intb,doublep1)
{
intcountUp=1;
intsumUp=1;
doublesumALL;
intsumDown=1;
inttemp=a;
while(countUp<=b)
{
sumUp=sumUp*a;
a--;
countUp++;
}
for(inti=1;i<=b;i++)
{
sumDown=sumDown*i;
}
sumALL=sumUp/sumDown;
returnsumALL*pow(p1,b)*pow(1-p1,temp-b);
}
Input
4
41
40
200.5
200.2
Output
0
4
4
9
*******
2.赶公交
Alfred在大学新区上学,他每个星期都要到市区学琴,因此要在每个星期六的10点钟之前赶到琴行上课,从郑大坐68路车到琴行要花整整一个小时,而68路车是每半小时一趟,整点和30分的时候会发一趟车。
这一次,Alfred起床晚了,一看表已经8点多了,匆忙收拾了一下之后,Alfred马上冲向公交站,但是,由于路况不佳,在前面的一段路上满是泥泞。
路况如下:
如左图,A(xA,yA)是Alfred现在所处的位置,B(xB,yB)是公交站(Bus-stop)的位置,其中y>0的区域是泥泞的地面,Alfred在泥泞的地面上的移动速度是v1(米/秒),而y<0的区域是水泥地,Alfred在水泥地上的移动速度只有v2(米/秒),其中v1<=v2,A在第二象限,B在第四象限。
Alfred是一个物工院的学生,他稍微估算了一下,剩下的时间已经不多了,他看看表,现在离9点整只剩下T秒了(T由题目给出),Alfred想知道,他如果用最优的策略赶往公交站,今天的课是否会迟到。
输入规格:
第一行是一个整数C,C<=10,紧接着C组数据,每组数据依次给出xA,yA,xB,yB,v1,v2和T,他们的意义如上文所述,x,y坐标的单位是米,所有坐标的绝对值<109,T是一个整数。
输出规格:
对于每组数据,输出YES或NO,表示Alfred会不会迟到。
算法:
在x轴上取P(p,0),对每组数据,给出xA,yA,xB,yB,v1,v2.,xA=
=0,Yes;t-T<0,No.
第二题。
。
。
不粉我你什么心态
#include
#include
#include
#include
usingnamespacestd;
classzuobiao//基坐标
{protected:
doublex,y;
public:
virtualvoidrun()=0;
virtualvoidprint()=0;
doublegetX();
doublegetY();
};
classA:
publiczuobiao//A坐标
{public:
A(){run();}
voidrun();
voidprint();
};
classB:
publiczuobiao//B坐标
{public:
B(){run();}voidrun();voidprint();
};
classAlfred//人物
{public:
Alfred(){setSpeed();}
voidsetSpeed();voidcalc();voidprint();
private:
Aa;Bb;doublev1,v2;doublet;
};
doublezuobiao:
:
getX(){returnx;}
doublezuobiao:
:
getY(){returny;}
voidA:
:
run(){x=0-rand()%109;y=rand()%109;}
voidB:
:
run(){x=rand()%109;y=0-rand()%109;}
voidA:
:
print(){cout<<"坐标A:
("<voidB:
:
print(){cout<<"坐标B:
("<voidAlfred:
:
setSpeed()
{doublea,b;
while
(1)
{a=rand()%6;b=rand()%6;
if(b>=a&&a>0)
{v2=b;v1=a;break;}}
}
voidAlfred:
:
print()
{cout<<"v1="<}
voidAlfred:
:
calc()
{doublei;doublek;//横坐标距离
k=b.getX()-a.getX();a.print();b.print();print();
for(i=0;i<=k;i++)
{if((sqrt(a.getY()*a.getY()+i*i)/v1+sqrt(b.getY()*b.getY()+(k-i)*(k-i))/v2)<=t){cout<<"YSE"<cout<<"NO"<}
intmain()
{intc,i;
srand((unsigned)time(NULL));
Alfreda[10];cout<<"请输入C:
";cin>>c;cout<for(i=0;i{a[i].calc();}return0;}
3.货物1000吨,3辆车同时起运,大车装5吨,来回一趟2小时,中车装3吨,来回一趟1.8小时(十进制),小车装2吨,来回一趟1.6小时(十进制),并规定:
若有多辆车同时到达,装车的优先次序是:
大车≥中车≥小车。
不记装车时间。
问:
(1)最后一趟车是那种车?
(2)大、中、小车各运多少趟?
算法:
设时间为t,然后起始t=0,剩余货物为m=1000-5-2-3,对t进行循环,在循环里,分开三种判断,1,t整除20等于0,就令m-5;2,t整除18等于0;就令m-3;3,t整除16=0,就令m-2;
每循环一次t自加一次;当m<=0时,循环结束。
此时再进行判断:
若t整除20等于0,最后为大车;若t整除18等于0,最后为中车;若t整除16=0,最后为小车。
大车趟数:
t/20+1;中车趟数:
(t-1)/18+1,小车趟数:
(t-1)/16+1
#include
voidmain()
{
inti=0,left=1000-5-3-2;
while
(1)
{
i++;
if(i%20==0)
left-=5;
if(left<=0)break;
if(i%18==0)
left-=3;
if(left<=0)break;
if(i%16==0)
left-=2;
if(left<=0)break;
}
if(i%20==0)
printf("最后一趟是大车\n");
else
{
if(i%18==0)
printf("最后一趟是中车\n");
else
printf("最后一趟是小车\n");
}
printf("大车运输了%d次\n中车运输了%d次\n小车运输了%d次\n",i/20+1,
(i-1)/18+1,(i-1)/16+1);
}
#include
usingnamespacestd;
intmain()
{intx=0,y=0,z=0;//次数
intt=0;//时间
intsum=1000;
inta1=5,a2=3,a3=2;
while(sum>=0)
{if(t%20==0)//大车
{if(sum<=0)
{cout<<"大车是最后一趟!
";break;}
else{sum=sum-a1;x++;}
}
if(t%18==0)
{if(sum<=0)
{cout<<"中车是最后一趟!
";break;}
else{sum=sum-a2;y++;}}
if(t%16==0){if(sum<=0)
{cout<<"小车是最后一趟!
";break;}
else{sum=sum-a3;z++;}
}t=t+2;
}cout<cout<<"三种车运送次数如下"<cout<return0;
}
0000*********////33*****************************
二、论述题(本大题共1小题,每小题20分,共20分)
以数字图书馆的应用,论述改进Web服务器性能的有关技术。
【提示】
由于在数字化图书馆信息系统中流通着的大多是数字化的索引、文摘、全文、图像或音频视频等多媒体信息,对Web服务器性能有着较高的要求,所以一个大中型的图书馆信息系统涉及到许多方面的技术与方案。
着重讨论与Web服务器性能有关的一些内容:
从硬件实现手段(缓存服务器、均衡负载设备、Web双机镜像、CPU和网卡的提升、网络带宽扩充)和软件实现手段(三层C/S软件结构设计、应用程序部署)等两个大方面论述如何提高Web服务器的性能,以便使用户能够更快捷、高效、安全地使用应用系统。
(1)缓存服务器和均衡负载设备使用可以缓解访问瓶颈,提高网络带宽、实现均衡负载。
缓存服务器也称为cache服务器,可以存储cache静态的内容如网页、多媒体点播资源和会议实况(已压缩的、有一定格式要求的)等。
cache服务器通常放到防火墙之外,外网Web服务器之前,因此Internet用户点击网页不再直接访问网站Web服务器,而是访问cache服务器。
由于cache服务器具有多个CPU和高速大容量I/O通道,独立的OS,因此能大大缓解Internet访问瓶颈,而且也具有一定的抗黑客攻击的能力。
********目前某图书馆采用这种方式,把大数据量的静态图片、点播资源、虚拟三维应用等都事先置放在cache服务器中,即使现今只有2MInternet的接入带宽,以上应用的播放速度和效果仍能让用户满意。
************
另外一种方式采用均衡负载设备或Web双机镜像。
这种方式通过负载均衡的方法达到Web访问性能最优。
Web双机镜像是较早以前流行的方式,虽能使系统可靠性提升,但由于双机总是在互相询问对方状态,将会影响一定的访问性能。
均衡负载设备是独立于Web服务器的硬件,它和Web服务器及网站中其他服务器接在同一交换机上,通过负载调度程序为各个服务器分配工作量,从而,能达到充分利用资源,提高访问性能的目的。
只是由于某图书馆目前对外发布资源相对仍较少,只采用了少量Web服务器,因此目前的均衡负载设备作用还不显著。
(2)从Web服务器的配置来看Web服务器自身CPU个数及速度、网卡数量、Web服务器与防火墙的位置关系等,都会影响到Web服务器的性能。
从Web服务器硬件本身来讲,CPU个数的增加、网卡个数的增加、I/O信道的扩展无疑可以直接地提高Web服务器性能。
此外,由于千兆口的防火墙目前较少且费用较高,如果把Web服务器放置防火墙之后,一定会大大影响Internet访问性能。
某图书馆采用IDS(入侵侦测)+Web服务器(服务器防火墙,较低端,不会影响流量)+应用服务器+数据库服务器(防火墙,高端),分层次的安全模式,既保证了系统的安全性,又提升了网络访问性能。
另外,某图书馆还采用了SAN网络区域存储来提高服务器访问速度。
(3)三层C/S软件结构设计和应用程序的适当部署也会提高Web服务器的性能。
将业务逻辑、通用访问接口与数据等相互分离、分别置放于Web服务器、应用服务器、数据库服务器上,通过程序功能和逻辑的合理部署,也能大大改进Web服务器性能。
一般的原则是,Web服务器只需接受Internethttp访问请求,使Web只有最少的任务,把实际处理交给各个应用服务器处理,然后返回结果给Browser。
某图书馆采用这种方式专门开发了搜索引擎应用服务器和混合检索应用服务器等,达到了良好的应用效果。
事实上,Web服务器的性能提升还存在很多手段和方法,比如CPU与存储之间关系,Web交换机等等.