2017-01-26 1 views
1

아직 해결할 수 없었던 매우 기본적인 (당혹 스러울 정도의) 질문입니다.최소 숫자를 찾아서 인쇄하는 기능

나는 사용자가 파일에 입력 한 가장 작은 정수를 호출해야하는 minimum 함수를 만들었습니다. 나는 atoi도 사용하고 있습니다. 다음과 같이

작업 기능은 다음과 같습니다

int minimum(int number) { 

static int minNumber = INT_MAX; 

if (number < minNumber) { 
    minNumber = number; 
} 
return minNumber; 

}

나는 사용자가 이러한 정수를 입력 한 내 파일 읽기입니다 때 다음으로, 나중에 프로그램에서 함수를 호출하고있다. 해결

for (int i = 1; !finished; i++) 
{ 
    if (fscanf(fp, "%s", word) < 1) 
     finished = 1; 
    else { 
     number = atoi(word); 
     minNumber = minimum(number); 
     printf("\nstring is \t %s\n", word); 
     printf("integer is \t %d\n", number); 
    } 
} 
minimum(number); 

아래 제안

편집 나는 이제 다음 올바른 코드를 사용하고-내 문제가 number 항상 가장 작은 것으로 내 마지막 입력을 반환하는 것입니다.

이 정수에 대한 인덱스를 표시하여 가장 작은 숫자의 위치를 ​​결정한다고 가정 해 보겠습니다. 다른 기능을 만드는 것이 갈 길입니까? 아니면 그냥 현재의 기능을 변경하여 수행 할 수 있습니까?

void minimum(int number) { 
    static int minNumber = INT_MAX; 

    if (number <= minNumber) { 
     minNumber = number; 
    } 
    printf("min number is %d\n", minNumber); 
} 

또는 함수에 minNumber를 전달합니다 : 당신이 minimum() 전화 minNumber의 값은 항상 INT_MAX 경우

+2

'static int minNumber = INT_MAX;'-'static'에 주목하라. 그리고 'minimum'에 대한 호출은 루프 내부에 있어야합니다. – WhozCraig

+2

자네는 최소 한 번만 최후의 번호로 전화한다. – kaylum

+0

'minimum'은 적어도 for 루프 안에서 호출해야합니다 .... – LPs

답변

0

minimum(number);가 외부 루프의 위치 기본적으로 마지막 입력 만 확인합니다.

그러나 문제가 해결되지 않는 여전히 for 루프 내를 이동 :. 그냥 INT_MAX으로 초기화 지역 변수와 비교하고 obviusly 그 때마다 < INT_MAX이기 때문에이 (얻을 수를 반환하면 minimum()를 호출 할 때마다

그래서 첫 번째 : 이미 @WhozCraig에 의해 의견에 언급 한 바와 같이, 그것에 모든 통화에 대해 동일한 minimum 기능에 볼 수 minNumber을 만들 수 있지만 : static int minNumber = INT_MAX;

minimum 기능은 이제 다음과 같습니다

int minimum(int number) { 

    static int minNumber = INT_MAX; 

    if (number < minNumber) { 
     minNumber = number; 
    } 

    return minNumber;       // return a minimum for later print it out 
} 

printf에 대한 호출을 제거 할 때마다 모든 호출마다 minNumber가 출력되므로 유의하십시오.

하자 가게 곳 최소값 우리는 지금까지 발견했습니다

int minNumber = 0 루프 내부

루프 for 전에 그리고 지금 :

... 
    else { 
     number = atoi(word); 
     minNumber = minimum(number);    // now we call it for every input 
     printf("\nstring is \t %s\n", word); 
     printf("integer is \t %d\n", number); 
    } 
... 

이제 단순히 그것을 밖으로 인쇄 :

printf("min number is %d\n", minNumber);

Btw, @KeineLust에 의해 제안 된대로 포인터를 전달하는 또 다른 방법이있다.

+0

이 문제에 대한 당신의 공헌에 감사드립니다. 나는 다른 방법을 사용하자마자이 방법을 테스트 할 것이다. –

+0

이 코드 줄에서 오류가 발생합니다.'minNumber = minimum (number); '- "int"타입에 "void"타입의 값을 할당 할 수 없습니다. –

+0

@Rizzo : 함수의 반환 타입 변경'void 최소값 (int number)'->'int 최소값 (int number)' –

2

하는 static 사용

void minimum(int number, int *minNumber) { 
    if (number <= *minNumber) { 
     *minNumber = number; 
    } 
    printf("min number is %d\n", *minNumber); 
} 

int minNumber = INT_MAX; 
for (int i = 1; !finished; i++) 
{ 
    ... 
    // As pointed out by @YuriyIvaskevych, you need to compare 
    // the number in each iteration of the for loop 
    number = atoi(word); 
    minimum(number, &minNumber); 
    ... 
} 
+0

이 문제에 대한 귀하의 통찰에 감사드립니다. 두 번째 제안을 시도하고 함수에서'int minNumber = INT_MAX; '를 제거했습니다. 그러나 나는 당신이 주 기능에 이것을 포함하는 것을보고 있습니까? 왜 이랬는지 설명해 주시겠습니까? 미리 감사드립니다. –

+0

함수 내부에서 비교하려면 변수에 초기 값이 있어야하기 때문에. 초기화를 제거한 후 숫자를 초기화되지 않은 변수와 비교하면 이는 정의되지 않은 동작입니다. –

+0

이것은''int minNumber ': redefinition' 오류로 연결됩니다. 제안 된대로 두 번째 방법에서''* ''를 사용했습니다. –

관련 문제