<?php
//űrlap, a mátrix méret megadására
function row_number()
{
$form =
"<form action=\"\" method=\"get\">\n".
"<div align=\"center\">\n".
"<input type=\"text\" name=\"rows\" size=\"5\" />".
"<input type=\"submit\" value=\"Indít\" />".
"</div>\n".
"</form>\n";
return $form;
}
//érvényes szám -e a szám
function valid_number($number,$maxnum = null)
{
if(substr($number,0,1) == '-') { $number = 0-$number;
}
if(((isset($valid[0]) and
$valid[0] == $number) and
strlen($number) > 0) or
($number < 0 and
substr($number,1) == $valid[0])) { if($maxnum !== null) {
if(!valid_number($maxnum) or $maxnum < $number ) {
return false;
} else {
return true;
}
}
return true;
}
return false;
}
function matrix_mutat
($matrix,$params = array()) {
$style = " background: #FF0000; color: #FFFFFF; ";
if(isset($params['rows'])) { $row1 = $params['rows'][0];
$row2 = $params['rows'][1];
} else {
$row1 = $row2 = 0;
}
$ret = "<table align=\"center\" border=\"1\" cellspacing=\"0\" cellpadding=\"3\">\n";
foreach($matrix as $rkey=>$row) {
$ret .= "<tr>\n";
foreach($row as $ckey => $field) {
if($row1 != $rkey and $row2 != $rkey) { $style1 = ''; } else { $style1 = $style; }
$ret .= "\t<td style=\"$style1 width: 50px; height: 50px; text-align: center;\">".round($field,2)."</td>"; }
$ret .= "</tr>\n";
}
$ret .= "</table>";
return $ret;
}
function sorcsere_mutat($matrix,$i,$j)
{
$ret =
"<div align=\"center\">$i. és $j. sor cseréje<br />".
"Ilyenkor a determináns negatívra változik, amit az eredménynél figyelembe veszünk!".
"</div>";
$ret .= matrix_mutat
($matrix,array('rows'=>array($i,$j))); return $ret;
}
//A mátrix táblázat létrehozása
function input_form($rows) {
$form =
"<form action=\"\" method=\"post\">\n".
"<div align=\"center\">\n".
"<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n";
//sorok
for($i=1; $i<=$rows; $i++) {
$form .= "<tr>\n";
//cella
for($j=1; $j<=$rows; $j++) {
$value = (isset($_POST['det'][$i][$j])) ?
$_POST['det'][$i][$j] : ""; $form .= "\t<td>";
$form .=
"<input type=\"text\" name=\"det[$i][$j]\" value=\"$value\"".
" style=\"width: 50; height: 50; text-align: center; line-height: 50px;\" valign=\"middle\"".
" />";
$form .= "</td>\n";
}
$form .= "</tr>\n";
}
$form .=
"<tr><td colspan=\"$rows\" align=\"center\"><input type=\"submit\" value=\"Számolás\" /></td></tr>".
"</table>\n".
"</div>\n".
"</form>\n";
return $form;
}
function sorcsere($matrix, $sor1,$sor2)
{
// return $matrix;
$uj_sor2 = $matrix[$sor1];
$matrix[$sor1] = $matrix[$sor2];
$matrix[$sor2] = $uj_sor2;
return $matrix;
}
//mátrix determinánsának számolása
function szamol($rows)
{
$elojel = 0;
$det_mat = 1;
//Végigmegyünk a sorokon
for($i=1; $i<=$rows; $i++) {
$if_rows_not_null = 0;
//Minden sorban végimegyünk a mezőkön
for($j=1; $j <= $rows; $j++) {
//Ha a az adott indexű post adat nincs be van állítva, vagy a benne lévő szám nem érvényes visszatérés hamissal
if(!isset($_POST['det'][$i][$j]) or
!valid_number
($_POST['det'][$i][$j],MAXNUM_FIELD
)) { return false;
}
//az első sorban ha az adott mező értéke 0
if($i == 1 and $_POST['det'][1][$j] == 0) {
$if_cols_not_null = 0;
//végimegy az adott oszlopon,
for($k=2; $k <= $rows; $k++) {
//és ha az adott indexű post nem létezik, vagy nem érvényes szám az értéke visszatér hamissal
if(!isset($_POST['det'][$i][$j]) or
!valid_number
($_POST['det'][$i][$j],MAXNUM_FIELD
)) { return false;
}
//az oszlop mezői értékének összeadása, hogy megállapítsuk mind 0-e
$if_cols_not_null += abs($_POST['det'][$k][$j]); }
//ha minden értéke 0, a determináns is 0
if(!$if_cols_not_null) { return 0; }
}
//a sorban levő értékek összedása, hogy megállapítsuk az összes értéke 0-e
$if_rows_not_null += abs($_POST['det'][$i][$j]); }
//ha a sor összes értéke 0, a determináns is 0
if(!$if_rows_not_null) { return 0;}
}
/******* nulla sor és nulla oszlop ellenőrzés eddig ********/
/* felső háromszög mátrix-ra alakítás */
$matrix = $_POST['det'];
//végigmegy a főátlón
for($j=1; $j < $rows; $j++) {
//ha a mező értéke 0,
if($matrix[$j][$j] == '0') {
//végignézi az oszlopot
for($i=$j+1; $i<=$rows; $i++) {
//Az első nem 0 elemmel kezdődő sorra lecseréli az aktuáli sort
if($matrix[$i][$j] != '0') {
$matrix = sorcsere($matrix,$j,$i);
print sorcsere_mutat($matrix,$i,$j);
$elojel = ($elojel) ? 0 : 1;
break;
}
}
}
/*****************************************/
//végigmegy az adott oszlopon
for($i=$j+1; $i<=$rows; $i++) {
//Kiszámítja a szorzó állandót
$konst = @($matrix[$i][$j] / $matrix[$j][$j]);
print "<div align=\"center\">$i.sor elemeiből kivonjuk a $j. sorban levő elemek (".round($matrix[$i][$j],2)." / ".round($matrix[$j][$j]).") szeresét</div>"; for($k=$j; $k <= $rows; $k++) {
//beállítja az adott mező értékét
$matrix[$i][$k] -= $matrix[$j][$k] * $konst;
}
print matrix_mutat($matrix);
}
}
//A felső háromszög mátrix főátlója elemeinek összeszorzása => a determináns meghatározása
print "<div align=\"center\">A főátló elemeit összeszorozzuk és megkapjuk a determinánst</div>";
for($i=1; $i<=$rows; $i++) {
$det_mat *= $matrix[$i][$i];
}
if($elojel) { $det_mat = 0-$det_mat; }
//visszatérési érték a mátrix determinánsa
return $det_mat;
}
if(!isset($_GET['rows']) or
!valid_number
($_GET['rows'],MAXNUM_ROWS
)) { print (isset($_GET['rows'])) ?
'<div align="center">Max '.MAXNUM_ROWS
.' * '.MAXNUM_ROWS
.' méretű mátrixot számolhatsz!</div>' : ''; print '<div align="center">Add meg a mátrix sorainak (oszlopainak) számát</div>';
print row_number();
} else {
print '<div align="center"><a href="'.$_SERVER['PHP_SELF'].'">Új determináns számítása</a></div>';
print input_form($_GET['rows']);
}
if(isset($_POST['det']) and
($det_mat = szamol
(count($_POST['det']))) !== false ) { print "<div align=\"center\"> A determináns = \"$det_mat\"</div>";
//print matrix_mutat($_POST['det'],array('rows'=>array(1,3)));
} else if(isset($_POST['det'])) { print "<div align=\"center\">A mátrix elemei csak számok lehetnek, és nem lehetnek nagyobbak mint: ".MAXNUM_FIELD."</div>";
}
?>