201811程序员下午真题
第 1 题
阅读以下说明和流程图,填写流程图中的空缺,将解答填入答题纸的对应栏内。
说明
设[a1b1],[a2,b2],...,[an,bn]是数轴上从左到右排列的n个互不重叠的区间(a1<b1<a2<b2...<an<bn)。以下流程图将一个新的区间[A,B](A<B)添加到上述区间集,形成新的从左到右排列的若干个互不重叠的区间(若A、B落在原有的两个区间,则以原有区间最左端点和最右端点为基准,形成新的区间),最后依次输出这些区间的端点。
例如,给定区间集:[1,2],[4,6],[8,10],[13,15],[17,20],添加区间[5,14]后,依次输出1,2,4,15,17,20,表示合并后的区间集:[1,2],[4,15],[17,20]。
该流程图采用的算法是:先在a1,b1,a2,b2,...,an,bn中扫描定位A点,再继续描定位B点,在扫描过程中随时输出已确定的区间的端点值。
答案与解析
- 试题难度:较难
- 知识点:流程图>流程图
- 试题答案:1.A
2.ai
3.bi
4.A,B
5.B - 试题解析:首先判断A<=ai,如果不满足,那么表示ai比较小,所以输出的是ai,判断A<=bi,如果不满足那么输出的就是bi,朝一个推进,如果依次都不满足,最终循环输出的就是区间[A,B]。这里可以判断(2)空为ai,(3)空为bi,(4)空为A,B。
如果在判断A<=ai满足,那么表示A比较小,所以输出的是A,所以(1)空填A。
判断(5)空,这是在B<=bi依次判断都不满足,直到最后一个区间都判断结束,这个时候说明B是大于所有的bi,所以此时输出来的是B。所以(5)空填B。
第 2 题
阅读以下C代码,回答问题1和问题2,将解答填入答题纸的对应栏内。
【C代码1】
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,tmp,b=0;
scanf("%d",&a);
tmp=a<0?-a:a;
while(tmp){
b=b*10+tmp%10;
tmp=tmp/10;
}
if(a==b||-a==b)
printf("Palindromic number.\n");
printf("a=%d b=%d\n",a,b);
return 0;
}
#include <stdio.h>
int main()
{
char grade;
int points;
for(grade='A';grade<'F';grade++){
switch(grade){
case 'A':points=4;break;
case 'B':points=3;
case 'C':points=2;
case 'D':points=1;break;
case 'E':
case 'W':points=0;
}
if(points>0)
printf("Passed,point=%d\n",points);
else
printf("Failed\n");
}
return 0;
}
【问题1】
写出【C代码1】运行时分别输入-1331、795的输出结果。
【问题 2】
写出【C代码2】运行时的输出结果。
答案与解析
- 试题难度:较难
- 知识点:C程序设计>C程序设计
- 试题答案:【问题1】 输入-1331的结果是:
Palindromic number.
a=-1331 b=1331
输入795的结果是:
a=795 b=597
【问题 2】输出结果是:
Passed,point=4
Passed,point=1
Passed,point=1
Passed,point=1
Failed
- 试题解析:【问题 1】考查while循环的知识。tmp取的是a的绝对值,然后执行while循环。%是取余操作,/是除法运算,注意,这里由于tmp是整数,所以除10之后只能保留其整数部分。所以while循环的实质就是对tmp里面的所有的数字进行逆转再赋值给b。
if循环判断如果a、b相等或者互为相反数,则输出Palindromic number.
最后输出a、b的值即可。
【问题 2】考查for循环和swicth…case语句。</div>
在swicth…case语句,如果没有break子句,则匹配到相同的字符后,依次向下执行,直到遇到break子句或者执行到结尾,所以在这里,遇到‘B’、‘C’这些字符的时候,最终的points的值是等于1的。遇到‘E’、字符的时候,最终的points的值是等于0的。
第 3 题
阅读以下说明和C代码,填写程序中的空(1) ~(6)。将解答写入答题纸的对应栏内。
【说明】
某地电价分三档:
(1)当月用电量不超过180度时,每度电0.5元:
(2)当月用电量超出180度但不超过360度的部分,每度电0.55元:
(3)当月用电量超过360度的部分,每度电0.7元。
例如,某户A一个月的用电量为150度,其电费为150*0.5=75.00元;某户B用电量为280度,其电费为180*0.5+(280-180)*0.55=145.00元;某户C用电量为450度,其电费为180*0.5+(360-180)*0.55+(450-360)*0.7=90.0+99.0+63.0=252.00元。
下面程序运行时读入m(m>0)个住户某月的用电量,计算该月每户应缴的电费并输出,同时找出这m个住户中该月的最大用电量和最小用电量。
【C代码】
#include<stdio.h>
#define MAXQT 100000 //用电的最大量
double proc(int qt)
{ //计算并返回月用电量为qt时的电费
double fee=0.0;
if( (1) )
fee=qt*0.5;
else if ( (2) )
fee=180*0.5+(qt-180)*0.55;
else
fee= (3) ;
return fee;
}
int main()
{
int m ; //住户数
int qt , minimun = MAXQT , maximum = 0 ; //用电量,最小用电量,最大用电量
scanf( "%d",&m);
while(m>0){
scanf( "%d" , &qt ) ;
if(qt<0 ‖ qt>MAXQT ) continue ;
printf( "%.21f\n ", proc(qt) ) ;
if( (4) )
minimum=qt;
else if( (5) )
maximum=qt;
(6) ;
}
printf( "maximum=%d,minimum=%d\n ",maximum,minimum);
return 0;
}
答案与解析
- 试题难度:较难
- 知识点:C程序设计>C程序设计
- 试题答案:1.qt<=180
2.qt<=360
3.1800.5+(360-180)0.55+(qt-360)0.7或0.7qt-63
4.minimum>qt
5.maximum<qt
6.m-- - 试题解析:本题考查C语言程序设计。1、2、3空根据前面电价的描述即可填入。(1)当月用电量不超过180度时,每度电0.5元;即qt<=180时, fee=qt0.5;
(2)当月用电量超出180度但不超过360度的部分,每度电0.55元;即qt>180且qt<=360时, fee=1800.5+(qt-180)*0.55;
(3)当月用电量超过360度的部分,每度电0.7元。
即qt>360时, fee= 1800.5+(360-180)0.55+(qt-360)0.7, 简化后得到0.7qt-63
第 4 题
阅读以下说明和C代码,填写程序中的空(1) ~(6),将解答写入答题纸的对应栏内。
【说明】
函数insertElem 的功能是在元素升序排列的数组中加入一个新元素并保持数组元素升序排列的特点。在main函数中输入若干表示价格的实数,输入为0或负数或实数个数超出限定数量时终止,调用insertElem将价格按升序保存在数组pdata中,最后输出所输入的实数。
【C代码】
#define ARRSZ 10001
void insertElem(double arr[] , int n , double elem)
/*arr 空间足够大且其元素按照升序排列,将elem插入arr中并保持其升序特点*/
{
int i;
double tmp;
if(n==0 ‖ elem>=arr[n-1] ) { (1) = elem ; return ;}
for(i=n-1 ; i>=0 && elem<arr[i] ; i-- ) { //查找插入位置并将元素后移
(2) ;
}
(3) =elem ; //将元素放入最终位置
}
int main()
{
int idx,n=0;
double price, pdata [ARRSZ] ;
do{
scanf( "%If ",&price);
if (price<=0) (4) ;
insertElem( (5) );//调用insertElem将price的值加入pdata数组
n++;
}while(n<ARRSZ);
for( idx=0 ; (6) ; idx++ ) //按升序输出所输入的实数
printf( "%.21f\t ", pdata[idx] );
return 0;
}
答案与解析
- 试题难度:较难
- 知识点:C程序设计>C程序设计
- 试题答案:1.arr[n]
2.arr[i+1]=arr[i]
3.arr[i+1]
4.break
5.pdata,n,price
6.idx<n - 试题解析:
(1)空如果arr数组里面目前的所有的数字都比新元素都要小,那么新元素肯定是插入到最后,所以填的是arr[n];
(2)(3)空执行查找插入位置并将元素后移,并将元素放在相应位置,首先如果elem><arr[i]的话,说明elem应该插入在arr[i]的前面,所以arr[i]这个元素应该向后移动一个位置,所以使用arr[i+1]= elem="">arr[i],此时elem应该插入在arr[i]的后面,所以使用arr[i+1]=elem。
(4)空如果输入的price小于等于0的话,按照题目要求的话,是终止循环,所以此处填入break。
(5)空是进行调用insertElem函数,此处填入调用的参数,分别是pdata,n,price。
(6)空是进行数组遍历输出,遍历到有数据元素的最后一个,所以填idx<n
第 5 题
阅读以下说明和Java程序,填写程序中的空(1) ~(5),将解答写入答题纸的对应栏内。
【说明】
以下Java代码实现一个简单乐器系统,音乐类(Music)可以使用各类乐器(Instrument)进行演奏和调音等操作。对部分乐器进行建模,其类图如图5-1所示,包括:乐器(Instrument)、打击乐器(Percussion)、弦乐器(Stringed)、管乐器(Wind)、木管乐器(Woodwind)、铜管乐器(Brass)。
图5-1 类图
【Java代码】
import java.util.ArrayList;
enum Note{ /*枚举各种音调*/
MIDDLE_C,C_SHARP,B_FLAT; //其它略
}
abstract class Instrument{ /*乐器*/
(1) ; //play方法
abstract void adjust() ; //adjust抽象方法
}
class Wind ( 2 ) {
public void play(Note n){System.out.println( "Wind.play() "+n);}
public viod adjust(){System.out.println( "Wind.adjust() ");}
}
/*类Percussion 和Stringed实现代码;略*/
class Brass (3) {
public void play(Note n){System.out.println( "Brass.play() "+n);}
public void adjust(){System.out.println( "Brass.adjust() ");}
}
class Woodwind extends Wind {
public void play(Note n){System.out.println( "Woodwind.play() "+n);}
}
public class Music {
void tune(Instrument i){i.play(Note.MIDDlE_C);}
void adjust(Instrument i){i.adjust();}
void tuneAll( ( 4 ) e) {
for(int j=0;j<e.size():j++) {
Instrument i=e.get(j);
adjust(i);
tune(i);
}
}
public static void main(String[]args)
{
( 5 ) music=new Music() ;
ArrayList<Instrument>orchestra=new ArrayList<>();
orchestra.add(new Wind());
orchestra.add(new Woodwind());
music.tuneAll(orchestra);
}
}
答案与解析
- 试题难度:较难
- 知识点:Java程序设计>Java程序设计案例
- 试题答案:1.abstract void play(Note n)
2.extends Instrument
3.extends Wind
4.ArrayList<Instrument>
5.Music
- 试题解析:
本题考查JAVA程序设计语言。
(1)空:定义抽象方法,类Instrument为抽象类,其方法为抽象方法。
(2)空:Wind类继承Instrument类。 乐器(Instrument)下面有三个子类:打击乐器(Percussion)、弦乐器(Stringed)和管乐器(Wind)。
(3)空:Brass类继承Wind类。 管乐器(Wind)下有2个子类:木管乐器(Woodwind)和铜管乐器(Brass)。
(4)空:使用数组进行创建各个Instrument类。
(5)空:创建一个Music对象。
第 6 题
阅读下列说明和C++代码,填写程序中的空(1) ~(5),将解答写入答题纸的对应栏内。
【说明】
以下C++代码实现一个简单乐器系统,音乐类(Music)可以使用各类乐器(Instument)进行演奏和调音等操作。对部分乐器进行建模,其类图如图6-1所示,包括:乐器(Instrument)、打击乐器(Perussion)、 弦乐器(Stringed)、 管乐器( Wind)、木管乐器(Woodwind)、铜管乐器(Brass )。
图6-1 类图
【C++代码】
#include<iostream>
#include<vector>
using namespace std;
enum Note{ /*枚举各种高调*/
MIDDLE_C,C_SHARP,B_FLAT //其它略
};
class Instrument{ /*抽象基类,乐器*/
public:
( 1 ) ; //纯虚函数play
virtual void adjust()=0; //adjust函数接口
};
class Wind: ( 2 ) {
public:
void play(Note n){cout<< "Wind.play() "<<n<<endl; }
void adjust(){cout<< "Wind.adjust() "<<endl; }
};
/*类Percussion 和Stringed实现代码略*/
class Brass: ( 3 ) {
public:
void play(Note n){cout<< "Brass.play() "<<n<<endl: }
void adjust(){cout<< "Brass.adjust() "<<endl; }
};
class Woodwind:public Wind{
public:
void play(Note n){cout<< "Woodwind.play() "<<n<<endl: }
};
class Music{
public:
void tune(Instrument*i){ i->play(MIDDLE_C); }
void adjust(Instrument*i){ i->adjust(); }
void tuneAll( ( 4 ) v ) { /*为每个乐器定调*/
vector<Instrument*>::iterator it;
for(it=v.begin();it!=v.end();it++) {
this->adjust(*it);
this->tune(*it);
}
}
};
int main()
{
( 5 ) music=new Music();
vector<Instrument*>orchestra;
orchestra.push_back(new Wind());
music->tuneAll(orchestra);
}
2.public Instrument
3.public Wind
4.Vector<Instrument*>
5.Music* - 试题解析:
(1)空:定义虚方法 (2)空:Wind类继承Instrument类 (3)空:Brass类继承Wind类 (4)空:使用容器向量进行创建各个Instrument类 (5)空:创建一个Music对象。