C#: atestat și pregătire ONTI

C#: proiect catalog cu note și raport calculat

Construiește un catalog C# cu elevi, note și medie calculată. Păstrează ID-ul elevului, tratează lipsa notelor și recalculează raportul după fiecare modificare.

Un catalog are cel puțin două tipuri de informații: identitatea elevului și notele asociate. Media este un rezultat calculat, nu o valoare care trebuie editată separat. Proiectul permite selectarea unui elev, adăugarea unei note și afișarea listei și mediei. Nu stabilește reguli oficiale de încheiere a situației școlare.

Cum lucrezi cu exemplul

Exemplul complet se compilează ca Windows Forms App pe .NET Framework 4.8, cu C# 7.3. Deschide Lesson.csproj din arhivă în Visual Studio pe Windows. Rulează scenariile descrise mai jos; verificarea compilării nu înlocuiește testarea ferestrei și a dispozitivelor folosite.

Descarcă sursele și instrucțiunile.

Ideea și pașii de implementare

Fiecare Student are ID, nume și o listă de note. ComboBox afișează numele, iar SelectedItem oferă obiectul. NumericUpDown permite note întregi între 1 și 10. La schimbarea selecției sau adăugarea unei note apelăm RenderStudent, care reconstruiește lista și raportul din model.

Pentru lista goală afișăm Fara note, fără împărțire la zero. Pentru o listă nevidă calculăm Average și formatăm cu două zecimale folosind cultura invariantă în acest exemplu. Această formatare este prezentare, nu o regulă de rotunjire pentru un catalog oficial.

Exemplu și rezultat așteptat

Ana pornește cu 7 și 9, deci media este 8.00. Adăugarea notei 10 produce 8.67 la afișare. Mihai nu are note și arată Fara note. Selectarea lui Mihai nu trebuie să afișeze lista Anei rămasă în control.

Schemă pentru lecția 43: Ana: 7 și 9; Media: 8.00; Adaugă 10; Media afișată: 8.67.Ana: 7 și 9 → Media: 8.00 → Adaugă 10 → Media afișată: 8.67.Mărește schema ↗

Codul complet

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new LessonForm());
    }
}
class Student {public int Id {get;set;} public string Name {get;set;} public List<int> Marks {get;set;}}
class LessonForm : Form
{
readonly ComboBox students=new ComboBox {Left=20,Top=20,Width=220,DropDownStyle=ComboBoxStyle.DropDownList};
    readonly ListBox marks=new ListBox {Left=20,Top=65,Width=220,Height=140};
    readonly Label average=new Label {Left=270,Top=110,Width=200};
    public LessonForm() {
        Text="Catalog didactic";ClientSize=new Size(520,250);
        students.DisplayMember="Name";students.DataSource=new List<Student> {
            new Student {Id=1,Name="Ana",Marks=new List<int>{7,9}},new Student {Id=2,Name="Mihai",Marks=new List<int>()}};
        var value=new NumericUpDown {Left=270,Top=20,Minimum=1,Maximum=10,Value=10};
        var add=new Button {Left=270,Top=65,Width=160,Text="Adauga nota"};
        students.SelectedIndexChanged += (s,e) => RenderStudent();
        add.Click += (s,e) => {var student=students.SelectedItem as Student;if(student==null)return;student.Marks.Add((int)value.Value);RenderStudent();};
        Controls.AddRange(new Control[] {students,marks,value,add,average});RenderStudent();
    }
    void RenderStudent() {
        marks.Items.Clear();var student=students.SelectedItem as Student;if(student==null){average.Text="";return;}
        foreach(int mark in student.Marks)marks.Items.Add(mark);
        average.Text=student.Marks.Count==0 ? "Fara note" : "Media: " + student.Marks.Average().ToString("F2",System.Globalization.CultureInfo.InvariantCulture);
    }
}

Greșeli și limite

Nu păstra un singur vector de note pentru toți elevii. Nu folosi numele ca ID, fiindcă pot exista omonimi. Nu salva media ca sursă unică dacă notele pot fi modificate. Nu interpreta rotunjirea la două zecimale din exemplu ca normă școlară verificată.

Exersează

Adaugă un al treilea elev cu același nume ca primul și verifică separarea notelor. Testează trecerea între elevul fără note și cel cu note. Adaugă eliminarea unei note selectate și confirmă revenirea la Fara note după ștergerea ultimei valori. Decide cum va fi salvată identitatea în persistare.

Continuă parcursul

Parcursul complet de 50 de lecții

Bazele C#

Lecția precedentă: C#: proiect gestiune cu stoc și operații verificabile

Lecția următoare: C#: quiz cu amestecare reproductibilă și identități stabile.

Referință: documentația Microsoft.

Întrebări frecvente

De ce calculez media din note?

Pentru a evita o valoare salvată care devine inconsistentă după modificarea listei.

Ce afișez pentru un elev fără note?

O stare explicită, precum Fara note, fără o medie inventată sau împărțire la zero.

Este acesta un catalog școlar oficial?

Nu. Este un proiect didactic de asociere, validare și raportare a datelor.

Un pas mai departe

Autentifică-te pentru a păstra progresul în cont.

Exersează cu o problemă →