故C选项也不对;定义数组时[ ]内的整数值表示数组元素的个数,在定义之后就不应该出现在[ ]内,故A选项错;strcpy(参数1,参数2)函数的功能是将参数2的字符串值赋到参数1对应的连续空间中,故D选项正确。 【答案】D
27.【知识点】结构体变量的引用、指针自增运算(第二部分/六、二)
【解析】P++可以改写成P=P+1。只能对结构体变量的各个成员进行赋值或存取以及运算等,选项D中P是结构体变量而不是结构体变量的成员,故而不能进行自增运算;C选项执行P++后,P中存放的地址值为原地址值加上2后的值,因为 int型变量占据2个字节的空间,下一个空间的地址为前一个空间地址值加2,假设P中原有地址值为ffdc(十六进制),执行P++后,P中存放的地址值为ffde (十六进制)。 【答案】D
28.【知识点】关键字(第二部分/一、二)
【解析】while、if、return均是关键字,而系统函数(即库函数)名不是关键字,故求平方根的函数sqrt不是关键字,答案应选A。 【答案】A
29.【知识点】参数定义(第二部分/五)
【解析】形参定义在函数头部的()中时,每一个形参前均要有类型名,故A选项错;二维数组作为形参,在定义时只能省去第一维中的常数,故B选项错;形参不能定义为static存储类别(只能是auto或register型),故D选项错; C选项中的(void)相当于没有参数,是可以的。 【答案】C
30.【知识点】函数的调用、逗号表达式(第二部分/五、二)
【解析】实参2和3分别传给形参a和b,于是a小于b成立,执行return(a,b);语句,而return语句的()中的表达式是逗号表达式,逗号表达式的值是最后一个表达式分量的值,本题中即为b的值3。 【答案】B 二、填空题 ·基本概念题
1.【知识点】程序的执行顺序、return语句(第二部分/五)
【解析】return语句的三种形式:return; 、return (表达式);、return 表达式;,该语句的主要功能是:结束本函数的执行,返回调用点。
正常情况下,程序的执行总是从主函数main开始,到主函数main结束。(除非遇..到子函数的exit(1);语句等非正常情况。) 【答案】main
2.【知识点】常量的书写格式(第二部分/二)
【解析】C语言中以书写格式来判断常量的类型,小写字母l或大写字母L是长整型常量的后缀。
【答案】long int 或 long
3.【知识点】表达式的书写(第二部分/二)
【解析】C语言的运算式与数学中的运算式写法有区别,主要由于二者的运算符有不少差异,例如数学中的乘号×、除号÷在C中分别用*和/表示;且在C语言编辑环境中无法表达出上标、开方等形式。 【答案】sqrt(x*x+y*y)/(a+b)
4.【知识点】逻辑运算、关系运算、自减运算(第二部分/二)
【解析】关系表达式的运算结果为逻辑值,而C语言中用1和0表示逻辑真和逻辑假;通常,自减运算符出现在运算对象左边时,先自减再参与其他运算;逻辑与运算的特点是:只要有一个运算对象为假,结果即为假,所以当&&的左边为假时,右边就不作处理了。
本题中&&左边的表达式(x>y)不成立,值为0,其右边的表达式(--x>0) 不作处理,
故x保持原值不变,依然为1。 【答案】1
5.【知识点】常用系统函数的返回值(第二部分/五)
【解析】函数fopen调用成功,则返回一个文件指针(文件信息区的起始地址),否则返回0;
在C语言中0、'\\0' 和NULL等值。 【答案】0或NULL
·阅读程序题
6.【知识点】数组与指针(第二部分/四) 【解析】 p p自增后
x[0] x[1] x[2] x[3]
1 2 3 5 数组名就是数组的首地址,即x等价于&x[0],则x+2等价于&x[2],指针p指向x[2];而*p++中*和++都是单目运算符,右结合性,等价于*(p++),先取p的原值与*组合,紧接着p自增p指向x[3],故而for循环当i为0时,输出x[2]的值3,当i为1时,输出x[3]的值5。 【注意】指针定义时的*只是一个标记,不具备“取内容符”的含义。 ...【答案】3 5
7.【知识点】静态存储变量、函数调用(第二部分/五) 【解析】静态存储变量如果进行初始化,只在第一次执行定义语句时随着分配内存赋予初值,当退出所定义的函数时,将保留其当时值,再次进入所在函数时,将不重新定义,也不进行初始化。main函数中当i为2和3时各调用fun函数一次:第一次调用时,形参a获值2,执行c*=a; 即c=c*a; 后,c获值2并带回到b=b+func(i);处,b获值3;第二次调用时,形参a获值3,c保持上次的2,执行c*=a;后,c获值6并带回到b=b+func(i);处,b获值9被输出。 【答案】9
8.【知识点】结构体与指针(第二部分/六) 【解析】结构体数组x获值情况如下图所示:
i=0时ptr x[0] x[1] 5 &x[1] 7 &x[0] x[0].a x[0].next x[1].a x[1].next i=2时ptr i=1时ptr i=0时,ptr->a即x[0].a,值为5被输出,ptr->next即x[0].next,值为&x[1],赋给ptr;i=1时,ptr->a即x[1].a,值为7被输出,ptr->next即x[1].next,值为&x[0],赋给ptr;i=2时,ptr->a即x[0].a,值为5被输出,ptr->next即x[0].next,值为&x[1],赋给ptr,结束。 【注意】输出语句中的分隔符,本题中为空格。
【答案】5 7 5
9.【知识点】参数的不同传递方式之间的区别(第二部分/五) 【解析】 x[0] x[1] 4 4
a 4 b &x[0]
参数a、b获值情况如上图,a++;后,a中值为5,b++;后,b中值为&x[1],*b即为x[1],故(*b)++;即为x[1]++,x[1]的值增为5,返回主函数后,a、b释放空间,输出x[0]和x[1]的值4和5。 【答案】4,5
10.【知识点】带参数的宏定义(第二部分/二) 【解析】在宏替换时,注意原样替换(不要随意附加括号等内容,除非本身有括号),本..题中ADD(a,b)/ADD(c,d)的替换结果是:a+b/c+d,故而输出的值为15+10/20+5的运算结果20,因为10/20的结果为0,而不是0.5。
【注意】表达式中各运算对象类型相同时,结果也为该类型。 【答案】20
11.【知识点】字符串处理(第二部分/四) 【解析】 b i l k e r \\0 s1 形参s1 形参s2 s2 l s3 形参s3 形参获值情况如上图,len1获得字符串s1的串长为6,len2获得字符串s2的串长为2(注意:不含字符'\\0'),嵌套的for循环将s1的每一个字符分别与s2的每一个字符相比较(除'\\0'外),一旦相等就跳出内循环;当s2中没有与s1中某字符相等的字符时,就将s1中的该字符依次赋到s3中;处理完后,在s3中所有获得的字符后加上'.\\0',使得其中存放的也.....为字符串,因而s3存放的字符串为\,串长为4,则len1-len3值为2。puts函数在输出...
字符串后自动换行。
【注意】内循环变化得快,相当于时钟的秒针;外循环变化得慢,相当于时钟的分针。 【答案】bike 2
12.【知识点】函数调用、二维数组(第二部分/五、四) 【解析】 形参s 数组s
1 4 7 2 5 8 3 6 9 r \\0 由于是地址传递,形参的变化直接导致实参发生同样的变化,故第一次调用change(s,0);后,数组s值为: 再被输出;
1 4 7 2 3 9 6 3 5 6 8 5 2 8 9 7 4 1 第二次调用change(s,1);后,数组s值为 : 再被输出。
【技巧】画图来处理此类繁琐的读程题将事半功倍。 ..
【答案】2 5 8 9 8 7 3 2 1
13.【知识点】链表的基本操作:创建、输出、删除及函数调用(第二部分/六) 【解析】调用create()函数后,生成如下链表: head 2 3 4 5 6 7 8 9 ^ 故调用print函数后,输出链表上各结点的第一个成员值如下:2,3,4,5,6,7,8,9。 调用delst函数,参数n y &y
delst函数的功能是删除链表上每一个结点之后的凡第一个成员值是该结点的第一个成员值的整数倍的所有结点,即第三、五、七、八个结点,count记录所删结点的个数4,再将值赋给*n,而*n即为y。
再次调用print函数后,输出链表上各结点的第一个成员值如下:2,3,5,7。 输出y值为4。
【答案】2,3,4,5,6,7,8,9 2,3,5,7 4 ·完善程序题
14.【知识点】数值算法(第二部分/八)
【解析】函数f的功能是计算f(x)的值,函数f1的功能是计算f’(x)的值,函数root的功能是计算方程的近似根,该函数为自己调用自己,即递归调用。第一个待填空处的含义是:此时的x对应的函数值f(x)已小于10-6,即为所求,赋值给y并返回主函数后输出即可;第二个待填空处的含义是:根据牛顿迭代公式描述出下一个x,再次调用root函数,判断下一个x对应的函数值是否满足条件。 【答案】x
x-f(x)/f1(x)
15.【知识点】累加式的求解(第二部分/八)
【解析】此题的关键是描述出任一项的分母,经分析,term 应该是某一项的分母,term+=i*pow(10,j);即为term=term+i*pow(10,j);当i为3时,term的值应为333,故而上式应被执行3次,而j取初值为0,步长为1,所以应填 j
16.【知识点】函数调用、一维数组的应用(第二部分/五、二)
【解析】函数f的功能是判断某数是否为回文数,主函数用m、m2、m3三次调用,三数同时都是回文数时即被输出。函数f中第一个while循环的作用是:将某数的每一位数位上
的数字从个位数到最高位数依次存放于数组a中,算法提示:反复求出个位数字,每求出一次,就将原数缩小十倍,直到求出最高位为止(即当原数变成一位数时求出最后一个个位数字,再缩小十倍为0时终止该循环),例如,当n为121时,先用n求得其个位数字1存放于a[0]中,再通过n=n/10;使n变为12,再用n求得其个位数字2存放于a[1]中,再通过n=n/10;使n变为1,再用n求得其个位数字1存放于a[2]中,再通过n=n/10;使n变为0,终止。第二个while循环是依次比较a数组中存放的某数的最低位数字与最高位数字是否相等,若相等,再比较次低位数字与次高位数字是否相等??,直到比完或不等为止。当某数n含k位数字时,当k为奇数例如5时,依次比较的是第1、5位数字和第2、4位数字;当k为偶数例如6时,依次比较的是第1、6位数字和第2、5位数字及第3、4位数字,故第二个空应填i 17.【知识点】字符串应用(第二部分/四) 【解析】主函数中的待填空处,应该让count获得子串第一次出现的位置下标值,而实参欲想通过形参获得值,只有借助地址传递,故而应填&count。 将s1中连续len2(s2的串长)个字符存入tmp数组中,以便于同s2进行比较,故 第一空应填strcmp(tmp,s2)= =0,表示两串相等,即s1中含子串s2;若不等,则从下一个字符开始再取连续len2个字符存入tmp数组中,继续比较??故第二空应填i++或++i或i=i+1。 【技巧】完善题的解题要领是理解题意后,通篇阅读整个程序,弄清重要变量的作用,将容易填写的空白处先填上,??填完后,再通篇阅读整个程序。 【答案】strcmp(tmp,s2)= =0或 ! strcmp(tmp,s2) i++或++i或i=i+1 &count 18.【知识点】排序算法(选择法)(第二部分/八) 【解析】若使自定义标识符STUD成为类型名,应使用typedef完成;降序排列用选择法完成的要领是:找出数组pu中成员grade值最大的元素与其第一个元素交换、找出除第一个元素以外的成员grade值最大的元素与其第二个元素交换??k中最终存放每一次找到的成员grade值最大的元素的下标,总是先认为待获得grade “最大值”的元素位置中存放的就是最大值,故第二空将i赋给k,再与其后的每一个元素的grade成员比较,一旦发现更大的,k立即记录下其下标值,故第三空填pu[k].grade pu[k].grade 2005年春二级C语言上机试卷 一、改错题 含有错误的源程序如下: #include {char name [20],num[20]; };