列表

详情


试题二(共15分) 

    阅读以下说明和C程序代码,将解答写在答题纸的对应栏内。 

【说明】  

    下面是一个待修改的C程序,其应该完成的功能是:对于输入的一个整数num,计算机其位数k,然后将其各位数字逆序转换为字符串保存并输出。若num为负整数,则输出字符串应有前缀“-”。例如,将该程序修改正确后,运行时若输入“14251”,则输出“15241”;若输入“-6319870”,则输出“-0789136”。  

    下面给出的C程序代码中有五处错误,请指出错误代码所在的行号并给出修改正确后的完整代码行。

【C程序代码】

参考答案:


详细解析:

本题考查 C 程序员查找错误和排除错误的基本能力。 程序中的错误主要分为语法错误和语义错误两类。语法错误是指语言结构上的错误,例如,是否引用了未定义的变量,表达式中缺少操作数等等。语义错误是指语言结构含义不正确或程序的运算逻辑有错误,这类错误可能在编译阶段发现(静态语义),也可能推迟到运行阶段才暴露。例如,表达式中运算符号不能处理所引用的运算对象 ,无穷循环等。
考生需要非常熟悉C语言的基本语法,从而通过走查源代码来发现语法错误。查找语义错误则需要充分理解程序的逻辑,也就是整个程序的结构和每条语句所起的作用。
前 2 行为预处理命令行,对于最常使用的 include 命令,考生应该非常熟悉,以便检查程序中对常用函数的调用是否正确。本程序中前两行无错误。
显然,接下来的四行分别为 mam 函数的首部,函数体的开始符号"{"、变量定义语句和空白行,这里也没有错误。
第 7 行为格式化输入函数 scanf 的调用语句,这是比较容易出错的地方,常见的错误是格式控制串与输入表列中的变量不匹配,或者是丢失变量前的取地址运算符号" &",该行的错误即在这里。
第 8行至第 12 行用于计算所输入整数的位数并用 k 来计算(记录),这几行代码应作为一个整体来理解。程序中首先将num的值备份至 t ,并对k 赋值,然后通过循环对t 进行辗转除以 10 的运算,使 t 每次都丢掉其个位数,即 t 的位数逐渐减少(t 每减少 l位, k 就增加1),直到 t 的值为 0时为止,此时 k 的值即为num的位数。第 9 行的循环条件错误导致了无穷循环(t 等于 0 时也继续循环),由于 t 的初值也可能是负数,因此应将其中的"t>=0"   改为"t!=0"。
第 14 行没有错误。
第 15 行的错误很明显,也很常见,即将"="误用为"=",从而改变其所在语句 的语义,其中的 "pstr=0"则将pstr的值重置为 0,使pstr所记录的字符串存储空间首地址信息丢失,此后针对 pstr[]的运算都会出错。
第 17 行至第 21 行用于处理 num 为负数时输出字符串应包含前缀"一"的要求,这几行没有错误。
第 22 行至第 25 行用于从 num 得到其逆置的数字字符串,其错误在第23行,属于逻辑错误。num%10 的运算结果为 num 的个位数字,而 pstr[]中要存储的是数字字符(即 ASCII  值),因此应将num%10 的运算结果加上字符 '0' (或字符 '0'的 ASCII 码值 48)。
第 26 行用于设置字符串结束标志,需要注意的是串结束标志的位置。由于 num 可能为负数,因此将字符串结束标志字符设置在 k 下标处可能出错,保险的做法是继续用 i作为下标,使得'\0'正好跟在最后一个数字字符的后面。
第 27 行至第 30 行没有错误。

上一题