POTREBUJEM DOROBIT DETERMINANT A INVERZNU MATICU
Kód: Vybrať všetko
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void vypisMaticu(int ***pole, int index, int rozmer);
void nacitajMaticu(int ***pole, int index, int rozmer);
void nasobMatice(int ***pole, int index_1, int index_2, int index_vysl, int rozmer);
void scitajMatice(int ***pole, int index_1, int index_2, int index_vysl, int rozmer);
void odcitajMatice(int ***pole, int index_1, int index_2, int index_vysl, int rozmer);
int sum_hlav_diag(int ***pole, int index, int rozmer);
int Determinant(int ***pole, int index, int rozmer);
int main(int argc, char *argv[])
{
int rozmer=2, ***pole = NULL, i, j, l_index, r_index, result_index;
char operacia, l_operator, r_operator, result_operator, matica;
int volba,vypis,n;
pole = (int ***)malloc(sizeof(int **) * 26); // AlOKACIA
for (i = 0 ; i < 26; i++) {
pole[i] = (int **)malloc(sizeof(int *) * rozmer);
for (j = 0; j < rozmer; j++)
pole[i][j] = (int *)malloc(sizeof(int) * rozmer); }
do {
printf("Volba:\n\n");
printf("1. Nacitaj maticu z klavesnice\n");
printf("2. Pocitaj matice\n");
printf("3. Vypis maticu\n");
printf("4. Determinant\n");
printf("5. Koniec\n");
scanf("%i", &volba);
switch (volba)
{
case 1:
printf("Zadaj index matice (A-Z): \n");
scanf("\n%c",&matica);
n = (int)matica - 65;
nacitajMaticu(pole,n,rozmer);
break;
case 2:
// ZADANIE OPERACIE
printf("Zadaj operaciu (napr. A * B , A + B , A - B):\n");
scanf("\n%c %c %c", &l_operator, &operacia, &r_operator);
l_index = (int)l_operator - 65;
r_index = (int)r_operator - 65;
printf("Zadaj do ktorej matice sa ma uskutocnit zapis:\n");
scanf("\n%c", &result_operator);
result_index = (int)result_operator - 65;
// VYKONANIE
switch (operacia)
{
case '+': scitajMatice(pole,l_index,r_index,result_index,rozmer);
break;
case '*': nasobMatice(pole,l_index,r_index,result_index,rozmer);
break;
case '-': odcitajMatice(pole,l_index,r_index,result_index,rozmer);
break;
default: printf("Neznama operacia!!!\n");
}
break;
case 3: printf("Zadaj index matice (A-Z): ");
scanf("\n%c",&matica);
n = (int)matica - 65;
vypisMaticu(pole,n,rozmer);
break;
case 4: printf("Determinant matice (A-Z): \n");
scanf("\n%c",&matica);
n = (int)matica - 65;
Determinant(pole,n,rozmer);
break;
case 5: system("pause");
return 0;
break;
default: printf("Chyba!!!\n");
}
} while(volba != 5);
system ("pause");
return 0;
}
int sum_hlav_diag(int ***pole, int index, int rozmer)
{
int i,j, x=0;
for (i=1; i<rozmer; i++)
for (j=i+1; j<rozmer; j++)
if ( pole[index][i][j] != pole[index][j][i] ) x++;
if (x) return 0;
else return 1;
}
void scitajMatice(int ***pole, int index_1, int index_2, int index_vysl, int rozmer) // SCITANIE FUNGUJE DOBRE
{
int i,j;
for (i=0; i<rozmer; i++)
for (j=0; j<rozmer; j++)
pole[index_vysl][i][j] = pole[index_1][i][j] + pole[index_2][i][j];
}
void odcitajMatice(int ***pole, int index_1, int index_2, int index_vysl, int rozmer) // ODCITANIE FUNGUJE DOBRE
{
int i,j;
for (i=0; i<rozmer; i++)
for (j=0; j<rozmer; j++)
pole[index_vysl][i][j] = pole[index_1][i][j] - pole[index_2][i][j];
}
void nasobMatice(int ***pole, int index_1, int index_2, int index_vysl, int rozmer) // NASOBENIE NEFUNGUJE
{
int i,j,k;
for (k=0; k<rozmer; k++)
for (j=0; j<rozmer; j++)
for (i=0; i<rozmer; i++)
pole[index_vysl][k][j] += pole[index_1][k][i] * pole[index_2][i][j];
}
void nacitajMaticu(int ***pole, int index, int rozmer)
{
int i,j;
char c = (char)(index + 65);
printf("Zadaj maticu %c: ", c);
printf("\n");
for (i=0; i<rozmer; i++)
for (j=0; j<rozmer; j++)
scanf("%d", &pole[index][i][j]);
}
void vypisMaticu(int ***pole, int index, int rozmer)
{
int i, j;
char c = (char)(index + 65);
printf("Matica %c:\n", c);
for (i=0; i<rozmer; i++)
{
for (j=0; j<rozmer; j++)
printf("%d\t", pole[index][i][j]);
printf("\n");
}
}
int Determinant(int ***pole, int index, int rozmer) // VSTUPOM CHCEM ABY BOL INDEX MATICE (0-25) A ROZMER (TEN JE FIXNY)
{
int i,j,j1,j2;
int det = 0;
int **m = NULL;
char c = (char)(index + 65);
if (rozmer < 1) {
} else if (rozmer == 1) {
det = pole[index][0][0];
} else if (rozmer == 2) {
det = pole[index][0][0] * pole[index][1][1] - pole[index][1][0] * pole[index][0][1];
} else {
det = 0;
for (j1=0; j1<rozmer; j1++) {
m = malloc((rozmer-1)*sizeof(int *));
for (i=0; i<rozmer-1; i++)
m[i] = malloc((rozmer-1)*sizeof(int));
for (i=1;i<rozmer;i++) {
j2 = 0;
for (j=0;j<rozmer;j++) {
if (j == j1)
continue;
m[i-1][j2] = pole[index][i][j];
j2++;
}
}
det += pow(-1.0,1.0+j1+1.0) * pole[index][0][j1] * Determinant(pole,index,rozmer-1);
for (i=0;i<rozmer-1;i++)
free(m[i]);
free(m);
}
}
printf("Determinant %c: %i\n",c,det);
return (det);
}