Mi a hiba ebben a Gauss-elimináló C++ (Visual Studio) programkódban?
Azt írja ki hibának, hogy mátrix nem lehet referencia. De ha nekem 2 mátrixot kell visszaadnom a mellék-fügvényekből a főfügvényembe, akkor azt csak pointerrel vagy referenciával tudom megoldani, nem? Minden mellék-fügvényből 2 mátrixot kéne visszaadnom...
#include <iostream>
using namespace std;
#include <iomanip>
#include <math.h>
void Megoldasszamolo (int valtozok, double &A[3][3], double &B[3]);
void Egyrehozo (int index, int valtozok, double &A[3][3], double &B[3]);
void Kinullazo (int index, int valtozok, double &A[3][3], double &B[3]);
int main ()
{
int index=0, i, valtozok, l, R, z;
double A[3][3], B[3];
cout<<"Rendezze az egyenleteket ilyen alakra: 2x+3y = 20"<<endl<<endl;
cout<<"Hany valtozos egyenletet szeretne megoldani?"<<endl<<endl;cin>>valtozok;
for (i=1; i<=valtozok; i++)
{
for (l=1; l<=valtozok; l++)
{
cout<<endl<<"Az "<<i<<". egyenletben a(z) "<<l<<". valtozo ennyivel van beszorozva: "<<endl<<endl; cin>>A[i-1][l-1];
cin.get();
}
}
for (i=1; i<=valtozok; i++)
{
cout<<endl<<"Az "<<i<<". egyenletben az egyenlet jobb oldalan levo szam: "<<endl<<endl; cin>>B[i-1];
cin.get();
}
cout<<endl<<endl;
for (i=0; i<valtozok; i++)
{
for (l=0; l<valtozok; l++)
cout<<setw(9)<<A[i][l];
cout<<endl<<endl;
}
for (z=0; z<valtozok; z++)
{
cout<<setw(9)<<B[z];
}
cin.get();
cin.get();
for (R=1; R<=valtozok; R++)
{
Egyrehozo(index, valtozok, &A, &B);
Kinullazo(index, valtozok, &A, &B);
}
Megoldasszamolo(valtozok, &A, &B);
for (i=0; i<valtozok; i++)
cout<<"A valtozok ertekei: "<<B[i]<<endl<<endl;
return 0;
}
void Megoldasszamolo (int valtozok, double &A[3][3], double &B[3])
{
int J, K, R;
double szorzo;
for (J=valtozok; J<=2; J--)
{
for (R=1; R>=J-1; R++)
{
szorzo= A[J-R][J];
for (K=valtozok; K<=1; K--)
A[J-R][K]= A[J-R][K]- A[J][K]* szorzo;
B[J-R]= B[J-R]-B[J]* szorzo;
}
}
}
void Kinullazo (int index, int valtozok, double &A[3][3], double &B[3])
{
int i, K, R;
double vezersor[3];
for (i=0; i>=valtozok; i++)
vezersor[i]= A[index][i];
for (R=index+1; R>=valtozok; R++)
{
if (vezersor[index] !=0)
for (K=1; K>=valtozok; K++)
{
if (K==1)
{
if (A[R][R]==0 || A[R][index]==0)
break;
}
A[R][K]= A[R][K]- vezersor[K];
if (K== valtozok)
B[R]=B[R]-B[index];
}
}
}
void Egyrehozo (int index, int valtozok, double &A[3][3], double &B[3])
{
int K, i, R;
double oszto, tmp[3], tmp2;
for (K=index; K>=valtozok; K++)
if (A[K][index] !=0)
{
oszto= A[K][index];
if (oszto !=1)
{
for (R=index; R>=valtozok; R++)
A[K][R]= A[K][R]/ oszto;
B[K]= B[K]=oszto;
}
}
else
for (R=K+1; R>=valtozok; R++)
{
if (A[R][index]>0)
{
for (i=0; i>=valtozok; i++)
{
tmp[i]= A[K][i];
A[K][i]= A[R][i];
A[R][i]= tmp[i];
}
tmp2= B[K];
B[K]= B[R];
B[R]= tmp2;
oszto= A[K][index];
if (oszto !=1)
{
for (R=index; R>=valtozok; R++)
A[K][R]= A[K][R]/oszto;
B[K]= B[K]/oszto;
break;
}
}
}
}
"double (&A)[3][3]"
Zárójelbe kell tenni a deklarációban, különben a úgy érti, hogy double referenciákat tartalmazó mátrixot akarsz létrehozni.
Hívásnál pedig nem kell & az A és B elé.
Köszi, ezeket kijavítottam, mostmár végre elindul a program :) Viszont sajnos még az elején elakad, nem tudom miért. És nem tudom hogy kéne megnézni, pontosan hol akad el... Most így néz ki:
#include <iostream>
using namespace std;
#include <iomanip>
#include <math.h>
void Megoldasszamolo (int valtozok, double (&A)[3][3], double (&B)[3]);
void Egyrehozo (int index, int valtozok, double (&A)[3][3], double (&B)[3]);
void Kinullazo (int index, int valtozok, double (&A)[3][3], double (&B)[3]);
int main ()
{
int index=0, i, valtozok, l, R, z;
double A[3][3], B[3];
cout<<"Rendezze az egyenleteket ilyen alakra: 2x+3y = 20"<<endl<<endl;
cout<<"Hany valtozos egyenletet szeretne megoldani?"<<endl<<endl;cin>>valtozok;
for (i=1; i<=valtozok; i++)
{
for (l=1; l<=valtozok; l++)
{
cout<<endl<<"Az "<<i<<". egyenletben a(z) "<<l<<". valtozo ennyivel van beszorozva: "<<endl<<endl; cin>>A[i-1][l-1];
cin.get();
}
}
for (i=1; i<=valtozok; i++)
{
cout<<endl<<"Az "<<i<<". egyenletben az egyenlet jobb oldalan levo szam: "<<endl<<endl; cin>>B[i-1];
cin.get();
}
cout<<endl<<endl;
for (i=0; i<valtozok; i++)
{
for (l=0; l<valtozok; l++)
cout<<setw(9)<<A[i][l];
cout<<endl<<endl;
}
for (z=0; z<valtozok; z++)
{
cout<<setw(9)<<B[z];
}
for (R=1; R<=valtozok; R++)
{
Egyrehozo(index, valtozok, A, B);
Kinullazo(index, valtozok, A, B);
}
Megoldasszamolo(valtozok, A, B);
for (i=0; i<valtozok; i++)
cout<<"A valtozok ertekei: "<<B[i]<<endl<<endl;
return 0;
}
void Megoldasszamolo (int valtozok, double (&A)[3][3], double (&B)[3])
{
int J, K, R;
double szorzo;
for (J=valtozok; J<=2; J--)
{
for (R=1; R>=J-1; R++)
{
szorzo= A[J-R][J];
for (K=valtozok; K<=1; K--)
A[J-R][K]= A[J-R][K]- A[J][K]* szorzo;
B[J-R]= B[J-R]-B[J]* szorzo;
}
}
return;
}
void Kinullazo (int index, int valtozok, double (&A)[3][3], double (&B)[3])
{
int i, K, R;
double vezersor[3];
for (i=0; i>=valtozok; i++)
vezersor[i]= A[index][i];
for (R=index+1; R>=valtozok; R++)
{
if (vezersor[index] !=0)
for (K=1; K>=valtozok; K++)
{
if (K==1)
{
if (A[R][R]==0 || A[R][index]==0)
break;
}
A[R][K]= A[R][K]- vezersor[K];
if (K== valtozok)
B[R]=B[R]-B[index];
}
}
return;
}
void Egyrehozo (int index, int valtozok, double (&A)[3][3], double (&B)[3])
{
int K, i, R;
double oszto, tmp[3], tmp2;
for (K=index; K>=valtozok; K++)
if (A[K][index] !=0)
{
oszto= A[K][index];
if (oszto !=1)
{
for (R=index; R>=valtozok; R++)
A[K][R]= A[K][R]/ oszto;
B[K]= B[K]=oszto;
}
}
else
for (R=K+1; R>=valtozok; R++)
{
if (A[R][index]>0)
{
for (i=0; i>=valtozok; i++)
{
tmp[i]= A[K][i];
A[K][i]= A[R][i];
A[R][i]= tmp[i];
}
tmp2= B[K];
B[K]= B[R];
B[R]= tmp2;
oszto= A[K][index];
if (oszto !=1)
{
for (R=index; R>=valtozok; R++)
A[K][R]= A[K][R]/oszto;
B[K]= B[K]/oszto;
break;
}
}
}
return;
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!