Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[Zadatak] Zbrajanje i množenje dvaju polinoma i prikaz vezanom listom

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Zbrajanje i množenje dvaju polinoma i prikaz vezanom listom

[ Pregleda: 5743 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

davs
xx

Član broj: 71279
Poruke: 15
*.dsl.iskon.hr.



Profil

icon [Zadatak] Zbrajanje i množenje dvaju polinoma i prikaz vezanom listom03.06.2008. u 16:45 - pre 172 meseci
Pozdrav svima,

ovako imam stvarno velik problem, dobio sam zadatak da uradim a opće ne znam kako da počnem, točnije baš i ne kužim što se traži, pa eto ako ima tko volje za pomoći stvarno bi mi uljepšao ovaj ljetni ispitni rok!

zadatak glasi:
Napišite program za zbrajanje i množenje dvaju polinoma zapisanih u obliku p(x) = c1xe1 + ... + cnxen; gdje su e1 > e2 >... > en >= 0.
Polinome prikažite vezanom listom. A.t.p. LIST implementirajte pomoću polja tako da i-ti član polja sadrži koeficijent ci i eksponent ei.

Zahvaljujem!


davs
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
78.90.101.*

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: [Zadatak] Zbrajanje i množenje dvaju polinoma i prikaz vezanom listom20.06.2008. u 08:07 - pre 172 meseci
Evo par smernica s kojima možeš da počneš.

Znači trebaš da implementiraš strukturu liste, u koju ćeš slagati realne vrednosti. Nakon toga ti trebaju dve funkcije koje kao argumente dobijaju po tri takve strukture: prve dve kao dve nad kojima će biti izvršeno množenje odnosno sabiranje, i treću u koju će upisati rezultat. Pretpostavljam da znaš kako se sabiraju / množe polinomi.

Ono što mi deluje neestetično u zadatku je implementacija liste preko polja. Stvari o kojima trebaš da razmisliš su:
1. Da li to treba da bude dinamičko (promenjive dužine) ili statičko (fiksne dužine) polje?
2. Da li spoljne funkcije trebaju da poljima i parametrima liste direktno pristupaju (verovatno slučaj) ili tek preko nekih iteratora i ubacivanja elemenata lista može da se čita / menja.

Prvo trebaš da shvatiš ove dileme, pa onda da ih raspraviš sa profesorom / kolegama koje su već prošle ispit, ako bude čega da se raspravi.
Ipak se ++uje.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4894
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+637 Profil

icon Re: [Zadatak] Zbrajanje i množenje dvaju polinoma i prikaz vezanom listom21.06.2008. u 10:03 - pre 172 meseci
(21.06.2008. - 12:03) Tema je premeštena iz foruma C programiranje u forum C za početnike.
 
Odgovor na temu

davs
xx

Član broj: 71279
Poruke: 15
*.dsl.iskon.hr.



Profil

icon Re: [Zadatak] Zbrajanje i množenje dvaju polinoma i prikaz vezanom listom24.06.2008. u 20:27 - pre 172 meseci
evo odradio sam vecinu posla, ali imam muka sa zbrajanjem i mnozenjem, nikako da napravim da radi bez greske za bilo koja dva polinoma! Ima li tko kakvo razumljivo rjesenje??

Unaprijed hvala!

evo kod


Code:
#include "stdafx.h"
#include <cstdlib>
#define POLINOM

// struktura koja ce sadrzati jedan stupanj polinoma (po zadatku)
struct Grade {
    double c; // koeficijent
    int e; // potencija (stupanj)
};

// tip za polinom (niz struktura Grade, i maximalni grade)
struct Polinom {
    Grade *p;
    int max_grade;
};

typedef Polinom* PPolinom;

PPolinom NewPolinom(int max_grade);

void DeletePolinom(PPolinom p);

PPolinom SumPolinoms(PPolinom p1, PPolinom p2);

PPolinom MulPolinoms(PPolinom p1, PPolinom p2);

void PrintPolinom(PPolinom p);





PPolinom NewPolinom(int max_grade)
{
    PPolinom p=new Polinom;
    p->p = new Grade[max_grade]; 
    p->max_grade = max_grade;
    for(int i=0;i<max_grade;i++)
    {
        p->p[i].c = 0.0;
        p->p[i].e = i;
    }
    return p;
}

void DeletePolinom(PPolinom p)
{
    delete[] p->p;
    delete p;
}



PPolinom SumPolinoms(PPolinom p1, PPolinom p2)
{    
    int mMax_grade=p1->max_grade;
    int mMin_grade=p2->max_grade;
    if (mMax_grade < p2->max_grade)
    {
        mMax_grade = p2->max_grade;
        mMin_grade = p1->max_grade;
    }

    PPolinom novi = new Polinom;

    novi->p = new Grade[p1->max_grade+p2->max_grade];
    novi->max_grade = p1->max_grade+p2->max_grade;


    int i,j,z;    

    //kopiranje oba u jedan radi lakseg zbrajanja
    for(i=0; i<p1->max_grade; i++)
    {
        novi->p[i].c=p1->p[i].c;
        novi->p[i].e=p1->p[i].e;
    }
    z=i;
    for(i=0; i<p2->max_grade; i++,z++)
    {
        novi->p[z].c=p2->p[i].c;
        novi->p[z].e=p2->p[i].e;
    }


            

        for(i=0; i < p1->max_grade+p2->max_grade;i++)
            for(j=i+1; j < p1->max_grade+p2->max_grade;j++)
                if(novi->p[i].e==novi->p[j].e)
                {
                    
                    novi->p[i].c = novi->p[i].c + novi->p[j].c;
                    //ne radi mi ovo, ostaju clanovi koje vec zbrojim

                }
    

return novi;
}

PPolinom MulPolinoms(PPolinom p1, PPolinom p2)
{
    /* pokusao sam rezultat mnozenja
    odvojiti u dva polinoma i proslijediti 
    funkciji za zbrajanje ali mi zbrajanje ne
    radi bas 100% */

    int i,j=0,z=0;

    int mMax_grade=p1->max_grade;
    int mMin_grade=p2->max_grade;
    if (mMax_grade < p2->max_grade)
    {
        mMax_grade = p2->max_grade;  // 3
        mMin_grade = p1->max_grade;  // 2
    }

    PPolinom novi = new Polinom;

    novi->p = new Grade[p1->max_grade * p2->max_grade];
    novi->max_grade = p1->max_grade * p2->max_grade;

    for(i=0; i<mMin_grade; i++)
    {
        for (j=0; j<mMax_grade; j++)
        {            
            novi->p[z].c = p2->p[i].c * p1->p[j].c;    
            novi->p[z].e = p2->p[i].e;

            if (p1->p[i].e == 1 && p2->p[j].e == 1)
                novi->p[z].e = 1;
            else
                novi->p[z].e = p1->p[i].e + p1->p[j].e;
            
            z++;
        }
    }

    PPolinom prvi = new Polinom;
    prvi->p = new Grade[mMax_grade];
    prvi->max_grade = mMax_grade;

    PPolinom drugi = new Polinom;
    drugi->p = new Grade[mMax_grade];
    drugi->max_grade = (mMax_grade * mMin_grade)/mMax_grade;

    for(i=0; i < mMax_grade; i++)
    {
        prvi->p[i].c = novi->p[i].c;
        prvi->p[i].e = novi->p[i].e;

    }
    for(i,z=0; i < mMax_grade*mMin_grade; i++,z++)
    {
        drugi->p[z].c = novi->p[i].c;
        drugi->p[z].e = novi->p[i].e;

    }

    novi=SumPolinoms(prvi,drugi);

    return novi;
}

void PrintPolinom(PPolinom p)
{
    for(int i=0;i<p->max_grade-1;i++)
        printf("%5.2lfx^%d + ",p->p[i].c,p->p[i].e);
    printf("%5.2lfx^%d",p->p[p->max_grade-1].c,p->p[p->max_grade-1].e);
}




int _tmain(int argc, _TCHAR* argv[])
{
    PPolinom a,b;
    a=NewPolinom(2);
    b=NewPolinom(6);



    a->p[0].c = 4;
    a->p[0].e = 2;
    a->p[1].c = 6;
    a->p[1].e = 4;

    


    b->p[0].c = 8;
    b->p[0].e = 2;
    b->p[1].c = 10;
    b->p[1].e = 7;
    b->p[2].c = 16;
    b->p[2].e = 5;
    b->p[3].c = 24;
    b->p[3].e = 8;
    b->p[4].c = 32;
    b->p[4].e = 9;
    b->p[5].c = 40;
    b->p[5].e = 10;


    printf("Polinom a): ");

    PrintPolinom(a);
    printf("\n");

    printf("Polinom b): ");
    PrintPolinom(b);

    PPolinom c=SumPolinoms(b,a);

    printf("\n");
    printf("\nZbrajanje : ");
    PrintPolinom(c);
    printf("\n");

    //PPolinom d=MulPolinoms(b,a);
    //printf("\nMnozenje\n");
    //PrintPolinom(d);
    //printf("\n");

    DeletePolinom(a);
    DeletePolinom(b);

    return 0;
}

davs
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
78.90.101.*

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: [Zadatak] Zbrajanje i množenje dvaju polinoma i prikaz vezanom listom24.06.2008. u 20:54 - pre 172 meseci
Nisam pogledao kod, ali mogu da kažem sledeće:

Sabiranje: stepen rezultirajućeg polinoma je jednak najvećem stepenu od dva data polinoma.
Množenje: stepen rezultirajućeg polinoma je jednak zbiru najvećih stepena dva data polinoma.

Ipak bih mogao da ti preporučim da razmisliš i o sledećoj strukturi:
Code:
typedef struct polinom {
    double* koeficijenti;
    int stepen;
} polinom;

Pritom se koeficijenti slažu od onog pored najmanjeg do onog pored najvećeg stepena.

*izmena*
Tek sad vidim šta si radio. Mislim da bi ti od pomoći bilo napomenuti da se polinom može definisati kao NIZ REALNIH BROJEVA koji predstavljaju koeficijente. Npr.

Brojevi: 2, 3, 1, 0, 5
Bi mogli da znače: 2 · x^0 + 3 · x + 1 · x^2 + 0 · x^3 + 5 · x^4

[Ovu poruku je menjao Mali Misha dana 24.06.2008. u 22:11 GMT+1]
Ipak se ++uje.
 
Odgovor na temu

davs
xx

Član broj: 71279
Poruke: 15
*.dsl.iskon.hr.



Profil

icon Re: [Zadatak] Zbrajanje i množenje dvaju polinoma i prikaz vezanom listom24.06.2008. u 21:42 - pre 172 meseci
evo izgleda da sam napravio napokon da radi kako treba.

zbrajanje sam napravio ovako

Code:
PPolinom SumPolinoms(PPolinom p1, PPolinom p2)
{    
    PPolinom novi = new Polinom;

    novi->p = new Grade[p1->max_grade+p2->max_grade];
    novi->max_grade = p1->max_grade+p2->max_grade;

    int i,j,z;    

    //kopiranje oba u jedan radi lakseg zbrajanja
    for(i=0; i<p1->max_grade; i++)
    {
        novi->p[i].c=p1->p[i].c;
        novi->p[i].e=p1->p[i].e;
    }
    z=i;
    for(i=0; i<p2->max_grade; i++,z++)
    {
        novi->p[z].c=p2->p[i].c;
        novi->p[z].e=p2->p[i].e;
    }

    /* pratimo koliko ih je zbrojeno
    kako bi znali koliko moramo
    tocno zauzeti za temp*/
    int br_zbrojenih=0;

    for(i=0; i < p1->max_grade+p2->max_grade;i++)
        for(j=i+1; j < p1->max_grade+p2->max_grade;j++)
            if(novi->p[i].e==novi->p[j].e)
            {
                novi->p[i].c = novi->p[i].c + novi->p[j].c;
                novi->p[j].c = NULL;    //postavi ga na NULL kako bi ga kasnije izbjegao prilikom 
                // kopiranja u temp;
                br_zbrojenih++;        //zbrojeni
            }

            /*deklariramo novi polino u kojeg
            cemo kopirati samo one elemente koji
            nam trebaju, bez onih sto su vec zbrojeni*/
            PPolinom temp = new Polinom;
            temp->p = new Grade[(p1->max_grade+p2->max_grade)-br_zbrojenih];
            temp->max_grade = (p1->max_grade+p2->max_grade)-br_zbrojenih;
            for(i=0,z=0; i<(p1->max_grade+p2->max_grade);i++)
                if (novi->p[i].c != 0)
                {
                    temp->p[z].c = novi->p[i].c;
                    temp->p[z].e = novi->p[i].e;
                    z++;
                }
                return temp;
}




A mnozenje jednostravno ih pomnozio svaki sa svakim u jedan polinom, zatim deklarirao nova dva polinoma i pola iz novog kopirao u jedan a drugu polovicu u drugi polinom i onda jednostavno opet pozvao da mi ih zbroji da dobijem konacni rezultat mnozenja! evo kod za mnozenje

Code:
PPolinom MulPolinoms(PPolinom p1, PPolinom p2)
{
    int i,j=0,z=0;

    PPolinom novi = new Polinom;

    novi->p = new Grade[p1->max_grade * p2->max_grade];
    novi->max_grade = p1->max_grade * p2->max_grade;
    //MNOZIMO IH SVAKI SA SVAKIM
    for(i=0; i<p2->max_grade; i++)
        for (j=0; j< p1->max_grade; j++)
        {
            novi->p[z].c = p1->p[i].c * p2->p[j].c;    
            novi->p[z].e = p1->p[i].e + p2->p[j].e;
            z++;
        }

        PPolinom prvi = new Polinom;
        prvi->p = new Grade[p1->max_grade];
        prvi->max_grade = p1->max_grade;

        PPolinom drugi = new Polinom;
        drugi->p = new Grade[p2->max_grade];
        drugi->max_grade = p2->max_grade;

        /*KOPIRAMO IH U ZASEBNE POLINOME*/
        for(i=0; i < p1->max_grade; i++)
        {
            prvi->p[i].c = novi->p[i].c;
            prvi->p[i].e = novi->p[i].e;

        }
        z=i;
        for(i=0; i < p2->max_grade; i++,z++)
        {
            drugi->p[i].c = novi->p[z].c;
            drugi->p[i].e = novi->p[z].e;

        }
        /* i zatim jednostavno pozovemo
        funkciju sumpolinoms*/

        novi=SumPolinoms(prvi,drugi);

        return novi;
}



*edited*
ne radi mnozenje nakon dodavanja jos elemenata u neki polinom u mainu! :-(
davs
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Zbrajanje i množenje dvaju polinoma i prikaz vezanom listom

[ Pregleda: 5743 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.