AP CSA考试真题:如何确定该程序段的最佳后置条件?
AP CSA考题后置条件逻辑验证
原题重现
程序段
/** Precondition: a[0]...a[n-1] is an initialized array of integers, and 0 < n <= a.length. **/ int c = 0; for (int i = 0; i < n; i++) if (a[i] >= 0) { a[c] = a[i]; c++; } n = c;
题干与选项
问该程序段的最佳后置条件是哪一项?
- 选项1:a[0]到a[n-1]移除了所有正整数
- 选项2:a[0]到a[n-1]移除了所有负整数
- 选项3:a[0]到a[n-1]移除了所有非负整数
- 选项4:a[0]到a[n-1]移除了所有零
- 选项5:程序执行后更新的n值小于等于执行前的n值
疑问解答
你提到的「初始数组所有元素都是负数时,选项2表述是否成立」的问题,答案是完全成立,原因如下:
- 编程场景下「移除集合中所有X类型元素」的标准定义是:操作完成后,目标集合内不存在任何X类型元素,并不要求操作过程中必须有至少一个X元素被删除。
- 对应全负数组的场景:程序执行完后
c的值为0,n被赋值为0,此时a[0]到a[n-1]是没有元素的空区间,空区间天然不存在负整数,完全符合「移除所有负整数」的描述。 - 可以用现实场景类比:你说「我把包里所有的硬币都拿出来了」,如果包里本来就没有硬币,这句话也不算错,二者逻辑完全一致。
另外官方标注选项2为最佳答案的逻辑也成立:后置条件核心是描述程序的核心功能,选项5只是程序实现带来的附属属性,完全没有描述数组内容的变更逻辑,自然不属于最佳选项。
内容的提问来源于stack exchange,提问作者Michael Mo
相关产品推荐
相关产品推荐

