Determinanta matrice u C++

poruka: 4
|
čitano: 9.671
|
moderatori: XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
neaktivan
offline
Determinanta matrice u C++

Treba izračunati determinantu kvadratne matrice. Matricu treba svesti na trokutastu. Profesor je rekao da ne koristimo pokazivače (**).

 

Nismo koristili ni one naredbe tipa cin i cout (iako skraćuju postupak) već samo standardno printf i scanf.

 

Uglavnom, imam program za prikaz matrice, program koji prikazuje dijagonalu matrice (A[1][1], A[2][2]...), za računanje maximalne vrijednosti i-og reda, 1. og stupca (taj program ima grešku jer ako upišem nulu onda ju prepoznaje kao max vrijednost). U program za računanje max vrijednosti treba ubaciti funkciju abs, ali što god napravim ispadnu samo neke velike vrijednosti.

Program za mijenjanje redaka mi uopće ne radi, iako ga je profesor napisao na komadu papiru. Čini mi se da ne radi zbog toga što ne znam pravilno ubaciti u int main(). Sve sam potprograme rascjepkala kako bih mogla provjeriti točnost svakog posebno. Zatim bi ih ubacila u jedan, glavni program, ali to će biti problem.

 

Možete li pomoći nekako, pa čak i nekom dobrom skriptom? Svašta sam skinula s interneta, ali sve je to puno nekih podataka koji mi ne pomažu puno. O.o

 

Želim to naučiti, ali imam malo vremena pa bih bila jako zahvalna ako mi netko pomogne. :)

Taj program imam kao uvjet za polaganje ispita i početnik sam u svemu tome pa bi svaka pomoć dobro došla.

Moj PC  
0 0 hvala 0
17 godina
offline
Determinanta matrice u C++

Što je ovo? - još nitko nije pružio dami pomoć

Nema veze - evo vitez @Floka na "bilom konju" - pardon - Phenomu II X4 955{#}

Ja sam u svom programu koristio cout i cin za konzolni ispis i upis jer mi je tako lakše - a najmanji problem ti je umjesto njih napisati printf i scanf - odnosno koristiti čisti C jezik.

Nije mi jasno zašto tvoj profa brani pokazivače - ovdje bi ionako bili korišteni samo za dinamičko alociranje memorije - a to nije uopće komplicirano - pače - poželjnije je.

Ali, ajde dobro, nek mu bude, vjerojatno je pod tim mislio da hoće dvodimenzionalnu matricu, a ne kompliciraniju jednodimenzonalnu - ali i dvodimenzionalna matrica se može

dinamički alocirati - preko pokazivača na pokazivače - i nije uopće komplicirano.

Dakle ja sam uradio sljedeće:

- alocirao sam dvodimenzionalno polje 10X10

- nakon toga se traži unos reda kvadratne matrice - max 10 - odnosno maksimum 10 redova X 10 stupaca

- nakon što se unese i ispiše matrica dolazimo do algoritma programa koji Gausovom metodom eliminacije matricu pretvara u trokutastu:

  1. alogoritam šeta po elementima glavne dijagonale matrice

  2. ako je element na glavnoj dijagonali 0 slijedi zamjena reda sa redom u kojem taj element nije 0

  3. zamjena se vrši sa redovima ispod tog reda - čim se zamjena izvrši - druga zamjena se ne vrši

  4. nakon toga računa se koeficijent koji je omjer između elementa u redu ispod u istom stupcu i elementa na glavnoj dijagonali

  5 sa tim koeficijentom množimo red u kojem smo uzeli element na glavnoj dijagonali i pribrajamo ga redu ispod

  6.na taj način dobijemo vrijednosti 0 u istm stupcu ispod glavne dijagnale

  7. ako se već nalazi 0 u stupcu ispod elementa na glavnoj dijagonali - taj red ne diramo - i cilj nam je dobiti 0

  8. postupak se ponavlja sve do pretposljednjeg elementa na glavnoj dijagonali.

  9. kad smo na taj način dobili trokutastu matricu - determinantu izračunamo kao umnožak elemenata glavne dijagonale - i pomnožimo sa varijablom brojac koja kontrolira predznak -

      kad se vrši zamjena redova matrice - mjenja se predznak

 

Nisam detaljno istestirao program - pa nisam siguran ima li greški - ali matrice sa ove stranice

http://www.vus.hr/Nastavni%20materijali/Matematika/Fin_matematika_vjezbe/7.%20vjezbe.pdf je točno izračunao.

 

#include<iostream>
#define MAX 10
using namespace std;



int main()
{
    int red, stupac, zamjena, brojac = 1;
    double matrica[MAX][MAX];

    cout<< "Unesi red kvadratne matrice <max 10>: ";
    cin>> red;

    stupac = red;// SAMO radi razumljivosti i preglednosti algoritma sam uveo varijablu
    cout<< "Unesi elemente matrice:\n";  //stupac - inače je jednaka varijabli red
    for(int i=0; i<red; i++)         // unos matrice
    {
       for(int j=0; j<stupac; j++)
       {
          cout<< "Unesi matrica[" << i << "][" << j << "]: ";
          cin>> matrica[i][j];
       }
    }
    cout<< "Ispis matrice:\n";
    for(int i=0; i<red; i++)         // ispis matrice
    {
       for(int j=0; j<stupac; j++)
       {
          cout<< matrica[i][j] << " ";
       }
       cout<< endl;
    }

    for(int i=0; i<red-1; i++)   // šetamo po glavnoj dijagonali matrice
    {
       int kontrolna = 0;   
       if(!matrica[i][i])     // ako je vrijednost na glavnoj dijagonali matrice 0
       {                     // ulazimo u blok za zamjenu reda
          for(int j = i; j<red-1; j++)  // gledamo u donjim redovima matrice gdje
                                       // je vrijednost u istom stupcu različia od 0
             if(matrica[j+1][i] != 0 && kontrolna == 0) 
             {
                for(int k=0; k<stupac; k++) // mijenjamo redove matrice da otesemo 0
                {                           // sa glavne dijagonale
                   zamjena = matrica[i][k];
                   matrica[i][k] = matrica[j+1][k];
                   matrica[j+1][k] = zamjena;
                }
                brojac *= (-1);  // ako izvršimo zamjenu redova brojač mijenja predznak
                kontrolna++;     // varijabla kontrolna zaustavlja daljne zamjene
             }                    // ako je zamjena uspješno obavljena
       }
       for(int j=i; j<red-1; j++) // blok u kojem svodimo elemente ispod glavne dijagonle na 0
       {                                   // ako je element ispod glaavne dijagonale 0
          if(!matrica[j+1][i]) continue; // varijablu preskačemo jer upravo to trebamo
          double koeficijent = matrica[j+1][i]/matrica[i][i];   // koeficijent kojim množimo
          for(int k=i; k<stupac; k++)      // red na glavnoj djagonali i pribrajamo ga
          {    //  redovima ispod glavne dijagonale - cilj je dobiti 0 ispod glavne dijagonale
             matrica[j+1][k] += (-koeficijent) * matrica[i][k];
          }   // dakle red na kojem je glavna dijagonala množimo koeficijentom i pribrajamo ga
       }       // redovima ispod njega

    }
    cout<< "Ispis trokutaste matrice matrice:\n";
    for(int i=0; i<red; i++)
    {
       for(int j=0; j<stupac; j++)
       {
          cout<< matrica[i][j] << " ";    // ispisujemo trokutastu matricu
       }
       cout<< endl;
    }
    double determinanta = 1;
    for(int i=0; i<red; i++)
    {
       determinanta *= matrica[i][i];    // računamo determinantu matrice
    }                                 // umnožak glavne dijagonale trokutaste matrice
    cout<< "Determinanta matrice: " << determinanta * brojac;
    cout<< endl;             // ne zaboraviti promjeniti predznak ako se vršila zamjena redova
    return 0;
}

 

 

Poruka je uređivana zadnji put čet 15.9.2011 19:10 (Floki).
 
0 0 hvala 1
16 godina
neaktivan
offline
Determinanta matrice u C++

Hvala Floki!!! :D

 

Program radi. Malo sam ga promijenila. Nisam samo uspjela srediti da determinanta ubaci brojčanik i promijeni predznak. Testirala sam program na nekoliko matrica. Predivno je vidjeti posloženo sve kako treba. :)

Moj PC  
0 0 hvala 0
17 godina
offline
Re: Determinanta matrice u C++
oblak24 kaže...

Hvala Floki!!! :D

 

Program radi. Malo sam ga promijenila. Nisam samo uspjela srediti da determinanta ubaci brojčanik i promijeni predznak. Testirala sam program na nekoliko matrica. Predivno je vidjeti posloženo sve kako treba. :)

Brojčanik ti se već nalazi unutra - to ti je varijabla brojac - svaki put kad se izrvši promjena redova matrice varijabla brojac mijenja predznak - na kraju sa njom se množi glavna dijagonala da bi

determinanta dobila pravi pedznak.

dakle - već imaš brojač unutra.

1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice