考试时间为4小时。本试卷包含两种题型:“代码填空”与“程序设计”。总计100分。
代码填空:3+3+4+6+7+9+10 = 42 分,程序设计:14+17+27 = 58分
【填空题要求】
填空题要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确、完整。所填写的代码不超过一条语句(即不能出现分号)。把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
【编程题要求】
编程题要求选手设计的程序对于给定的输入能给出正确的输出结果。考生的程序只有能运行出正确结果的时候才有机会得分。注意:在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。选手的程序必须是通用的,不能只对试卷中给定的数据有效。对每个题目,要求考生把所有类写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。请不要使用package语句。
另外,源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。
1. 计算蔬菜总价(满分3分)
为了丰富群众菜篮子,平抑菜价,相关部分组织了蔬菜的调运。今某箱中有多个品种的蔬菜。蔬菜的单价(元/公斤)存放在price数组中,蔬菜的重量(公斤)存放在weight数组中。下面的代码计算该箱蔬菜的总价,试完善之。
1 2 3 4 5 6 7 8 9 | public static double getTotal(double[] price, double[] weight) { double x = 0; for(int i=0; i<price.length; i++) { ____________________ ; } return x; } |
2. 计算行程 (满分3分)
低碳生活,有氧运动。骑自行车出行是个好主意。小明为自己的自行车装了个计数器,可以计算出轮子转动的圈数。在一次骑车旅行中,出发时计算器的示数为begin,到达目的地时的示数为end。下列代码计算了小明一共骑行了多远(单位:公里)。其中d表示小明自行车轮子的直径(单位:米)。
1 2 3 4 | public static double getDistance(int begin, int end, double d) { return (end-begin) * Math.PI * d ___________________; } |
3. 反转的串 (满分4分)
解决同一个问题往往有许多方法。小刚很喜欢别出心裁。一天他在纸上草草写了一段程序,实现了把串s中的内容反转后放入s2的功能。也就是说,s2最后的内容变成了“7654321”。
可惜草纸出现了一处污损,请补全缺失的部分。
1 2 3 4 5 6 | String s = "1234567"; String s2 = ""; for (int i = 0; i < s.length(); i++) { s2 = s.charAt(i) + __________________; } System.out.println(s2); |
4. 最近距离(满分6分)
已知平面上的若干点的位置,存入一个List中。现在需要计算所有这些点中,距离最近的两个点间的最小距离。请补全缺失的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import java.util.*; class MyPoint { private double x; // 横坐标 private double y; // 纵坐标 public MyPoint(double x, double y) { this.x = x; this.y = y; } public static double distance(MyPoint p1, MyPoint p2) { double dx = p1.x - p2.x; double dy = p1.y - p2.y; return Math.sqrt(dx*dx + dy*dy); } /* lst中含有若干个点的坐标 返回其中距离最小的点的距离 */ public static double getMinDistance(List<MyPoint> lst) { double r = ____________________; int n = lst.size(); for(int i=0; i<n; i++) { for(int j=i+1; j<n; j++) { MyPoint p1 = lst.get(i); MyPoint p2 = lst.get(j); double d = MyPoint.distance(p1,p2); if( d < r ) ___________________; } } return r; } } |
5. 股票风险 (满分7分)
股票交易上的投机行为往往十分危险。假设某股票行为十分怪异,每天不是涨停(上涨10%)就是跌停(下跌10%)。假设上涨和下跌的概率均等(都是50%)。再假设交易过程没有任何手续费。某人在开始的时候持有总价值为x的该股股票,那么100个交易日后,他盈利的可能性是多少呢?
以下程序通过计算机模拟了该过程,一般的输出结果在0.3左右。请填写缺失的代码。把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | int N = 10000; int n = 0; for(int i=0; i<N; i++) { double value = 1000.0; for(int k=0; k<100; k++) { if(Math.random() > ________________) value = value * 1.1; else value = value * 0.9; } if (______________) n++; } System.out.println(1.0*n/N); |
6. 猜数字 (满分9分)
很多人都玩过这个游戏:甲在心中想好一个数字,乙来猜。每猜一个数字,甲必须告诉他是猜大了,猜小了,还是刚好猜中了。下列的代码模拟了这个过程。其中用户充当甲的角色,计算机充当乙的角色。为了能更快地猜中,计算机使用了二分法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | System.out.println("请在心中想好一个数字(1~100),我来猜"); System.out.println("我每猜一个数字, 你要告诉我是 '猜大了','猜小'了,还是'猜中'"); Scanner scan = new Scanner(System.in); int v1 = 1; int v2 = 100; for( ; ;) { int m = (v1 + v2)/2; System.out.println("我猜是:" + m); System.out.println("1.猜得太大了"); System.out.println("2.猜得太小了"); System.out.println("3.猜中!"); System.out.print("请选择:"); int user = Integer.parseInt(scan.nextLine()); if(user==3) break; if(user==1) ______________; // 填空1 if(user==2) ______________; // 填空2 } |
7. 基因牛 (满分10分)
张教授采用基因干预技术成功培养出一头母牛,三年后,这头母牛每年会生出1头母牛, 生出来的母牛三年后,又可以每年生出一头母牛。如此循环下去,请问张教授n年后有多少头母牛? 以下程序模拟了这个过程,请填写缺失的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public static class Cow { private int age; public Cow afterYear() { age++; return age > 2 ? new Cow() : _____________; } public static void showTotalCowNum(int n) { List<Cow> list = new ArrayList<Cow>(); list.add(new Cow()); for (int i = 0; i < n; i++) { int cowCount = list.size(); for (int j = 0; j < cowCount; j++) { Cow cow = list.get(j).afterYear(); if (cow != null) { ______________________; list.add(cow); } } } System.out.println(n + "年后,共有:" + list.size()); } } |
8. 程序设计:字符串的处理(满分14分)
在实际的开发工作中,对字符串的处理是最常见的编程任务。本题目即是要求程序对用户输入的串进行处理。具体规则如下:
- 把每个单词的首字母变为大写。
- 把数字与字母之间用下划线字符(_)分开,使得更清晰
- 把单词中间有多个空格的调整为1个空格。
例如:
用户输入:
1 | you and me what cpp2005program |
则程序输出:
1 | You And Me What Cpp_2005_program |
用户输入:
1 | this is a 99cat |
则程序输出:
1 | This Is A 99_cat |
我们假设:用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号。每个单词间由1个或多个空格分隔。假设用户输入的串长度不超过200个字符。
9. 程序设计:输出“上三角”(满分17分)
方阵的主对角线之上称为“上三角”。
请你设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是:使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。
例如:当n=3时,输出:
1 2 3 | 1 2 3 6 4 5 |
当n=4时,输出:
1 2 3 4 | 1 2 3 4 9 10 5 8 6 7 |
当n=5时,输出:
1 2 3 4 5 | 1 2 3 4 5 12 13 14 6 11 15 7 10 8 9 |
程序运行时,要求用户输入整数n(3~20)
程序输出:方阵的上三角部分。
要求格式:每个数据宽度为4,右对齐。
10. 程序设计:10名学生参加竞赛(满分27分)
A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。因为某种原因,他们是否参赛受到下列条件的约束:
1. 如果A参加,B也参加;
2. 如果C不参加,D也不参加;
3. A和C中只能有一个人参加;
4. B和D中有且仅有一个人参加;
5. D、E、F、G、H 中至少有2人参加;
6. C和G或者都参加,或者都不参加;
7. C、E、G、I中至多只能2人参加
8. 如果E参加,那么F和G也都参加。
9. 如果F参加,G、H就不能参加
10. 如果I、J都不参加,H必须参加
请编程根据这些条件判断这10名同学中参赛者名单。如果有多种可能,则输出所有的可能情况。每种情况占一行。参赛同学按字母升序排列,用空格分隔。
比如:
C D G J
就是一种可能的情况。