2022年5月程序员模拟题下午(一)之四
摘要:对于【程序员】软考考试而言,试题无疑是最重要的学习资料之一。在软考备考过程中,吃透试题、掌握试题所考知识点、熟悉试题的出题思路,对我们提升分数的效果是最明显的,通过对试题的反复练习,还可以查漏补缺。今天,给大家带来【2022年5月程序员模拟题下午(一)】部分试题的详解,一起来看看吧~1、试题四(共15分,每空3分)【说明】函数del_substr(S,T)的功能是从头至
1、试题四(共15分,每空3分)【说明】函数del_substr(S,T)的功能是从头至尾扫描字符串S,删除其中与字符串T相同的所有子串,其处理过程为:首先从串S的第一个字符开始查找子串T,若找到,则将后面的字符向前移动将子串T覆盖掉,然后继续查找子串T;否则从串S的第二个字符开始查找,依此类推,重复该过程,直到串S的结尾为止。该函数中字符串的存储类型SString定义如下:typedef struct {char *ch; /*串空间的首地址*/int length; /*串长*/}SString;【C函数】void del_substr(SString *S, SString T){int i, j;if (S->length < 1 || T.length < 1 || S->length < T.length )return;i = 0; /* i为串S中字符的下标 */for (; ; ) {j = 0; /* j为串T中字符的下标 */while (i < S->length && j < T.length ) { /* 在串S中查找与T相同的子串 */if (S->ch[i]==T.ch[j] ) {i++; j++;}else {i = (1) ; j = 0; /* i值回退,为继续查找T做准备 */}}if ((2) ) { /* 在S中找到与T相同的子串 */i = (3) ; /* 计算S中子串T的起始下标 */for(k = i+T.length; k<S->length; k++) /* 通过覆盖子串T进行删除 */S->ch[ (4) ] = S->ch[k];S->length = (5) ; /* 更新S的长度 */}else break; /* 串S中不存在子串T*/}}
答案:
(1)i-j+1或其等价形式
(2)j=T.length,或j>= T.length,或其等价形式
(3)i-j,或i- T.length
(4)k- T.length,或k-j,或其等价形式
(5)S->length- T.length,或S->length -j
答题解析:
根据题目部分的描述,首先要在字符串S中查找与T相同的子串,基本方法是逐个字符进行比对,在代码中,当S->ch[i]与T.ch[j]不相等时,i值需退回至本趟开始位置后再后移一个位置,从而为开始下一趟查找做准备。由于相同的字符个数为i个,因此i需回退至位置i-j+1,即空(1)填入i-j+1。
由于在串S中查找与T 相同子串是以i < S->length && j < T.length作为条件的,因此查找结束时,该条件必然为假。若在S中找到与T相同的子串,则j < T.length必然不成立,即j将等于T.length。因此,空(2)处填入j=T.length。根据注释,空(3)处需计算S中子串T的起始下标,显然应该填入i-j,或i- T.length。
通过覆盖子串T进行删除,也就是将后面的字符前移来实现删除。假设需要删除的子串在S->ch[ p]~ S->ch[p+ T.length-1]中,则需要将S->ch[p+ T.length]移至S->ch[ p],
S->ch[p+ T.length+1]移至S->ch[ p+1],以此类推,直到将S->ch[S->length-1]移至S->ch[S->length- T.length]为止,因此以下代码中的空(4)处应该填写入k- T.length。
for(k = i+T.length; k<S->length; k++) /* 通过覆盖子串T进行删除 */
S->ch[ (4) ] = S->ch[k];
最后空(5)处很明显是要将S的长度减去子串T的长度值,因为删除了一个相应长度值的子串,因此空(5)填入S->length- T.length
查看完整试题>>>
软考资料: 2024年软考论文范文> 软考考试核心重点难点汇总> 查看更多>
备考刷题:章节练习+每日一练> 软考历年试题+模拟题>查看更多>