Tablica 2 wymiarowa macierz 3x3

0
#include <iostream>
#include <conio.h>
#include <ctime>
#include <stdlib.h>

using namespace std;

const int n=3;
int **tab;


int menu();
void wypelnij_i_pokaz(int **tab,int min, int max );

int wyznacznik(int **tab,int n);
bool symetryczna(int **tab, int n);
int suma_komorek(int **tab, int n);


////////////////////////////////////////////////////////////////////////////////////
int main()
{

	
	switch(menu())
	{
		case 1:{
			 system("CLS");
			 cout<<"Macierz 3x3"<<endl;
				wypelnij_i_pokaz(tab,1,9);
				wyznacznik(tab,n);
				
			break;
		}
		case 2:{
			wypelnij_i_pokaz(tab,1,9);
			if(symetryczna(tab,n))
			cout<<"Tablica jest symetryczna"<<endl;
			else
			cout<<"tablica jest niesymetryczna"<<endl;
			break;
		}
		case 3:{
			wypelnij_i_pokaz(tab,1,9);
		    suma_komorek(tab,n);
			break;
		}
	}
	system("pause");
}
/////////////////////////////////////////////////////////////////////////////////////
int menu(){ 
int opcja;

do{
	 
	cout<<" ============ Menu Lab 5 ============"<<endl;
	cout<<"1.Wyliczanie wyznacznika macierzy"<<endl;
	cout<<"2.Sprawdz czy macierz jest symetryczna "<<endl;
	cout<<"3.Suma wartosci komorek"<<endl;
	cout<<"======================================="<<endl<<endl;
	cout<<"wybierz warunek od 1 do 3"<<endl;
    cin>>opcja;
   }
   while(opcja<1 || opcja>3);
   return opcja;
}
////////////////////////////////////////////////////////////////////////////////////
void wypelnij_i_pokaz(int **tab,int min,int max)
{
	tab = new int*[n];  //<-------- PIERWSZY!
	srand(time(0));
	for(int i=0;i<n;i++)
	{
	tab[i] = new int[n];  //<--------------- ODWOŁANIE DO DRUGIEGO WYMIARU !
	for(int j=0;j<n;j++)
	{
	tab[i][j]=rand()%(max-min+1)+min;
	cout<<tab[i][j]<<" ";
}
	
	cout<<"\n";
}
}
////////////////////////////////////////////////////////////////
int wyznacznik(int **tab, int n)
{
	int Wyznacznik;
	
tab = new int*[n];
for(int i=0;i<n;i++)
{
	tab[i] = new int[n];
	for(int j=0;j<n;j++)
{

	 int Wyznacznik_1=(tab[0][0]*tab[1][1]*tab[2][2])+(tab[0][1]*tab[1][2]*tab[2][0])+(tab[0][2]*tab[1][0]*tab[2][1]);
    int Wyznacznik_2=(tab[2][0]*tab[1][1]*tab[0][2])+(tab[2][1]*tab[1][2]*tab[0][0])+(tab[2][2]*tab[1][0]*tab[0][1]);
    Wyznacznik=Wyznacznik_1-Wyznacznik_2;
}
}
    cout <<"\nWyznacznik macierzy wynosi "<<Wyznacznik<<".";
    return Wyznacznik;
}
/////////////////////////////////////////////////////////////////////////////////////
bool symetryczna(int **tab, int n)
{
	tab = new int*[n];
     for(int i=0; i<n; i++)
     {
     	tab[i] = new int[n];
          for(int j=0; j<n; j++)
          {
               if(tab[i][j] != tab[j][i])
               {      
                     return false;
               }   
          }   
     }
     return true;     
}
//////////////////////////////////////////////////////////////////////////////
int suma_komorek(int **tab, int n)
{
	
     int suma = 0;
     tab = new int*[n];
     for(int i=0; i<n; i++)
     {
     	 	tab[i] = new int[n];
          for(int j=0; j<n; j++)
          {
               if((i+j)%2==0)
               {      
                     suma =suma + tab[i][j];
                      
               }   
          }   
      
     }
     cout<<"suma wynosi "<<suma<<endl;
     return suma;   
}
 

Program nie chce liczyć wyznacznika, próbowałem już paru sposobów, ale zwracało wartość "0", ktoś mógłby mnie nakierować na rozwiązanie?

0

Program nie chce liczyć wyznacznika

Liczy. Dobrze jest Wyznacznik_1 i Wyznacznik_2. Ale funkcja wyznacznik() powinna wyglądać tak:

int wyznacznik(int **&tab, int n)
{
    int Wyznacznik;
 
     int Wyznacznik_1=(tab[0][0]*tab[1][1]*tab[2][2])+(tab[0][1]*tab[1][2]*tab[2][0])+(tab[0][2]*tab[1][0]*tab[2][1]);
    int Wyznacznik_2=(tab[2][0]*tab[1][1]*tab[0][2])+(tab[2][1]*tab[1][2]*tab[0][0])+(tab[2][2]*tab[1][0]*tab[0][1]);
    Wyznacznik=Wyznacznik_1-Wyznacznik_2;

    cout <<"\nWyznacznik macierzy wynosi "<<Wyznacznik<<".";
    return Wyznacznik;
} 

Tylko tyle. Zwróć uwagę jak jest przekazana tablica! Wymusza to również zmianę typu argumentu w funkcji wypelnij_i_pokaz().
A tak z ciekawości, po co Ci dynamiczna tablica skoro jej wymiar jest znany w czasie kompilacji (stała n)?

0

Do @Rekman:

  1. wyznacznik() nie potrzebuje referencji na wskaźnik.

  2. Zostawiłeś wyświetlenie wewnątrz funkcji?

  3. A po kiego tu przekazane n?

  4. Skoro rozmiar jest ten sam const int n=3; to czemu z uporem maniaka przekazujesz to do każdej funkcji?

  5. Skoro przekazujesz do funkcji int **tab to po kiego zadeklarowałeś to jaką zmienną globalną?

  6. Rozważ takie podejście:

#include <iostream>
#include <cstdio>
#include <ctime>
using namespace std;

const size_t MatrixSize=3;
typedef double Matrix[MatrixSize][MatrixSize];

void Generate(Matrix &m)
  {
   for(size_t y=0;y<MatrixSize;++y) for(size_t x=0;x<MatrixSize;++x) m[y][x]=rand()%10;
  }

void Show(const Matrix &m)
  {
   for(size_t y=0;y<MatrixSize;++y,cout<<endl) for(size_t x=0;x<MatrixSize;++x) cout<<'\t'<<m[y][x];
  }

double Det(const Matrix &m)
  {
   return
      m[0][0]*m[1][1]*m[2][2]-m[2][0]*m[1][1]*m[0][2]+
      m[0][1]*m[1][2]*m[2][0]-m[2][1]*m[1][2]*m[0][0]+
      m[0][2]*m[1][0]*m[2][1]-m[2][2]*m[1][0]*m[0][1]      
     ;
  }

int main()
  {
   srand(time(0));
   Matrix m;
   Generate(m);
   Show(m);
   cout<<"wyznacznik: "<<Det(m)<<endl;
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1