【软件构造】软件构造18年考试大题试题(仅供参考)
自己做的答案,有一些地方省略了,仅供参考,应该会有一些错误,期待指正。
2018
二、
第二行public->private
第3,4行存在别名,应改为:
Private final List…(new ArrayList<>());
第六行:
synchronied(lines){
Iterator iter = lines.iterator();
while (iter.hasNext()) {
String line = iter.next();
if (line.contains(filter))
iter.remove();
}
}
}
第12行:synchronied(title){
title = title.toUpperCase();
}
第16行:synchronied(lines){
for (String s : lines)
sb.append(s + “\n”);
}
//Thread Safety:
//6行在对mutable类型的lines进行迭代时增加锁以串行原子方式运行确保线程安全
//12行在对title操作增加锁串行原子方式运行确保线程安全
//16行在对lines迭代时增加锁确串行原子方式运行保线程安全
三、
四、
(1)22行:selectPaperByRandom中的返回papers存在表示泄露,应该用Collection.unmodifiedList(papers)返回。返回客户端可能会被修改导致选择的论文不匹配等错误。
24行:getSelectionResult() 返回存在表示泄露,应备份再将备份返回。返回客户端可能会被修改导致对象数据变化引起错误。
(2)public class NoEnoughPapersException extends Exception{
private final Student s;
private final int num;
public NoEnoughPapersException(Student s, int num){
this.s = s;
this.num = num;
}
public Student getStudent() {
return new Student(s.getName(), s.get..(), s.get..());
}
public int getNum() {
return num;
}
}
public class PaperList throws NoEnoughPapersException
18行改为throw new NoEnoughPapersException(student, availablePapers.size());
Client:
14行开始:
try {
listOfRainy.selectPaperByRandom(student);
}catch(NoEnoughPapersException e) {
System.out.println(“学生”+e.getStudent().getName()+“希望选论文” +e.getStudent().get…() “篇,但目前只有 “+e.getNum()+” 篇可选”);
}
5-2
PaperSelection类中新增一个方法:
public int accept(Visitor visitor){
Visitor.visit(this);
}
Vistor类:
public class Vistor{
public int visit(PaperSelection p) {
Map<Paper, Student> m = p.getSelections();
Set names = new HashSet;
for(Student s : m.values()) {
if(names.contains(s.getName()))
continue;
else
names.add(s.getName());
}
return names.size();
}
}
六、
(1)@param student 要为选择paper的学生,要求该学生未被分配论文
@return 返回一个List代表为该学生选择的文章列表,要求列表中论文未被其他学生引用,同时列表符合学生要求
@throws NoEnoughPapersException 如果没有足够的文章为该学生选择
(2)略