2017年下半年 程序员 下午试卷 案例解析(2)

2019-03-23 13:16

问题:3.3 (6分)

写出代码3运行后的输出结果。

解析:

x1=3;x2=0;x3=2;x4=1

第一个条件 0==yr@0, 2000满足,返回为A;其余都不满足,继续进行判断; 第二个条件 !yr%4, 1997不满足,返回为D;其余满足,继续进行判断; 第三个条件 0!=yr0,2020满足,返回为B;2100不满足,返回为C。 枚举类型中列出的每一个枚举符都对应着一个整数值,枚举类型实际上是一个整型符号常量的集合。当定义枚举类型时,枚举符都已经被系统隐含地赋予了一个整型值,默认情况下,第一个元素为0,第二个元素为1,依此类推。所以相应的A=0,B=1,C=2,D=3,故返回为:x1=3;x2=0;x3=2;x4=1。

Average! poor!

Oops,Error

(2)Excellent! Good!

控制传递给与开关的值匹配的 case 语句。switch 语句可以包括任意数目的 case 实例,但是任何两个 case 语句都不能具有相同的值。语句体从选定的语句开始执行,直到 break 将控制传递到 case 体以外。case后面的常量表达式实际上只起语句标号作用,而不起条件判断作用,即\只是开始执行处的入口标号\因此,一旦与switch后面圆括号中表达式的值匹配,就从此标号处开始执行,而且执行完一个case后面的语句后,若没遇到break语句,就自动进入 下一个case继续执行,而不在判断是否与之匹配,直到遇到break语句才停止执行,退出break语句.因此,若想执行一个case分之后立即跳出 switch语句,就必须在此分支的最后添加一个break语句。 0 1 0 0 2 0 0 2 1 1 0 1 1 2 0 1 2 1

此题考察多重for循环再加上一个判定条件,i的取值为(0,1),j的取值为(0,1,2),k的取值为(0,1),只要按顺序找到i!=j且j!=k的组合即可。

第四题

阅读以下说明、C函数和问题,回答问题1和问题2将解答填入答题纸的对应栏内。 【说明】

当数组中的元素已经排列有序时,可以采用折半查找(二分查找)法查找一个元素。下面的函数biSearch(int r[],int low,int high,int key)用非递归方式在数组r中进行二分查找,函数biSearch_rec(int r[],int low,int high,int key)采用递归方式在数组r中进行二分查找,函数的返回值都为所找到元素的下标;若找不到,则返回-1。

【C函数1】

int biSearch(int r[],int low,int high,int key) //r[low..high] 中的元素按非递减顺序排列

//用二分查找法在数组r中查找与key相同的元素 //若找到则返回该元素在数组r的下标,否则返回-1 {

int mid;

while((1)) {

mid = (low+high)/2 ; if (key ==r[mid]) return mid; else if (key

(3); }/*while*/ return -1; }/*biSearch*/

【C 函数 2】

int biSearch_rec(int r[],int low,int high,int key) //r[low..high]中的元素按非递减顺序排列

//用二分查找法在数组r中查找与key相同的元素 //若找到则返回该元素在数组r的下标,否则返回-1 {

int mid; if((4)) {

mid = (low+high)/2 ; if (key ==r[mid]) return mid; else if (key

return biSearch_rec((5),key); else

return biSearch_rec((6),key); }/*if*/

return -1;

}/*biSearch_rec*/

问题:4.1 (12分)

请填充C函数1和C函数2中的空缺,将解答填入答题纸的对应栏内。

问题:4.2 (3分)

若有序数组中有n个元素,采用二分查找法查找一个元素时,最多与( )个数组元素进行比较,即可确定查找结果。 (7)备选答案:

A.[log2(n+1)] B.[n/2] C.n-1 D.n

解析: low<=high

(2)high=mid-1 (3)low=mid+1 (4)low<=high (5)low,mid-1 (6)mid+1,high

本题考察折半查找。二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果xa[n/2],则只要在数组a的右半部搜索x。

总共有n个元素,渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。

(7)A

第五题

阅读以下说明和Java代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】

以下Java代码实现一个超市简单销售系统中的部分功能,顾客选择图书等物件 (Item)加入

购物车(ShoppingCart),到收银台(Cashier)对每个购物车中的物品统计其价格进行结账。设计如图5-1所示类图。

图5-1类图

问题:5.1 【Java代码】 interface Item{

public void accept(Visitor visitor); public double getPrice(); }

class Book (1){ private double price;

public Book(double price){(2);}

public void accept(Visitor visitor){ //访问本元素 (3); }

public double getPrice() { return price; } }

//其它物品类略 interface Visitor {

public void visit(Book book); //其它物品的visit方法 }

class Cashier(4){

private double totalForCart;

//访问Book类型对象的价格并累加 (5){

//假设Book类型的物品价格超过10元打8折 if(book.getPrice()<10.0){

totalForCart+=book.getPrice(); } else

totalForCart+=book.getPrice()*0.8; }

//其它visit方法和折扣策略类似,此处略

public double getTotal() { return totalForCart; } }

class ShoppingCart {

//normal shopping cart stuff

private java.util.ArrayListitems=new java.util.ArrayList<>(); public double calculatePrice() { Cashier visitor=new Cashier();

for(Item item:items) { (6); }

double total=visitor.getTotal(); return total; }

public void add(Item e) { this.items.add(e); } }

解析:

implements Item (2)this.price=price (3)visitor.visit(this) (4)implements Visitor

(5)public void visit(Book book) (6)item.accept(visitor)

这里考察的是访问者模式。其定义如下:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

第一、四空为接口与实现,接口使用Interface,实现使用implements。第二空this表示类实例本身。第三空为访问本元素。第五空实现接口里面的方法。第六空调用accept方法。


2017年下半年 程序员 下午试卷 案例解析(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:电子皮带秤工作原理

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: