计算机等级考试二级上机改错题详细分析4

计算机等级考试二级上机改错题详细分析4,第1张

计算机等级考试二级上机改错题详细分析4,第2张

4.在给定的程序MODI1中。C,fun的功能是从字符串S中删除所有小写字母C,S在main函数中已经被赋予了字符串:cabcdabcdabcxccc,输出结果应该是:abdabdabx。
请更正fun函数中的错误,以便它能得到正确的结果。
注意:不要改变主函数,不要增删行,不要改变程序的结构!
试题源程序如下:
/* * * * * * * * * *找到* * * * * * */
包含“stdio . a”;
void fun(char s)
{ int I,j;
for(I = j = 0;s[I];i++)
if(s[i]!= ' c ')
/* * * * * * * * * *找到了* * * * * * * * */
s[j]= s[I];
/* * * * * * * * * *找到了* * * * * * * * */
s[I]= 0;
}
main()
{ char s[80]= " cabcdabcdabbcxccc ";
printf("原字符串:");卖出期权;
乐趣;
printf("删除后的字符串:");卖出期权;printf(" \ n \ n ");
}分析:(1)编译上述程序时,给出的第一条错误信息是:声明语法错误,说明include行有语法错误。通过观察这一行,我们首先可以发现include前面没有“#”号,这一行的末尾有一个分号,我们可以更正。再次编译并给出错误消息:无法打开包含文件的STDIO。a ',表示无法打开名为' stdio.a '的包含文件。这里可以发现,stdio.h文件的后缀写成了”。“误答,可以改正。
(2)再次编译时,给出错误消息:indirection无效,说明for语句中的s[i]是非法标识符。在这个s[i]中,字符串中的一个元素以标签的形式表示,它被用作循环结束符号。当s[i]中的值为0时,循环结束,即满足字符串结束符时;观察形参S只能说明它是一个字符变量。当然不能用s[i]的形式,但是对应的参数是一个字符数组名。很明显,形参应该定义为:char*s,修改后编译没有错误。
(3)运行程序,输出结果为:xabcdabcdabcxccc,与预定结果不一致。函数fun中的逻辑结构应该进一步检查。检查程序知道,在for循环中,使用if语句通过下标I逐个检查S引用的字符串中的每个字符是否为小写字母C,如果不是,则放回S引用的字符数组中,位置由下标J指定;I由for的循环变量控制,而J除了初始值没有变化。所以只要不是小写字母C,就重复放在s[0]中(因为J一直是0),只有s[0]中的字符发生了变化,其他位置的内容没有变化。s[j]中每放一个非小写字母C,J就要加1,if子句中s[J]= s[I];应该改写为:s[j++]= s[I];,或者重写为:{ s[j]= s[I];j++;}。
(4)修正后再次运行程序,输出字符串为:abdabdabxabcxccc,也与预期结果不同。但是可以看出字符串的第一部分是正确的,要考虑字符串的结束标记是否放错了位置。检查函数中最后一条语句s[I]= 0;可以看出,字符串的结束标记并没有放在J所指的字符串的末尾,而是仍然放在原字符串的末尾。所以这个语句应该是s[j]= 0;。
(5)修正后再次运行程序,得到正确的结果:abdabdabx。
(6)提示:本题的错误基本都是逻辑错误。对于这类问题,要求考生能够读懂程序,分析算法中的错误并加以改正。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 计算机等级考试二级上机改错题详细分析4

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情