C#: atestat și pregătire ONTI

C#: miniaplicație quiz cu răspuns unic și scor

Construiește un quiz Windows Forms cu întrebări, opțiuni și scor. Controlează trecerea la întrebarea următoare și previne punctarea repetată a răspunsului.

Combinăm controalele și regulile într-un quiz cu două întrebări originale. Aplicația afișează o întrebare, cere alegerea unei opțiuni și trece la următoarea numai după evaluare. Scorul nu este citit din label. Indexul întrebării și scorul sunt starea sesiunii, iar metoda ShowQuestion reconstruiește interfața din această stare.

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

ListBox afișează opțiunile în aceeași ordine ca cheia numerică a întrebării. SelectedIndex este potrivit aici ca index în opțiunile acelei întrebări, nu ca ID persistent de entitate. Lipsa selecției oprește evaluarea. După acceptare, indexul crește o singură dată, iar opțiunile sunt înlocuite.

La final dezactivăm butonul și lista. Handler-ul verifică suplimentar indexul pentru a păstra regula chiar dacă starea vizuală ar fi schimbată ulterior. Exemplul nu are persistare și nici autentificare: rezultatul aparține rulării curente.

Exemplu și rezultat așteptat

Pentru 2+3 alegi 5, iar pentru numărul de elemente din [4,7,9] alegi 3. Obții 20 de puncte. Dacă prima alegere este 6 și a doua este 3, obții 10. Apăsarea butonului fără alegere nu trece la întrebarea următoare.

Schemă pentru lecția 29: Întrebare 0: 2+3; Alegere 5 → +10; Întrebare 1: Length; Final: cel mult 20.Întrebare 0: 2+3 → Alegere 5 → +10 → Întrebare 1: Length → Final: cel mult 20.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 LessonForm : Form
{
readonly string[] questions={"Cat este 2 + 3?","Cate elemente are [4,7,9]?"};
    readonly string[][] answers={new[] {"4","5","6"},new[] {"2","3","4"}};
    readonly int[] keys={1,1}; int index,score;
    readonly Label prompt=new Label {Left=20,Top=20,Width=380};
    readonly ListBox choices=new ListBox {Left=20,Top=55,Width=260,Height=100};
    readonly Button submit=new Button {Left=20,Top=175,Width=150,Text="Raspunde"};
    public LessonForm() {
        Text="Quiz";ClientSize=new Size(440,240);
        submit.Click += (s,e) => {
            if(index>=questions.Length || choices.SelectedIndex<0)return;
            if(choices.SelectedIndex==keys[index])score+=10;index++;ShowQuestion();
        };
        Controls.AddRange(new Control[] {prompt,choices,submit});ShowQuestion();
    }
    void ShowQuestion() {
        choices.Items.Clear();
        if(index==questions.Length) {prompt.Text="Final. Scor: " + score;submit.Enabled=false;choices.Enabled=false;return;}
        prompt.Text=questions[index];choices.Items.AddRange(answers[index]);choices.SelectedIndex=-1;
    }
}

Greșeli și limite

Nu amesteca ordinea opțiunilor fără să actualizezi cheia răspunsului. Nu permite două evaluări pentru aceeași întrebare prin butoane diferite. Nu considera că un label cu scorul final este și dovadă de salvare. Pentru reluare, resetează explicit indexul, scorul și starea controalelor.

Exersează

Parcurge toate combinațiile de corect și greșit pentru cele două întrebări: scorurile posibile sunt 0, 10 și 20. Testează lipsa selecției înaintea fiecărui răspuns. Adaugă un buton Reia și verifică faptul că o sesiune nouă pornește de la zero, fără opțiunea rămasă selectată.

Continuă parcursul

Parcursul complet de 50 de lecții

Bazele C#

Lecția precedentă: C#: Undo și Redo pentru modificări controlate

Lecția următoare: C#: miniaplicație cu grilă și stare separată de butoane.

Referință: documentația Microsoft.

Întrebări frecvente

De ce verific indexul și în handler?

Regula de finalizare trebuie păstrată și în logică, nu doar prin dezactivarea vizuală a butonului.

Pot amesteca opțiunile?

Da, dar trebuie să păstrezi asocierea dintre opțiune și corectitudine.

Scorul se păstrează după închidere?

Nu în acest exemplu. Persistarea este o funcție separată, care necesită salvare și recitire.

Un pas mai departe

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

Exersează cu o problemă →