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

文章作者 100test 发表时间 2007:03:10 17:18:08
来源 100Test.Com百考试题网


4、给定程序MODI1.C中,函数fun的功能是:从字符串s中删除所有小写字母c。主函数中已给s赋字符串:cabcdabcdabcxccc,输出结果应该是:abdabdabx。
  请改正函数fun中的错误,使它能得出正确的结果。
  注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
  试题源程序如下:
  /**********found**********/
  include "stdio.a".
  void fun(char s)
  { int i,j.
   for(i=j=0.s[i].i )
    if(s[i]!=c)
  /**********found**********/
    s[j]=s[i].
  /**********found**********/
   s[i]=0.
  }
  main()
  { char s[80]="cabcdabcdabcxccc".
   printf("The original string:").puts(s).
   fun(s).
   printf("The string after 0deleted:").puts(s).printf("\n\n").
  }分析:(1)当对以上程序进行编译时,给出的第一个出错信息是:Declaration syntax error,指出在include行有语法错。观察此行首先可以发现在include之前没有"#"号,在此行的末尾多了分号,对此进行修正。再进行编译,给出出错信息:Unable to open include fileSTDIO.A,指出打不开名为STDIO.A的include文件。可以发现在此错把stdio.h文件的后缀写成了".a",进行改正。
  (2)再次进行编译时给出了出错信息:Invalid indirection,指出for语句中的s[i]为非法的标识符。在此s[i]以带下标的形式表示字符串中的某个元素,并作为循环结束标志,当s[i]中的值为0时循环结束,也就是说,遇到字符串结束标志时循环结束;观察形参s,仅说明它是一个字符变量,当然不可以使用s[i]的形式,而对应的实参却是一个字符数组名,显然,形参应定义成:char*s,进行修改后编译不再有错。
  (3)运行程序,输出结果是:xabcdabcdabcxccc,与预定的结果不符。应进一步检查函数fun中的逻辑结构。检查程序可知在for循环中,通过下标i用if语句来逐个检查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)提示:本题中出现的错误基本是逻辑错,对于这样的试题,要求考生能够读懂程序,分析算法方面的错误进行改正。



相关文章


1.1 TurboC语言概述
计算机等级考试二级上机改错题详细分析3
计算机等级考试二级上机改错题详细分析4
北京:计算机等级考试明起报名时间为6月28日到7月6日
C语言之C语言的底层操作
山东:全国计算机等级考试成绩可查
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛