#include <stdio.h>
#include <math.h>
#define N 3
#define EPSILON 0.00001
void input_matrix(double m[][N]) {
int i, j;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++) {
printf("%d-%d: ", i, j);
scanf("%lf", &m[i][j]);
}
}
void dump_matrix(double m[][N]) {
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("%.2f ", m[i][j]);
putchar('\n');
}
putchar('\n');
}
int calc_rank(double m[][N]) {
int k, i, j;
double max, tmp;
int max_idx;
for (k = 0; k < N; k++) {
/* pivot */
max_idx = k;
max = fabs(m[k][k]);
for (i = k; i < N; i++)
if (fabs(m[i][k]) > max) {
max_idx = i;
max = m[i][k];
}
if (fabs(max) < EPSILON)
return k;
for (i = k; i < N; i++) {
tmp = m[k][i];
m[k][i] = m[max_idx][i];
m[max_idx][i] = tmp;
}
/* forward */
for (i = k + 1; i < N; i++) {
for (j = k + 1; j < N; j++)
if (fabs(m[i][k]) > EPSILON)
m[i][j] = m[k][k] / m[i][k] * m[i][j] - m[k][j];
m[i][k] = 0.0;
/* dump_matrix(m); */
}
}
return k;
}
int main() {
double m[N][N];
input_matrix(m);
printf("rank: %d\n", calc_rank(m));
return 0;
}
/* end */