下半年程序员真题案例分析题Word文档格式.docx
- 文档编号:16239707
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:14
- 大小:223.86KB
下半年程序员真题案例分析题Word文档格式.docx
《下半年程序员真题案例分析题Word文档格式.docx》由会员分享,可在线阅读,更多相关《下半年程序员真题案例分析题Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
,a,b);
Swap(a,b);
Printf("
a2=%db2=%d\n”,a,b);
return0;
【代码2】
stdio.h>
#defineSPACE¨
//空格字符
Intmain()
{
charstr[128]=”Nothingisimpossible!
“;
inti,num=0,wordMark=0;
for(i=0;
str[i];
i++)
If(str[i]=SPACE)
WordMark=0;
else
If(wordMark=0){
wordMark=1;
Mun++;
}
Printf(“%d/n”,num)
retun0;
【代码3】
#defineSPACE“//空格字符
intcountStrs(char*);
intmain()
charstr[128]="
Nothingisimpossible!
"
;
Printf(‘%d/n,
(1)(str))
retum0;
intcountStrs(char*p)
intnum=0,wordMark=0;
for(;
(2);
p++){
If((3)=SPACE)
wordMark=0;
if(!
wordMark){
wordMark=1;
++mun
retum(4);
【问题1】
(4分)
写出代码1运行后的输出结果。
【问题2】
(3分)
写出代码2运行后的输出结果。
【问题3】
(8分)
代码3的功能与代码2完全相同,请补充3中的空缺,将解答写入答题纸的对应栏内。
试题三(共15分)
阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
下面的程序利用快速排序中划分的思想在整数序列中找出第k小的元素(即将元素从小到大排序后,取第k个元素)。
对一个整数序列进行快速排序的方法是:
在待排序的整数序列中取第一个数作为基准值,然后根据基准值进行划分,从而将待排序的序列划分为不大于基准值者(称为左子序列)和大于基准值者(称为右子序列),然后再对左子序列和右子序列分别进行快速排序,最终得到非递减的有序序列。
例如,整数序列“19,12,30,11,7,53,78,25"
的第3小元素为12。
整数序列“19,12,7,30,11,11,7,53.78,25,7"
的第3小元素为7。
函数partition(inta[],intlow,inthigh)以a[low]的值为基准,对a[low]、a[low+l]、…、a[high]进行划分,最后将该基准值放入a[i](low≤i≤high),并使得a[low]、a[low+l]、,..、A[i-1]都小于或等于a[i],而a[i+l]、a[i+2]、..、a[high]都大于a[i]。
函教findkthElem(inta[],intstartIdx,intendIdx,inrk)在a[startIdx]、a[startIdx+1]、...、a[endIdx]中找出第k小的元素。
【代码】
#include<
stdlib.h>
Intpartition(inta[],intlow,inthigh)
{//对a[low..high]进行划分,使得a[low..i]中的元素都不大于a[i+1..high]中的元素。
intpivot=a[low];
//pivot表示基准元素
Inti=low,j=high;
while(
(1)){
While(i<
j&
&
a[j]>
pivot)--j;
a[i]=a[j]
a[i]>
pivot)++i;
a[j]=a[i]
(2);
//基准元素定位
returni;
}
IntfindkthElem(inta[],intstartIdx,intendIdx,intk)
{//整数序列存储在a[startldx..endldx]中,查找并返回第k小的元素。
if(startldx<
0||endIdx<
0||startIdx>
endIdx||k<
1||k-l>
endIdx||k-1<
startIdx)
Return-1;
//参数错误
if(startIdx<
endldx){
intloc=partition(a,startIdx,endldx);
∥进行划分,确定基准元素的位置
if(loc==k-1)∥找到第k小的元素
return(3);
if(k-l<
loc)//继续在基准元素之前查找
returnfindkthElem(a,(4),k);
else//继续在基准元素之后查找
returnfindkthElem(a,(5),k);
returna[startIdx];
inti,k;
intn;
inta[]={19,12,7,30,11,11,7,53,78,25,7};
n=sizeof(a)/sizeof(int)//计算序列中的元素个数
for(k=1;
k<n+1;
k++){
i<n;
i++){
printf(“%d/t”,a[i]);
printf(“\n”);
printf(“elem%d=%d\n,k,findkthElem(a,0,n-1,k));
//输出序列中第k小的元素
return0;
试题四(共15分)
【说明】
图是很多领域中的数据模型,遍历是图的一种基本运算。
从图中某顶点v出发进行广度优先遍历的过程是:
①访问顶点v;
②访问V的所有未被访问的邻接顶点W1,W2,..,Wk;
③依次从这些邻接顶点W1,W2,..,Wk出发,访问其所有未被访问的邻接顶点;
依此类推,直到图中所有访问过的顶点的邻接顶点都得到访问。
显然,上述过程可以访问到从顶点V出发且有路径可达的所有顶点。
对于从v出发不可达的顶点u,可从顶点u出发再次重复以上过程,直到图中所有顶点都被访问到。
例如,对于图4-1所示的有向图G,从a出发进行广度优先遍历,访问顶点的一种顺序为a、b、c、e、f、d。
图4-1
图4-2
设图G采用数组表示法(即用邻接矩阵arcs存储),元素arcs[i][j]定义如下:
图4-1的邻接矩阵如图4-2所示,顶点a~f对应的编号依次为0~5.因此,访问顶点a的邻接顶点的顺序为b,c,e。
函数BFSTraverse(GraphG)利用队列实现图G的广度优先遍历。
相关的符号和类型定义如下:
#defineMaxN:
50/*图中最多顶点数*/
typedefintAdjMatrix[MaxN][MaxN];
typedefstruct{
intvexnum,edgenum;
/*图中实际顶点数和边(弧)数*/
AdjMatrixarcs;
/*邻接矩阵*/
)Graph;
typedefintQElemType;
enum{ERROR=0;
OK=l};
代码中用到的队列运算的函数原型如表4-1所述,队列类型名为QUEUE。
表4-1实现队列运算的函数原型及说明
intBFSTraverse(GraphG)
{//图G进行广度优先遍历,图采用邻接矩阵存储
unsignedchar*visited;
//visited[]用于存储图G中各顶点的访问标志,0表示未访问
intv,w;
u;
QUEUEQQ;
∥申请存储顶点访问标志的空间,成功时将所申请空间初始化为0
visited=(char*)calloc(G.vexnum,sizeof(char));
If(
(1))
retumERROR;
(2);
//初始化Q为空队列
for(v=0;
v<
G.vexnum;
v++){
if(!
visited[v]){//从顶点v出发进行广度优先遍历
%d”,v);
//访问顶点v并将其加入队列
visited[v]=l;
(3);
while(!
isEmpty(Q)){
(4);
//出队列并用u表示出队的元素
for(v=0;
v<
w++){
if(G.arcs[u][w]!
=0&
(5)){//w是u的邻接顶点且未访问过
%d”,w);
//访问顶点w
visited[w]=1;
EnQueue(&
Q,w);
free(visited);
returnOK;
)//BFSTraverse
从下列的2道试题(试题五至试题六)中任选1道解答。
请在答题纸上的指定位置处将所选择试题的题号框涂黑。
若多涂或者未涂题号框,则对题号最小的一道试题进行评分。
试题五(共15分)
阅读以下说明和Java程序,填补代码中的空缺,将解答填入答题纸的对应栏内。
以下Java代码实现一个简单的聊天室系统(ChatRoomSystem),多个用户(User)可以向聊天室(ChatRoom)发送消息,聊天室将消息展示给所有用户。
类图如图5-1所示。
【Java代码】
classChatRoom{
publicstaticvoidshowMessage(Useruser,Strmgmessage){
System.out.println("
["
+user.getName()+"
]:
+message);
classUser{
privateStringname;
publicStringgetName(){
returnname;
publicvoidsetName(Stringname){
this.name=name;
publicUser(Stringname){
(1)=name;
publicvoidsendMessage(Stringmessage){
(2)(this,message);
publicclassChat:
RoomSystem{
publicvoidstartup(){
Userzhang=newUser("
John"
);
Userli=newUser("
Leo"
zhang.sendMessage("
Hi!
Leo!
1i.sendMessage("
John!
"
publicvoidjoin(Useruser){
(3)("
HelloEveryone!
Iam"
+user.getName());
publicstaticvoidmain(String[]args){
ChatRoomSystemcrs=(4);
Crs.startup();
Crs.join((5))(“Wayne”));
/*
程序运行结果:
[John]:
Leol
[Leo]:
[Wayne】:
IamWayne
*/
试题六(共15分)
阅读下列说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
以下C++代码实现一个简单的聊天室系统(ChatRoomSystem),多个用户(User)可以向聊天室(ChatRoom)发送消息,聊天室将消息展示给所有用户。
类图如图6-1所表示。
【C++代码】
iostream>
string>
usingnamespacestd;
classUser{
private:
stringname;
public:
User(stringname){
~User(){}
voidsetName(stringname){
this->
name=name;
stringgetName(){
voidsendMessage(stringmessage);
};
classChatRoom{.
staticvoidshowMessage(User*user,stringmessage){
cout<
<
user->
getName()"
message<
endl;
voidUser:
:
sendMessage(stringmessage){
(2)(this,message);
classChatRoomSystem{
..
voidstartup0(){
User*zhang=newUser(“John"
User*li=newUser("
zhang->
sendMessage("
li_>
}
voidjoin(User*user){
(3)("
HeIIoEveryone!
lam"
+user->
getName());
.;
}.
};
intmain(){
ChatRoomSystem*crs=(4);
crs->
startup();
join((5)("
Wayne"
));
deletecrs;
/*
如需了解更多程序员真题资讯,请看希赛软考学院!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 下半年 程序员 案例 分析