int wyznacznikMacierzy(int **macierz,int A)
{
int i,j,m,n,c;
int s=1;
int wyznacznik;
int **temp=NEW(0,A,A);
if(A==1)
wyznacznik=macierz[0][0];
if(A==2)
wyznacznik=(macierz[0][0]*macierz[1][1])-(macierz[1][0]*macierz[0][1]);
else{
wyznacznik=0;
for(c=0;c<A;c++)
{
m=0;
n=0;
for(i=0;i<A;i++)
{
for(j=0;j<A;j++)
{
temp[i][j]=0;
if(i!=0 && j!=c)
{
temp[m][n]=macierz[i][j];
if(n<(A-2))
n++;
else
{
n=0;
m++;
}
}
}
}
wyznacznik=wyznacznik+s*(macierz[0][c]*wyznacznikMacierzy(temp,A-1));
s=-1*s;
}
}
return wyznacznik;
}
void main()
{ srand((unsigned)time(NULL));
int n=3;
int** M=NEW(0,n,n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
M[i][j]=random(1,9);
display("M",M,n,n);
double wyznacznikos=wyznacznikMacierzy(M,n);
cout<<"\n wyznacznik= "<<wyznacznikos;
}
Koniecccccccccccccccc
kratownica#include "bibs.h"
const int roz=1000;
char katalog[roz]="D:\\Dokumenty\\kratownica_infa\\projekt\\projekt\\";
char plik[roz];
fstream wczytywanie,zapisywanie;
void main()
{
//Definiowanie podstawowych zmiennych do wczytywania danych z plików txt
int M; //liczba prętów kratownicy
int N; //liczba węzłów
int Z; //liczba odebranych stopni swobody
strcpy_s(plik,katalog);
strcat_s(plik,"alok.txt");
wczytywanie.open(plik,ios::in);
wczytywanie>>M; //wczytujemy liczbe prętów z 1. wiersza alok.txt
int** ALOK=NEW(0,M,2); //utworzenie macierzy alokacji ALOKmx2
for(int i=0;i<M;i++)
for(int j=0;j<2;j++)
wczytywanie>>ALOK[i][j];
wczytywanie.close();
display("ALOK",ALOK,M,2); //wyświetlenie macierzy ALOK
strcpy_s(plik,katalog);
strcat_s(plik,"boundary.txt");
wczytywanie.open(plik,ios::in);
wczytywanie>>Z; //wczytujemy ile jest odebranych st. swobody z 1. wiersza boundary.txt
int* R=NEW(0,Z); //wektor Rz z numerami odebranych st. swobody
for(int i=0;i<Z;i++)
wczytywanie>>R[i];
wczytywanie.close();
quick_sort(R,Z); // sortowanie wektora R od najmniejszej do największej wartości
display("R",R,Z); //wyświetlenie wektora R
strcpy_s(plik,katalog);
strcat_s(plik,"cart.txt");
wczytywanie.open(plik,ios::in);
wczytywanie>>N; // wczytywanie liczby węzłów
double** X=NEW(0.0,N,2); // macierz Xnx2 ze składowymi położen wszystkich prętów
for(int i=0;i<N;i++)
for(int j=0;j<2;j++)
wczytywanie>>X[i][j];
wczytywanie.close();
display("X",X,N,2); //wyświetlanie macierzy X ze składowymi położen prętów
int T=2*N; //zmienna pomocnicza
strcpy_s(plik,katalog);
strcat_s(plik,"force.txt");
wczytywanie.open(plik,ios::in);
double* Q=NEW(0.0,T); //wektor Qt zawierający składowe pionowe(Y) i poziome (X) sił i reakcji
for(int i=0;i<T;i++)
wczytywanie>>Q[i];
wczytywanie.close();
display("Q",Q,T); //wyświetlenie wektora Q sił i reakcji
double* L=NEW(0.0,M); //wektor Lm z długościami prętów
double** B=NEW(0.0,M,T); //macierz Bmxt kosinusów kierunkowych prętów
for ( int a=0;a<M;a++) //zerowanie macierzy B
for (int b=0;b<T;b++)
B[a][b]=0;
for(int p=0; p<M; p++)
{
int i0=ALOK[p][0]; //numery globalne końców prętów (1. kolumna z ALOK)
int i1=ALOK[p][1]; //numery globalne końców prętów (2. kolumna z ALOK)
double dX=X[i1][0]-X[i0][0]; //rzut pręta na oś X
double dY=X[i1][1]-X[i0][1]; //rzut pręta na oś Y
L[p]=sqrt(pow(dX,2)+pow(dY,2)); // obliczenie długości pręta
double alfa=dX/L[p]; // kosinus kierunkowy
double beta=dY/L[p]; // kosinus kierunkowy
B[p][2*i0]=-alfa;
B[p][2*i0+1]=-beta;
B[p][2*i1]=alfa;
B[p][2*i1+1]=beta; // 4 składowe macierzy B w wierszu p
}
display("L",L,M);
display("B",B,M,T); //wyświetlenie macierzy Btxm i wektora Lm
double** D=NEW(0.0,T,M); //Dtxm - Transponowana macierz B
for(int i=0;i<T;i++)
for(int j=0;j<M;j++)
D[i][j]=B[j][i]; //transpozycja
display ("D",D,T,M); //wyświetlenie macierz Dbxt
//Definiowanie kolejnych macierzy i wektorów
//podział macierzy D na dwie części
double** Dg=NEW(0.0,T-Z,M); //macierz górna
double** Dd=NEW(0.0,Z,M); //macierz dolna
double* F=NEW(0.0,M); //wektor poszukiwanych sił w prętach, który obliczamy
double* Qg=NEW(0.0,T-Z); //wektor z węzłami w których nie ma reakcji
double* Qd=NEW(0.0,Z); // wektor,który obliczamy z reakcjami w węzłach
//pomocnicze zmienne-liczniki
int wd=0;
int wg=0;
for (int s=0;s<T;s++)
{
if (s==R[wd]) //jeżeli s jest elem. wektora Rz(nr st. swob.)
{
for(int i=0;i<M;i++)
Dd[wd][i]=D[s][i]; // wiersz s macierzy Dtxm zapisujemy do Dd
wd++;
}
else
{
Qg[wg]=Q[s]; //składową s wektora Qt zapisujemy do Qg
for (int i=0;i<M;i++)
Dg[wg][i]=D[s][i]; //wiersz s macierz Dtxm zapisujemy do Dg
wg++;
}
}
if (T-Z==M) //sprawdzenie czy macierz Dd jest kwadratowa
{
for (int i=0;i<M;i++)
gauss(Dg,Qg,F,M); //obliczenie sił F w prętach
for (int i=0;i<Z;i++)
for(int j=0;j<M;j++)
Qd[i]+=Dd[i][j]*F[j]; // obliczenie składowych reakcji Qd z zależności Dd*F=Qd
}
for(int i=0;i<M;i++)
cout<<"\nSila w precie "<<i<<" : F["<<i<<"]="<<F[i];
//wyświetlenie wyników na ekranie
for(int i=0;i<Z;i++)
{
cout<<"\nReakcja w wezle " <<R[i]/2;
if(!(R[i]%2)) //bo bylo i=2i(+1) przy alokacji
cout<<" w kierunku poziomej osi x - stopien swobody "<<R[i]<<" : Qd["<<i<<"]="<<Qd[i];
else
{
cout<<" w kirerunku pionowej osi y";
cout<<" - stopien swobody "<<R[i]<<" : Qd["<<i<<"]="<<Qd[i];
}
}
//zapisywanie wyników do plików
strcpy_s(plik,katalog);
strcat_s(plik,"sily.txt");
zapisywanie.open(plik,ios::out);
//zapisywanie sił
for (int i=0;i<M;i++)
{
zapisywanie<<"F["<<i<<"] = "<<F[i]<<endl;
}
zapisywanie.close();
//Zapisywanie reakcji
strcpy_s(plik,katalog);
strcat_s(plik,"reakcje.txt");
zapisywanie.open(plik,ios::out);
for (int i=0;i<Z;i++)
{
zapisywanie<<Qd[i]<<endl;
}
zapisywanie.close();
DEL(ALOK);
DEL(R);
DEL(X);
DEL(Q);
DEL(L);
DEL(B);
DEL(D);
DEL(Dg);
DEL(Dd);
DEL(Qg);
DEL(Qd);
DEL(F);
cout<<endl;
}
MACIERZ TRANSPONOWANA
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
B[i][j]=A[j][i];
cout<<endl;
}
cout<<"Macierz transponowana to \n";
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
cout<<B[i][j]<<" ";
cout<<endl;
}
ZAPISYWANIE:
Void main
{
fstream zapis;
zapis.open("C:\\Users\\Pawel\\Desktop\\pawel\\proba\\proba\\runge.txt",ios::out);
for(int i=0;i<n;i++)
zapis<<X[i]<<" "<<U[i]<<endl;
zapis.close();
}
Mnożenie macierzy:
Kod:
for(int i=0;i<n;i++)
for(int a=0;a<n;a++)
for(int j=0;j<n;j++) t3[i][a]+= t[i][j]*t2[j][a];
gdzie:
*t1, t2 - macierze wejściowe
*t3 - macierz wyjściowa...
*n - wymiar macierzy, dałem warunek, że macierze są kwadratowe, jeśli nie, popraw w jednym for n na jakieś, powiedzmy m (drugi wymiar drugiej macierzy),
przed wykonaniem sprawdzić, czy spełnione są warunki mnożenia macierzy- wymiar drugi pierwszej równy pierwszemu drugiej
transpozycja macierzy:
Kod:
for(int i = 0; i < n; i++)
for(int j = 0; j < i; j++){
tmp = t1[i][j];
t1[i][j] = t1[j][i];
t1[j][i] = tmp;}
, gdzie:
*t1 - macierz
*n - wymiar
*tmp - zmienna pomocnicza, typ ten sam, co macierz
#include <iostream> //to musi byc i napiszcie to od razu (chuj wie)
#include <fstream>//to musi byc i napiszcie to od razu(zapis do pliku)
#include <cmath>//to musi byc i napiszcie to od razu(funkcje matematyczne)
#include "newdel.h"//to musi byc i napiszcie to od razu (macierze)
using namespace std;//to musi byc i napiszcie to od razu (drugi chujw ie)
double sil(double a) //liczenie silni postaci 1/a!
{
double f; //liczenie rekurencyjne
if(a==0)f=1;
else
{
f=sil(a-1)/a;
}
return f;
}
double S(double eps) //suma szeregu zlozonego z silni
{
double a=1,i=1,b=1;
while(b>eps){ //liczy dopoki jest spelniony warunek z zadania ( zadanie 1 z jakeigos kolła)
b=sil(i);
a=a+sil(i);
i++;
}
return a;
}
double g(double x){ //liczenie funkcji z zadania dla x podanego
double y=pow((sin(x)),cos(0.5*pow(x,2)));
return y;
}
double* B(double t) //wyliczanie wspolrzednych wektora predkosci i wartosci predkosci tego wektora i zapis tego do wektora z 3 wspolrzednymi
{
double* A=NEW(1.0,3); //macierz wypelniona jedynkami do ktorej potem wejda wyniki
A[0]=-cos(t);// skaldowa x predkosci
A[1]=1.0/10.0*2*pow(t,2);// skladowa y predkosci
A[2]=sqrt(pow(A[0],2)+pow(A[1],2));// wartosc predkosci
return A; // zwroca tablica z wartosciami
}
double* MIN(double** T,int m, int n) //pobieranie tablicy i jej wymairu do pozniejszego wyciagania wartosci minimalnej z kazdej kolumny
{
double* MIN=NEW(0.0,n); //macierz wartosci minimalnych dla kazdej kolumny - narazie wypelniona byle jak
for (int i=0;i<n;i++) { // wywolywanie po kolei kazdej kolumny i kazdego jej wiersza dwoma petlami for i zapamietywanie najmneijszej wartosci z kazdej kolumny oraz zapisanie tego do tablicy MIN
for (int k=0;k<m;k++) {
if (k==0) MIN[i]=T[k][i];//wpisuje jako minimalna wartosc pierwsza liczbe z kolumny
else if (T[k][i]<MIN[i]) MIN[i]=T[k][i]; //sprawdza czy kolejna liczba nei jest mniejsza a jak jest to ja zapamietuje zamiast swojej starej :D
}
}
return MIN; //zwraca maceirz minimalnych wynikow
}
void main()
{
int m,n; //zadanie z sortowaniem , wywolywanie i wypisywanie i sortowanie
cout<<"podaj m "<<endl; //zadanie z sortowaniem , wywolywanie i wypisywanie i sortowanie
cin>>m;
cout<<"podaj n "<<endl;//zadanie z sortowaniem , wywolywanie i wypisywanie i sortowanie
cin>>n;//zadanie z sortowaniem , wywolywanie i wypisywanie i sortowanie
double* p;//zadanie z sortowaniem , wywolywanie i wypisywanie i sortowanie
double** G=NEW(-100.0,100.0,m,n);//zadanie z sortowaniem , wywolywanie i wypisywanie i sortowanie
p=MIN(G,m,n);//zadanie z sortowaniem , wywolywanie i wypisywanie i sortowanie
d("G",G,m,n);//zadanie z sortowaniem , wywolywanie i wypisywanie i sortowanie
d("p",p,n);//zadanie z sortowaniem , wywolywanie i wypisywanie i sortowanie
/* //<-- znak do robienia komentarzy ta gwiazdka i slash , zeby sie nei pieprzyly zadania ze soba ,
double eps,t; //zadanie z szeregiem
double* V; //zadanie z szeregiem
eps=1.0e-5; //zadanie z szeregiem
char PATH[1000]="C:\\g.txt"; //zadanie z szeregiem
cin>>b; //zadanie z szeregiem
cout<<S(eps); //zadanie z szeregiem
fstream strum; //tabalaryzcja funkcji
strum.open(PATH,ios::out); //tabalaryzcja funkcji
double k=3.0/250.0; //tabalaryzcja funkcji
for (double i=0.0;i<=3+k;i=i+k) { //tabalaryzcja funkcji
strum<<i<<" "<<g(i)<<endl; //tabalaryzcja funkcji ( zapis do pliku kazdej wartosci od 0 do 3 ze skokiem k=3/250
}
cout<<"podaj t chuju"<<endl; //zadanie z predkoscia bez tabelaryzacji
cin>>t; //zadanie z predkoscia bez tabelaryzacji
V=B(t); //zadanie z predkoscia bez tabelaryzacji
cout<<"skladowa x to "<<V[0]<<endl; //zadanie z predkoscia bez tabelaryzacji
cout<<"skladowa y to "<<V[1]<<endl; //zadanie z predkoscia bez tabelaryzacji
cout<<"predkosc to "<<V[2]<<endl; //zadanie z predkoscia bez tabelaryzacji
strum.close(); //zadanie z predkoscia bez tabelaryzacji
*/
}
7