sobota, Styczeń 17th, 2009

PHP: Szukamy sumy i NWD

Poproszono mnie o napisanie, prostej aplikacji, której działanie miało by polegać na analizie pliku wejściowego, którego linia miała by następującą składnie „liczba1 liczba2 … liczbaN”, z dowolną ilością linii o właśnie takiej składni. Celem aplikacji było by zsumowanie wszystkich składników danej linii i zapisanie sum w analogicznym pliku wyjściowym suma.txt, lub znalezienie NWD składników z każdej linii i również zapisanie ich w analogicznym pliku nwd.txt.

Opis rozwiązania

Problem nie jest skomplikowany, a jego rozwiązanie sprowadza się do kilku lini kodu.

W moim przypadku, pobrałem całą zawartość pliku input.txt, następnie korzystając z funkcją explode, zapisałem kolejne linie pliku do tablicy, oraz kolejne liczby z tablicy, oddzielone spacją zapisałem do tablicy dwuwymiarowej. Tym prostym sposobem, otrzymałem tablicę dwuwymiarową (ilość liczb w wierszu, może być różna) wyglądającą mniej, więcej tak:

linia1liczba1 linia1liczba2 … linia1liczbaN

linia2liczba1 linia2liczba2 … linia2liczbaN

…………………………………………………………

liniaNliczba1 liniaNliczba2 … liniaNliczbaN

Następnie zastosowałem proste algorytmy, aby w tablicy suma i nwd, znalazły się poszukiwane przez nas wyniki, które omówione są w komentarzach do kodu.

Całość trafia do pliku wyjściowego, dla sumy:

suma1linii

suma2linii

……………

sumaNlinii

oraz analogicznie dla NWD:

nwd1linii

nwd2linii

…………

nwd3linii

Kod

<html><head><META http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body>

<form method="post">
<select name="tryb">
<option value="suma"> Zsumuj wiersze</option>
<option value="nwd"> Znajdź największy wspólny dzielnik w wierszach</option>
</select>
<input type="submit" value="Start" />
</form>

<?PHP if (file_exists("input.txt")) { ?>
<a href="input.txt">input.txt</a>
<?PHP } ?>
<?PHP if (file_exists("suma.txt")) { ?>
<a href="suma.txt">suma.txt</a>
<?PHP } ?>
<?PHP if (file_exists("nwd.txt")) { ?>
<a href="nwd.txt">nwd.txt</a>
<?PHP } ?>

<?PHP

$rows_array = explode("\n",file_get_contents("input.txt")); // powstanie nam tablica z wierwszami z pliku input.txt

foreach ($rows_array as $key => $value)
{
$row[$key] = explode(" ",$value); // Powstanie tablica 2 wymiarowa ( 1szy wymiar - numer wiersza, 2gi wymiar - element wiersza )
}

for ( $i=0; $i < count($row); $i++ ) // będziemy sprawdzać kolejne wiersze
{
// NWD
// przykład algorytmu NWD: bierzemy dowolny element z wiersza i sprawdzamy czy nie jest dzielnnikiem,
// jeżeli nie jest schodzimy w dół o jeden, aż znajdziemy dzielenie wszystkich elementów bez reszty ( dzielenie modulo )
$nwd[$i] = $row[$i][0];

$szukam_dzielnik = true;

while ( $szukam_dzielnik )
{
$wynik = 0;

for ( $b=0; $b < count($row[$i]); $b++ )
{
$wynik += ($row[$i][$b] % $nwd[$i]);
}

$nwd[$i]--; // dekrementacja

if ( $wynik == 0 ) // brak dzielenia z reszty - znaleźliśmy NWD szukając od góry
{
$szukam_dzielnik = false;
$nwd[$i]++;
}
}

// SUMA
for ( $b=0; $b < count($row[$i]); $b++ )
{
$sum[$i] += $row[$i][$b]; // tablica suma będzie miała sumę kolejnych wierszy
}
}

if ( $_POST['tryb'] == "suma" )
{
$wynik = "";
foreach ( $sum as $value )
{
$wynik .= $value."\n"; // Z Tablicy sum wpisujemy do zmiennej wynik kolejne wiersze zakańczając je znakiem nowej lini
}

// ZAPIS DO PLIKU - WYMAGA UPRAWNIEŃ NA SERWERZE CHMOD 666 lub 777 gdyby nie działało
file_put_contents("suma.txt",$wynik);
// KONIEC ZAPISU
}

if ( $_POST['tryb'] == "nwd" )
{
$wynik = "";
foreach ( $nwd as $value )
{
$wynik .= $value."\n"; // Z Tablicy sum wpisujemy do zmiennej wynik kolejne wiersze zakańczając je znakiem nowej lini
}

// ZAPIS DO PLIKU - WYMAGA UPRAWNIEŃ NA SERWERZE CHMOD 666 lub 777 gdyby nie działało
file_put_contents("nwd.txt",$wynik);
// KONIEC ZAPISU
}

?>

</body></html>
Be Sociable, Share!

Kategorie: php
Możesz śledzić komentarze do tego wpisu poprzez kanał RSS 2.0. Możesz również napisać własny komentarz, lub umieścić odnośnik do tego wpisu, na swojej stronie.

Jeden komentarz

Trackback

  • *

    Spam Protection by WP-SpamFree