Do tego celu wykorzystuję rekurencyjną funkcję det.
a - liczba niewiadomych i liczba równań
tablica[a][a] - współczynniki przy niewiadomych
wiersz - numer wiersza, w ktorym zaczyna sie podmacierz
kolumna - numery kolumn, które zawiera podmacierz
dodatkowa - dynamiczny wektor kolumn
m - mnożnik, pełni funkcję (-1) ^{i+j}
s-suma iloczynów
w-wyznacznik główny
Tutaj jest jego część, która powinna obliczać wyznacznik główny, a tymczasem wyskakuje błąd:
Kod: Zaznacz cały
206 ...a\Documents\C++\Wyznaczniki.cpp cannot convert `int (*)[((unsigned int)((int)a))]' to `int**' for argument `4' to `double det(int, int, int*, int**)'
Kod: Zaznacz cały
#include <iostream>
#include <conio.h>
#include <iomanip>
#include <cstdlib>
using namespace std;
double det(int a, int wiersz, int * kolumna, int ** tablica)
{
int g,h,k,m,* dodatkowa;
double s;
if(a == 1)
{ // sprawdzamy warunek zakończenia rekurencji
return tablica[wiersz][kolumna[0]]; // macierz 1 x 1, wyznacznik równy elementowi
}
else
{
int dodatkowa[a-1];
s = 0;
m = 1;
for(g = 0; g < a; g++)
{
k = 0;
for(int h = 0; h < a - 1; h++)
{
if(k == g)
{k++;
}
dodatkowa[h] = kolumna[k++];
}
}
s = m * tablica[wiersz][kolumna[g]] * det(a - 1,wiersz + 1, dodatkowa, tablica);
m = -m; // kolejny mnożnik
return s;
}
}
int main()
{
double w;
int a, opcja;
bool c;
time_t b;
srand ((int) time(&b));
cout<<endl;
cout<<" Program oblicza uklady rownan do 10 niewiadomych"<<endl;
cout<<" Rownania maja postac ax+by+cz+dw=p,"<<endl;
cout<<" gdzie {a,b,c,d,p} to zmienne,"<<endl;
cout<<" a {x,y,z,w} niewiadome."<<endl;
cout<<endl;
cout<<" Z jaka iloscia niewiadomych chcesz obliczyc uklad rownan?"<<endl;
cout<<" ";
cin>>a;
if(a>10||a<1)
{system( "cls" );
cout<<endl;
cout<<" Niewlasciwa ilosc niewiadomych."<<endl;
cout<<" Wprowadz jeszcze raz."<<endl;
main();
}
int tablica[a][a], p[a];
for (int i = 0; i < a; i++)
{for(int j = 0; j < a; j++)
{tablica[i][j]=0;
}
p[i]=0;
}
do
{
system ( "cls" );
cout<<endl;
cout<<" Chcesz?:"<< endl;
cout<<" 1. Wlasnorecznie wpisac zmienne"<< endl;
cout<<" 2. Wylosowac je przypadkowo z przedzialu 0-10"<< endl;
cout<<" 3. Wylosowac je przypadkowo z przedzialu 0-100"<< endl;
cout<<" 4. Wrocic i wybrac jeszcze raz liczbe niewiadomych."<<endl;
cout<<" 0. Wyjsc"<< endl;
cout<<" ";
cin>>opcja;
switch(opcja)
{case 1:for(int i = 0; i < a; ++i)
{for (int j = 0; j < a; ++j)
{ if(j+1==a)
{cout<<" Podaj zmienna ";
switch (j+1)
{case 1:cout<<"a"; break;
case 2:cout<<"b"; break;
case 3:cout<<"c"; break;
case 4:cout<<"d"; break;
case 5:cout<<"e"; break;
case 6:cout<<"f"; break;
case 7:cout<<"g"; break;
case 8:cout<<"h"; break;
case 9:cout<<"i"; break;
case 10:cout<<"j"; break;
}
cout<<" rownania numer "<<i+1<<"."<<endl;
cout<<" ";
cin>>tablica[i][j];
cout<<" Podaj zmienna p rownania numer "<<i+1<<"."<<endl;
cout<<" ";
cin>>p[i];
}
else
{ switch (j+1)
{case 1:cout<<" Podaj zmienna a rownania numer "<<i+1<<"."<<endl; break;
case 2:cout<<" Podaj zmienna b rownania numer "<<i+1<<"."<<endl; break;
case 3:cout<<" Podaj zmienna c rownania numer "<<i+1<<"."<<endl; break;
case 4:cout<<" Podaj zmienna d rownania numer "<<i+1<<"."<<endl; break;
case 5:cout<<" Podaj zmienna e rownania numer "<<i+1<<"."<<endl; break;
case 6:cout<<" Podaj zmienna f rownania numer "<<i+1<<"."<<endl; break;
case 7:cout<<" Podaj zmienna g rownania numer "<<i+1<<"."<<endl; break;
case 8:cout<<" Podaj zmienna h rownania numer "<<i+1<<"."<<endl; break;
case 9:cout<<" Podaj zmienna i rownania numer "<<i+1<<"."<<endl; break;
case 10:cout<<" Podaj zmienna j rownania numer "<<i+1<<"."<<endl; break;
}
cout<<" ";
cin>>tablica[i][j];
}
}
}
break;
case 2: for (int i = 0; i < a; ++i)
{for (int j = 0; j < a; ++j)
{
tablica[i][j] = rand() % 10 + 1;
}
p[i] = rand() % 10 + 1;
}
break;
case 3: for (int i = 0; i < a; ++i)
{for (int j = 0; j < a; ++j)
{
tablica[i][j] = rand() % 100 + 1;
}
p[i] = rand() % 100 + 1;
}
break;
case 4: system( "cls" );
main();
break;
case 0: cout << "Dziekujemy :)"<<endl;
break;
default: cout << "Nieznana opcja!"<<endl;
}
if (opcja==1||opcja==2||opcja==3)
{
system( "cls" );
cout<<endl;
for(int i = 0; i < a; ++i)
{
cout<<" ";
for(int j=0; j<a; j++)
{
if(j+1==a)
{
cout<<tablica[i][j];
switch (j+1)
{case 1:cout<<"x"; break;
case 2:cout<<"y"; break;
case 3:cout<<"z"; break;
case 4:cout<<"w"; break;
case 5:cout<<"v"; break;
case 6:cout<<"u"; break;
case 7:cout<<"t"; break;
case 8:cout<<"s"; break;
case 9:cout<<"r"; break;
case 10:cout<<"q"; break;
}
cout<<"="<<p[i];
}
else
{
cout<<tablica[i][j];
switch (j+1)
{case 1:cout<<"x"; break;
case 2:cout<<"y"; break;
case 3:cout<<"z"; break;
case 4:cout<<"w"; break;
case 5:cout<<"v"; break;
case 6:cout<<"u"; break;
case 7:cout<<"t"; break;
case 8:cout<<"s"; break;
case 9:cout<<"r"; break;
case 10:cout<<"q"; break;
}
cout<<"+";
}
}
cout<<endl;
cout<<endl;
}
cout<<" Czy chcesz zmienic zmienne?"<<endl;
cout<<" 1. Tak 0.Nie"<<endl;
cout<< endl;
cin>>c;
}
}while (c!=0);
cout << fixed << setprecision(2);
int kolumna[a];
for(int i = 0; i < a; i++)
{
kolumna[i] = i;
}
w = det(a, 0, kolumna, tablica);
cout<<w<<endl;
getch();
}
Z góry dzięki.