Przejdź do głównej zawartości

Kalkulator średniej ocen

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?

  • 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

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.

  1. Formularz wprowadzania oceny Użytkownik podaje ocenę (1-6) i opcjonalnie jej wagę (1-3). 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 waga jest w zakresie 1-3.

  3. Obliczenie średniej System oblicza średnią arytmetyczną (wszystkie oceny równe) lub ważoną (uwzględnia wagi) i wyświetla wynik.

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

  • Formularz z polami: ocena (select 1-6)
  • Walidacja danych w PHP (ocena w zakresie)
  • Lista wprowadzonych ocen
  • Obliczenie średniej arytmetycznej
  • Prosty interfejs CSS

Przykładowy scenariusz:

Użytkownik wybiera ocenę 5 z listy i klika “Dodaj”. Ocena pojawia się na liście. Na dole widzi: “Średnia: 4.25 (4 oceny)”.

Ocena: 3.0

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:

  • 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!