Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Prosty skrypt liczącv średnią
Forum PHP.pl > Forum > Przedszkole
Xiviss
Witam, miałbym prośbę o napisanie króciutkiego skryptu, który:
Liczy średnią arytmetyczną wszystkich dodatnich elementów tablicy.

Chciałbym także, by było to napisane prostym językiem, oparte o proste formułki, najlepiej takie znajdujące się w dziale podstawy.
http://www.php.rk.edu.pl/w/p/podstawy-php/ - link.

Być może wydaje się to banalne, ale lekcje z programowania zacząłem dopiero w tym roku szkolnym, a chciałbym mieć możliwość przeanalizowania tresci takiego prostego skrypciku, który był jednym z kilku na sprawdzianie, który muszę poprawić.
Kshyhoo
Cytat(Xiviss @ 15.12.2014, 18:42:29 ) *
Witam, miałbym prośbę o napisanie króciutkiego skryptu, który:
Liczy średnią arytmetyczną wszystkich dodatnich elementów tablicy.

Chciałbym także, by było to napisane prostym językiem, oparte o proste formułki, najlepiej takie znajdujące się w dziale podstawy.
http://www.php.rk.edu.pl/w/p/podstawy-php/ - link.

Być może wydaje się to banalne, ale lekcje z programowania zacząłem dopiero w tym roku szkolnym, a chciałbym mieć możliwość przeanalizowania tresci takiego prostego skrypciku, który był jednym z kilku na sprawdzianie, który muszę poprawić.

Nie odrabiamy zadań domowych, to Forum chcących się czegoś nauczyć. Pracuj samodzielnie a z problemami wróć. Zamykam...

EDIT: zmieniam decyzję, otwieram wątek... Ale nie ma tak lekko:

  1. // tablica
  2. $t[]=1;
  3. $t[]=3;
  4. $t[]=5;
  5. $t[]=6;
  6.  
  7. $ile = count($t);
  8. for ($i= ; $i< ; $i )
  9. $suma += $t[$i];
  10. echo $suma / $ile;

W pętli for brakuje treści, to Twoje zadanie...

PS: Jak ktoś da gotowca, ma bana na rok wink.gif
Xiviss
No dzięki, lepsze to niż nic.
Teraz tylko muszę przeglądnąć cały dział podstawy, tak z 2 - 3 godziny i myślę, że dojdę czego tu brakuje. biggrin.gif
Kshyhoo
No chyba pętlę FOR kumasz?
Xiviss
No niestety nie.
Nie rozumiem, czym jest zmienna $i, toż to nigdzie nie jest zdefniowane ;///
Jedynym materiałem, w oparciu o który próbuje pojąć tę pętlę jest przykład zawarty tutaj:
http://www.php.rk.edu.pl/w/p/instrukcje-warunkowe/
mniej więcej na końcu artykułu jest podobny przykład pętli FOR, ale nie jestem w stanie przerobić go tak, by działało w oparciu o wartości elementów tablicy.
Wgl, jak dla mnie, kompletnie zielonego, te przykłady nie są dostatecznie dobrze opisane co, jak, dlaczego i w jaki sposób działa.
Kshyhoo
No przecież to proste: wystarczy zsumować w pętli dane z tablicy i podzielić przez ilość elementów tablicy. Jak działa FOR zapewne wiesz. Zawiera 3 składniki: w pierwszym musisz zacząć od czegoś (pewnie od 0); w drugim dać jakiś warunek, żeby pętla liczyła; w trzecim zwiększyć licznik - tak łopatologicznie. Reasumując, pętla powinna wyglądać:
  1. for ($i=0; $i<[*];$ i++)

W miejsce [*] musisz coś wstawić, więcej nie dostaniesz...
Xiviss
  1. <?php
  2. // tablica
  3.  
  4. $t[]=1;
  5. $t[]=-3;
  6. $t[]=5;
  7. $t[]=-6;
  8.  
  9. $ile = count($t);
  10. for ($i=0; $i<[*]; $i++)
  11. $suma += $t[$i];
  12. echo $suma / $ile;
  13. ?>

Ale czy to na pewno dobrze liczy?
Bo widzę, że count($t) zlicza calkowita ilosc elementów, w tym te, których wartości są ujemne (sam teraz je przemianowałem, bo w Twojej tablicy wszystkie wartosci były dodatnie).
Czyli w takim w/w przypadku skrypt dzieliłby sumę wartości przez 4, zamiast 2. (bo w zamyśle skrypt ma liczyć średnią wszystkich elementów dodatnich, czyli w przypadku, gdy tablica ma 4 elementy, w tym 2 o wartościach dodatnich, skrypt sumuje wartości tych 2 dodatnich elementów i ma dzielić przez 2).
No chyba, że to ja zle rozumiem w takim wypadku pojęcie sredniej arytmetycznej.

No i sprawa druga, jak dla mnie to w miejscu tego znicza [*] powinna stać 0, a sam znak wiekszosci powinien mieć inny zwrot ">" zamiast "<".
Na podstawie tego co Napisales wczesniej, dla mnie logicznym jest ze druga formułka powinna wyglądać $i>0, co w moim zamysle ma oznaczac, ze petla wykonuje operacje dla kazdego elementu wiekszego od 0.
Jeśli jest inaczej to sam na pewno do tego nie dojdę. :/

Pozdrawiam.
Kshyhoo
Źle myślisz. Powinna się tam znaleźć zmienna, która zawiera pewną wartość. No bo przecież kiedyś ta pętla musi się zatrzymać. Widać nie znasz zasady działania pętli FOR... proponuję od tego zacząć.
Xiviss
No ok, zamiast znicza dalem zmienna $ile.
Tylko w takim wypadku sumuje mi wszystkie elementy, w tym te ujemne i otrzymuje 3.
Wtedy dzieli przez 4 i wychodzi wynik -0,75, czyli dalej cos jest nie tak.
Kshyhoo
1 - 3 + 5 - 6 = -3
Otrzymujesz -3 a nie +3.
-3 / 4 = -0,75
Co jest źle?
Xiviss
No to jest zle, ze ten skrypt ma dodawac do siebie tylko dodatnie wartosci tablicy i dzielic przez ilosc tych dodatnich elementów.
Podczas gdy teraz ten skrypt sumuje wszystkie wartosci i dzieli przez ilosc wszystkich elementów, w tym też tych, których wartości są ujemne.
A i moj błąd, w poprzednim poscie napisalem 3 zamiast -3
Kshyhoo
No słuchaj, dostałeś niemal gotowca i jeszcze wybrzydzasz? Nie znasz pętli FOR, i jak się okazuje, nie znasz też instrukcji IF... Czy tak trudno dać jeden warunek?
Xiviss
Ja na prawde nie wybrzydzam, po prostu dla mnie wplecienie kazdego jednego warunku, funkcji to mordęga.
Tutaj mam jakis warunek, ale to nie dziala, wywala jakis error.

Staram się to jakoś ogarnąć, ale dla mnie to wszystko to czarna magia.

  1. <?php
  2. // tablica
  3.  
  4. $t[]= 1;
  5. $t[]= -3;
  6. $t[]= 5;
  7. $t[]= -6;
  8.  
  9. IF ($t[]>0)
  10. {
  11. count($t) as $ile;
  12. }
  13. for ($i=0; $i<$ile; $i++)
  14. $suma += $t[$i];
  15. echo $suma / $ile;
  16. ?>
Kshyhoo
Podpowiem: Jeżeli element tablicy jest większy od zera... Chyba umiesz napisać to w PHP?
Rysh
Cytat(Xiviss @ 15.12.2014, 20:56:26 ) *
No to jest zle, ze ten skrypt ma dodawac do siebie tylko dodatnie wartosci tablicy i dzielic przez ilosc tych dodatnich elementów.
Podczas gdy teraz ten skrypt sumuje wszystkie wartosci i dzieli przez ilosc wszystkich elementów, w tym też tych, których wartości są ujemne.
A i moj błąd, w poprzednim poscie napisalem 3 zamiast -3

  1. <?php
  2.  
  3. $liczby = array(-2, -5, 6, 12);
  4. $suma = 0;
  5. $ilosc = 0;
  6.  
  7. function srednia($array) {
  8. foreach($array as $liczba) {
  9. if($liczba > 0) {
  10. $suma += $liczba;
  11. $ilosc++;
  12. }
  13. }
  14. return $liczba/$ilosc;
  15. }
  16.  
  17. echo srednia($liczby);
  18.  
  19. ?>
Kshyhoo
@Rysh, jak się mają uczyć, ja dajesz gotowce?
Xiviss
O mateczko, w dalszym ciągu to jest zle biggrin.gif
Wynik jest równy 6, kiedy powinien byc 9.
fastlone
Cytat(Xiviss @ 15.12.2014, 21:48:43 ) *
O mateczko, w dalszym ciągu to jest zle biggrin.gif
Wynik jest równy 6, kiedy powinien byc 9.

Przejrzyj to, co wysłał Ci Rysh, jeśli znasz odrobinę angielskiego (chodzi mi głównie o magiczne słowo "return") to powinieneś się zorientować, co tam jest nie tak...
Xiviss
Tak, wychodzi na to, że jestem upośledzony, bo ja nie widze w samym słowie return nic nadzwyczajnego.
Będę musiał po prostu zapytać nauczyciela, jak to powinno wyglądać, bo już nie mam pomysłów
Rysh
Cytat(Kshyhoo @ 15.12.2014, 21:40:22 ) *
@Rysh, jak się mają uczyć, ja dajesz gotowce?

Niemogłem wytrzymać smile.gif Pozatym ten przykład można rozwiązać na kilka sposobów, pokazaliśmy mu dwa. Kolega dalej niełapie, więc nie wiem jak mu to prościej wytłumaczyć.

Cytat(Xiviss @ 15.12.2014, 22:23:20 ) *
Tak, wychodzi na to, że jestem upośledzony, bo ja nie widze w samym słowie return nic nadzwyczajnego.
Będę musiał po prostu zapytać nauczyciela, jak to powinno wyglądać, bo już nie mam pomysłów

Powinno wyglądać, tak jak Ci napisałem wyżej.
Kshyhoo
@Xiviss: Bo jesteś leń i nie chce Ci się myśleć. W skrypcie jest błąd, zapewne celowo, żebyś nauczył się myśleć a nie czekał na gotowe.
Pomyśl, czy to: $liczba/$ilosc; na na pewno jest to, o co chodzi? Skoro $liczba trzyma wartość tablicy, zresztą ostatnią... to podzielone przez ilość elementów tablicy nie da dobrego wyniku. Musisz tam podstawić inną zmienną, która będzie zawierała sumę dodatnich elementów tablicy. Tak trudno to skumać?
Rysh
Dałem kod niesprawdzając, czy działa tak jak należy - jak widać pomyliłem się przy samym końcu smile.gif
Kshyhoo
Ale wyszło na dobre, bo okazuje się, że autor wątku czeka na gotowca. Miałem rację zamykając ten wątek.
Xiviss
musi być $suma/$ilosc tak?
Tylko teraz juz wgl nic nie wyswietla na ekranie, cos zem rozwalil przy okazji
Kshyhoo
Tak ciężko na nowo wklepać skrypt, podmieniając jedną zmienną?
Xiviss
  1. <?php
  2.  
  3. $liczby = array(-2, -5, 6, 12);
  4. $suma = 0;
  5. $ilosc = 0;
  6.  
  7. function srednia($array) {
  8. foreach($array as $liczba) {
  9. if($liczba > 0) {
  10. $suma += $liczba;
  11. $ilosc++;
  12. }
  13. }
  14. return $suma/$ilosc;
  15. }
  16.  
  17. echo srednia($liczby);
  18.  
  19. ?>


Tak w końcu zadziałało, ale szczerze niewiem jakim prawem. Te całe return to w sumie niewiem po co, ale coś robić chyba musi.
No dzięki wszystkim za pomoc, ale szczerze to teraz nabrałem tylko większych wątpliwości czy uda mi sie zdać.
Mam poprawic pierwszy sprawdzian, kiedy my już mamy model MVC. Będzie bieda
sazian
Wróćmy do tego co sam wykombinowałeś
Cytat(Xiviss @ 15.12.2014, 21:14:27 ) *
  1. <?php
  2. // tablica
  3. $t[]= 1;
  4. $t[]= -3;
  5. $t[]= 5;
  6. $t[]= -6;
  7.  
  8. IF ($t[]>0)
  9. {
  10. count($t) as $ile;
  11. }
  12. for ($i=0; $i<$ile; $i++)
  13. $suma += $t[$i];
  14. echo $suma / $ile;
  15. ?>


kod wykonuje się linijka po linijce
ten kod
  1. $t[]= 1;
  2. $t[]= -3;
  3. $t[]= 5;
  4. $t[]= -6;

powoduje przypisanie do zmiennej wybranych wartości - i z tego co widzę to to jest już dla Ciebie jasne, ale żeby lepiej to zobaczyć proponuję po tym dodać var_dump($t);

dalej masz instrukcję if czyli "jeżeli", w nawiasach podajesz warunek. Teraz zobacz na swój warunek $t[]>0 pytasz czy element tablicy jest jest większy od zera, ale który element ? w nawiasach kwadratowych musisz podać "identyfikator"/adres komórki tablicy. Inaczej php nie wie o który element pytasz.

dalej count($t) as $ile; jeśli już to $ile=count($t); słowo kluczowe as jest używane tylko w pewnych określonych konstrukcjach np. w foreach ale nie można go używać do przypisywania wartości, do tego jest operator =

for ($i=0; $i<$ile; $i++) - ta konstrukcja jest bardzo prosta, pętla for ma jakby trzy bloki oddzielone średnikami. W pierwszym bloku inicjujesz zmienne(przypisujesz wartości początkowe). W drugim bloku jest warunek, jeśli tan warunek zostanie spełniony to p?tla będzie wykonywana kolejny raz. Ostatni blok to modyfikacja zmiennych po przejściu pętli - ten blok nie jest wykonywany przy pierwszym przejściu !
zobacz przykład
  1. for($i=0;$i<10;$i++)
  2. {
  3. echo $i.'<br />';
  4. }
  5.  


teraz pewnie widzisz że twoja instrukcja if jest w niewłaściwym miejscu. Tak powinna być wewnątrz pętli.

Ważna uwaga, po każdej instrukcji dodawaj klamry żeby unikną niepotrzebnych błędów przy późniejszej edycji.

I oczywiście tak jak zauważył @Rysh do przeszukiwania pętli lepiej sie nadaje pętla foreach ponieważ jest "niewrażliwa" na dziury w indeksach



edit:
poczytaj tu http://pl.wikibooks.org/wiki/PHP dział "Podstawy języka"
Boshi
Jeszcze mam taką małą uwagę do postu usera Rysh. Fajnie, że się pomyliłeś, bo autor musiał pomysleć, ale na litość, mogłeś to zapisać bez funkcji, bo jak sam zauważyłeś autor nie ma pojęcia jak działą pętla for, a my tu z Return wyjeżdżamy biggrin.gif


p.s Autorze, nie wiem co za bzdury Ty opowiadasz, ale mam spore wątpliwości co do twojego zdania o MVC. Skoro MVC to OOP, a ty nie ogarniasz podstaw składni. Chyba, żę przeszpałeś cały rok. Zresztą nie wiem czy program Technikum (bo sądzę, że w nim jesteś) przewiduje w ogóle MVC-powątpiewam.
Rysh
Cytat(Boshi @ 16.12.2014, 01:43:38 ) *
Jeszcze mam taką małą uwagę do postu usera Rysh. Fajnie, że się pomyliłeś, bo autor musiał pomysleć, ale na litość, mogłeś to zapisać bez funkcji, bo jak sam zauważyłeś autor nie ma pojęcia jak działą pętla for, a my tu z Return wyjeżdżamy biggrin.gif


p.s Autorze, nie wiem co za bzdury Ty opowiadasz, ale mam spore wątpliwości co do twojego zdania o MVC. Skoro MVC to OOP, a ty nie ogarniasz podstaw składni. Chyba, żę przeszpałeś cały rok. Zresztą nie wiem czy program Technikum (bo sądzę, że w nim jesteś) przewiduje w ogóle MVC-powątpiewam.

Jak by nie było, to są podstawy. W każdej książce z PHP od razu wyskakują z funkcjami smile.gif

Moim zdaniem, taki skrypt należy wręcz umieścić w funkcji, jak by prowadzący zajęcia kazał mu obliczyć średnie z 2+ liczb?
Pewnie kopiowałby kod, a gdyby pomyślał użyłby funkcji - jeśli ma mieć zaliczenie z MVC to, nie wiem jak on to ogarnie.
Boshi
Racja to są podstawy no, ale sam widzisz jak autor te podstawy rozumie, choć wypadało by smile.gif

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.