c언어 eval쪽 문제
글쓴이: julley123 / 작성시간: 토, 2015/10/24 - 5:33오후
#include <stdio.h> #include <stdlib.h> #include <math.h> //pow(밑수, 지수) 함수 이용 #define MAX_DEGREE 101 /*다항식의 최대 차수 + 1 */ typedef struct { int coef; //밑수 int expon; //지수 int degree; } Polynomial; Polynomial termsA[MAX_DEGREE]; Polynomial termsB[MAX_DEGREE]; Polynomial termsadd[MAX_DEGREE]; Polynomial termsmult[MAX_DEGREE]; Polynomial termseval[MAX_DEGREE]; void read_poly(Polynomial *); void print_poly(Polynomial *); void padd(Polynomial *,Polynomial *,Polynomial *); void pmult(Polynomial *,Polynomial *,Polynomial *); void peval(Polynomial *); int main() { printf("NAME : KIM Jeong Joon\n"); printf("STO : 200811861\n"); read_poly(termsA); printf("first polynomial : "); print_poly(termsA); read_poly(termsB); printf("second polynomial : "); print_poly(termsB); padd(termsA, termsB, termsadd); printf("다항식을 더하면 다음과 같습니다. \n"); print_poly(termsadd); pmult(termsA, termsB, termsmult); printf("다항식을 곱하면 다음과 같습니다. \n"); print_poly(termsmult); peval(termsA); printf("x에 값을 대입하여 다항식을 계산하면 다음과 같습니다. \n"); system("PAUSE"); return 0; } void read_poly(Polynomial *terms) { int input_degree; int i; printf("만드실 다항식의 최고차항의 차수를 입력하세요 : \n"); scanf("%d",&input_degree); while(input_degree < 0 || input_degree > MAX_DEGREE) { printf("잘못입력하셨습니다. \n"); printf("다시 입력하세요. \n"); scanf("%d", &input_degree); } for(i=input_degree; i>=0; i--) { printf("\n 차수가 %d인 항의 계수를 입력하세요 :", i); scanf("%d", &terms[i].coef); (terms+i)->expon = i; //scanf("%d", &terms[i].expon); } terms->degree = input_degree; printf("\n"); } void print_poly(Polynomial *terms) { int i; for(i=terms[0].degree; i>=0; i--) { if(terms[i].coef>0) { if(i!=terms[0].degree) printf(" + "); if(terms[i].coef!=1) printf("%d",terms[i].coef); if(i==0&&terms[0].coef==1) printf("1"); if(i!=0) printf("x"); if(!(i==1||i==0)) printf("^%d", terms[i].expon); } else if(terms[i].coef<0) { if(terms[i].coef!=-1) printf(" %d",terms[i].coef); else printf(" -"); if(i!=0) printf("x"); if(!(i==-1||i==0)) printf("^%d", terms[i].expon); } } printf("\n"); } void padd(Polynomial *termsA, Polynomial *termsB, Polynomial *termsadd) //입력 받은 두개의 다항식을 더하여 출력 { int i, max; if(termsA[0].degree>=termsB[0].degree) max = termsA[0].degree; else max = termsB[0].degree; termsadd[0].degree = max; for(i=max; i>=0; i--) { termsadd[i].coef = termsA[i].coef + termsB[i].coef; //밑수를 더함 termsadd[i].expon = i; } } void pmult(Polynomial *termsA, Polynomial *termsB, Polynomial *terms_mul) //입력 받은 두개의 다항식을 곱하여 출력 { int i,j; terms_mul[0].degree = termsA[0].degree + termsB[0].degree; for(i=terms_mul[0].degree; i>=0; i--) terms_mul[i].coef = 0; for(i=termsA[0].degree; i>=0; i--) { for(j=termsB[0].degree; j>=0; j--) { terms_mul[i+j].coef = terms_mul[i+j].coef+termsA[i].coef*termsB[j].coef; terms_mul[i+j].expon = i+j; } } } void peval(Polynomial *termsA) { int i,input_x; printf("계산할 x 값을 입력하세요.\n"); scanf("%d", input_x); double eval=0; for(i=termsA[0].degree;i>=0;i--); { eval +=termsA[i].coef * pow(input_x,i); } printf("계산된 X값은 %d\n", eval); }
eval 값이 자꾸 0이 나오는 이유를 알고 싶습니다.
Forums:
몇가지 문제가 있습니다.
- 변수를 전역으로 설정했습니다.
- scanf("%d", input_x); 에서 & 가 빠졌습니다.
- 한줄씩 printf()로 값을 확인해보시기 바랍니다.
%f 는 dobule float
%d 는 int
- 줄을 잘 맞춰서 올려주시기 바랍니다.
//이와 같은 코드는 위험합니다.
if( fn( fnOne( fnTwo() ) ) ) {}
if( val ) {}
//이렇게 명시적으로 작성해서. 사용해주시기 바랍니다.
int val = fn();
if( val == 0 )
{
return 0;
}
- 명시적 형변환은 이렇게 합니다.
int n = 0;
double d = (double)n;
pow((double)n, (double)n);
pow(n, n); //묵시적 형변환이 적용되는지는 확인해봐야 합니다.
- double 에 초기화는 이렇게 합니다.
double d = 0.0f;
- DevC++ 로 테스트한 예제소스를 함께 올립니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답해주신거 너무너무 감사합니다.
제 하찮은 코딩에 답해주신거 너무너무 감사합니다.
addpoly 값 예를 들어 두 개의 식을 더해서 2x+2라는 다항식이 나오면
x값에 2를 넣어 6이라는 값을 출력하고 싶을 때에는 어떻게 해야하는지요..?
무엇을 연결을 해야할거 같은데 계속 결과값이 0이나와서 어떻게 해야할지 도무지 감이 잡히지 않습니다.
예를 들어
#include
#include
#include //pow(밑수, 지수) 함수 이용
#define MAX_DEGREE 101 /*다항식의 최대 차수 + 1 */
typedef struct
{
int coef; //밑수
int expon; //지수
int degree;
} Polynomial;
void read_poly(Polynomial *);
void print_poly(Polynomial *);
void padd(Polynomial *,Polynomial *,Polynomial *);
void peval(Polynomial *);
int main(int argc, char** argv)
{
Polynomial termsA[MAX_DEGREE];
Polynomial termsB[MAX_DEGREE];
Polynomial termsadd[MAX_DEGREE];
Polynomial termseval[MAX_DEGREE];
read_poly(termsA);
printf("first polynomial : ");
print_poly(termsA);
read_poly(termsB);
printf("second polynomial : ");
print_poly(termsB);
padd(termsA, termsB, termsadd);
printf("다항식을 더하면 다음과 같습니다. \n");
print_poly(termsadd);
peval(termsA);
printf("x에 값을 대입하여 다항식을 계산하면 다음과 같습니다. \n");
system("PAUSE");
return 0;
}
void read_poly(Polynomial *terms)
{
int input_degree;
int i;
printf("만드실 다항식의 최고차항의 차수를 입력하세요 : \n");
scanf("%d", &input_degree);
while(input_degree < 0 || input_degree > MAX_DEGREE)
{
printf("잘못 입력 하셨습니다. \n");
printf("다시 입력하세요. \n");
scanf("%d", &input_degree);
}
for(i=input_degree; i>=0; i--)
{
printf("\n 차수가 %d인 항의 계수를 입력하세요 :", i);
scanf("%d", &terms[i].coef);
(terms+i)->expon = i;
//scanf("%d", &terms[i].expon);
}
terms->degree = input_degree;
printf("input_degree : %d\n", input_degree);
printf("\n");
}
void print_poly(Polynomial *terms)
{
int i;
for(i=terms[0].degree; i>=0; i--)
{
if(terms[i].coef>0)
{
if(i!=terms[0].degree)
{
printf(" + ");
}
if(terms[i].coef!=1)
{
printf("%d",terms[i].coef);
}
if(i==0&&terms[0].coef==1)
{
printf("1");
}
if(i!=0)
{
printf("x");
}
if(!(i==1||i==0))
{
printf("^%d", terms[i].expon);
}
}
else if(terms[i].coef<0)
{
if(terms[i].coef!=-1)
{
printf(" %d",terms[i].coef);
}
else
{
printf(" -");
}
if(i!=0)
{
printf("x");
}
if(!(i==-1||i==0))
{
printf("^%d", terms[i].expon);
}
}
}
printf("\n");
}
//입력 받은 두개의 다항식을 더하여 출력
void padd(Polynomial *termsA, Polynomial *termsB, Polynomial *termsadd)
{
int i, max;
if(termsA[0].degree>=termsB[0].degree)
{
max = termsA[0].degree;
}
else
{
max = termsB[0].degree;
}
termsadd[0].degree = max;
for(i=max; i>=0; i--)
{
termsadd[i].coef = termsA[i].coef + termsB[i].coef; //밑수를 더함
termsadd[i].expon = i;
printf("다항식 termsadd[i].coef %d \n", termsadd[i].coef );
printf("다항식 termsadd[i].expon %d \n", termsadd[i].expon);
}
}
void peval(Polynomial *termsA)
{
int i,input_x;
printf("계산할 x 값을 입력하세요.\n");
scanf("%d", &input_x);
double eval=0.0f;
for(i=termsA[0].degree;i>=0;i--);
{
eval += (double) ((int)termsA[0].coef * (int)pow((double)input_x,(double)i));
printf("eval %f\n", eval);
}
printf("계산된 X값은 %d\n", eval);
}
eval 값이 0이 나오는게 무엇때문인지 도무지.. 해결할 수가 없습니다
그 문제는 이렇습니다.
- eval += (double) ((int)termsA[0].coef * (int)pow((double)input_x,(double)i));
이 부분을 이렇게 수정했습니다.
double d1 = pow( (double)input_x, (double)i );
eval += (double) ((int)termsA[0].coef * d1);
이러니 보이네요. ㅇ_ㅇ;;
아마도. 소수점값이 잘려서 인가 봅니다.
int n = (double) db; //이건 잘립니다.
double db = (double) n; //이건 남지만.
- 이 소스는. 완전한 결과를 보장하도록. 만든 소스가 아닙니다.
그냥. 컴파일 되고. 값이 출력되는지 정도만을 보장합니다. 제품사용시에는 주의하셔야 합니다.
- 줄 맞춰서 파일로 올리셔야 알아보기 쉽습니다.
- 테스트 방법. 헤더 파일. 출력결과. 다항식에 대한 설명. 등을 해주시는것이 이해하기 좋습니다.
- C언어 다항식으로 검색하면 이것저것 나옵니다.
잘 되는 예제소스 참고해보세요.
- peval(termsadd); 로 수정했습니다.
- 한줄씩 확인해보시기 바랍니다.
//--------------------------------------------------------------------------
//입력값
//--------------------------------------------------------------------------
1 2 0
2x
1 0 1
+ 1
//--------------------------------------------------------------------------
//출력결과
//--------------------------------------------------------------------------
만드실 다항식의 최고차항의 차수를 입력하세요 :
1
차수가 1인 항의 계수를 입력하세요 :2
차수가 0인 항의 계수를 입력하세요 :0
input_degree : 1
first polynomial : -----------
2x
만드실 다항식의 최고차항의 차수를 입력하세요 :
1
차수가 1인 항의 계수를 입력하세요 :0
차수가 0인 항의 계수를 입력하세요 :1
input_degree : 1
second polynomial : -----------
+ 1
다항식 termsadd[1].coef 2
다항식 termsadd[1].expon 1
다항식 termsadd[0].coef 1
다항식 termsadd[0].expon 0
다항식을 더하면 다음과 같습니다.
-----------
2x + 1
계산할 x 값을 입력하세요.
2
pow() 0.500000
termsA[0].coef 1
input_x 2
i -1
eval 0.500000
계산된 X값은 0
x에 값을 대입하여 다항식을 계산하면 다음과 같습니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
제생각에는...
void padd(Polynomial *,Polynomial *,Polynomial *);
function prototype, function definition은 포인터인데
padd(termsA, termsB, termsadd);
함수를 부르는건 포인터가 아닙니다.
padd(&termsA, &termsB, &termsadd);
이렇게 한번 해보세요.
아 terma가 배열이군요..
전달된게 포인터 맞습니다.
입력되는 이름이 맞는지 확인해보세요.
리스트를 활용한 다항식
http://blog.naver.com/zkd1750?Redirect=Log&logNo=90184237873
이 내용을 확인해보자.
계수 / 지수
계수 / 차수
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
void peval(Polynomial
void peval(Polynomial *termsA) 함수안의 for 루프 바로 뒤에 세미콜론이 있네요.
그리고 eval 출력시 int로 형변환을 해주어야 합니다.
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
댓글 달기