2013-05-12 1 views
0

C에서 코드를 사용하는 데 문제가 있습니다. 숫자를 변환하지 않습니다. 이것은 주어진 수를 다른 기준으로 다른 수로 변환하는 유클리드 알고리즘입니다. "정밀도"는 쉼표 뒤의 자릿수입니다. 상기베이스 (10) I (170)와, 예를 들면 그것을 시도하고 그 결과 I 170하고 싶었을 다수 항상 유클리드 알고리즘과 Horner의 방법으로 숫자 변환

static char convertIntToChar(int number) { 
    if (0 <= number && 10 > number) { 
      return number + '0'; 
    } 
    else if (16 > number) { 
      return number - 10 + 'A'; 
    } 
    else { 
      return '\0'; 
    } 
} 

"숫자"를위한 입력

:

static char* euclid(float number, int base, int precision) 
{ 
    //create a buffer for holding the resulting string 
    char* resultString = createBuffer(number, base, precision); 
    int numbTemp; 
    int numbDiv; 

    float maxExponent = 0; 

    while (number >= pow((float)base, (float)maxExponent)) { 
     maxExponent++; 
    } 

    maxExponent--; 

    if (maxExponent < 0) { 

     maxExponent = 0; 
    } 

    while (maxExponent >= 0) { 
    numbDiv = number/pow(base, maxExponent); 
    *resultString += converIntToChar(numbDiv); 
    numbTemp = numbDiv * pow(base, maxExponent); 
    number -= numbTemp; 
    maxExponent--; 
    if(maxExponent < 0 && precision >0) { 
     *resultString += ","; 
     while(precision > 0) { 
      numbDiv = number/pow(base, maxExponent); 
      numbTemp = numbDiv * pow(base, maxExponent); 
      *resultString += convertIntToChar(numbDiv); 
      number = number - numbTemp; 
      maxExponent--; 
      precision--; 
     } 
    } 
    } 
    return resultString; 
} 

문자 번호 변환 (베이스 (10)에 대한 것임)는 AA 인베이스 (16)에 번호로서 리턴된다. 하지만 결과는 is입니다. 문제를 찾아 내도록 도와주세요. 게다가 나는 리눅스를 사용한다. 그래서 gcc 컴파일러를 사용합니다. 또한 Horner의 메서드를 구현하려고하는데 위와 같은 결과가 나타납니다 () Horner의 메서드에 대한 코드입니다.

static char* horner(float number, int base, int precision) { 

    // create a buffer for holding the resulting string. 
    char* resultString = createBuffer(number, base, precision); 
    int numbDiv = 0; 
    int numbTemp = 0; 
    int numbConv = 0; 

    do { 
     numbDiv = number/base; 
     numbTemp = numbDiv * base; 
     numbConv = number - numbTemp; 
     number = numbDiv; 
     *resultString += convertIntToChar(numbConv); 
    } while (number != 0); 

    return resultString; 
} 

관련 싸리

+0

쉼표로 숫자를 입력하면이 기호가 다시 나타납니다.예를 들어, 제가베이스 10에 15741.233을 입력하면 3D7D 3 (기수 16에 정밀도 4 (쉼표 뒤의 숫자))가 반환되지만 3D7D.3BA5이어야합니다. 왜 그렇게하는지 모르겠습니다. 아무도 이유를 아나요? – Hagi

+0

작은 따옴표를 사용하지 않았습니다. 결과적으로 3D7D.3을 얻었지만 여전히 3 자리가 누락되었습니다. 아무도 이유를 아나요? – Hagi

답변

0

문제가 *resultString 어떤 이상 혼란이다; resultString [idx]에 정밀도를 넣어야합니다. 여기서 idx는 다음 인덱스이지만, 단지 * resultString이 가리키는 값이므로 0 번째 문자에 값을 추가하는 것입니다.

그래서 이렇게 :

char * resultString = createBuffer(number, base, precision); 

괜찮;

하지만

*resultString += converIntToChar(numbDiv); 

인덱스 변수를 선언 무의미한; 나중에 지금

char * resultString = createBuffer(number, base, precision); 
size_t idx = 0; 

:

resultString[idx++] = convertIntToChar(numbDiv); 

하고있는 동안의

(); 루프 :

*resultString += ","; /* ??? */ 

resultString[idx++] = ','; /* note single character quotes */ 

및 * resultString 다른 인스턴스와 동일하게 처리된다;

resultString[idx++] = 0; 
return; 

이 또한 createBuffer는 C의 NULL 문자를 차지하는 메모리를 반환해야 함을 의미

함수 (즉, resultString가 준비) 당신이 아직 종료 NULL 문자를 필요로 반환하는 것입니다되면

끝에 문자열.

+0

팁 주셔서 감사합니다. 효과가 있습니다. 다른 문제로 나를 도울 수 있습니까? 예를 들어 번호 15741.233 (밑면 10까지)은 3D7D.3BA5 (밑면 16까지)로 반환되어야합니다. 나는 그것을 시험해 보았고 결과적으로 3D7D 3을 얻었다. 내 코드가 왜 그런지 알고 있습니까? – Hagi

+0

나는 4로 정밀도를 선택했다. – Hagi

+0

나는 더 이상 을 얻지 못한다. 그것은 하나의 문자 따옴표를 사용하지 않았기 때문이었습니다. ^^ 그러나 이제 3D7D.3을 얻었으며 여전히 3 자리가 누락되었습니다. 왜 그런 단서가 있니? – Hagi

0

*resultString += some char은 문자를 문자열에 결합하지 않으므로 (의 정수 값은 resultString의 첫 번째 문자에 추가됩니다).