System ocen ucznia — tutorial (C#)

Cel: nauka pracy z tablicami (List), obliczania średniej, warunków i podsumowań. Prosty podział na klasy — Student w osobnym pliku.

Plan

  1. Utwórz projekt: dotnet new console -n GradesApp.
  2. Dodaj pliki Student.cs i Program.cs (poniżej).
  3. Uruchom: dotnet run i przetestuj różne wejścia.

Przykładowy kod

Plik: Student.cs


using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;

public class Student
{
    public string Name { get; set; }
    public List Grades { get; } = new List();

    public void AddGrade(double grade)
    {
        if (!double.IsNaN(grade) && !double.IsInfinity(grade) && grade >= 0)
            Grades.Add(grade);
    }

    public double Average()
    {
        if (Grades.Count == 0) return double.NaN;
        return Grades.Average();
    }

    public string Summary()
    {
        var avg = Average();
        var avgStr = double.IsNaN(avg) ? "-" : avg.ToString("F2", CultureInfo.InvariantCulture);
        var gradesStr = Grades.Count == 0 ? "(brak ocen)" : string.Join(", ", Grades.Select(g => g.ToString("F1", CultureInfo.InvariantCulture)));
        return $"{Name}: średnia {avgStr}, oceny: {gradesStr}";
    }
}
  

Plik: Program.cs


using System;
using System.Collections.Generic;
using System.Globalization;

class Program
{
    static double ParseDouble(string s)
    {
        if (string.IsNullOrWhiteSpace(s)) return double.NaN;
        s = s.Trim().Replace(',', '.');
        return double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out var v) ? v : double.NaN;
    }

    static int ReadInt(string prompt)
    {
        while (true)
        {
            Console.Write(prompt);
            var line = Console.ReadLine();
            if (int.TryParse(line, out var n) && n >= 0) return n;
            Console.WriteLine("Podaj nieujemną liczbę całkowitą.");
        }
    }

    static double ReadGrade(string prompt)
    {
        while (true)
        {
            Console.Write(prompt);
            var line = Console.ReadLine();
            var g = ParseDouble(line);
            if (!double.IsNaN(g) && g >= 0 && g <= 6) return g; // zakładamy skala 0-6
            Console.WriteLine("Nieprawidłowa ocena. Podaj liczbę z zakresu 0-6.");
        }
    }

    static void Main()
    {
        Console.WriteLine("Prosty system ocen ucznia");
        int studentsCount = ReadInt("Ilu uczniów chcesz dodać? ");
        var students = new List();

        for (int i = 0; i < studentsCount; i++)
        {
            Console.Write($"Nazwa ucznia #{i+1}: ");
            var name = Console.ReadLine() ?? $"Uczen{i+1}";
            var s = new Student { Name = name.Trim() };
            int gradesCount = ReadInt($"Ile ocen dla {s.Name}? ");
            for (int j = 0; j < gradesCount; j++)
            {
                var g = ReadGrade($"Ocena #{j+1}: ");
                s.AddGrade(g);
            }
            students.Add(s);
            Console.WriteLine();
        }

        Console.WriteLine("=== Podsumowanie ===");
        foreach (var st in students)
        {
            Console.WriteLine(st.Summary());
        }

        // statystyki klasy
        var validAverages = new List();
        foreach (var st in students)
        {
            var avg = st.Average();
            if (!double.IsNaN(avg)) validAverages.Add(avg);
        }

        if (validAverages.Count > 0)
        {
            var classAvg = 0.0;
            foreach (var a in validAverages) classAvg += a;
            classAvg /= validAverages.Count;
            Console.WriteLine();
            Console.WriteLine($"Średnia klasy: {classAvg.ToString("F2", CultureInfo.InvariantCulture)}");
            int failing = 0; // jeśli próg zaliczenia np. 3.0
            foreach (var a in validAverages) if (a < 3.0) failing++;
            Console.WriteLine($"Liczba niezaliczających (średnia < 3.0): {failing}");
        }
        else
        {
            Console.WriteLine("Brak ocen do obliczeń średniej klasy.");
        }
    }
}
  

Zadania do samodzielnej pracy

Zadanie 1: Dodaj możliwość edycji ocen ucznia (dodawanie/usuwanie oceny) przed podsumowaniem.
Zadanie 2: Zapisz dane (uczniowie + oceny) do pliku i wczytaj przy starcie programu.
Zadanie 3: Rozszerz ocenianie o wagę oceny (np. testy 0.6, zadania 0.4) i oblicz średnią ważoną.

Powrót do listy tutoriali