2010-11-26 4 views
1
/* Program to multiply two polynomials. */ 

/#include <stdio.h> 
#include <conio.h> 

#define MAX 10 

struct term 
{ 
int coeff ; 
int exp ; 
} ; 

struct poly 
{ 
struct term t [10] ; 
int noofterms ; 
} ; 

void initpoly (struct poly *) ; 
void polyappend (struct poly *, int, int) ; 
struct poly polyadd (struct poly, struct poly) ; 
struct poly polymul (struct poly, struct poly) ; 
void display (struct poly) ; 

void main() 
{ 
struct poly p1, p2, p3 ; 

clrscr() ; 

initpoly (&p1) ; 
initpoly (&p2) ; 
initpoly (&p3) ; 

polyappend (&p1, 1, 4) ; 
polyappend (&p1, 2, 3) ; 
polyappend (&p1, 2, 2) ; 
polyappend (&p1, 2, 1) ; 

polyappend (&p2, 2, 3) ; 
polyappend (&p2, 3, 2) ; 
polyappend (&p2, 4, 1) ; 

p3 = polymul (p1, p2) ; 

printf ("\nFirst polynomial:\n") ; 
display (p1) ; 

printf ("\n\nSecond polynomial:\n") ; 
display (p2) ; 

printf ("\n\nResultant polynomial:\n") ; 
display (p3) ; 

getch() ; 
} 

/* initializes elements of struct poly */ 
void initpoly (struct poly *p) 
{ 
int i ; 
p -> noofterms = 0 ; 
for (i = 0 ; i < MAX ; i++) 
{ 
    p -> t[i].coeff = 0 ; 
    p -> t[i].exp = 0 ; 
} 
} 

/* adds the term of polynomial to the array t */ 
void polyappend (struct poly *p, int c, int e) 
{ 
p -> t[p -> noofterms].coeff = c ; 
p -> t[p -> noofterms].exp = e ; 
(p -> noofterms) ++ ; 
} 

/* displays the polynomial equation */ 
void display (struct poly p) 
{ 
int flag = 0, i ; 
for (i = 0 ; i < p.noofterms ; i++) 
{ 
    if (p.t[i].exp != 0) 
    printf ("%d x^%d + ", p.t[i].coeff, p.t[i].exp) ; 
    else 
    { 
    printf ("%d", p.t[i].coeff) ; 
    flag = 1 ; 
    } 
} 
if (!flag) 
    printf ("\b\b ") ; 

} 
/* adds two polynomials p1 and p2 */ 
struct poly polyadd (struct poly p1, struct poly p2) 
{ 
int i, j, c ; 
struct poly p3 ; 
initpoly (&p3) ; 

if (p1.noofterms > p2.noofterms) 
    c = p1.noofterms ; 
else 
    c = p2.noofterms ; 

for (i = 0, j = 0 ; i <= c ; p3.noofterms++) 
{ 
    if (p1.t[i].coeff == 0 && p2.t[j].coeff == 0) 
    break ; 
    if (p1.t[i].exp >= p2.t[j].exp) 
    { 
    if (p1.t[i].exp == p2.t[j].exp) 
    { 
    p3.t[p3.noofterms].coeff = p1.t[i].coeff + p2.t[j].coeff ; 
    p3.t[p3.noofterms].exp = p1.t[i].exp ; 
    i++ ; 
    j++ ; 
    } 
    else 
    { 
    p3.t[p3.noofterms].coeff = p1.t[i].coeff ; 
    p3.t[p3.noofterms].exp = p1.t[i].exp ; 
    i++ ; 
    } 
    } 
    else 
    { 
    p3.t[p3.noofterms].coeff = p2.t[j].coeff ; 
    p3.t[p3.noofterms].exp = p2.t[j].exp ; 
    j++ ; 
    } 
} 
return p3 ; 
} 

/* multiplies two polynomials p1 and p2 */ 
struct poly polymul (struct poly p1, struct poly p2) 
{ 
int coeff, exp ; 
struct poly temp, p3 ; 

initpoly (&temp) ; 
initpoly (&p3) ; 

if (p1.noofterms != 0 && p2.noofterms != 0) 
{ 
    int i ; 
    for (i = 0 ; i < p1.noofterms ; i++) 
    { 
    int j ; 

    struct poly p ; 
    initpoly (&p) ; 

    for (j = 0 ; j < p2.noofterms ; j++) 
    { 
    coeff = p1.t[i].coeff * p2.t[j].coeff ; 
    exp = p1.t[i].exp + p2.t[j].exp ; 
    polyappend (&p, coeff, exp) ; 
    } 

    if (i != 0) 
    { 
    p3 = polyadd (temp, p) ; 
    temp = p3 ; 
    } 
    else 
    temp = p ; 
    } 
} 
return p3 ; 
} 

は、私はいくつかの問題を抱えています:メンバ変数「noofterms」 を使用する目的が何であるか/MULTソースコード

  1. void initpoly(struct poly *)、void polyappend(struct poly *、int、int)関数では、多項式は構造体の型へのポインタとして扱われますが、関数poly polyadd(struct poly、struct poly)構造体poly polymul(struct poly、struct poly)、void表示(struct poly構造体)の単純構造変数が使用されます。誰かが親切に私にその理由を説明することができ

...元のオブジェクトを変更することができ、それによって彼らの引数としてポインタを取る

+0

ええ、私は私が終了する答えがあります。しかし、あなたの他の質問に対する答えを受け入れるまで、それを削除します。ところで、あなたはここで尋ねた他の質問へのリンクを見つけることができます:http://stackoverflow.com/users/415041/tuhin – Omnifarious

+0

@Omnifarious:私はそれを念頭に置いておきます...私の行為のために申し訳ありません! – Tony

+0

@Omnifarious私はあなたの感想に同意しますが、私は答えをポスターに贈ることが本当に最良のアプローチであるとは確信していません。 – Justin

答えて

2

機能。単純な構造変数を渡すと、それはコピーされ、関数はコピーを変更することしかできません。

nooftermsは、多項式が構成されている項の数を数えます。

0

nooftermsは、他のルーチンがいくつの配列要素が適切であるかを知るために使用されます。 0の係数で十分であることは厳密には必要ではありませんが、係数が0の要素で何もしないようにすることで、計算を少し効率的にすることができます。

考えてみると、struct poly *引数を取るすべての関数は、渡されたものを変更します。そのため、ポインタが必要なのです。彼らがstruct polyを受け取り、それを修正した場合、あなたのプログラムの残りの部分に変更が表示されません。