问题: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.ArrayList 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方法。