黑马程序员技术交流社区

标题: 有各位大神讲解一下,程序里面第一个i--到底在整个程序中.... [打印本页]

作者: CrazyMan    时间: 2014-12-6 23:18
标题: 有各位大神讲解一下,程序里面第一个i--到底在整个程序中....
//编程实现将任意的十进制整数转换成任意R进制数
#include <stdio.h>

int jinzhi (int numb, int flag); /*进制转换,flag为要转换的进制,最高16*/

int main()
{
    int number, flag;
    printf ("输入一个数和要转换的进制:");
    scanf ("%d%d", &number, &flag);
   
    printf ("十进制数%d转为%d进制是 ", number, flag);
    jinzhi (number, flag);
    return 0;
}

int jinzhi (int numb, int flag)
{
    int nA[100], i;
   
    for (i  = 0; numb != 0; i ++)
    {
        nA[ i ] = numb % flag;//nA[0]=0;nA[1]=1;n[2]=0;nA[3]=1
        if (nA[i ] >= 10)
            switch (nA[i ])
        {
            case 10: nA[i ] = 'A'; break;
            case 11: nA[i ] = 'B'; break;
            case 12: nA[i ] = 'C'; break;
            case 13: nA[i ] = 'D'; break;
            case 14: nA[i ] = 'E'; break;
            case 15: nA[i ] = 'F'; break;
        }
        numb = numb / flag;
    }
   i--;//我不知道这个i--有什么作用?没有它程序运行的结果就不是你想要的
    //printf ("i1=%d\n",i );
    while (i  >= 0)
    {
        if (nA[i ] >= 'A' && nA[i ] <= 'F')
            printf ("%c", nA[i ]);
        else
            printf ("%d", nA[i ]);
       // printf ("i2=%d\n",i );
        i--;
        //printf ("i3=%d\n",i );
    }
    printf ("\n");
   
    return 0;
}
作者: 枫煠    时间: 2014-12-7 01:03
  1. int jinzhi (int numb, int flag)
  2. {
  3.     //1.这个i,一开始没指定所以i=0
  4.     int nA[100], i;
  5.    
  6.     //2-1.如果你代入的numb=0,不进入回圈,i还是0
  7.     //2-2.numb!=0,进入for回圈不管有没有达到sif (nA[i ] >= 10),i都会>0,因为i++
  8.     for (i  = 0; numb != 0; i ++)
  9.     {
  10.         nA[ i ] = numb % flag;//nA[0]=0;nA[1]=1;n[2]=0;nA[3]=1
  11.         if (nA[i ] >= 10)
  12.             switch (nA[i ])
  13.         {
  14.             case 10: nA[i ] = 'A'; break;
  15.             case 11: nA[i ] = 'B'; break;
  16.             case 12: nA[i ] = 'C'; break;
  17.             case 13: nA[i ] = 'D'; break;
  18.             case 14: nA[i ] = 'E'; break;
  19.             case 15: nA[i ] = 'F'; break;
  20.         }
  21.         numb = numb / flag;
  22.     }
  23.    
  24.     //3.执行到这里i已经是符合 >=0的条件了,所以一定会进入while回圈,不加i--,那就会一直在回圈里面不出来,陷入无穷回圈
  25.     while (i  >= 0)
  26.     {
  27.         if (nA[i ] >= 'A' && nA[i ] <= 'F')
  28.             printf ("%c", nA[i ]);
  29.         else
  30.             printf ("%d", nA[i ]);
  31.         // printf ("i2=%d\n",i );
  32.         i--;
  33.         //printf ("i3=%d\n",i );
  34.     }
  35.     printf ("\n");
  36.    
  37.     //4.结论:i++是i=i+1的意思,反之i--就是i=i-1,所以加上i--,i会慢慢递减变成负数,(i  >= 0)才会等于false,才会离开回圈
  38.    
  39.     return 0;
  40. }
复制代码


不知道这样解释有没有为你解惑?
作者: 从今以后    时间: 2014-12-7 01:12
for (i  = 0; numb != 0; i ++) 因为这里最后一次循环结束后执行i++后才判断的numb != 0,因为numb==0然后退出这个循环,但是这时的i已经不是循环结束当时那个i,也就是nA[i]取值其实是nA[i+1],所以减回来
作者: 米匠    时间: 2014-12-7 20:34
这是基础测试里的题吗
作者: 从今以后    时间: 2014-12-8 13:27
米匠 发表于 2014-12-7 20:34
这是基础测试里的题吗

是的。。
作者: CrazyMan    时间: 2014-12-8 23:13
枫煠 发表于 2014-12-7 01:03
不知道这样解释有没有为你解惑?

有点感觉,谢谢啦
作者: CrazyMan    时间: 2014-12-8 23:46
枫煠 发表于 2014-12-7 01:03
不知道这样解释有没有为你解惑?

我while循环里面有一个i--,可以让它减到负数跳出循环的呀




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2