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

[Zadatak] Klasa matrica

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Klasa matrica

[ Pregleda: 2579 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nina012
Nina Modrić
studentica
BanjaLuka

Član broj: 198499
Poruke: 9
*.telekabel.ba.



Profil

icon [Zadatak] Klasa matrica22.10.2008. u 20:49 - pre 189 meseci
Rad sa matricama nije veliki problem i prilično se dobro snađem , ali sada odjednom susretoh se sa klasama i ne znam kako da se koristim njima - izgleda da imam problem .

Dobila sam zadatak da definišem klasu Matrix koja ima sl. članove :

1. 3 člana podatka red za broj redova , vrst za vrstu i elem preko pointera

i ja to napisa ovako :
Code:

class Matrix {
int red ;
int vrst ;
double **elem ;

ali sada dođoše na red te funkcije pa se traži sledeće :

2. funkcijski član def koji definiše matricu sa svim elementima =0
3. funkcijski član upis koji pridružuje realne vrijednosti elementima matrice
4. funkcijski član ispis koji ispisuje matricu red po red
5. funkcijski član kvad koji provjerava da li je matrica kvadratna
6. funkcijski član trans koji daje transponovanu matricu zadane matrice
7. funkcijski član saberi, koji sabire 2 matrice i rezultat je matrica. Ukoliko broj redova i kolona ne odgovaraju ispisati text koji javlja grešku
8. funkcijski član oduzmi koji oduzima 2 matrice i rezultat je matrica isto javlja za grešku
9. funkcijski član pomnožiSkalar koji matricu množi proizvoljnim realnim brojem i rezultat je matrica
10 . funkcijski član pomnoži koji množi 2 matrice i rezultat je matrica ako redovi i kolone ne odgovaraju da javi grešku
11. funkcijski član sing ,koji provjerava da li je matrica singularna
12. funkcijski član inv , koji izračunava inverznu matricu ako ista postoji tj. ako matrica nije singularna
13. funkcijski član det , koji daje vrijednost determinante matrice ako je ista kvadratna

Da li neko ima dovoljno iskustva i slobodnog vremena da definiše ove funkcijske članove ?
Evo neki kod koji bi možda mogao pomoći osobi koja je nveć radila sa klasama , ja sam iskreno tek juče pokušala nešto s tim . ( definisan je unos ispis transponovana matrica .... )

CODE :
Code:

# include <iostream>
# include <vector>
using namespace std;
// Funkcija DaLiJeGornjaTrougaona...
bool DaLiJeGornjaTrougaona(vector<vector<double> > a){
bool istina=true;
for (int i=1; i<a.size(); i++)
for (int j=0; j<i; j++)
if (a[j]!=0) istina=false;
return istina;
}
// Funkcija TragMatrice...
double TragMatrice(vector<vector<double> > a){
if (a.size()!=a[0].size())
throw "Matrica nije kvadratna, nema traga i ne moze biti trougaona!\n";
double rez=0;
for (int i=0; i<a.size(); i++) rez+=a;
return rez;
}
// Funkcija Transponovana...
vector<vector<double> > Transponovana(vector<vector<double> > a){
int pom1=a.size(); // Pocetni broj redova matrice
int pom2=a[0].size(); // Pocetne broj kolona matrice
// max - veca dimenzija (red ili kolona)
int max=a[0].size();
if (a.size()>a[0].size()) max=a.size();
// Resize matrice na kvadratnu dimenzija [max][max]
a.resize(max);
for(int i = 0; i < max; i++) a.resize(max);
// "Okretanje" odgovarajucih pozicija u matrici
double priv;
for (int i=0;i<max;++i)
for (int j=i+1;j<max;++j)

Unaprijed hvala na pomoći !!!

[Ovu poruku je menjao X Files dana 23.10.2008. u 10:38 GMT+1]
 
Odgovor na temu

cdjole
Djordje Cvijetic
Novi Sad

Član broj: 151293
Poruke: 30
*.dynamic.sbb.rs.



Profil

icon Re: [Zadatak] Klasa matrica23.10.2008. u 01:10 - pre 189 meseci
Ima tu dosta funkcija, mada za onoga ko radi dosta sa matricama ne bi trebalo da bude problem. Ja nisam radio sa matricama vec dugo, pa bi mi trebalo dosta vremena da odradim te funkcije.
Moj ti je savet da ipak najpre proucis klase i naucis nesto o njima, kako bi lakse mogla ovo da odradis. Ima tu jos posla osim predstavljanja tih funkcija.
Evo ti samo osnova kako bi trebalo otprilike da izgleda klasa.

Code:
//matrix.hpp
#ifndef MATRIX_TYPE
    #define MATRIX_TYPE

class Matrix{
    private: // ovde su ti podaci koji su dostupni samo f-jama clanicama 
        int red, vrst;
    double *elem;
    public: // ovde deklarises f-je clanice
        Matrix(); // konstuktor, moze ih biti i vise
    ...
    Matrix(const Matrix &); // konstruktor kopije, moras ga praviti zbog pokazivaca

    Matrix& operator = (const Matrix &); // moras preklopiti i operator dodele zbog pokazivaca

    ~Matrix(); // destruktor takodje moras napraviti zbog pokazivaca,

    void def(){red = 0; vrst = 0; elem = new double(0);} // ovo ti je npr. ona prva f-ja, sad dole ti idu one ostale f-je koje si navela
    ...
            
           
}; //kraj klase

# endif


Verovatno te ovi svi podaci (konstruktor, destruktor, preklapanje operatora, ...) zbunjuju ako nisi ranije radila sa klasama, pa bi zbog toga i trebalo malo vise da proucis iste.
U principu, posle tih konstruktora i destruktora, deklarises funkcije koje ti trebaju, pa u .cpp fajlu i napises kako rade (ako su kratke, mozes i ovde). Verovatno ima negde i gotovih klasa matrica na netu,
pa ti i to moze pomoci.
 
Odgovor na temu

Nina012
Nina Modrić
studentica
BanjaLuka

Član broj: 198499
Poruke: 9
*.telekabel.ba.



Profil

icon Re: [Zadatak] Klasa matrica23.10.2008. u 09:04 - pre 189 meseci
Ovo je prvi put da pokušavam raditi sa klasama i uglavnom sam razumjela neka prava pristupa , ali ovu kada konstruktor , kada destruktor - ma gubim se .

Pokušala sam ovako :
Code:

#include <iostream>  // ne znam trebam li ovdje staviti i #include<vector > ?
using namespace std ;
class Matrica {
private : // naučila sam da ovo i nije potrebno kada se nalazi na prvom mjestu
int red,kol ;
double *elem ;
public :
void defMatrica () ( red=0 ; kol=0 ;elem=new double (0); // zašto " new " ? ovo je tvoj red
void upisMatrica () {
       for ( int i=0 ; i<red ; i++ )
           for ( int j=0 ; j<kol ; j++ )
                 {
                  cout <<"("<< i+1 <<"," <<j+1<<")";
                  cin >> i,j ;
                  }
                           }
void ispisMatrica () {
       cout<<"Unešena Matrica je: " ;
                  {
                  for ( i=0 ; i<red ; i++ )
                  for ( j=0 ; j<kol ; j++)
                  cout << [i],[j] ;
                   }
                           }

Je li bar ovaj dio sada ok ?

Code:
 
iza cout ima i [ i ]; ne znam zašto to ne prikazuje

EDIT: X Files : Molim Vas da zbog preglednosti, kod upisujete između tag-ova predviđenih za to:

[code]
int main ( int argc, char *argv[] )
{
// ...
return 0;
}
[/code]
Tada ce prestati i pogresno dekodiranje "indeks od i" koje biva protumaceno kao ITALIC.

[Ovu poruku je menjao Nina012 dana 23.10.2008. u 10:25 GMT+1]

[Ovu poruku je menjao X Files dana 23.10.2008. u 10:40 GMT+1]
 
Odgovor na temu

Nina012
Nina Modrić
studentica
BanjaLuka

Član broj: 198499
Poruke: 9
*.telekabel.ba.



Profil

icon Re: [Zadatak] Klasa matrica23.10.2008. u 09:28 - pre 189 meseci
Imam jedan program koji je prije rađen , ali bez klase , još mi nije jasno kako da to "utrpam" u klasu

evo kod :
Code:

#include <iostream.h>
#define max 10

main ()
{
    int matrica[max][max], suma[max], proizvod[max];
    int n,s=0,p=1;
    cout << "n=";
    cin >> n;
    for (int i=1; i<=max; i++)
    {
        suma[i]=0;
        proizvod[i]=1;
    }
    for (int i=1; i<=n; i++)
        for (int j=1; j<=n; j++)
        {  
            cout <<"Mat["<<i<<","<<j<<"]=";
            cin >> matrica[i][j];
            suma[j]+=matrica[i][j];
            proizvod[i]*=matrica[i][j];
        }
    for (int i=1; i<=n; i++)
        cout<<"Suma["<<i<<"]="<<suma[i]<<endl;
    for (int i=1; i<=n; i++)
        cout<<"Proizvod["<<i<<"]="<<proizvod[i]<<endl;
    return 0;
}


EDIT: X Files : Kao što rekoh, molim Vas da zbog preglednosti, kod upisujete između tag-ova predviđenih za to:

[code] ... [/code]

[Ovu poruku je menjao X Files dana 23.10.2008. u 10:41 GMT+1]
 
Odgovor na temu

cdjole
Djordje Cvijetic
Novi Sad

Član broj: 151293
Poruke: 30
*.dynamic.sbb.rs.



Profil

icon Re: [Zadatak] Klasa matrica23.10.2008. u 11:02 - pre 189 meseci
Konstruktor sluzi za kreiranje objekta u memoriji i dovodjenje istog u pocetno stanje. Ako ga ne napravis, koristi se podrazumevani konstruktor i on nema parametre. Npr. nek imamo klasu kompleksnih brojeva.
Tada mozemo koristiti podrazumevani konstruktor kao

Complex a;

Medjutim, ako napravimo drugi konstruktor (ili vise njih), onda ovaj podrazumevani vise ne vazi i ne moze se pozivati.

Complex (double r, double i){... postavlja realni i imaginarni deo broja na r, tj. i};

Sada da bi kreirali objekat moramo proslediti i parametre:

Complex (a, b);

Mozemo napraviti i konstruktor bez parametara, pa koristiti i njega, samo sto to vise nije onaj podrazumevani konstruktor.

Destruktor unistava kreirani objekat, koristi se na kraju da ne bi doslo do curenja memorije.

Da bi koristila operatore +, *, -, itd. tako da odgovaraju tvojoj klasi, moras ih preklopiti, tj. predefinisati da bi radili ono sto tebi odgovara.

Posto radis sa pokazivacima, moras koristiti "new" da bi se dinamicki alocirala memorija. To ti je kao "malloc" u C-u. E sad, to povlaci i neke druge obavezne stvari koje se moraju uraditi, a koje nisu obavezne ukoliko
nema pokazivaca medju podacima clanovima. To znaci da moras napraviti konstruktor kopije, destruktor i moras preklopiti operator dodele (to je obavezno, a ostalo mozes po potrebama).

Klasa ti se sastoji iz .h i .cpp fajla. Najbolje je videti na primeru. Evo odradio sam da kazem osnovnu (ili "golu") klasu matrica, da vidis kako ide, a zeljene funkcije treba dodavati.

Code:
//matrica.h
#ifndef MATRIX_H
    define MATRIX_H

class Matrix {
    private:
        int kolone, vrste;
        double **mat;
        Allocate();
    public:
        Matrix(int m, int n); //konstruktor obicni
        Matrix(const Matrix &); //konstruktor kopije
        ~Matrix(); //destruktor
        Matrix &operator = (const Matrix &); //prelapanje operatora =
        
        friend Matrix operator + (const Matrix &m1, const Matrix &m2); //preklapanje jos nekih operatora
        friend Matrix operator * (const Matrix &m1, const Matrix &m2);
        friend Matrix operator << (const Matrix &out, const Matrix &);
};
#endif


Code:
//matrica.cpp
#include "matrica.h"

Matrix :: Allocate()
{
    mat = new double *[vrste];
    for (int i = 0; i < vrste; i++)
    {
        mat[i] = new double *[kolone];
        for (int j = 0; j < kolone; j++)
            mat[i][j] = 0;
    }
}

Matrix :: Matrix(int m, int n)
{
    vrste = m;
    kolone= n;
    Allocate();
}

Matrix :: Matrix(const Matrix &M)
{
    vrste = M.vrste;
    kolone = M.kolone;
    Allocate();
    for (int i = 0; i < vrste; i++)
        for (int j = 0; j < kolone; j++)
            mat[i][j] = M.mat[i][j];
}

Matrix :: ~Matrix()
{
    for (int i = 0; i < vrste; i++)
        delete []mat[i];
    delete []mat;
}

Matrix &Matrix :: operator = (const Matrix &M)
{
    if(M == this) return *this;
    if((vrste != M.vrste) || (kolone != M.kolone))
    {
        for (int i = 0; i < vrste; i++)
            delete []mat[i];
        delete []mat;
        vrste = M.vrste;
        kolone = M.kolone;
        Allocate();
    }
    for (int i = 0; i < vrste; i++)
        for (int j = 0; j < kolone; j++)
            mat[i][j] = M.mat[i][j];
    return *this;
}

Matrix operator + (const Matrix &M1, const Matrix &M2)
{
    if((M1.vrste != M2.vrste) || (M1.kolone!= M2.kolone)) exit(1);
    Matrix pom(M1.vrste, M1.kolone);
    for (int i = 0; i < M1.vrste; i++)
        for (int j = 0; j < M1.kolone; j++)
            pom[i][j] = M1.mat[i][j] + M2.mat[i][j];
    return pom;
}

Matrix operator * (const Matrix &M1, const Matrix &M2)
{
    
    if (M1.kolone != M2.vrste) exit(1);
    Matrix pom(M1.vrste, M2.kolone);
    for (int i = 0; i < M1.vrste; i++)
        for (int j = 0; j < M2.kolone; j++)
        {
            pom[i][j] = 0;
            for (int k = 0; k < M1.kolone; k++)
                pom[i][j] = pom[i][j] + M1.mat[i][k] * M2.mat[k][j];
        }
    return pom;
}

ostream &operator << (ostream &out, const Matrix &M)
{
    for (int i = 0; i < M.vrste; i++)
        for (int j = 0; j < M.vrste; j++)
        {
            out << mat[i][j];
            if (j == M.kolone) 
                out << endl;
        }
    return out;
}


Ovo ti je znaci osnovno, imas preklopljene neke operatore koji ce ti trebati za one tvoje funkcije, tako da ih mozes koristiti bez problema u njima. Sad treba jos da u .h fajlu deklarises te funkcije,
a onda i da ih napises u .cpp fajlu.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Klasa matrica

[ Pregleda: 2579 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

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