2012 上半年程序员考试真题及答案-下午卷
试题一
已知数组 A[l:n]中各个元素的值都是非零整数,其中有些元素的值是相同的(重复)。
为删除其中重复的值,可先通过以下流程图找出所有的重复值,并对所有重复值赋 0 标 记。
该流程图采用了双重循环。
处理思路:如果数组 A 某个元素的值在前面曾出现过,则该元素赋标记值 0。例如, 假
设数组 A 的各元素之值依次为 2, 5, 5,1,2, 5, 3,则经过该流程图处理后,各元素之值
依次为 2,5,0, 1,0,0,3。
填补流程图中的空缺(1)〜(5)
(1) n-1
(2) A[i]
(3) i+1
⑷ A[j]
(5) A[j]
在处理大批数据记录时,删除重复记录(关键词重复的记录)是常见的操作。本题源自这种
应用。刪除重复记录算法可分两步进行。第一步将重复 ai 现的多余元素标记为 0; 第二步
再删除所有的 0 元素。本题流程图只做第一步处理。
本流程图采用了对 i 和 j 的双重循环,对每个元素 A[i],需要查看其后面的各个元素(用
A[j]表示)是否与 A[i]相同。因此,外层循环应对 i=l,n-1 进行,从而在(1)处应填“n-1”。
内层循环应对 j=i+l,n 进行,从而在(3)处应填“i+1”。
在外循环处理中首先应判断 A[i]是否已经标记为 0,若是则无需进一步处理。因此, (2)处
应填“A[i]”。而在内循环处理中首先应判断 A[j]是否已经标记为 0,若是则无需进一步处理。
因此,(4)处应填“A[j]”。如果发现元素重复(即 A[i]=A[j]),则需要再将 A[j]赋值为 0 (标
记),因此(5)处应填“A[j]”。
试题二
设在某 C 系统中为每个字符型数据分配 1 个字节,为每个整型(int)数据分配 4 个字节,
为每个指针分配 4 个字节,sizeof(x)用于计算为 x 分配的字节数。
【问题 1】
请写出以上 C 代码的运行结果。
4 4 20
1 11
4 1 10
sizeof 是 C 语言提供的一个关键字,sizeof(x)用于计算为 x 分配的字节数,其结果与系统
或编译器相关。若 x 是数组名时,用于计算整个数组所占用存储空间的字节数;若 x 是指
针,则无论其指向的目标数据是什么类型,x 所占用的存储空间大小都相同(在同 一系统
或编译环境中);若 x 是结构体变量或类型,则需要根据系统规定的对齐要求来计 算为 x
所分配空间的字节数。
根据说明,系统为每个字符型数据分配 1 个字节,为每个整型(int)数据分配 4 个 字节,
为每个指针分配 4 个字节,那么 sizeof(int)、sizeof(unsigned int)是计算整型数据和无
符号整型数据的存储空间大小,sizeof(arr)是计算数组 arr 的字节数,它们的值分别为 4、
4 和 20。
sizeof(Char)计算一个字符数据所占用的字节数,根据说明应为 1。Sizeof(mystr)计算为
字符数组 mystr 分配的空间大小,该数组的大小由字符串"JustAtestVn"决定,该字符串 的
长度为 10,还有一个串尾结束标志字符’\0',因此 sizeof(mystr)的值为 11。
ptr 是指向字符数组 mystr 的指针,显然 sizeof(ptr)的结果为 4。由于*ptr 指向了一个字
符数据,因此 sizeof (*ptr)的结果为 1,函数 strlen(ptr)计算 ptr 所指字符串的长度,
结果为 10。
【问题 2】
(1) 请定义一个“只读”型的整型常量 size,并将其值初始化为 10;
(2) 请定义一个指向整型变量 a 的指针 ptr,使得 ptr 的值不能修改,而 ptr 所指向的
目标变量的值可以修改(即可以通过 ptr 间接修改整型变量 a 的值)。
注:无需给出整型变量 a 的定义。
(1) const int size =10;或 int const size =10;
(2) int* const ptr = &a;
在 C 语言中,const 关键字的一个作用是限定一个变量的值不能被改变,使用 const 可以在
一定程度上提高程序的安全性和可靠性。
const int size = 10;或 int const size = 10;
以上代码都可以定义一个“只读”型的整型常量 size 并将其值初始化为 10。
当 const 用于修饰指针时,常见的情形如下:
(1) const 修饰的是指针所指向的对象,该对象不可改变,指针变量可改变。
const int *p; // 或 int const *p;
(2) const 修饰的是指针,该指针变量不可改变,其指向的对象可改变。
int *const p;
(3) const 修饰的是指针以及指针所指向的对象,都不可改变。
const int *const p;
【问题 3】
某 C 程序文件中定义的函数 f 如下所示,请简要说明其中 static 的作用,以及形参 表
“const int arr[]’’ 中 const 的作用。
static 的作用:说明 f 是内部函数,只能在本文件中调用它。 const 的作用:在函数 f 中
不能修改数组元素的值,若有修改,编译时会报错。
关键字 static 用于修饰函数中的局部变量时,是通知编译器将该变量的存储空间安排在全
局存储区,这样在下一次调用函数时还保留上一次对该变量的修改结果。
当一个源程序由多个源文件组成时,用 static 修饰的全局变量和函数,其作用域为当前文
件,对其他源文件不可见,即它们不能被其他源文件引用或调用。
当函数的形参用 const 修饰时,在函数体内部不能被修改。
试题三
函数 numberOfwords (char message[])的功能是计算存储在 message 字符数组中的一
段英文语句中的单词数目,输出每个单词(单词长度超过 20 时仅输出其前 20 个字母), 并
计算每个英文字母出现的次数(即频数),字母计数时不区分大小写。
假设英文语句中的单词合乎规范(此处不考虑单词的正确性),单词不缩写或省略, 即
不会出现类似 don't 形式的词,单词之后都为空格或标点符号。
函数中判定单词的规则是:
(1) 一个英文字母串是单词;
(2) 一个数字串是单词;
(3) 表示名词所有格的撇号(')与对应的单词看作是一个单词。
除上述规则外,其他情况概不考虑。
填补 C 函数中的空缺(1)〜(6)
(1) char *,或 unsigned char
(2) isalnum,或 isalpha(*pstr)丨丨 isdigit
(3) islower,或!isupper
(4) pstrH-,或++pstr,或 pstr=pstr+l,或 pstrf=l
(5) wordbuffer[i],或*(wordbuffer+i)
(6) pstr-H-,或++pstr,或 pstr=psti+l,或 pstr+=l
本题考查 C 语言程序设计基本技术。
题目中涉及的知识点主要有字符串、字符指针和函数调用等,首先应认真阅读题目的说
明部分,以了解函数代码的功能和大致的处理思路,然后理清代码的框架,明确各个变量(或
数组元素)所起的作用,并以语句组分析各段代码的功能,从而完成空缺处的代码填充。
函数中空(1)处所在语句为定义变量 pstr 的声明语句,根据下面对 pstr 的使用方式,可知
pstr 是一个指向字符的指针变量,因此空(1)处应填入“char*”。
显然,“pstr = message;”使 pstr 指向了英文语句的第一个字符,下面的 while 循环
则用于遍历语句中的每一个字符:
while (*pstr) {
对于语句中的一个字符*pstr,它可能是一个单词中的字符、空格、标点符号或其他 字
符,由于函数的功能是取出单词并进行统计,因此首先考虑该字符是否属于一个单词 以及
是否是单词的开头(字母或数字字符),结合注释,可知空(2)处用于判定当前字 符*pstr
是否是单词的开头字符,即是否是字母或数字,由于代码中己给出了(*pstr),因 此最合适
的 做 法 是 直 接 调 用 库 函 数 进 行 处 理 , 即 空 ( 2) 处 应 填 入 “ isalnum ”, 也 可 以 填 入
“isalpha(*pstr)丨丨 isdigit’’。
得到一个单词的开头字符后就用 do-while 语句依次取出该单词的每一个字符,直到单
词结束为止。根据题目说明,单词中包含的字符为字母、数字或撇号('),因此 do-while 继
续循环的条件之一是表达式“isalnUm(*pStr)|j*pStr='\"”的值为“真”,另一个条件是 关
于单词长度不超过 20 的限制。
分析空(3)所在的语句(如下所示),显然是对单词中的字母进行计数,在*pstr 是 字
母(isalPha(*pStr)的返回值为 1)的前提下,“pS[*pStr-'a’]++”是对小写字母进行计数,
“pS[*pstr-'A']++”是对大写字母进行计数,所以空(3)处应判断*pstr 是否为小写字母,
应填入“islower”,或者填入“!isupper”。
if (isalpha(*pstr)) {
if ( (3) (*pstr) ) ps[*pstr_* a *]++;
else ps[*pstr-’A1]++;
}
空(4)处是令 pstr 指向下一字符,因此应填入“pstrf+”或其等价形式。
空(5)处是设置字符串结尾字符,因此应填入“wordbuffer[i]”或其等价形式。
空(6)处是令 pstr 指向下一字符,因此应填入“pstrf+”或其等价形式。