CATEGORII DOCUMENTE |
DOCUMENTE SIMILARE |
|
TERMENI importanti pentru acest document |
|
: | |
De multe ori suntem tentati sa spunem ca informatica este doar o materie si ne propunem sa invatam doar ceea ce se regaseste in paginile manualului de informatica.Ceea ce nu se gaseste in acesta reprezinta indrumarea catre aplicatii care sa nu tina neaparat de informatica.Voi prezenta in continuare principalele operatii cu matrice, dublate de un program scris pentru limbajul C++, pentru exemplificare.
Putem face aceasta citire utilizand un tablou bidimensional.Valorile elementelor le vom citi pozitie cu pozitie, utilizand doua instructiuni for.
#include <iostream.h>
int main()
return 0;}
Citirea de mai sus este rareori utilizata si doar de cei incepatori in ale informaticii. Sa presupunem ca avem de scris un program mai complicat , cu operatii dificile cu matrici.Dorim sa testam programul pentruu o matrice de 5 linii si 5 coloane.Introducem cele 25 elemente, programul nu functioneaza corectMai facem ceva corectari, iar introducem cele 25 elemente, iar nu functioneza corect, apare frustrarea..
Pentru a evita cazul de mai sus utilizam o citire speciala, dintr-un fisier extern. Cum functioneaza ? In folderul in din care rulati BC.EXE, de obicei C:BORLANDCBIN, creati un fisier de tip text cu numele "matrice.txt"( numele nu este obligatoriu dar va va ajuta sa va aduceti aminte de el ).Pe prima linie scrieti numarul de linii si numarul de coloane, exact cum le scriati cand utilizati modul de citire de mai sus, apoi, pe urmatoarele n linii veti scrie cele m coloane. Un exemplu concret:
"matrice.txt" Obsevati ca puteti citi elementele si
insirate unul dupa altul, insa nu veti
mai gasi cu usurinta coordonatele
fiecaruia.
Programul acum va include "fstream.h" in loc de "iostream.h".Puteti folosi in continuare "cin" si "cout" numai ca acum aveti acces si la "ifstream" sau "ofstream". Pentru exemplificare, dorim sa afisam matricea citia din "matrice.txt" in alt fisier text, "rezult.txt". Mai jos veti regasi acelasi program dar acum el utilizeaza citirea din fisier.
#include <fstream.h>
ifstream fin('matrice.txt');
ofstream fout('rezult.txt');
int main()
return 0;}
NOTA.Nu este nevoie sa creati fisierul "rezult.txt".Acesta va fi creat automat de program.
Acestea fiind cunoscute, putem trece mai departe si vom vedea alte operatii cu matrice. De fiecare data vom utiliza citirea din fisier.
Vom prezenta aici doar cazul particular de adunare a doua matrice. Pentru n matrice puteti folosi un tablou tridimensional.
#include <fstream.h>
#include <conio.h>
ifstream fin('matrice.txt');
ofstream fout('rezult.txt');
int main()
else cout<<'Adunarea nu este posibila !';
return 0;
Incepand de la acest capitol aveti nevoie de ceva cunostinte de matematica pentru rezolvarea problemelor. De aceea nu voi insista cu explicatiile. Doua matrici nu se pot inmulti decat daca numarul coloane al primei matrice este egal cu numarul de linii al celei de-a doua matrice. Matricea produs va avea numarul de linii al primei matrice si numarul de coloane al matricei a doua.
#include <fstream.h>
#include <conio.h>
ofstream g('rezultat.txt');
ifstream f('matrice.txt');
int main()
for(i=1;i<=l1;i++) }
return 0;
Observati ca programul calculeaza doar produse de matrice cu elemente numere naturale.Pentru a putea lucra cu numere din Q aveti nevoie sa stabiliti tipul variabilelor de tip FLOAT ( "float a" de exemplu in loc de "int a").
In cazul in care stiti ceva despre determinanti, a scrie un program care sa calculeze determinanti pana la ordinul al 4-lea sau al 3-lea nu prezinta interes. Vom scrie un program care sa calculeze determinantii de ordin n, unde n poate fi oricat de mare ( in limita matricei bineinteles ! ideea conteaza ). Programul foloseste mai multe functii. Functia care calculeaza detrminantul este recursiva . Programul nu se foloseste decat de descompunerea determinantului de ordin 2 . Determinantii de ordin mai mare sunt descompusi apoi dupa prima linie. Programul are un scop exclusiv informatic. A-l folosi pentru a rezolva determinanti mici nu poate insemna decat pierderea exercitiului la matematica, intrucat determinantii au cateva proprietati cu ajutorul carora se calculeaza rapid. Utilizarea programului la acesti determinanti determina inevitabil uitarea acestor proprietati . Utilizati programul cum doriti insa nu uitati de matematica !
#include <fstream.h>
#include <conio.h>
#include <math.h>
ifstream fin('matrice.txt');
ofstream fcout('determinant.txt');
void submatrice(long int n,long int lin,long int col,long int a[50][50],long int b[50][50])
b[l][c]=a[i][j];
}
long int det(long int a[50][50],long int n)
if(n==2)
else
}
return s;
int main()
Inversa unei matrice se calculeaza utilizand notiunea de determinant. Nu voi intra in amanunte insa va recomand ca, inainte de a folosi programul, sa observati cum a fost creat . Studierea teoriei va ajuta mult in acest caz. De asemenea , programul creat de mine este mult mai complex intrucat am facut cateva aditii care sa ajute la scrierea efectiva a inversei matricei de ordin n. Amanunte voi da la final.
#include <fstream.h>
#include <conio.h>
#include <math.h>
ifstream f('matrice.txt');
ofstream fcout('inversa.txt');
long int cmmdc(long int a,long int b)
return a;
void fractie(long int a,long int b)
if(a<0&&b<0)
c=a;
a/=cmmdc(abs(c),b);
b/=cmmdc(abs(c),b);
if(a==0) fcout<<'0 ';
else if(b==1) fcout<<a<<' ';
else
fcout<<a<<'/'<<b<<' ';
void transpusa(long int a[50][50],long int n)
void submatrice(long int n,long int lin,long int col,long int a[50][50],long int b[50][50])
b[l][c]=a[i][j];
}
long int det(long int a[50][50],long int n)
else
}
return s;
void inversa(long int a[50][50],long int n,long float inv[50][50])
}
int main()
}
return 0;
Explicatii.
1.Dupa cum vedeti programul utilizeaza doua functii preluate direct din programul pentru aflarea determinantului. Apoi mai contine o functie care permite aflarea matrecei inverse si alte functii pe care le voi explica uin continuare. O functie pentru calcularea transpusei vitala pentru calcul si doua functii , cmmdc si fractie. Dupa realizarea programului cu variabile de tip float mi-am dat seama ca valorile obtinute in majoritatea cazurilor sunt destul de "urate" din punct de vedere grafic. Puteti sa va inchipuiti o matrice inversa de genul urmator:
0.83333333 1.6 5.67843223456, etc.
Pentru aceasta , dupa aflarea adjunctei* am aplat functia fractie care nu face altceva decat sa realizeze o simplificare a fractiei. Functia pare complicata deoarece am inclus diferite cazuri exceptie, intre care:
n/1= n ,
a/-b=-a/b si asa mai departe, lucruri care tin de estetica.
*matrice adjuncta = matrice obtinuta in urma aflarii determinantului de pe fiecare pozitie din matricea initiala , suprimand de fiecare data linia si coloana respectiva.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2479
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved