AP计算机2013年考试:主观题解答
第一大题
第一问
考察对列表的循环遍历和字符串的相等比较。找到即返回,循环外返回null
的模式。
public DownloadInfo getDownloadInfo(String title){ for(DonwloadInfo info : downloadList){ if(info.getTitle().equals(title)) return info; } return null; }
第二问
同样是对列表的遍历以及在列表后追加元素。注意for-each不是对downloadList
,因而可以在循环体中修改它。
public void updateDownloads(List<String> titles){ for(String title : titles){ DownloadInfo info = getDownloadInfo(title); if(info)info.incrementTimesDownloaded(); else downloadList.add(new DownloadInfo(title)); } }
第二大题
第一问
考察Math.random
的使用。注意这个函数取到的是介于0和1之间的浮点数,需要熟练将其转换为所需的整数范围。
public TokenPass(int playerCount){ board = new int[playerCount}; for(int i = 0; i < playerCount; i++){ board[i] = 1 + (int) (10 * Math.random()); } currentPlayer = (int) playerCount * Math.random(); }
第二问
解答并不是最简单的写法,但尽量还原了整个游戏步骤,也推荐在考试时用这个思路来写。使用取模运算来防止数组越界是一个很好的技巧。
public void distributeCurrentPlayerTokens(){ int token = board[currentPlayer]; board[currentPlayer] = 0; int i = currentPlayer + 1; while(token > 0){ board[i % board.length]++; token--; i++; } }
第四大题
第一问
将一维数组转换为二维数组,需要对奇数行和偶数行进行不同的处理。索引的计算比较繁杂,务必要最后带回到题目中给的两个例子里试算一番。
public SkyView(int numRows, int numCols, double[] scanned){ view = double[numRows][numCols]; for(int i = 0; i < scanned.length; i++) if((i / numCols) % 2 == 0)view[i / numCols][i % numCols]=scanned[i]; else view[i / numCols][numCols - i % numCols - 1]=scanned[i]; }
第二问
本质上还是一个二维数组的遍历,需要掌握如何在循环中进行累加。
public double getAverage(int startRow, int endRow, int startCol, int endCol){ int count = 0; double sum = 0; for(int i = startRow; i <= endRow; i++){ for(int j = startCol; j <= endCol; j++){ sum += view[i][j]; count++; } } return sum/count; }
1 条评论
AP计算机2013年考试:主观题 – AP计算机科学A · 2019年3月20日 下午10:59
[…] AP计算机2013年考试:主观题解答 […]