logo资料库

2012上半年程序员考试真题及答案-下午卷.doc

第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
资料共18页,剩余部分请下载后查看
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+”或其等价形式。
分享到:
收藏