Skip to content

System ocen (mini)

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?

  • 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

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.

  1. 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”).

  2. Walidacja danych System sprawdza poprawność wprowadzonych danych - czy ocena jest w zakresie 1-6, czy przedmiot jest wybrany, czy waga jest dodatnia.

  3. Zapis do pliku JSON Każda ocena jest zapisywana do pliku JSON z datą dodania i wszystkimi parametrami.

  4. 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:

  • Formularz z polami: przedmiot (select), ocena (1-6), opis
  • Walidacja danych w PHP (ocena w zakresie, przedmiot wybrany)
  • Zapis oceny do pliku JSON
  • Lista wszystkich ocen
  • Obliczanie i wyświetlanie średniej arytmetycznej
  • Prosty interfejs CSS

Przykładowy scenariusz:

Użytkownik wybiera “Matematyka”, wpisuje ocenę 4 i opis “Sprawdzian”. Po zapisie widzi wpis na liście. Na dole wyświetla się: “Średnia: 4.2”.

Ocena: 3.0

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:

  • Pokazać postępy - nawet małe kroki się liczą
  • Wyjaśnić wątpliwości - pytaj, nie zgaduj
  • Skonsultować rozwiązania - feedback pomoże Ci się rozwijać

Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!