2013-03-05 2 views
1

간단한 피타고라스 함수를 수행하고 있습니다 사용자가 두 개의 숫자를 입력하면 두 숫자가 모두 Hypo라는 사용자 정의 함수로 전달되고 hypo는 한 값인 C , 이것이 답입니다.사용자 정의 함수의 반환 값에 문제가 있습니다

내 스크립트는 다음과 같습니다.

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

int hypo(double a, double b); 

int main(void) 
{ 
    double one, two; 
    //user inputs two variables 
    scanf("%lf %lf", &one, &two); 
    printf("Your C number is: %.2lf\n", hypo(one, two)); 

    system("PAUSE"); 
    return 0; 
} 

/*-------------------------------------------------------------------------*/ 

int hypo(double a, double b) 
{ 
    double c; 
    c = sqrt((a*a)+(b*b)); 
    printf("Currently, A = %.2lf, and B = %.2lf, C = %.2lf\n", a, b, c); 

    return c; 
} 

내 컴퓨터에서는 끝까지 모든 방법으로 작동합니다. Return c; 어떤 이유로, Main 함수에 값 0을 리턴합니다. (필자는 오류가있는 곳을 보았습니다. 따라서 하이포 기능의 인쇄 화면을 확인하십시오.)

이 점에 대해 알고 싶습니다.

나는 synax가 잘못되었거나 아직 읽지 않은 것이 내 머리 위로 사라 졌다고 확신하지만 책을보고 YouTube 동영상을 확인한 후 1 시간이 지나면 왜 이것이 작동하지 않습니다.

편집 :

가 빠른 답변에 대한 여러분 모두 감사합니다! 나는 그것을 두 배로 변경했다. (과정에서 내 실수를 깨닫고 너무 xD) 매력처럼 작동한다. 너희들은 모든 대답하는 속도에 매우 만족 , 나는 당신이 int를 반환 hypo이 :) 앞으로

+0

@PieterGeerkens을 : 물론 그것은 컴파일합니다. 'double'을'int'로 변환하는 것은 표준 변환이며, C 스타일 가변 함수는 타입 검사를 전혀 제공하지 않습니다. 여기서 가장 큰 문제는 타입 안전성을 지닌 C++에 비해'scanf'와'printf'를 사용하는 것입니다. –

+1

나는 단지'C' 만 본다. –

답변

2

당신은 두 번에 반환 형식을 변경해야

double hypo(double a, double b) 
{ 
    double c; 
    c = sqrt((a*a)+(b*b)); 
    printf("Currently, A = %.2lf, and B = %.2lf, C = %.2lf\n", a, b, c); 

    return c; 
} 
+0

답장을 보내 주셔서 감사합니다 ^^ 그게 문제를 해결했습니다 :) – Farstride

1

그것을 통과해야 하겠지만, 그것은 double을 인 것처럼 당신은 그것을 사용하고 있습니다. 구현에,

double hypo(double a, double b); 

: 그리고 당신은 그것을 전환해야

double hypo(double a, double b) 
{ 
    double c; 
    // ... 

당신이 int로 돌아 오면, 결과 값 c 대신 가치를 표시하는 int에 잘린 얻을 것이다. 이로 인해 1.0보다 작은 양수의 값이 0으로 변환됩니다. 또한 형식 문자열이 double을 지정하면 int가 전달되므로 디스플레이가 항상 잘못된 대답을 인쇄하게됩니다.

+0

반올림 결과가 아닌 형식 문자열 불일치 (int vs double)로 인해 잘못된 결과가 발생합니다. – Roddy

+0

@Roddy True - 그 것을 포함하도록 편집 됨 ... –

1

당신은 두 유형으로 당신의 변수 c 정의 :

double c; 

그러나 당신은이 int 반환하려고 :

int hypo(double a, double b); 

당신은 double 또는 캐스트에 hypo의 반환 형식을 변경해야 하나 c ~ int. 그러나, 주조 (2에 2.678을) 어떤 분수를 버릴 것이다

return (int)c; 

을 따라서 난 당신이 또한 빗변을 계산하려고 할 때 더 논리적이다 대신 double에 반환 형식을 변경하는 것이 좋습니다 (분수하는이 포함될 수 있습니다 자리) :

double hypo(double a, double b); 
+0

모든 것을 설명해 주셔서 감사합니다. "Doh!"였습니다. 오류를 읽었을 때 오류가 발생하지만 세부 정보와 설명을 통해이 오류가 다시 발생하지 않도록 할 수 있습니다. :) – Farstride

2

당신은 아마 double 할 때 귀하의 반환 형식이 int입니다 - 작은 값이 주조 및 (0 초래할 것, 즉 0.5 0) int에 저장합니다.

0을 얻는 정확한 이유는 부동 값 형식을 사용하여 정수 값을 인쇄하기 때문입니다. 정수 인쇄의 경우 %d을 사용하지만 반환 유형을 hypo으로 올바르게 지정하면 (double)이 문제가 사라집니다.

+1

잘못된 결과는 반올림 결과가 아닌 형식 문자열 불일치 (int vs double) 때문입니다. – Roddy

+0

@Roddy, 답변 해 주신 의견에 감사드립니다. –

관련 문제