2010 下半年程序员考试真题及答案-下午卷
试题一
【说明】
下面的流程图中有两个判断条件 A>0 和 B>0。这些判断条件的各种组合情况如下表所
示。表中 Y 表示相应的条件成立,N 表示相应的条件不成立。每一列表示一种条件组合,并
在列首用相应的序号来表示。
【流程图】
【问题 1】
当遇到哪几种条件组合时,流程图能执行“1→i”?(写出相应的序号即可)
1, 2
本题考查程序模块处理流程设计的理解能力。
针对流程图中的多个判断条件及其组合,给出流程图的各种输入数据方案,检查流程图
的执行情况,这种方法实际上就是单元测试常用的白盒方法。一组输入数据方案就是一个测
试案例。
对于本题的处理流程,三个判断条件中有两个是一样的,即只有两种判断条件。因此判
断条件的组合共有 4 种。题中对这 4 种组合情况编制了序号。我们可以分别对这 4 种条件组
合分析其执行流程的情况,见下表:
因此,条件组合序号为 1、2 时,该流程将执行 1→i。
【问题 2】
当遇到哪几种条件组合时,流程图能执行“2→j” ?(写出相应的序号即可)
2,4
本题考查程序模块处理流程设计的理解能力。
针对流程图中的多个判断条件及其组合,给出流程图的各种输入数据方案,检查流程图
的执行情况,这种方法实际上就是单元测试常用的白盒方法。一组输入数据方案就是一个测
试案例。
对于本题的处理流程,三个判断条件中有两个是一样的,即只有两种判断条件。因此判
断条件的组合共有 4 种。题中对这 4 种组合情况编制了序号。我们可以分别对这 4 种条件组
合分析其执行流程的情况,见下表:
因此,条件组合序号为 2、4 时,该流程将执行 2→j。
【问题 3】
当遇到哪几种条件组合时,流程图能执行“3→k” ?(写出相应的序号即可)
1,3,4
本题考查程序模块处理流程设计的理解能力。
针对流程图中的多个判断条件及其组合,给出流程图的各种输入数据方案,检查流程图
的执行情况,这种方法实际上就是单元测试常用的白盒方法。一组输入数据方案就是一个测
试案例。
对于本题的处理流程,三个判断条件中有两个是一样的,即只有两种判断条件。因此判
断条件的组合共有 4 种。题中对这 4 种组合情况编制了序号。我们可以分别对这 4 种条件组
合分析其执行流程的情况,见下表:
因此,条件组合序号为 1、3、4 时,该流程将执行 3→k。
【问题 4】
该流程图共有多少条实际热行路径?
4
由于这 4 种执行的情况不同,即执行路径不同,因此,该流程图共有 4 条不同的执行路径。
试题二
【说明 1】
函数 deldigit(char*s)的功能是将字符串 s 中的数字字符去掉,使剩余字符按原次序
构成一个新串,并保存在原串空间中。其思路是:先申请一个与 s 等长的临时字符串空间并
令 t 指向它,将非数字字符按次序暂存入该空间,最后再复制给 s。
【C 函数】
【说明 2】
函数 reverse(char *s, int len)的功能是用递归方式逆置长度为 len 的字符串 s。例
如,若串 s 的内容为“abcd”,则逆置后其内容变为“dcba”。
【C 函数】
(1) strlen(s)+1
(2) *(s+i),或 s[i],或其等价表示
(3) *(t+k),或 t[k],或其等价表示
(4) len>1,或 len>=1,或其等价表示
(5) s+1,len-2
本题考查 C 程序基本结构的理解和应用。
根据说明 1,在函数 deldigit(char *s)中需先申请一个与 s 等长的临时字符串空间并令 t
指向它,因此空(1)处应填入“Strlen(s)+1”,其中,加 1 的原因是函数 strlen 计算 s 所
指向字符串的长度时,没有包含串结束标志字符“\0”。当然,申请比“strlen(s)+1” 更
大的存储区也可以,只是没有必要。
由于需要将非数字字符按原来的顺序存入 t 所指向的存储区,所以空(2)处填入“s[i]”,
或其等价表示形式。
最后再设置 t 所指向字符串的结束标志,即令 t[k] = '\0'。在这里,空(3)处的 t[k]写为
t[k++]也可以,而写为 t[k+1]或 t[++k]则不符合整个代码的处理逻辑。
函数 reverse(char *s, int len)的功能是用递归方式逆置长度为 len 的字符串 s,其中,
以下代码实现了将 s 所指字符与串中最后一个字符交换的处理:
ch=*s;
*s=*(s+len-1);
*(s+len-1)=ch;
显然,当字符串的长度 len 小于或等于 1 时,无须进行交换,因此空(4)处应填入“len>1”,
或者“len>=1”。若长度为 1 时也进行交换,逻辑上没有错,但是运算是冗余的。
试题三
【说明 1】
下面代码的设计意图是:将保存在文本文件 data.txt 中的一系列整数(不超过 100 个)
读取出来存入数组 arr[],然后调用函数 sort()对数组 arr 的元素进行排序,最后在显示屏
输出数组 arr 的内容。
【C 代码】
【问题 1】
以上 C 代码中有三处错误(省略部分的代码除外),请指出这些错误所在的代码行号,
并在不增加和删除代码行的情况下进行修改,写出修改正确后的完整代码行。
在说明 1 之后的 C 代码中有三处错误。
第 1 个错误的源头在第 14 行对变量 fp 的定义上。FILE 是预定义的一个结构体类型,
在 C 语言程序中,必须通过定义 FILE 类型的指针变量和文件操作函数来访问外存文件。因
此,第 14 行的代码应为“FILE*fp;”。
第 2 个错误位于第 19 行,函数 fscanf 与 scanf 函数的用法相同,以整型、浮点型和字
符型格式控制方式读取文件中的数据时,需要在获取值的变量名前加取地址运算符号“&”,
arr[num++]等同于 arr[num], num+=1,而数组元素 arr[num]的作用等同于一个变量,因此,
该行的正确代码为 “fscanf(fp,"%d",&arr[num++]);”。
第 3 个错误位于第 21 行。根据函数 sort 的定义可知,调用函数 sort 时第一个实参应
该为数组名或对数组元素取地址。因此,该行的正确代码为“sort(arr,num);”或者
“sort(&arr[0], num);”。
【问题 2】
若分别采用函数定义方式 1、2 和调用方式 1、2,请分析程序的运行情况,填充下面的
空(1)〜(3)。
若采用定义方式 1 和调用方式 1,则输出为“00000000”,
若采用定义方式 1 和调用方式 2,则(1)。
若采用定义方式 2 和调用方式 1,则(2)。
若采用定义方式 2 和调用方式 2,则(3)。
(1) 输出为 “00000000”
(2) 运行异常,无输出(或含义相同的叙述)
(3) 输出为 “testing”
关于函数 get_str 的两种定义方式,其区别在形式参数的类型不同,从而导致调用时对
实参的要求不同。