阅读以下代码,回答问题1至问题3,将解答填入答题纸的对应栏内。【代码1】#include<stdio.h>Void swap(int x, int y){int tmp=x; x=y; y=tmp;}int main(){int a=3, b=7;printf(“a1=%d b1=%d\n”, a, b);swap(a,b);printf(“a2=%d b2=%d\n”, a, b);return 0;}【代码2】#include<stdio.h>#define SPACE '' //空格字符int main(){char str[128]=“Nothing is impossible! ”;int i,num=0,wordMark=0;for(i=0;str[i];i++)if(str[i]:=SPACE)wordMark=0;elseif(wordMark==0){wordMark=1;num++;}printf(“%d\n”,num);return 0;}【代码3】#include<stdio.h> #define SPACE '' //空格字符int countStrs(char*);int main(){ char str[128]=“Nothing is impossible! ”;printf(“%d\n”,(1)(str));return 0;}int countStrs(char*p){int num=0,wordMark=0;for(;(2);p++) { if( (3) ==SPACE) wordMark=0;elseif(!wordMark)(WordMark=1;++num}}return (4);}
问答题
写出代码1运行后的输出结果。
【正确答案】正确答案:a1=3 b1=7, a2=3 b2=7
【答案解析】解析:本问题考查函数调用时的参数传递。 C语言仅支持传值调用方式,实参传递给形参的值可以是数值,也可以是地址值。根据题目中给出的函数swap(int x,int y)定义信息,在main中执行函数调用“swap(a,b)”时,是将实参a的值传递给形参x、实参b的值传递给形参y,这个传递过程是单方向的,此后再执行swap中的操作时,x、y的修改与a、b再无关联,因此在main函数中,a和b的值没有变化。
问答题
写出代码2运行后的输出结果。
【正确答案】正确答案:3
【答案解析】解析:本问题考查程序的基本结构和运算逻辑。 首先确定变量的作用,num用来对单词进行计数。for循环语句的作用是遍历字符串中的字符。对字符串中的每个字符str[i],如果是空格字符,则将wordMark设置为0,然后继续考查下一个字符。观察存储在数组str中的字符串,空格字符的作用是作为单词的分隔符。显然,对于每个单词的第一个字符,此时wordMark的值一定为0。当字符str[i]不是空格字符,接下来通过判断wordMark是否为0来决定num是否增加,以及是否改变wordMark。据此可以看出,对于一个单词的第一个字符之后的其他字符,通过将wordMark设置为1,使得对每个单词,num的值仅自增1次。因此,程序的功能是对字符串中的单词进行计数(与单词连载一起的特殊符号也算作单词的一部分,单词仅以空格分隔)。
问答题
代码3的功能与代码2完全相同,请补充代码3中的空缺,将解答写入答题纸的对应栏内。
【正确答案】正确答案:(1)countStrs (2)*p 或p[0] 或*(p+0)或*p!=0或*p!=‘\0’或等效形式 (3)*p或p[0]或*(p+0)或等效形式 (4)num
【答案解析】解析:本问题考查程序的基本结构、运算逻辑和函数调用规范。 在代码3中,将对字符串中的单词计数用一个函数来实现,需要在理解代码2的基础上来完善代码3。 空(1)处的要求很明确,就是要通过函数调用来完成单词计数,为防止考生误解,该函数调用的实参已给出,因此填入函数名“countStrs”即可。 空(2)处的for循环用来遍历字符串中的字符,显然,p是指向串中字符的指针,循环条件应为是否遇到串结束标志字符,因此空(2)处应填入“*p!=0”或者等效方式。 空(3)处所在表达式是串中的字符与空格字符进行相等比较,应填入“*p”或者等效方式。 根据函数countStrs的首部定义及函数体内的代码逻辑,空(4)处是返回字符串中的单词数目,应填入“num”。