阅读以下技术说明、流程图和C程序,根据要求回答问题1和问题2。 【说明】 如图6-13所示的程序流程图描述了对8位二进制整数求补的算法。该算法的计算过程如下:从二进制数的低位(最右位)开始,依次向高位逐位查看,直到首次遇到“1”时,停止查看。然

admin2009-02-15  25

问题 阅读以下技术说明、流程图和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表示。
   
   以下待修改的【C程序】完成的功能是:对于给定的1个长正整数,从其个位数开始,每隔一位取1个数字(即取其个位、百位和万位等数字),形成1个新的整数并输出。例如,将该程序修改正确后,运行时若输入“9753186420”,则输出的整数为“73840”。
   【C程序】
   行号    C代码
   01      #include  <stdio.h>
   02      int  main()
   03      {    long    n,num;
   04           int i;
   05           do  {
   06                printf("请输入一个正整数:");
   07                scanf("%1d",n);
   08          }while(n<=0);
   09          k = 1;
   10          for (i=1;n>=0;i++)  {
   11              if  (i%2=1)  {
   12                   num = num + (n%10)*k;
   13                   k = k*10;
   14              }
   15              n = n/10;
   16          }
   17          printf("新数据为:%d\n",num);
   18          return 0;
   19      }

选项

答案(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等于“0”且SW=O时,则说明这些二进制位无须取反,对应于流程图的(4)空缺处的操作应为空操作(即NOP)。
   当某个BIT的值等于“1”且SW的值等于0,则说明找到了从右边数的第1个“1”,此时应将SW的值置为非“0”,因此流程图中(2)空缺处的操作要对SW置1,即该空缺处所填写的内容是“1→sw”。
   最后,应将其余各位取反,即BIT等于1时,要在流程图的(3)空缺处将其置0(即0→BIT);反之,则要在流程图的(5)空缺处将其置1(即1→BIT)。
转载请注明原文地址:https://jikaoti.com/ti/0vW7FFFM
0

最新回复(0)