c언어 eval쪽 문제

julley123의 이미지

#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이 나오는 이유를 알고 싶습니다.

shint의 이미지

- 변수를 전역으로 설정했습니다.

- 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++ 로 테스트한 예제소스를 함께 올립니다.

댓글 첨부 파일: 
첨부파일 크기
Package icon eval 테스트.zip411.01 KB

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

julley123의 이미지

제 하찮은 코딩에 답해주신거 너무너무 감사합니다.

addpoly 값 예를 들어 두 개의 식을 더해서 2x+2라는 다항식이 나오면

x값에 2를 넣어 6이라는 값을 출력하고 싶을 때에는 어떻게 해야하는지요..?

무엇을 연결을 해야할거 같은데 계속 결과값이 0이나와서 어떻게 해야할지 도무지 감이 잡히지 않습니다.

julley123의 이미지

#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이 나오는게 무엇때문인지 도무지.. 해결할 수가 없습니다

shint의 이미지

- 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에 값을 대입하여 다항식을 계산하면 다음과 같습니다.

댓글 첨부 파일: 
첨부파일 크기
Package icon test C 다항식 연습예제 미구현.zip411.09 KB

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

익명 사용자의 이미지

void padd(Polynomial *,Polynomial *,Polynomial *);

function prototype, function definition은 포인터인데
padd(termsA, termsB, termsadd);
함수를 부르는건 포인터가 아닙니다.

padd(&termsA, &termsB, &termsadd);
이렇게 한번 해보세요.

익명 사용자의 이미지

전달된게 포인터 맞습니다.

shint의 이미지

리스트를 활용한 다항식
http://blog.naver.com/zkd1750?Redirect=Log&logNo=90184237873

이 내용을 확인해보자.
계수 / 지수
계수 / 차수

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

yhsuk의 이미지

void peval(Polynomial *termsA) 함수안의 for 루프 바로 뒤에 세미콜론이 있네요.

for(i=termsA[0].degree;i>=0;i--);     // <- 여기 세미콜론이;;;
{
    eval +=termsA[i].coef * pow(input_x,i);
}

그리고 eval 출력시 int로 형변환을 해주어야 합니다.

printf("계산된 X값은 %d\n", (int)eval); 

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.