问答题
阅读以下技术说明、流程图和C程序,根据要求回答问题1和问题2。
【说明】
如图6-13所示的程序流程图描述了对8位二进制整数求补的算法。该算法的计算过程如下:从二进制数的低位(最右位)开始,依次向高位逐位查看,直到首次遇到“1”时,停止查看。然后,对该“1”位左面的更高位(如果存在的话),逐位求反,所得的结果就是对原二进制数求补的结果。例如:对二进制整数10010110求补的结果时01101010。
设8位二进制整数中的各位,从低位到高位,依次存放在整型数组BIT的BIT[1]~BIT[8]中。例如,二进制整数10010110存放在数组BIT后,则有BIT[1]=0,BIT[2]=1,…,BIT[7]=0,BIT[8]=1。若流程图中存在空操作,则用NOP表示。
问答题
【问题1】
请将图6-13流程图中(1)~(5)空缺处的内容补充完整。其中,(1)空缺处按“循环变量名:循环初值,增量,循环终值”格式描述。
【正确答案】
【答案解析】(1)i:1,1,8 (2)1→sw (3)0→BIT[i] (4)NOP,或空操作 (5)1→BIT[i] [要点解析] 由于题目中给出了对8位二进制整数求补的算法,并且指明将8位二进制整数中的各位,从低位到高位,依次存放在整型数组BIT的BIT[1]~BIT[8]中,因此,循环控制变量的初值应该为1(从二进制数中的最低位开始)、终值为8(二进制数中的每一位都要检查)、增量为1(每次检查1位),按照“循环变量名:循环初值,增量,循环终值”格式描述,则(1)空缺处所填写的内容为“i:1,1,8”。0 由题目中给出的算法可知,从最右位开始向左找到的第一个“1”及其右边的各位是不取反的,因此需要一个标志,sw起的就是这个作用。由于SW的初始值为0,因此在找到从右边数的第1个“1”之前,当BIT[i]等于“0”且SW=O时,则说明这些二进制位无须取反,对应于流程图的(4)空缺处的操作应为空操作(即NOP)。 当某个BIT[i]的值等于“1”且SW的值等于0,则说明找到了从右边数的第1个“1”,此时应将SW的值置为非“0”,因此流程图中(2)空缺处的操作要对SW置1,即该空缺处所填写的内容是“1→sw”。 最后,应将其余各位取反,即BIT[i]等于1时,要在流程图的(3)空缺处将其置0(即0→BIT[i]);反之,则要在流程图的(5)空缺处将其置1(即1→BIT[i])。
问答题
【问题2】
待修改的【C程序】中存在3个错误,请指出各个错误所在的行号,并给出相应的修改意见。
【正确答案】
【答案解析】第3行,变量num没有初始化,应将其初始值设为0
第7行,scanf函数参数错,应将语句“scanf("%1d",n);”中的n修改为“&n”,或者在n之前加取地址符号
第13行,循环条件错,应将语句中“n>=O”修改为“n>0”
[要点解析]
本问题考查程序检错和排错能力。程序错误一般分成语法错误和语义错误两种类型,其中语法错误是形式上的错误,语义错误是含义上的错误,编译程序能够发现程序中的所有语法错误。语义错误又可分为静态语义错误和动态语义错误,静态语义错误编译时检查,而动态语义错误在程序运行时表现。
在C程序中,常见的错误有:①使用的变量没有定义;②变量没有赋值初就直接使用;③输入输出的数据类型与所用格式说明符不一致;④超出数据范围;⑤输入时数据的组织方式与要求不符;⑥误把“=”作为关系运算符“等于”;⑦语句的分号缺少或放置错误;⑧缺少花括号“{}”,或圆括号“()”、中括号“[]”不配对;⑨符号引用错误;⑩引用数组元素超界等。
在本试题给出的C程序中,所出现的错误及其修改建议如表6-18所示。
{{B}}表6-18 C程序中存在错误及其修改意见表{{/B}}
{{B}}行 号{{/B}}
{{B}}错误原因分析{{/B}}
{{B}}修改意见{{/B}}
第3行
变量num没有赋初始值就直接使用(动态语义错误)。由于变量num是局部变量,使用变量num的语句为“num=num+(n%10)*k;”。由于变量num没有赋初值,因此系统不保证对其进行初始化,导致程序的运行结果不确定 建议将其初始值设为0
第7行
scanf函数参数错,即输入变量时忘记使用地址符号(动态语义错误),导致程序运行时,变量n不能正确接收输入的数据 建议将语句“scanf("%1d",n);”修改为“scarlf("%1d",&n);”
第10行
循环条件错误,可能导致无穷循环 建议将语句“for(i=1;n>=O;i++)”修改为“for(i=1;n>0;i++)”