Cel: nauka pracy z tablicami (List), obliczania średniej, warunków i podsumowań. Prosty podział na klasy — Student w osobnym pliku.
dotnet new console -n GradesApp.Student.cs i Program.cs (poniżej).dotnet run i przetestuj różne wejścia.
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}";
}
}
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.");
}
}
}