-
Notifications
You must be signed in to change notification settings - Fork 1
/
determinant.c
166 lines (138 loc) · 4.95 KB
/
determinant.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int order;
void matrix_print(int **M, int order);
/******** input **********/
void order_input(){
int flag = 0;
while(order < 1){
printf("Inserire l'ordine della matrice (interi > 1): ");
scanf("%d", &order);
if (flag)
printf("Attenzione: il valore inserito non è valido.\n");
flag = 1;
}
printf("Ordine inserito: %d\n", order);
}
void matrix_input(int ***M){
int i, j;
*M = (int **) malloc(order * sizeof(int *));
for (i = 0; i < order; i++){
(*M)[i] = (int *) malloc(order * sizeof(int));
for (j = 0; j < order; j++){
printf("Inserire valore %d,%d-esimo: ", i+1, j+1);
scanf("%d", &(*M)[i][j]);
}
printf("\n");
}
}
/*************************/
/********** determinant stuff **********/
void create_submatrix(int **M, int **submatrix, int dimension, int position){ //creates submatrix, position is the column to be excluded
int i, j, J;
for (i = 1; i < dimension; i++){ //iterates rows: starts from the second
for (j = 0, J = 0; j < dimension; j++, J++){ //iterates columns
if (!(j == position)){
submatrix[i - 1][J] = M[i][j];
}
else
J--; //is j == column, set back 1 J so that element is not copied
}
}
}
int determinant(int **M, int dimension){
/*
iterates through first row: multiplies the element by -1 if i+j is odd then multiplies the result by the determinant
of the submatrix calculated by excluding the first row and the first column. Repeats for every element of the row.
*/
int i, j, det = 0;
//allocate submatrix
int **submatrix = malloc((dimension - 1) * sizeof(int *)); //allocates submatrix
for (i = 0; i < dimension - 1; i++)
submatrix[i] = malloc((dimension - 1) * sizeof(int));
//end
if (dimension == 1)
return M[0][0];
else if (dimension == 2)
return (M[0][0] * M[1][1]) - (M[0][1] * M[1][0]); //2x2 matrix: det = ad - bc
else{
for (i = 0; i < dimension; i++){ //scorre le righe della matrice M
for (j = 0; j < dimension; j++){ //scorre le colonne
create_submatrix(M, submatrix, dimension, j); //crea una sottomatrice
det += M[i][j] * pow(-1, j) * determinant(submatrix, dimension - 1);
}
}
}
free(submatrix);
return det;
}
/***************************************/
/*********** printing functions *******/
void print_matrix(int **M, int order){ //simple format version
int i, j;
for (i = 0; i < order; i++){
for (j = 0; j < order; j++)
printf("%d ", M[i][j]);
printf("\n");
}
printf("\n");
}
void matrix_print(int **M, int order){ //cuter format
int i, j, t, sum, max = 0, space;
//allocates array that will contain every elemnts length (as in digits), has form array[rows][columns]
int **array = malloc((order + 1) * sizeof(int *));
for (i = 0; i < order + 1; i++){
array[i] = malloc((order) * sizeof(int)); //element with most digits has its length stored in last block, used later for spacing, hence the order + 1
if (i == order)
for (j = 0; j < order; j++)
array[order][j] = 0; //setting element with most digits to 0
}
//calculates all elements length and stores them in allocated matrix, then stores longest of column in last block
for (i = 0; i < order; i++){
for (j = 0; j < order; j++){
sum = 0;
t = M[j][i];
if (t <= 0){
t = -t;
sum++;
}
while (t > 0){
t /= 10;
sum++;
}
array[j][i] = sum; //sum is number of element's digit
if (sum > array[order][i])
array[order][i] = sum;
}
max += array[order][i];
}
printf(" _ ");
printf("%*s", max+order, ""); //prints max+order spaces
printf("_\n");
for (i = 0; i < order; i++){
if (i != order -1) printf("| ");
else printf("|_");
for (j = 0; j < order; j++){
space = array[order][j] - array[i][j]; //adds space such that all digits of a column are spaced as the longest + 1
printf(" %d", M[i][j]);
printf("%*s", space, "");
if (i == order - 1 && j == order - 1){
}
}
if (i != order - 1 && j != order - 1) printf(" |");
else printf(" _|\n");
printf("\n");
}
}
int main(){
int det, **M;
order_input();
matrix_input(&M);
//print_matrix(M, order);
matrix_print(M, order);
det = determinant(M, order);
printf("Determinant of input matrix is: %d\n\n", det);
free(M);
return 0;
}