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.
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:
Verifică lumina
Evaluare stareTreci strada
Acțiune pentru AdevăratAșteaptă
Acțiune pentru FalsExemplu interactiv - Comparație Structuri
Observație: Indiferent de valoarea notei, algoritmul va afișa întotdeauna un mesaj relevant - fie "Promovat", fie "Nepromovat".
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.
Problema 2: Acces cu ambele mesaje
Enunț: Scrieți un algoritm care afișează mesaj corespunzător pentru acces permis/respins.
Problema 3: Comparație numere
Enunț: Scrieți un algoritm care afișează care număr este mai mare sau dacă 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:
• Valoare nenulă → true
• Valoare nulă (0) → false
if(x) ≡ if(x != 0)
if(!x) ≡ if(x == 0)
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
Testează-ți cunoștințele:
Când se execută blocul ALTFEL în structura completă?
Exemplu Complet: Vârstă pentru film
#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
Scenariul 2: Vârstă < 12 ani
Aplicații Practice și Best Practices
Când să folosești structura completă:
Best Practices pentru structuri complete:
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 % 2calculează 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:
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++:
citește→cin >>dacă condiție atunci→if (condiție)altfel→elsescrie→cout <<└■→ 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
casetrebuie să fie constante întregi breakoprește execuția - fără el, execuția continuă în următorul casedefaultse execută dacă niciun case nu se potrivește- Case-urile 6 și 7 sunt grupate (nu au instrucțiuni între ele)
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.