Vždycky mě štvalo, když jsem seděl u počítače a potřeboval něco spočítat, že jsem si musel brát k ruce kalkulačku CASIO, protože program Kalkulačka, co je součástí Windows, resp. kcalc který je součástí KDE, je typickou ukázkou neergonomické aplikace. Pokud má počítač klávesnici se 104 tlačítky, je přinejmenším hloupé kalkulačku realizovat jako aplikaci se soft-buttony, do kterých se uživatel musí trefovat myší. Navíc každý trochu složitější výraz se díky absenci funkce závorek počítá poměrně obtížně a jedna paměťová buňka je mnohdy málo. Proto jsem kdysi dávno, na Vánoce 2004, jako semestrální úlohu z předmětu Algoritmizace, naprogramoval Kalkulátor v jazyku Java. Číst dále...
#define MAX_R 10Program je napsán v C99 a díky staticky definovaným polím je extrémně paměťově náročný a minimálně škálovatelný.:) Podstata řešení spočívá v postupném zjednodušování problému až na úkol spočítat determinant matice 1x1, kterýžto je roven hodnotě jediného prvku matice. Všechny větší matice jsou podle prvního řádku rozloženy na menší a menší.
#include <stdio.h>
double determinant(double matice[MAX_R][MAX_R], int rozmer) {
double det=0;
double submatice[MAX_R][MAX_R];
if (rozmer<1) return 0;
if (rozmer==1) return matice[0][0];
// rozklad podle prvniho radku
for (int i=0; i<rozmer; i++) {
//vypocet submatice
for (int u=0; u<rozmer-1; u++)
for (int v=0; v<rozmer-1; v++)
submatice[u][v]=matice[u+1][v<i?v:v+1];
det += (i%2?1:-1)*matice[0][i ]*determinant(submatice, rozmer-1);
}
return det;
}
int main() {
double pole[MAX_R][MAX_R]={{1,-2,1,2,4},{3,0,-1,1,-3},{2,2,2,3,5},{-2,-2,0,5,-2},{-2,3,-1,0,-2}};
double det;
det=determinant(pole,5);
printf("Determinant je %f \n", det);
return 0;
}