Опубликовать инкремент в цикле do while, если условие TRUE (BEST WAY?) - PullRequest
0 голосов
/ 28 октября 2018

Это довольно просто, действительно.

int main()
{
    int n,i,j;
    n = 20;
    i = 0;
    char ch[8];

    do
    {
        ch[i] = (n%2) + '0';
        n /= 2;
        // SIMPLE WAY
        if(n != 0)
            i++;
    }
    while(n != 0);

    for(j=0; j<=i; j++)
    {
        printf("%c",ch[i-j]);
    }

    return 0;
}

Но мне не нравится этот ПУТЬ

Я пробовал ниже путь, но код плохой

int main()
{
    int n,i,j;
    n = 20;
    i = 0;
    char ch[8];

    do
    {
        ch[i] = (n%2) + '0';
        n /= 2;
    }
    while(n != 0 && i++); // THIS

    for(j=0; j<=i; j++)
    {
        printf("%c",ch[i-j]);
    }

    return 0;
}

Как получить значение, увеличенное только тогда, когда цикл верен с BEST WAY?ИЛИ просто исправить 2-й способ while(n != 0 && i++)

Ответы [ 5 ]

0 голосов
/ 29 октября 2018
do
{ .......... }while(n && i++ ? 1 : n);

этот материал о && действиях, называемых оценкой короткого замыкания

0 голосов
/ 29 октября 2018

В C ++ вы можете сделать:

std::cout << std::bitset<8>(n); // 00010100 for n = 20

, если ведущий 0 в порядке.

0 голосов
/ 29 октября 2018

Как получить значение, увеличенное только в том случае, если цикл имеет значение BEST WAY?
ИЛИ просто исправить 2-й способ, пока (n! = 0 && i ++)

Я рекомендуюни один из подходов.

Нет необходимости в специальном тесте, чтобы увидеть, должен ли код увеличиваться i.

do {
  ch[i] = (n%2) + '0';
  n /= 2;
  i++;
} while(n != 0);
// Just decrement after the loop
i--;

for(j=0; j<=i; j++) {
    printf("%c",ch[i-j]);
}

В качестве альтернативы вообще не уменьшать

do {
  ch[i] = (n%2) + '0';
  n /= 2;
  i++;
} while(n != 0);

for(j=0; j<i; j++) {
  printf("%c",ch[i-1-j]);
}

Или используйте do ... while для печати. ​​

do {
  ch[i++] = (n%2) + '0';
  n /= 2;
} while(n);

do {
  printf("%c",ch[--i]);
} while (i);

Примечания:

char ch[8]; слишком мало для int вне диапазона [-255 ... 255].Для 32-битного int используйте char ch[32]; или шире.В общем, использование char ch[sizeof(int) * CHAR_BIT];

ch[i] = (n%2) + '0';, безусловно, приведет к неожиданным результатам при n < 0.Вместо этого рассмотрим unsigned типов.

0 голосов
/ 29 октября 2018

Это может быть так:

int n = 20;
int i = 7;
char ch[] = "00000000";
while (n) // if n already = 0 then do nothing
{
    ch[i--] = (n % 2) + '0'; // assign then increment
    n /= 2;                // shift to right same as n >>= 1;
}
printf ("%08s", ch);
0 голосов
/ 29 октября 2018

Ну, вы всегда можете сделать:

do {
   // code
} while(n != 0 && ++i);

Таким образом, i увеличивается сразу после того, как первая часть && оценивается как True, а && применяется к n != 0 и обновленная версия i.

...