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.
În acest material
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.
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
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.