Czego się nauczysz?
- Walidacji danych liczbowych (oceny 1-6)
- Obliczania średniej arytmetycznej i ważonej
- Pracy z wagami i współczynnikami
- Tworzenia statystyk i prognoz
- Zapisywania i odczytywania danych z JSON
This content is not available in your language yet.
Stworzysz Kalkulator średniej ocen - aplikację umożliwiającą wprowadzanie ocen szkolnych i obliczanie średniej arytmetycznej oraz ważonej. System pozwala śledzić postępy, analizować rozkład ocen i prognozować, jaką ocenę trzeba zdobyć, aby osiągnąć określoną średnią.
Czego się nauczysz?
W prawdziwej pracy...
Systemy obliczania średnich i ważonych wyników są podstawą wielu aplikacji - od e-dzienników i platform edukacyjnych, przez systemy oceny pracowników (KPI), po aplikacje finansowe (średnie ważone portfela). Umiejętność pracy że średnimi i statystykami jest fundamentem dla każdego programisty aplikacji analitycznych.
Formularz wprowadzania oceny Użytkownik podaje ocenę (1-6) i opcjonalnie jej wagę (1-3). Może też dodać opis (np. “sprawdzian”, “kartkówka”).
Walidacja danych System sprawdza poprawność wprowadzonych danych - czy ocena jest w zakresie 1-6, czy waga jest w zakresie 1-3.
Obliczenie średniej System oblicza średnią arytmetyczną (wszystkie oceny równe) lub ważoną (uwzględnia wagi) i wyświetla wynik.
Lista ocen Użytkownik widzi wszystkie wprowadzone oceny z wagami i datami dodania.
Przykładowa struktura pliku JSON:
{ "grades": [ { "id": 1, "grade": 5, "weight": 2, "description": "Sprawdzian - równania", "created_at": "2026-02-10 14:30:00" }, { "id": 2, "grade": 4, "weight": 1, "description": "Kartkówka", "created_at": "2026-02-12 10:15:00" }, { "id": 3, "grade": 3, "weight": 3, "description": "Praca klasowa", "created_at": "2026-02-15 11:00:00" }, { "id": 4, "grade": 6, "weight": 1, "description": "Aktywność", "created_at": "2026-02-17 09:45:00" } ]}Wymagane funkcje:
Przykładowy scenariusz:
Ocena: 3.0Użytkownik wybiera ocenę 5 z listy i klika “Dodaj”. Ocena pojawia się na liście. Na dole widzi: “Średnia: 4.25 (4 oceny)”.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Użytkownik dodaje ocenę 5 z wagą 2 (sprawdzian). System wyświetla listę ocen z wagami. Na dole: “Średnia ważona: 4.14, Najlepsza: 6, Najgorsza: 3”.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Użytkownik widzi rozkład: “6: 1, 5: 2, 4: 3, 3: 1”. Korzysta z prognozy: “Aby mieć średnią 4.5, potrzebujesz oceny 5 z wagą 2 lub 6 z wagą 1”. Może usunąć ocenę klikając ikonę kosza.
Walidacja oceny:
$grade = filter_var($_POST['grade'] ?? '', FILTER_VALIDATE_INT);$weight = filter_var($_POST['weight'] ?? 1, FILTER_VALIDATE_INT);
if ($grade === false || $grade < 1 || $grade > 6) { $errors[] = "Ocena musi być liczbą od 1 do 6";}
if ($weight < 1 || $weight > 3) { $errors[] = "Waga musi być od 1 do 3";}Obliczanie średniej arytmetycznej:
function calculateArithmeticAverage(array $grades): float { if (empty($grades)) { return 0; }
$sum = array_sum(array_column($grades, 'grade')); return round($sum / count($grades), 2);}Obliczanie średniej ważonej:
function calculateWeightedAverage(array $grades): float { if (empty($grades)) { return 0; }
$weightedSum = 0; $totalWeight = 0;
foreach ($grades as $g) { $weight = $g['weight'] ?? 1; $weightedSum += $g['grade'] * $weight; $totalWeight += $weight; }
if ($totalWeight === 0) { return 0; }
return round($weightedSum / $totalWeight, 2);}Statystyki ocen:
function getGradeStatistics(array $grades): array { if (empty($grades)) { return [ 'count' => 0, 'min' => null, 'max' => null, 'distribution' => [], ]; }
$gradeValues = array_column($grades, 'grade');
// Rozkład ocen $distribution = array_count_values($gradeValues); ksort($distribution);
return [ 'count' => count($grades), 'min' => min($gradeValues), 'max' => max($gradeValues), 'distribution' => $distribution, ];}Prognoza potrzebnej oceny (wariant C):
function predictNeededGrade(array $grades, float $targetAvg, int $newWeight = 1): ?array { if (empty($grades)) { return ['grade' => ceil($targetAvg), 'possible' => true]; }
$currentWeightedSum = 0; $currentTotalWeight = 0;
foreach ($grades as $g) { $weight = $g['weight'] ?? 1; $currentWeightedSum += $g['grade'] * $weight; $currentTotalWeight += $weight; }
// Wzór: (currentSum + X * newWeight) / (currentWeight + newWeight) = targetAvg // X = (targetAvg * (currentWeight + newWeight) - currentSum) / newWeight $neededGrade = ($targetAvg * ($currentTotalWeight + $newWeight) - $currentWeightedSum) / $newWeight;
if ($neededGrade <= 0) { return ['grade' => 1, 'possible' => true, 'message' => 'Już masz wystarczającą średnią']; }
if ($neededGrade > 6) { return ['grade' => null, 'possible' => false, 'message' => 'Niemożliwe do osiągnięcia jedną oceną']; }
return [ 'grade' => ceil($neededGrade), 'exact' => round($neededGrade, 2), 'possible' => true, ];}
// Użycie$prediction = predictNeededGrade($grades, 4.5, 2);if ($prediction['possible']) { echo "Potrzebujesz oceny {$prediction['grade']} z wagą 2";} else { echo $prediction['message'];}Kolorowanie ocen:
function getGradeColor(int $grade): string { $colors = [ 1 => '#e74c3c', // czerwony 2 => '#e74c3c', // czerwony 3 => '#f39c12', // pomarańczowy 4 => '#f1c40f', // żółty 5 => '#2ecc71', // zielony 6 => '#27ae60', // ciemny zielony ];
return $colors[$grade] ?? '#95a5a6';}
function getGradeEmoji(int $grade): string { $emojis = [ 1 => '😢', 2 => '😕', 3 => '😐', 4 => '🙂', 5 => '😊', 6 => '🎉', ];
return $emojis[$grade] ?? '❓';}Wykorzystaj lekcje!
Cotygodniowe spotkania podczas lekcji to idealny moment, by:
Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!