2014-02-10 5 views
0

저는 사용자가 문자를 입력하고, 각 문자를 골라 내며, 각각을 이진수로 변환하고 각 이진수의 '1'수를 계산하는 프로그램을 작성하고 있습니다. 지금까지는 작업 코드가 있습니다. 그러나 각 바이너리의 출력은 역순입니다. 이처럼 : 내가 원하는 때내 바이너리가 역순으로 출력됩니다.

The character A = 10000010 1's = 2 

/필요가 :

The character A = 01000001 1's = 2 

나는 이미이를 수정하는 일처럼 간단 할 것이라고 말했다 된 기능의 양을 사용하는 데 필요한입니다 내 binaryPrinter 함수에 대한 재귀. 나는 내가 그 일을 할 수있는 곳과 내가 어떤 주장을 할 지 혼란 스럽다. 어떤 도움이라도 환상적 일 것입니다.

p.s. binaryPrinter 함수의 오른쪽 부분에 배치하면 내 거꾸로 이진 문제를 해결할 것입니다 프로그램을 반복하려면 binaryPrinter 함수에서 재귀를 사용해야합니다.

#include <stdio.h> 
#include <stdlib.h> 

void binaryPrinter(int digitsLeft, int value, int * numberOfOnes); 
void print(char c); 
int charToInt(char C) 
{ 
    int c; 

    c=C;  

    return (int) c; 
} 
int main() 
{ 
    char value; 
    int result = 1; 
    while (result != EOF) 
     { 
      result = scanf("%c", &value); 
      if (result != EOF) 
       { 
        print(value); 
       } 
     } 

} 

void print(char c) 
{ 
    int digits=8, value=c; 
    int ones=0; 

    printf("The character %c = ", c); 

    binaryPrinter(digits, value, &ones); 

    printf(" 1's = %d\n", ones); 
} 

void binaryPrinter(int digitsLeft, int value, int * numberOfOnes) 
{ 

    for (digitsLeft=8; digitsLeft>0; digitsLeft--) 
     { 
      if(value & 1) 
       { 
        printf("1"); 
        *numberOfOnes=*numberOfOnes+1; 
       } 
      else 
       { 
        printf("0"); 
       } 
      value = value >> 1; 

     } 
} 

답변

1

다음은 재귀 버전입니다. 아무 것도 인쇄하기 전에 되풀이되므로 각 자릿수 처리에서 돌아 오는 순서대로 인쇄되므로 올바른 순서로 인쇄됩니다.

void binaryPrinter(int digitsLeft, int value, int * numberOfOnes) 
{ 
    if (digitsLeft > 1) { 
     binaryPrinter(digitsLeft - 1, value >> 1, numberOfOnes); 
    } 

    if (value & 1) { 
     printf("1"); 
     (*numberOfOnes)++; 
    } else { 
     printf("0"); 
    } 

} 
+0

감사합니다 바머! –

0

변경

에 대한

에 루프 (digitsLeft = 1; digitsLeft < = 8; digitsLeft ++)

+0

'digitsLeft'는 루프 카운터로 함수 EXCEPT의 아무 곳에서나 사용되지 않기 때문에 무의미합니다. –

+0

binaryPrinter 함수의 오른쪽 부분에 배치하면 분명히 내 문제를 해결할 프로그램을 반복하기 위해 binaryPrinter 함수에서 재귀를 사용해야합니다. –

0

글쎄, 당신은 역순으로 자리에서 찾고있다 :

if (value & 1) --> take the right-most digit 
value = value >> 1; --> shift to the right 

있으시면

12345678 
,

입력에 대해 (예, 그건하지 비트,이 위치를 설명하기 위해 단지이다), 당신은 일을하는지 : 출력

8,7,6,5,4,3,2,1 

. 원래 문자열의 왼쪽 (최상위) 비트에서 작업하여 논리를 뒤집어서 최하위 비트까지 작업해야합니다.

+0

binaryPrinter 함수의 오른쪽 부분에 배치하면 분명히 내 문제를 해결할 프로그램을 반복 할 수있는 binaryPrinter 함수에서 재귀를 사용해야합니다. –

관련 문제