Czego się nauczysz?
- Walidacji danych liczbowych (oceny 1-6)
- Obliczania średnich (arytmetyczna i ważona)
- Grupowania danych po kategoriach (przedmioty)
- Pracy z wagami i współczynnikami
- Tworzenia statystyk i raportów
This content is not available in your language yet.
Stworzysz System ocen - aplikację umożliwiającą rejestrowanie ocen ucznia z różnych przedmiotów, obliczanie średniej arytmetycznej i ważonej oraz przeglądanie historii ocen. To praktyczne narzędzie do śledzenia postępów w nauce.
Czego się nauczysz?
W prawdziwej pracy...
Systemy oceniania i raportowania są podstawą wielu aplikacji edukacyjnych (e-dzienniki, platformy e-learningowe), HR-owych (oceny pracownicze, KPI) i biznesowych (scoring, rating). Umiejętność pracy że średnimi ważonymi i statystykami jest fundamentem dla każdego programisty tworzącego systemy analityczne.
Formularz dodawania oceny Użytkownik wybiera przedmiot z listy, wpisuje ocenę (1-6) i opcjonalnie wagę oceny. Może też dodać opis (np. “sprawdzian”, “kartkówka”).
Walidacja danych System sprawdza poprawność wprowadzonych danych - czy ocena jest w zakresie 1-6, czy przedmiot jest wybrany, czy waga jest dodatnia.
Zapis do pliku JSON Każda ocena jest zapisywana do pliku JSON z datą dodania i wszystkimi parametrami.
Lista ocen i średnia Użytkownik widzi wszystkie swoje oceny oraz obliczoną średnią (arytmetyczną lub ważoną).
Przykładowa struktura pliku JSON:
{ "grades": [ { "id": 1, "subject": "Matematyka", "grade": 4, "weight": 2, "description": "Sprawdzian - równania", "created_at": "2026-02-10" }, { "id": 2, "subject": "Matematyka", "grade": 5, "weight": 1, "description": "Kartkówka", "created_at": "2026-02-12" }, { "id": 3, "subject": "Polski", "grade": 3, "weight": 3, "description": "Wypracowanie", "created_at": "2026-02-13" } ]}Wymagane funkcje:
Przykładowy scenariusz:
Ocena: 3.0Użytkownik wybiera “Matematyka”, wpisuje ocenę 4 i opis “Sprawdzian”. Po zapisie widzi wpis na liście. Na dole wyświetla się: “Średnia: 4.2”.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Użytkownik widzi oceny pogrupowane: “Matematyka: 4, 5, 3 | Średnia ważona: 4.1”. Pod spodem “Polski: 3, 4 | Średnia ważona: 3.6”. Oceny poniżej 3 są oznaczone czerwono.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Użytkownik widzi raport: “Średnia ogólna: 3.8”. Statystyki: “Najlepsza: 6 (Historia), Najgorsza: 2 (Fizyka)”. Może kliknąć “Prognoza” i sprawdzić: “Aby podnieść średnią z Matematyki do 4.0, potrzebujesz oceny 5 z wagą 2”.
Walidacja oceny:
$grade = filter_var($_POST['grade'], FILTER_VALIDATE_INT);
if ($grade === false || $grade < 1 || $grade > 6) { $errors[] = "Ocena musi być liczbą od 1 do 6";}
$weight = filter_var($_POST['weight'] ?? 1, FILTER_VALIDATE_INT);if ($weight < 1 || $weight > 3) { $weight = 1; // domyślna waga}Obliczanie średniej arytmetycznej:
function calculateAverage(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; }
return $totalWeight > 0 ? round($weightedSum / $totalWeight, 2) : 0;}Grupowanie po przedmiotach:
function groupBySubject(array $grades): array { $grouped = [];
foreach ($grades as $g) { $subject = $g['subject']; if (!isset($grouped[$subject])) { $grouped[$subject] = []; } $grouped[$subject][] = $g; }
return $grouped;}
// Użycie$bySubject = groupBySubject($grades);foreach ($bySubject as $subject => $subjectGrades) { $avg = calculateWeightedAverage($subjectGrades); echo "$subject: średnia ważona $avg";}Prognoza (wariant C):
function predictNeededGrade(array $grades, float $targetAvg, int $newWeight = 1): ?int { $currentWeightedSum = 0; $currentTotalWeight = 0;
foreach ($grades as $g) { $weight = $g['weight'] ?? 1; $currentWeightedSum += $g['grade'] * $weight; $currentTotalWeight += $weight; }
// Szukamy X: (currentSum + X * newWeight) / (currentWeight + newWeight) = targetAvg $neededGrade = ($targetAvg * ($currentTotalWeight + $newWeight) - $currentWeightedSum) / $newWeight;
if ($neededGrade < 1) return 1; if ($neededGrade > 6) return null; // niemożliwe return (int) ceil($neededGrade);}Wykorzystaj lekcje!
Cotygodniowe spotkania podczas lekcji to idealny moment, by:
Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!