阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。[说明1]递归函数is elem(char ch,char*set)的功能是判断ch中的字符是否在set表示的字符集合中,若是,则返回1,否则返回0。[C代码1] int is—elem(char ch,char*set) { if(*set==‘\0’) return 0; else if ( (1) ) return 1; else return is—elem( (2) ); }【说明2】函数char*combine(char*setA,char*setB)的功能是将字符集合A(元素互异,由setA表示)和字符集合B(元素互异,由setB表示)合并,并返回合并后的字符集合。【C代码2】char* combj ne(char*setA,char*setB) { int i, lenA, lenB, lenC; lenA=strlen(setA); lenB=strlen(setB); char*setC= (char*)malloc(1enA+lenB+1); if (!setC) return NULL ; strncpy(setc, setA, lenA); //将setA的前lenA个字符复制后存入setc lenc= (3); for (i=0; i<lenB; i++) if((4) ) //调用is—elem判断字符是否在setA中 setC[1enC++] =setB[i]; (5)=‘\0’; //设置合并后字符集的结尾标识 return SetC; }
【正确答案】正确答案:(1)set[0]=ch 或*set=ch或等价形式 (2)ch,set+1或ch,++set或等价形式 (3)lenA或等价形式 (4)!iselem(setB[i],setA) 或等价形式 (5)setC[1enC] 或*(setC+lenC)或等价形式
【答案解析】解析:本题考查C程序设计的基本结构和运算逻辑。 函数is_elem(char ch,char*set)的功能是判断给定字符是否在一个字符串中,其运算逻辑是:若ch所存的字符等于字符数组set的第一个字符,则结束;否则再与set中的第二个字符比较,依此类推,直到串尾。因此空(1)处应填入“set【0】=ch”或其等价表示。题目要求该函数以递归方式处理,并在空(2)处填入递归调用时的实参。显然,根据函数is elem的首部信息,递归调用时第一个参数仍然为“ch”,第二个参数是需给出set中字符串的下一个字符的地址(第一次递归时为字符串第二个字符的地址,第二次递归时实际为字符串第三个字符的地址,由于传进来时与ch进行比较的字符都是*set,那么下一个字符就都表示为set.+1),即为&set[1],或者为set+1,所以空(2)处应填入参数“ch,set+1”或其等价表示。 函数combine(char*setA,char*setB)的功能是将字符集合A和字符集合B合并,并返回合并后的字符集合,处理思路是:现将A集合的元素全部复制给集合C(stmcpy(setC,setA,lenA)),然后按顺序读取集合B中的字符,判断其是否出现在A中。如果来自集合B的字符已经在A中,则忽略该字符,否则,将其加入集合C。 变量lenC表示集合C的元素个数,其初始值应等于lenA,因此空(3)应填入“lenA”。 根据注释,空(4)应填入“!is_elem(setB[i],setA)”,判断来自集合B的元素setB[i]是否在集合setA中。空(5)处的代码作用是设置字符数组setC的尾部字符“\0”,由于lenC的值跟踪了该集合中元素数目的变化,其最后的值正好表示了setC的元素个数,所以该空应填入“setC[1enC]”或其等价表示。