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>
W odpowiedzi na “PHP: Szukamy sumy i NWD”
[…] the original: PHP: Szukamy sumy i NWD Related ArticlesBookmarksTags amfphp: setup: part 1 … or both the Flex and PHP side and […]