Pagina Principală
Ora 5

Structura Alternativă Completă

DACĂ...ATUNCI...ALTFEL (if-then-else) - gestionarea ambelor cazuri

40min teorie + 10min probleme
Competența 3.2
Sigla liceului
TEORIE - 40 minute

Ce vei învăța astăzi?

După această lecție, vei putea să folosești structura alternativă completă pentru a gestiona toate scenariile posibile într-o decizie și să scrii algoritmi mai inteligenți care răspund corect în orice situație.

Sintaxa DACĂ...ATUNCI...ALTFEL
Gestionarea ambelor cazuri
Comparație cu structura simplă
Probleme complexe cu decizii complete

Ce este Structura Alternativă Completă?

Definiție: Structura alternativă completă (DACĂ...ATUNCI...ALTFEL) permite executarea unor instrucțiuni dacă condiția este adevărată și a altor instrucțiuni dacă condiția este falsă. Acoperă toate scenariile posibile!

Analogie: Semafoare complete

Gândește-te la structura completă ca la un sistem complet de semafoare:

CONDIȚIA

Verifică lumina

Evaluare stare
DACĂ VERDE

Treci strada

Acțiune pentru Adevărat
ALTFEL (ROȘU)

Așteaptă

Acțiune pentru Fals

Exemplu interactiv - Comparație Structuri

citește nota (nota la examen) ┌ dacă nota ≥ 5 atunci │ scrie "Promovat" │ altfel │ scrie "Nepromovat" └■ scrie "Verificare terminată"

Observație: Indiferent de valoarea notei, algoritmul va afișa întotdeauna un mesaj relevant - fie "Promovat", fie "Nepromovat".

citește nota (nota la examen) ┌ dacă nota ≥ 5 atunci │ scrie "Promovat" └■ scrie "Verificare terminată"

Limitare: Dacă nota este sub 5, nu se afișează niciun mesaj despre nepromovare. Utilizatorul nu știe ce s-a întâmplat!

Caracteristică Structură Simplă Structură Completă
Sintaxă DACĂ...ATUNCI DACĂ...ATUNCI...ALTFEL
Acoperire Doar cazul Adevărat Ambele cazuri (Adevărat/Fals)
Flexibilitate Limitata Maximă
Utilizare Acțiuni opționale Decizii complete
Exemplu Reducere doar pentru comenzi mari Promovat/Nepromovat
Probleme rezolvate - Structură Alternativă Completă
Problema 1: Par/Impar complet

Enunț: Scrieți un algoritm care afișează dacă un număr este par sau impar.

citește n (număr întreg) ┌ dacă n % 2 = 0 atunci │ scrie "Numărul este par" │ altfel │ scrie "Numărul este impar" └■
Problema 2: Acces cu ambele mesaje

Enunț: Scrieți un algoritm care afișează mesaj corespunzător pentru acces permis/respins.

citește varsta (vârsta persoanei) ┌ dacă varsta ≥ 18 atunci │ scrie "Acces permis" │ altfel │ scrie "Acces respins. Vârsta minimă: 18 ani" └■
Problema 3: Comparație numere

Enunț: Scrieți un algoritm care afișează care număr este mai mare sau dacă sunt egale.

citește a, b (două numere) ┌ dacă a > b atunci │ scrie "Primul număr este mai mare" │ altfel │ ┌ dacă a < b atunci │ │ scrie "Al doilea număr este mai mare" │ │ altfel │ │ scrie "Numerele sunt egale" │ └■ └■

Instrucțiunea if-else în C++

Varianta 1: if-else complet
Sintaxă:
if (conditie) {
    instructiuni_1;
} else {
    instructiuni_2;
}
Mod de execuție:

1. Se evaluează condiția

2. Dacă este adevărată (true): se execută blocul 1

3. Dacă este falsă (false): se execută blocul 2

// Exemplu: Par sau impar complet
if (n % 2 == 0) {
    cout << "Par";
} else {
    cout << "Impar";
}
Instrucțiunea switch (pentru cazuri multiple)
Sintaxă:
switch (expresie) {
    case valoare1:
        instructiuni1;
        break;
    case valoare2:
        instructiuni2;
        break;
    default:
        instructiuni_default;
}
Mod de execuție:

1. Se evaluează expresia

2. Se compară cu fiecare valoare case

3. Dacă se găsește potrivire, se execută instrucțiunile respective

4. Dacă nu, se execută blocul default (dacă există)

// Exemplu: Zile săptămânii
switch (zi) {
    case 1: cout << "Luni"; break;
    case 2: cout << "Marti"; break;
    case 3: cout << "Miercuri"; break;
    case 4: cout << "Joi"; break;
    case 5: cout << "Vineri"; break;
    case 6:
    case 7: cout << "WEEKEND!"; break;
    default: cout << "Zi invalidă";
}
Observații importante if-else:
Conversie automată booleană:
• Valoare nenulă → true
• Valoare nulă (0) → false
Echivalențe utile:
if(x)if(x != 0)
if(!x)if(x == 0)
Atenție la instrucțiuni compuse:
Folosește acolade {} când ai mai multe instrucțiuni!
Test C++: Ce afișează programul?
#include <iostream>

using namespace std;

int main() {
    int a = 5, b = 7;
    
    if (a > b)
        cout << "a mai mare";
    else
        cout << "b mai mare";
    
    return 0;
}

Fluxul Structurii DACĂ...ATUNCI...ALTFEL

Citește date
Evaluare condiție
DA (Adevărat)
Execută blocul ATUNCI
NU (Fals)
Execută blocul ALTFEL
Continuare algoritm
Testează-ți cunoștințele:

Când se execută blocul ALTFEL în structura completă?

Exemplu Complet: Vârstă pentru film

citește varsta (vârsta spectatorului) ┌ dacă varsta ≥ 12 atunci │ scrie "Acces permis la film" │ pret ← 25 │ scrie "Preț bilet: ", pret, " lei" │ altfel │ scrie "Acces respins. Vârsta minimă: 12 ani" │ scrie "Te așteptăm când vei avea 12 ani!" └■ scrie "Vă mulțumim!"
Program C++ echivalent
#include <iostream>

using namespace std;

int main() {
    int varsta;
    
    cout << "Introdu varsta: ";
    cin >> varsta;
    
    if (varsta >= 12) {
        cout << "Acces permis la film" << endl;
        int pret = 25;
        cout << "Pret bilet: " << pret << " lei" << endl;
    } else {
        cout << "Acces respins. Varsta minima: 12 ani" << endl;
        cout << "Te asteptam cand vei avea 12 ani!" << endl;
    }
    
    cout << "Va multumim!" << endl;
    
    return 0;
}
Execuție pas cu pas (2 scenarii):
Scenariul 1: Vârstă ≥ 12 ani
➡️ citește varsta varsta = 14
➡️ dacă varsta ≥ 12 atunci 14 ≥ 12? ADEVĂRAT
➡️ scrie "Acces permis la film" Afișează mesajul
➡️ pret ← 25 pret = 25
➡️ scrie "Preț bilet: ", pret, " lei" Afișează: Preț bilet: 25 lei
➡️ scrie "Vă mulțumim!" Afișează mesajul final
Scenariul 2: Vârstă < 12 ani
➡️ citește varsta varsta = 10
➡️ dacă varsta ≥ 12 atunci 10 ≥ 12? FALS
➡️ scrie "Acces respins. Vârsta minimă: 12 ani" Afișează mesajul
➡️ scrie "Te așteptăm când vei avea 12 ani!" Afișează mesaj suplimentar
➡️ scrie "Vă mulțumim!" Afișează mesajul final

Aplicații Practice și Best Practices

Când să folosești structura completă:

Decizii cu două rezultate clare - Promovat/Nepromovat, Par/Impar, Pozitiv/Negativ
Sisteme de notificare - Succes/Eroare, Valid/Invalid
Calcul alternative - Reducere diferită, Formula A/Formula B
Verificări complete - Acces Permis/Respins, Cont Activ/Inactiv

Best Practices pentru structuri complete:

💡 Folosește condiții clare - evită condiții duble negative
💡 Gestionează toate cazurile - asigură-te că ALTFEL acoperă tot ce rămâne
💡 Mesaje informative - oferă feedback util în ambele cazuri
💡 Evită structuri imbricate complexe - pentru logică complexă, folosește variabile intermediare
EXERCIȚII PBINFO - 15 minute

Problemă #1583 - Verificare număr pozitiv sau negativ

Verificare completă cu if-else

Enunț:

Cerință: Să se scrie un program care citește un număr întreg și afișează "pozitiv" dacă numărul este mai mare decât 0, altfel afișează "negativ sau zero".

Date de intrare:

Programul citește de la tastatură un număr întreg.

Date de ieșire:

Programul va afișa pe ecran mesajul "pozitiv" sau "negativ sau zero".

Exemple:

Exemplu 1:

Intrare:

7

Ieșire:

pozitiv

Exemplu 2:

Intrare:

-3

Ieșire:

negativ sau zero

Exemplu 3:

Intrare:

0

Ieșire:

negativ sau zero
Restricții și precizări:
  • Numărul este întreg
  • Se folosește structura alternativă completă (if-else)
  • Condiția: număr > 0
Scrie soluția ta:
Soluție corectă:
#include <iostream>

using namespace std;

int main() {
    int n;
    
    cin >> n;
    
    if (n > 0)
        cout << "pozitiv";
    else
        cout << "negativ sau zero";
    
    return 0;
}

Observație: Acesta este un exemplu perfect de structură alternativă completă - acoperă ambele cazuri posibile.

Problemă #1584 - Determinare paritate

Determinare completă par/impar cu if-else

Enunț:

Cerință: Să se scrie un program care citește un număr întreg și afișează "par" dacă numărul este par, altfel afișează "impar".

Date de intrare:

Programul citește de la tastatură un număr întreg.

Date de ieșire:

Programul va afișa pe ecran mesajul "par" sau "impar".

Exemple:

Exemplu 1:

Intrare:

8

Ieșire:

par

Exemplu 2:

Intrare:

7

Ieșire:

impar
Restricții și precizări:
  • Numărul este întreg
  • Un număr este par dacă restul împărțirii la 2 este 0
  • Folosiți operatorul % (modulo) pentru rest
  • Condiția: n % 2 == 0
Scrie soluția ta:
Soluție corectă:
#include <iostream>

using namespace std;

int main() {
    int n;
    
    cin >> n;
    
    if (n % 2 == 0)
        cout << "par";
    else
        cout << "impar";
    
    return 0;
}

Puncte cheie de reținut:

  • n % 2 calculează restul împărțirii lui n la 2
  • == este operatorul de egalitate în C++ (nu confunda cu = care este atribuire)
  • Structura if-else acoperă ambele cazuri posibile

Exercițiu de transformare

Transformă pseudocodul în C++ cu if-else

Pseudocod dat:

citește a, b (două numere întregi) ┌ dacă a > b atunci │ scrie "Primul numar este mai mare" │ altfel │ scrie "Al doilea numar este mai mare sau egal" └■ scrie "Comparare terminată"
Scrie programul C++ echivalent:
Soluție corectă:
#include <iostream>

using namespace std;

int main() {
    int a, b;
    
    cout << "Introdu doua numere: ";
    cin >> a >> b;
    
    if (a > b)
        cout << "Primul numar este mai mare" << endl;
    else
        cout << "Al doilea numar este mai mare sau egal" << endl;
    
    cout << "Comparare terminata" << endl;
    
    return 0;
}

Reguli de transformare Pseudocod → C++:

  1. citeștecin >>
  2. dacă condiție atunciif (condiție)
  3. altfelelse
  4. scriecout <<
  5. └■ → se încheie execuția structurii if-else

Instrucțiunea switch în C++

Decizii multiple bazate pe valori constante

Problemă:

Cerință: Să se scrie un program care citește un număr întreg reprezentând o zi a săptămânii (1-7) și afișează numele zilei. Dacă numărul este 6 sau 7, afișează "WEEKEND", iar pentru alte valori afișează "Zi invalidă".

Date de intrare:

Programul citește de la tastatură un număr întreg.

Date de ieșire:

Programul afișează numele zilei sau mesajul corespunzător.

Exemple:

Exemplu 1:

Intrare:

3

Ieșire:

Miercuri

Exemplu 2:

Intrare:

6

Ieșire:

WEEKEND

Exemplu 3:

Intrare:

8

Ieșire:

Zi invalida
Scrie soluția ta cu switch:
Soluție corectă cu switch:
#include <iostream>

using namespace std;

int main() {
    int zi;
    cin >> zi;
    
    switch(zi) {
        case 1:
            cout << "Luni" << endl;
            break;
        case 2:
            cout << "Marti" << endl;
            break;
        case 3:
            cout << "Miercuri" << endl;
            break;
        case 4:
            cout << "Joi" << endl;
            break;
        case 5:
            cout << "Vineri" << endl;
            break;
        case 6:
        case 7:
            cout << "WEEKEND" << endl;
            break;
        default:
            cout << "Zi invalida" << endl;
            break;
    }
    
    return 0;
}

Observații importante switch:

  • Valorile din case trebuie să fie constante întregi
  • break oprește execuția - fără el, execuția continuă în următorul case
  • default se execută dacă niciun case nu se potrivește
  • Case-urile 6 și 7 sunt grupate (nu au instrucțiuni între ele)
PROBLEME - 10 minute

Exercițiul Practic: Algoritmi cu Decizii Complete

Sarcini de lucru

Completează următoarele sarcini pentru a-ți consolida cunoștințele despre structura alternativă completă

Sarcina 1: Analiză problemă

Enunț: "Scrieți un algoritm care verifică dacă un elev a promovat examenul. Se consideră că se promovează cu nota ≥ 5."

Soluție pentru Sarcina 1:

Analiza problemei:

  • Intrare: nota examen (număr întreg sau real)
  • Condiție: nota ≥ 5
  • Acțiune dacă condiția este adevărată: afișează "Promovat"
  • Acțiune dacă condiția este falsă: afișează "Nepromovat"
  • Tip de date: număr
Sarcina 2: Scriere pseudocod

Cerință: Scrie pseudocodul complet pentru problema de mai sus.

Soluție pentru Sarcina 2:
ALGORITMUL VerificaPromovare VARIABILE nota: real ÎNCEPUT CITESTE nota DACĂ nota ≥ 5 ATUNCI SCRIE "Promovat" ALTFEL SCRIE "Nepromovat" SFÂRȘIT DACĂ SFÂRȘIT

Descarcă exercițiile