C#: atestat și pregătire ONTI

C#: proiect gestiune cu stoc și operații verificabile

Construiește o aplicație C# de gestiune a stocului. Separă operațiile de intrare și ieșire, refuză cantitățile imposibile și păstrează un jurnal al succeselor.

În gestiune, un stoc negativ nu este o simplă problemă de afișare. Regula trebuie protejată în model, indiferent de controlul folosit pentru introducerea cantității. Proiectul urmărește un produs și două operații: intrare și ieșire. Jurnalul înregistrează numai operațiile reușite.

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

Stock primește o valoare inițială între zero și un milion. Add verifică limita înainte de adunare, iar Remove verifică disponibilul înainte de scădere. Ambele întorc bool pentru acceptare. NumericUpDown limitează introducerea la 1–1000, dar modelul verifică în continuare propriul contract.

Handlerii apelează aceeași metodă Apply cu sensul operației. Numai succesul adaugă o linie în jurnal. Label-ul este reîmprospătat din model după fiecare încercare. În acest proiect datele sunt în memorie; pentru persistență poți adapta salvarea XML din proiectul anterior sau o tranzacție SQL.

Exemplu și rezultat așteptat

Pornim cu zece unități. O ieșire de șapte produce stoc trei și o linie de jurnal. Încercarea unei ieșiri de cinci este refuzată: stocul și jurnalul rămân neschimbate. O intrare de două produce stoc cinci.

Schemă pentru lecția 42: Stoc 10; Ieșire 7 → stoc 3; Ieșire 5 → refuz; Intrare 2 → stoc 5.Stoc 10 → Ieșire 7 → stoc 3 → Ieșire 5 → refuz → Intrare 2 → stoc 5.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 Stock {
    public int Value {get;private set;}
    public Stock(int initial) {if(initial<0 || initial>1000000)throw new ArgumentOutOfRangeException("initial");Value=initial;}
    public bool Add(int quantity) {if(quantity<=0 || quantity>1000000-Value)return false;Value+=quantity;return true;}
    public bool Remove(int quantity) {if(quantity<=0 || quantity>Value)return false;Value-=quantity;return true;}
}
class LessonForm : Form
{
readonly Stock stock=new Stock(10);
    readonly NumericUpDown amount=new NumericUpDown {Left=20,Top=20,Minimum=1,Maximum=1000,Value=1};
    readonly Label total=new Label {Left=20,Top=65,Width=250};
    readonly ListBox log=new ListBox {Left=20,Top=110,Width=440,Height=150};
    public LessonForm() {
        Text="Gestiune";ClientSize=new Size(500,290);
        var add=new Button {Left=170,Top=20,Text="Intrare"};var remove=new Button {Left=280,Top=20,Text="Iesire"};
        add.Click += (s,e) => Apply(true);remove.Click += (s,e) => Apply(false);
        Controls.AddRange(new Control[] {amount,add,remove,total,log});total.Text="Stoc: " + stock.Value;
    }
    void Apply(bool incoming) {
        int quantity=(int)amount.Value;bool ok=incoming ? stock.Add(quantity) : stock.Remove(quantity);
        if(ok)log.Items.Add((incoming ? "Intrare " : "Iesire ") + quantity);else MessageBox.Show(this,"Operatie refuzata.");
        total.Text="Stoc: " + stock.Value;
    }
}

Greșeli și limite

Nu scădea stocul înainte de verificare și apoi încerca să repari un rezultat negativ. Nu deduce stocul din numărul liniilor jurnalului. Nu considera că limita controlului înlocuiește validarea modelului, deoarece modelul poate fi apelat și de un import sau de teste.

Exersează

Verifică scenariul 10, ieșire 7, refuz 5, intrare 2. Testează în model cantitatea zero și apropierea de limita maximă. Adaugă două produse cu ID-uri distincte și confirmă că o operație pe unul nu modifică celălalt. Pentru predare, documentează explicit că închiderea aplicației pierde starea până la adăugarea persistării.

Continuă parcursul

Parcursul complet de 50 de lecții

Bazele C#

Lecția precedentă: C#: proiect bibliotecă cu împrumut și salvare XML

Lecția următoare: C#: proiect catalog cu note și raport calculat.

Referință: documentația Microsoft.

Întrebări frecvente

De ce validez și în model?

Pentru că regulile trebuie păstrate și când datele vin din altă sursă decât controlul vizual.

O operație refuzată apare în jurnalul succeselor?

Nu. Poți avea separat un jurnal de erori, dar nu o înregistra drept modificare reușită.

Stocul se salvează automat?

Nu în acest exemplu. Persistarea trebuie adăugată și verificată prin recitire.

Un pas mai departe

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

Exersează cu o problemă →