初级程序员下午试题上半年及答案解析.docx
- 文档编号:5752821
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:28
- 大小:28.16KB
初级程序员下午试题上半年及答案解析.docx
《初级程序员下午试题上半年及答案解析.docx》由会员分享,可在线阅读,更多相关《初级程序员下午试题上半年及答案解析.docx(28页珍藏版)》请在冰豆网上搜索。
初级程序员下午试题上半年及答案解析
初级程序员下午试题2014上半年及答案解析
(1~5/共30题)填空题
阅读以下说明和流程图,填补流程图中的空缺
(1)~(5),将解答填入答题纸的对应栏内。
[说明]
指定网页中,某个关键词出现的次数除以该网页长度称为该关键词在此网页中的词频。
对新闻类网页,存在一组公共的关键词。
因此,每个新闻网页都存在一组词频,称为该新闻网页的特征向量。
设两个新闻网页的特征向量分别为:
甲(a1,a2,…,ak)、乙(b1,b2…,bk),则计算这两个网页的相似度时需要先计算它们的内积S=a1b1+a2b2+…+akbk。
一般情况下,新闻网页特征向量的维数是巨大的,但每个特征向量中非零元素却并不多。
为了节省存储空间和计算时间,我们依次用特征向量中非零元素的序号及相应的词频值来简化特征向量。
为此,我们用(NA(i),A(i)|i=1,2,…,m)和(NB(j),B(i)…j=1,2,…,n)来简化两个网页的特征向量。
其中:
NA(i)从前到后描述了特征向量甲中非零元素A(i)的序号(NA
(1)<NA
(2)<…),
NB(j)从前到后描述了特征向量乙中非零元素B(j)的序号(NB
(1)<NB
(2)<…)。
下面的流程图描述了计算这两个特征向量内积S的过程。
图片
第1题
(1)______
第2题
(2)_____
第3题
(3)_____
第4题
(4)_____
第5题
(5)_____
下一题
(6~10/共30题)填空题
阅读以下说明和C函数,填补代码中的空缺
(1)~(5),将解答填入答题纸的对应栏内。
[说明1]
函数isPrime(intn)的功能是判断n是否为素数。
若是,则返回1,否则返回0。
素数是只能被1和自己整除的正整数。
例如,最小的5个素数是2,3,5,7,11。
[C函数]
intisPrime(intn)
{
intk,t
if(n==2)return1;
if(n<2||
(1))return0;/*小于2的数或大于2的偶数不是素数*/
t=(int)sqrt(n)+1;
for(k=3;k<t;k+=2)
if(
(2))return0;
return1;
}
[说明2]
函数mtminOne(intarr[],intk)的功能是用递归方法求指定数组中前k个元素中的最小者,并作为函数值返回。
[C函数]
intminOne(intarr[],intk)
{
intt;
assert(k>0);
if(k==1)
return(3);
t=minone(arr+1,(4);
if(arr[0]<t)
returnarr[0];
return(5);
}
第6题
(1)_____
第7题
(2)_____
第8题
(3)_____
第9题
(4)_____
第10题
(5)_____
上一题下一题
(11~15/共30题)填空题
阅读以下说明和C程序,填补代码中的空缺
(1)~(5),将解答填入答题纸的对应栏内。
[说明]
函数areAnagrams(char*fstword,char*sndword)的功能是判断fstword和sndword中的单词(不区分大小写)是否互为变位词,若是则返回1,否则返回0。
所谓变位词是指两个单词是由相同字母的不同排列得到的。
例如,“triangle”与“integral”互为变位词,而“dumbest”与“stumble”不是。
函数areAnagrams的处理思路是检测两个单词是否包含相同的字母且每个字母出现的次数也相同。
过程是先计算第一个单词(即fstword中的单词)中各字母的出现次数并记录在数组counter中,然后扫描第二个单词(即sndword中的单词)的各字母,若在第二个单词中遇到与第一个单词相同的字母,就将相应的计数变量值减1,若在第二个单词中发现第一个单词中不存在的字母,则可断定这两个单词不构成变位词。
最后扫描用于计数的数组counter各元素,若两个单词互为变位词,则counter的所有元素值都为0。
函数areAnagrams中用到的部分标准库函数如下表所述。
图片
[C函数]
intareAnagrams(char*fstword,char*sndword)
{
intindex;
intcounter[26]={0};/*counter[i]为英文字母表第i个字母出现的次数,
´A´或´a´为第0个,´B´或´b´为第1个,依此类推*/
if(
(1))/*两个单词相同时不互为变位词*/
return0;
while(*fstword){/*计算第一个单词中各字母出现的次数*/
if(isalpha(*fstword)){
if(isupper(*fstword))
counter[*fstword-´A´]++;
else
counter[+fstword-´a´]++;
(2);/*下一个字符*/
}
}
while(*sndword){
if(isalpha(*sndword)){
index=isupper(*sndword)?
*sndword-´A´:
*sndword-´a´;
if(counter[index])
counter[index]--;
else
(3);
}
(4);/*下一个字符*/
}
for(index=0;index<26;index++)
if((5))
return0;
return1;
}
第11题
(1)_____
第12题
(2)_____
第13题
(3)_____
第14题
(4)_____
第15题
(5)_____
上一题下一题
(16~20/共30题)填空题
阅读以下说明和C函数,填补代码中的空缺
(1)~(5),将解答填入答题纸的对
应栏内。
[说明]
函数ReverseList(LinkListheadptr)的功能是将含有头结点的单链表就地逆置。
处理思路是将链表中的指针逆转,即将原链表看成由两部分组成:
已经完成逆置的部分和未完成逆置的部分,令s指向未逆置部分的第一个结点,并将该结点插入已完成部分的表头(头结点之后),直到全部结点的指针域都修改完成为止。
例如,某单链表如图4—1所示,逆置过程中指针s的变化情况如图4—2所示。
图片
链表结点类型定义如下:
typedefstructNode{
intdata;
structNode*next;
}Node,*LinkList;
[C函数]
voidReverseList(LinkListheadptr)
{//含头结点的单链表就地逆置,headptr为头指针
LinkListp,s;
if(
(1))return;//空链表(仅有头结点)时无需处理
p=
(2);//令p指向第一个元素结点
if(!
P->next)return;//链表中仅有一个元素结点时无需处理
s=p->next;//s指向第二个元素结点
(3)=NULL;//设置第一个元素结点的指针域为空
while(s){
p=s;//令P指向未处理链表的第一个结点
s=(4);
p->next=headptr->next;//将P所指结点插入已完成部分的表头
headptr->next=(5);
}
}
第16题
(1)_____
第17题
(2)_____
第18题
(3)_____
第19题
(4)_____
第20题
(5)_____
上一题下一题
(21~25/共30题)填空题
阅读下列说明、C++代码和运行结果,填补代码中的空缺
(1)~(5),将解答填入答题纸的对应栏内。
[说明]
对部分乐器进行建模,其类图如图5—1所示,包括:
乐器(Instrument)、管乐器(Wind)、打击乐器(Percussion)、弦乐器(Stringed)、木管乐器(Woodwind)、铜管乐器(Brass)。
图片
下面是实现上述设计的C++代码,其中音乐类(Music)使用各类乐器(Instnunent)进行演奏和调音等操作。
[C++代码]
#inqlude<iostream>
usingnamespacestd;
enumNote{/*枚举各种音调*/
MIDDLE_C,C_SHARP,B_FLAT
};
classInstrument{/*抽象基类,乐器*/
public:
(1);//play函数接口
virtualvoidadjust()=0;//adjust函数接口
},
classWind
(2){
public:
voidplay(Noten){cout<<"Wind.play()"<<n<<endl;}
voidadjust(){cout<<"Wind.adjust()"<<endl;}
};
/*类Percussion和Stringed实现代码略*/
classBrass(3){
public:
voidplay(Noten){cout<<"Brass.play()"<<n<<endl;}
voidadjust(){cout<<"Brass.adjust()"<<endl;}
};
classWoodwind:
publicWind{
public:
voidplay(Noten){cout<<"Woodwind.play()"<<n<<endl;}
};
classMusic{
public:
voidtune(Instrument*i){i->play(MIDDLE_C);}
voidadjust(Instrument*i){i->adjust();}
voidtuneAll((4)e[],intnumIns){/*为每个乐器定调*/
for(inti=0;i<numIns;i++){
this->tune(e[i]);
this->adjust(e[i]);
}
}
};
/*使用模板定义一个函数size,该函数将返回数组array的元素个数,实现代码略*/
intmaln(){
Music*music=(5)Music();
Instrument*orchestra[]={newWind(),newWoodwind()};
music->tuneAll(orchestra,size(orchestra));/*size返回数组orchestra的元素个数*/
for(inti=0;i<size(orchestra);i++)
deleteorchestra[i];
deletemusic;
}
本程序运行后的输出结果为:
Wind.play()0
Wind.adjust()
Woodwind.play()0
Wind.adjust()
第21题
(1)_____
第22题
(2)_____
第23题
(3)_____
第24题
(4)_____
第25题
(5)_____
上一题下一题
(26~30/共30题)填空题
对部分乐器进行建模,其类图如图6—1所示,包括:
乐器(Instrument)、管乐器(Wind)、打击乐器(Percussion)、弦乐器(Stringed)、木管乐器(Woodwind)、铜管乐器(Brass)。
图片
下面是实现上述设计的Java代码,其中音乐类(Music)使用各类乐器(Instrument)进行演奏和调音等操作。
[Java代码]
enumNote{/*枚举各种音调*/
MIDDLE_C,C_SHARP,B~FLAT;//其他略
}
interfaceInstrument{/*接口,乐器*/
(1);//play方法接口
voidadjust()j//adjust方法接口
}
classWind
(2){
publicvoidplay(Noten){System.out.println("Wind.play()"+n);}
publicvoidadjust(){System.out.println("Wind.adjust()");}
}
/*类Percussion和Stringed实现代码略*/
classBrass(3){
publicvoidplay(Noten){System.out.println("Brass.play()"+n);}
publicvoidadjust(){System.out.println("Brass.adjust()");}
}
classWoodwindextendsWind{
publicvoidplay(Noten){System.out.println("Woodwind.play()"+n);}
}
publicclassMusic{
voidtune(Instrument_i){i.play(Note.MIDDLE_C);}
voidadjust(Instrument_i){i.adjust();}
voidtuneAll((4)e){
for(Instrumenti:
e){
adjust(i);
tune(i);
}
}
publicstaticvoidmain(String[]args){
Musicmusic=(5)Music();
Instrument[]orchestra={newWind(),newWoodwind()};
music.tuneAll(orchestra);
}
}
本程序运行后的输出结果为:
Wind.adjust()
Wind.play()MIDDLE_C
Wind.adjust()
Woodwind.play()MIDDLE_C
第26题
(1)_____
第27题
(2)_____
第28题
(3)_____
第29题
(4)_____
第30题
(5)_____
答案及解析
(1~5/共30题)填空题
阅读以下说明和流程图,填补流程图中的空缺
(1)~(5),将解答填入答题纸的对应栏内。
[说明]
指定网页中,某个关键词出现的次数除以该网页长度称为该关键词在此网页中的词频。
对新闻类网页,存在一组公共的关键词。
因此,每个新闻网页都存在一组词频,称为该新闻网页的特征向量。
设两个新闻网页的特征向量分别为:
甲(a1,a2,…,ak)、乙(b1,b2…,bk),则计算这两个网页的相似度时需要先计算它们的内积S=a1b1+a2b2+…+akbk。
一般情况下,新闻网页特征向量的维数是巨大的,但每个特征向量中非零元素却并不多。
为了节省存储空间和计算时间,我们依次用特征向量中非零元素的序号及相应的词频值来简化特征向量。
为此,我们用(NA(i),A(i)|i=1,2,…,m)和(NB(j),B(i)…j=1,2,…,n)来简化两个网页的特征向量。
其中:
NA(i)从前到后描述了特征向量甲中非零元素A(i)的序号(NA
(1)<NA
(2)<…),
NB(j)从前到后描述了特征向量乙中非零元素B(j)的序号(NB
(1)<NB
(2)<…)。
下面的流程图描述了计算这两个特征向量内积S的过程。
图片
第1题
(1)______
参考答案:
0
详细解答:
第2题
(2)_____
参考答案:
S+A(i)B(j)或等价表示
详细解答:
第3题
(3)_____
参考答案:
i>m或i=m+1或等价表示
详细解答:
第4题
(4)_____
参考答案:
i>n或j=n+1或等价表示
详细解答:
第5题
(5)_____
参考答案:
i>morj>n或i=m+1orj=n+1或等价表示
详细解答:
本题是简化了的一个大数据算法应用之例。
世界上每天都有大量的新闻网页,门户网站需要将其自动进行分类,并传送给搜索的用户。
为了分类,需要建立网页相似度的衡量方法。
流行的算法是,先按统一的关键词组计算各个关键词的词频,形成网页的特征向量,这样,两个网页特征向量的夹角余弦(内积/两个向量模的乘积),就可以衡量两个网页的相似度。
因此,计算两个网页特征向量的内积就是分类计算中的关键。
对于存在大量零元素的稀疏向量来说,用题中所说的简化表示方法是很有效的。
这样,求两个向量的内积只需要在分别从左到右扫描两个简化向量时,计算对应序号相同(NA(i)=NB(j))时的A(i)*B(j)之和(其他情况两个向量对应元素之乘积都是0)。
因此,流程图中
(2)处应填S+A(i)*B(j),而累计的初始值S应该为0,即
(1)处应填0。
流程图中,NA(i)<NB(j)时,下一步应再比较NA(i+1)<NB(j),除非i+1已经越界。
因此,应先执行i+1→i,再判断是否i>m或i=m+1(如果成立,则扫描结束)。
因此(3)处应填i>m或i=m+1。
流程图中,NA(i)>NB(j)时,下一步应再比较NA(i)<NB(j+1),除非j+1已经越界。
因此,应先执行j+1→j,再判断是否j>n或j=n+1(如果成立,则扫描结束)。
因此(4)处应填j>n或j=n+1。
(5)处应填扫描结束的条件,i>morj>n或i=m+1orj=11+1,即两个简化向量之一扫描结束时,整个扫描就结束了。
下一题
(6~10/共30题)填空题
阅读以下说明和C函数,填补代码中的空缺
(1)~(5),将解答填入答题纸的对应栏内。
[说明1]
函数isPrime(intn)的功能是判断n是否为素数。
若是,则返回1,否则返回0。
素数是只能被1和自己整除的正整数。
例如,最小的5个素数是2,3,5,7,11。
[C函数]
intisPrime(intn)
{
intk,t
if(n==2)return1;
if(n<2||
(1))return0;/*小于2的数或大于2的偶数不是素数*/
t=(int)sqrt(n)+1;
for(k=3;k<t;k+=2)
if(
(2))return0;
return1;
}
[说明2]
函数mtminOne(intarr[],intk)的功能是用递归方法求指定数组中前k个元素中的最小者,并作为函数值返回。
[C函数]
intminOne(intarr[],intk)
{
intt;
assert(k>0);
if(k==1)
return(3);
t=minone(arr+1,(4);
if(arr[0]<t)
returnarr[0];
return(5);
}
第6题
(1)_____
参考答案:
n%2==0,或!
(n%2),或其等价形式
详细解答:
第7题
(2)_____
参考答案:
n%k==0,或!
(n%k),或其等价形式
详细解答:
第8题
(3)_____
参考答案:
arr[0],或*arr,或其等价形式
详细解答:
第9题
(4)_____
参考答案:
k-1,或其等价形式
详细解答:
第10题
(5)_____
参考答案:
t
详细解答:
本题考查C程序的基本语法和运算逻辑。
首先应认真分析题目中的说明,然后确定代码结构和各变量的作用。
函数isPrime(intn)的功能是判断n是否为素数。
根据素数的定义,小于2的数和大于2的偶数都不是素数,n是偶数可表示为“n%2等于0”,因此空
(1)处应填入“n%2==0”,或者“!
(n%2)”。
在n是大于2的奇数的情况下,下面的代码从3开始查找n的因子,直到n的平方根为止。
for(k=3;k<t;k+=2)
if(
(2))return0;
若k的值是n的因子,则说明n不是素数。
因此,空
(2)处应填入“n%k==0”,或者“!
(n%k)”。
函数intminOne(intarr[],intk)的功能是用递归方法求指定数组中前k个元素中的最小者,显然,k为1时,这一个元素就是最小者。
因此,空(3)处应填入“arr[0]”或其等价形式。
空(4)所在的语句是通过递归方式找出arr[1]~arr[k-1]中的最小者,第一个实参指出从arr[1]开始,第二个参数为元素个数,为k-1个,因此空(4)应填入“k-1”。
接下来的处理就很明确了,当t表示arr[1]~arr[k-1]中的最小者,其与arr[0]比较后就可以得到arr[0]~arr[k-1]中的最小者,因此空(5)处应填入“t”。
上一题下一题
(11~15/共30题)填空题
阅读以下说明和C程序,填补代码中的空缺
(1)~(5),将解答填入答题纸的对应栏内。
[说明]
函数areAnagrams(char*fstword,char*sndword)的功能是判断fstword和sndword中的单词(不区分大小写)是否互为变位词,若是则返回1,否则返回0。
所谓变位词是指两个单词是由相同字母的不同排列得到的。
例如,“triangle”与“integral”互为变位词,而“dumbest”与“stumble”不是。
函数areAnagrams的处理思路是检测两个单词是否包含相同的字母且每个字母出现的次数也相同。
过程是先计算第一个单词(即fstword中的单词)中各字母的出现次数并记录在数组counter中,然后扫描第二个单词(即sndword中的单词)的各字母,若在第二个单词中遇到与第一个单词相同的字母,就将相应的计数变量值减1,若在第二个单词中发现第一个单词中不存在的字母,则可断定这两个单词不构成变位词。
最后扫描用于计数的数组counter各元素,若两个单词互为变位词,则counter的所有元素值都为0。
函数areAnagrams中用到的部分标准库函数如下表所述。
图片
[C函数]
intareAnagrams(char*fstword,char*sndword)
{
intindex;
intcounter[26]={0};/*counter[i]为英文字母表第i个字母出现的次数,
´A´或´a´为第0个,´B´或´b´为第1个,依此类推*/
if(
(1))/*两个单词相同时不互为变位词*/
return0;
while(*fstword){/*计算第一个单词中各字母出现的次数*/
if(isalpha(*fstword)){
if(isupper(*fstword))
counter[*fstword-´A´]++;
else
counter[+fstword-´a´]++;
(2);/*下一个字符*/
}
}
while(*sndword){
if(isalpha(*sndword)){
index=isupper(*sndword)?
*sndword-´A´:
*sndword-´a´;
if(counter[index])
counter[index]--;
else
(3);
}
(4);/*下一个字符*/
}
for(index=0;index<26;index++)
if((5))
return0;
return1;
}
第11题
(1)_____
参考答案:
strcmp(fstword,sndword)==0,或其等价形式
详细解答:
第12题
(2)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 初级 程序员 下午 试题 上半年 答案 解析
![提示](https://static.bdocx.com/images/bang_tan.gif)