软考初级程序员0911下午.docx
- 文档编号:10860257
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:37
- 大小:2.34MB
软考初级程序员0911下午.docx
《软考初级程序员0911下午.docx》由会员分享,可在线阅读,更多相关《软考初级程序员0911下午.docx(37页珍藏版)》请在冰点文库上搜索。
软考初级程序员0911下午
2009年上半年软考程序员考试下午试卷
试题一(共15分)
阅读以下说明和流程图,填补流程图中的空缺
(1)~(5),将解答填入答题纸的对应栏内。
【说明】
下面的流程图采用公式计算的近似值。
设x位于区间(0,1),该流程图的算法要点是逐步累积计算每项Xn/n!
的值(作为T),再逐步累加T值得到所需的结果S。
当T值小于10-5时,结束计算。
【流程图】
试题二(共15分)
【说明】
C语言常用整型(int)或长整型(long)来说明需要处理的整数,在一般情况下可以满足表示及运算要求,而在某些情况下,需要表示及运算的整数比较大,即使采用更长的整型(例如,longlong类型,某些C系统会提供)也无法正确表示,此时可用一维数组来表示一个整数。
假设下面要处理的大整数均为正数,将其从低位到高位每4位一组进行分组(最后一组可能不足4位),每组作为1个整数存入数组。
例如,大整数2543698845679015847在数组A中的表示如下(特别引入-1表示分组结束):
在上述表示机制下,函数add_large_number(A,B,C)将保存在一维整型数组A和B中的两个大整数进行相加,结果(和数)保存在一维整型数组C中。
【C函数】
voidadd_large_number(intA[],intB[],intC[])
{
inti,cf; /*cf存放进位*/
intt,*p; /*t为临时变量,p为临时指针*/
cf=
(1) ;
for(i=0;A[i]>-1&&B[i]>-1;i++){
/*将数组A、B对应分组中的两个整数进行相加*/
t=
(2) ;
C[i]=t%10000;
cf= (3) ;
}
if( (4) ) p=B;
else p=A;
for(;p[i]>-1;i++){ /*将分组多的其余各组整数带进位复制入数组C*/
C[i]=(p[i]+cf)%10000; cf=(p[i]+cf)/10000;
}
if(cf>0) C[i++]=cf;
(5) =-1; /*标志"和数"的分组结束*/
}
试题三(共15分)
阅读以下说明、C函数和问题,将解答填入答题纸的对应栏内。
【说明】
二叉查找树又称为二叉排序树,它或者是一棵空树,或者是具有如下性质的二叉树:
●若它的左子树非空,则其左子树上所有结点的键值均小于根结点的键值;
●若它的右子树非空,则其右子树上所有结点的键值均大于根结点的键值;
●左、右子树本身就是二叉查找树。
设二叉查找树采用二叉链表存储结构,链表结点类型定义如下:
typedefstructBiTnode{
int key_value; /*结点的键值,为非负整数*/
structBiTnode*left,*right; /*结点的左、右子树指针*/
}*BSTree;
函数find_key(root,key)的功能是用递归方式在给定的二叉查找树(root指向根结点)中查找键值为key的结点并返回结点的指针;若找不到,则返回空指针。
【函数】
BSTreefind_key(BSTreeroot,intkey)
{
if(
(1) )
returnNULL;
else
if(key==root->key_value)
return
(2) ;
elseif(key
return (3) ;
else
return (4) ;
}
【问题1】
请将函数find_key中应填入
(1)~(4)处的字句写在答题纸的对应栏内。
【问题2】
若某二叉查找树中有n个结点,则查找一个给定关键字时,需要比较的结点个数取决于 (5) 。
试题四(共15分)
阅读以下两个说明、C函数和问题,将解答写入答题纸的对应栏内。
【说明1】
函数main()的功能旨在对输入的一个正整数n,计算,但是对该函数进行测试后没有得到期望的结果。
【C函数1】
1.输入5测试上述main函数时,显示结果如下所示。
2.将行号为7的代码修改为:
printf("n=%d\nresult:
%d\n",n,sum); 并再次输入5测试main函数,显示结果如下所示。
【问题1】(9分)
请给出上述main函数中需要修改的代码行号,并给出修改后的整行代码。
【说明2】
函数test_f2()编译时系统报告有错,修改后得到函数f2_B()。
对函数f2_B()进行编译时顺利通过,在某些C系统中执行时却由于发生异常而不能正确结束。
【C函数2】
【问题2】(6分)
(1)请指出函数test_f2中不能通过编译的表达式;
(2)请指出可能导致函数f2_B运行异常的表达式。
从下列2道试题(试题五至试题六)中任选1道解答。
如果解答的试题数超过1道,则题号小的1道解答有效。
试题五(共15分)
阅读以下说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
C++标准模板库中提供了map模板类,该模板类可以表示多个“键-值”对的集合,其中键的作用与普通数组中的索引相当,而值用作待存储和检索的数据。
此外,C++模板库还提供了pair模板类,该类可以表示一个“键-值”对。
pair对象包含两个属性:
first和second,其中first表示“键-值”中的“键”,而second表示“键-值”中的“值”。
map类提供了insert方法和find方法,用于插入和查找信息。
应用时,将一个pair对象插入(insert)到map对象后,根据“键”在map对象中进行查找(find),即可获得一个指向pair对象的迭代器。
下面的C++代码中使用了map和pair模板类,将编号为1001、1002、1003的员工信息插入到map对象中,然后输入一个指定的员工编号,通过员工编号来获取员工的基本信息。
员工编号为整型编码,员工的基本信息定义为类employee。
map对象与员工对象之间的关系及存储结构如图5-1所示。
图5-1
【C++代码】
#include
#include
#include
usingnamespacestd;
classemployee{
(1) :
employee(stringname,stringphoneNumber,stringaddress){
this->name=name;
this->phoneNumber=phoneNumber;
this->address=address;
}
stringname;
stringphoneNumber;
stringaddress;
};
intmain()
{
map
typedefpair
for(intemployIndex=1001;employIndex<=1003;employIndex++){
chartemp[10]; //临时存储空间
_itoa(employIndex,temp,10); //将employIndex转化为字符串存储在temp中
stringtmp(
(2) ); //通过temp构造string对象
employeeMap. (3) (employeePair(employIndex,
newemployee("employee-"+tmp,
"85523927-"+tmp,
"address-"+tmp)
)
);//将员工编号和员工信息插入到employeeMap对象中
}
intemployeeNo=0;
cout<<"请输入员工编号:
";
(4) >>employeeNo; //从标准输入获得员工编号
map
:
const_iteratorit;
it= (5) .find(employeeNo); //根据员工编号查找员工信息
if(it==employeeMap.end()){
cout<<"该员工编号不存在!
"< return-1; } cout<<"你所查询的员工编号为: "< cout<<"该员工姓名: "< cout<<"该员工电话: "< cout<<"该员工地址: "< return0; } 试题六(共15分) 阅读以下说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 java.util包中提供了HashMap模板类,该模板类可以表示多个“键-值”对的集合,其中“键”的作用与普通数组中的索引相当,而“值”用作待存储和检索的数据。 HashMap实现了Map接口。 在Map接口中定义了put和get方法,put方法表示Map对象中加入一个“键-值”对,get方法则通过“键”来获取其对应的“值”。 下面的Java代码中使用了HashMap模板类,将编号为1001、1002、1003的员工信息插入到HashMap对象中,然后输入一个指定的员工编号,通过员工编号来获取员工的基本信息。 员工编号为整型编码,而员工的基本信息定义为类employee。 HashMap对象与员工对象之间的关系及存储结构如图6-1所示。 [日期: 2009-05-25] 来源: 作者: 未知 [字体: 大中小] 【Java代码】 importjava.util.*; classemployee{ employee(Stringname,StringphoneNumber,Stringaddress){ this.name=name; this.phoneNumber=phoneNumber; this.address=address; } Stringname; StringphoneNumber; Stringaddress; }; publicclassjavaMain{ publicstaticvoidmain(String[]args){ Map for(IntegeremployIndex=1001;employIndex<=1003;employIndex++){ Stringtmp=employIndex. (1) (); employeeMap. (2) (employIndex, (3) ("employee-"+tmp, "85523927-"+tmp, "address-"+tmp ) );//将员工编号和员工信息插入到employeeMap对象中 } intemployeeNo=0; System.out.print("请输入员工编号: "); Scanners=newScanner(System.in); employeeNo=s.nextInt(); //从标准输入获得员工编号 employeeresult=employeeMap. (4) (employeeNo); if( (5) ==null) { System.out.println("该员工编号不存在! "); return; } System.out.println("你所查询的员工编号为: "+employeeNo); System.out.println("该员工姓名: "+result.name); System.out.println("该员工电话: "+result.phoneNumber); System.out.println("该员工地址: "+result.address); } } 2009下半年软考程序员下午试题 试题一(共15分) 阅读以下说明和流程图,填补流程图中的空缺 (1)~(5),将解答填入答题纸的对应栏内。 【说明】 求连续函数f(x)的根(方程f(x)=0的解)的最简单方法是二分法。 为此,首先需要在若干点上检查函数值的符号,如果发现f(a)与f(b)符号相反(a 因为当x从a变到b时,连续函数的值将从正变到负(或从负变到正),必然要经过0。 区间(a,b)就是根的初始范围。 取该区间的中点m,如果f(m)=0,则根就是m。 如果f(a)与f(m)符号相反,则根一定在区间(a,m)中;如果f(m)与f(b)符号相反,则根一定在区间(m,b)中。 因此,根的范围缩小了一半。 依此类推,将区间一半一半地分下去,当区间的长度很小(达到根的精度要求,例如0.001)时,或者当区间中点处的函数值几乎接近于0(即绝对值小于预先规定的微小量,例如0.001)时,近似计算就可以结束了。 以下流程图描述了用二分法近似计算区间(a,b)中f(x)的根的过程。 【流程图】 试题二(共15分) 阅读以下说明和C函数,将应填入(n)处的字句写在答题纸的对应栏内。 【说明1】 函数Counter(intn,intw[])的功能是计算整数n的二进制表示形式中1的个数,同时用数组w记录该二进制数中1所在位置的权。 例如,十进制数22的二进制表示为10110。 对于该二进制数,1的个数为3,在w[0]中存入2(即21)、w[1]中存入4(即22)、w[2]中存入16(即24)。 【C函数1】 intCounter(intn,intw[]) {inti=0,k=1; while( (1)){ if(n%2)w[i++]=k; n=n/2; (2); } returnI; } 【说明2】 函数Smove(intA[],intn)的功能是将数组中所有的奇数都放到所有偶数之前。 其过程为: 设置数组元素下标索引i(初值为0)和j(初值为n-1),从数组的两端开始检查元素的奇偶性。 若A[i]、A[j]都是奇数,则从前往后找出一个偶数,再与A[j]进行交换;若A[i],A[j]都是偶数,则从后往前找出一个奇数,再与A[i]进行交换;若A[i]是偶数而A[j]是奇数,则交换两者,直到将所有的奇数都排在所有偶数之前为止。 【C函数2】 voidSmove(intA[],intn) {inttemp,i=0,j=n-1; if(n<2)return; while(i<j){ if(A[i]%2==1&&A[j]%2==1){(3);} elseif(A[i]%2==0&&A[j]%2==0){(4);} else{ if((5)){ temp=A[i];A[i]=A[j];A[j]=temp; } i++,j--; } } } 试题三(共15分) 阅读以下说明、C函数和问题,将解答写入答题纸的对应栏内。 【说明1】 函数testfl(intm,intn)对整数m、n进行某种运算后返回一个整数值。 【C函数1】 inttest_fl(intm,intn) {intk; k=m>n? m: n; for(;(k%m! =0)||(k%n! =0);k++); returnk; } 【问题1】(5分) (1)请写出发生函数调用test_fl(9,6)时,函数的返回值; (2)请说明函数test_fl的功能。 【说明2】 设在某C系统中为每个字符分配1个字节,为每个指针分配4个字节,sizeof(x)计算为x分配的字节数。 函数test_f2()用于测试并输出该C系统为某些数据分配的字节数。 【C函数2】 voidtest_f2() {charstr[]="NewWorld";char*p=str;chari='\0'; void*ptr=malloc(50); printf("%d\t",sizeof(str));printf("%d\n",sizeof(p)); printf("%d\t",sizeof(i));printf("%d\n”,sizeoqptr)), } 【问题2】(4分) 请写出函数test_f2()的运行结果。 【说明3】 函数test_f3(chars[])的功能是: 将给定字符串s中的所有空格字符删除后形成的串保存在字符数组tstr中(串s的内容不变),并返回结果串的首地址。 【C函数3】 char*test_f3(constchars[]) {chartstr[50]={'\0'};unsignedinti,k=0; for(i=0;i if(s[i]! ='')tstr[k++]=s[i]; returntstr; } 【问题3】(6分) 函数test_f3()对返回值的处理有缺陷,请指出该缺陷并说明修改方法。 试题四(共15分) 阅读以下说明和C函数,将解答填入答题纸的对应栏内。 【说明】 函数del_substr(S,T)的功能是从头至尾扫描字符串S,删除其中与字符串T相同的所有子串,其处理过程为: 首先从串S的第一个字符开始查找子串T,若找到,则将后面的字符向前移动将子串T覆盖掉,然后继续查找子串T,否则从串S的第二个字符开始查找,依此类推,重复该过程,直到串S的结尾为止。 该函数中字符串的存储类型SString定义如下: typedefstruct{ char*ch;/*串空间的首地址*/ intlength;/*串长*/ }SString; 【C函数】 voiddelsubstr(SString*S,SStringT) { inti,j; if(S->length<1||T.length<1||S->length<T.length) return; i=0;/*i为串S中字符的下标*/ for(;;){ j=0;/*j为串T中字符的下标*/ while(i<S->length&&j<T.length){/*在串S中查找与T相同的子串*/ if(S->ch[i]==T.ch[j]){ i++;j++; } else{ i= (1);j=0;/*i值回退,为继续查找T做准备*/ } } if( (2)){/*在S中找到与T相同的子串*/ i=(3);/*计算S中子串T的起始下标*/ for(k=i+T.length;k S->ch[(4)]=S->ch[k]; S->length=(5);/*更新S的长度*/ } elsebreak;/*串S中不存在子串T*/ } } 试题五(共15分) 阅读以下说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 已知类LinkedList表示列表类,该类具有四个方法: addElement()、lastElement()、numberOfElement()以及removeLastElement()。 四个方法的含义分别为: voidaddElement(Object): 在列表尾部添加一个对象; ObjectlastElement(): 返回列表尾部对象; intnumberOfElement(): 返回列表中对象个数; voidremoveLastElement(): 删除列表尾部的对象。 现需要借助LinkedList来实现一个Stack栈类,C++代码1和C++代码2分别采用继承和组合的方式实现。 【C++代码1】 classStack: publicLinkedList{ public: voidpush(Objecto){addElement(o);};//压栈 Objectpeek(){return (1);};//获取栈顶元素 boolisEmpty(){//判断栈是否为空 returnnumberOfElement()==0; }; Objectpop(){//弹栈 Objecto=lastElement(); (2); returno; }; }; 【C++代码2】 classStack{ private: (3); public: voidpush(Objecto){//压栈 list.addElement(o); }; Objectpeek(){//获取栈顶元素 returnlist.(4); }; boolisEmpty(){//判断栈
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 初级 程序员 0911 下午