Structuri Repetitive și Condiționale
Cuprins
- Introducere
- Structuri Condiționale
- if
- if-else
- if-else if-else
- switch
- Operatorul ternar
- Structuri Repetitive
- while
- do-while
- for
- for-each (enhanced for)
- Instrucțiuni de control al buclelor
- break
- continue
- return
- Structuri imbricate
- Bune practici
- Exemple complexe
- Exerciții practice
1. Introducere
Structurile de control permit programatorilor să controleze fluxul de execuție al programului. Există două categorii principale:
- Structuri condiționale: permit executarea de cod în funcție de anumite condiții
- Structuri repetitive: permit executarea de cod în mod repetat atât timp cât o condiție este îndeplinită
Aceste structuri reprezintă fundația algoritmilor și procesării datelor în Java.
2. Structuri Condiționale
Instrucțiunea if
Sintaxă:
if (condiție) {
// cod executat dacă condiția este adevărată
}
Exemplu:
int varsta = 18;
if (varsta >= 18) {
System.out.println("Persoană adultă");
}
Instrucțiunea if-else
Sintaxă:
if (condiție) {
// cod executat dacă condiția este adevărată
} else {
// cod executat dacă condiția este falsă
}
Exemplu:
int varsta = 16;
if (varsta >= 18) {
System.out.println("Persoană adultă");
} else {
System.out.println("Minor");
}
Instrucțiunea if-else if-else
Sintaxă:
if (condiție1) {
// cod executat dacă condiția1 este adevărată
} else if (condiție2) {
// cod executat dacă condiția1 este falsă și condiția2 este adevărată
} else {
// cod executat dacă toate condițiile anterioare sunt false
}
Exemplu:
int nota = 8;
if (nota >= 9) {
System.out.println("Excelent");
} else if (nota >= 7) {
System.out.println("Bine");
} else if (nota >= 5) {
System.out.println("Satisfăcător");
} else {
System.out.println("Nesatisfăcător");
}
Instrucțiunea switch
Sintaxă:
switch (expresie) {
case valoare1:
// cod executat dacă expresie == valoare1
break;
case valoare2:
// cod executat dacă expresie == valoare2
break;
default:
// cod executat dacă expresia nu se potrivește cu nicio valoare
}
Exemplu:
int zi = 3;
switch (zi) {
case 1:
System.out.println("Luni");
break;
case 2:
System.out.println("Marți");
break;
case 3:
System.out.println("Miercuri");
break;
case 4:
System.out.println("Joi");
break;
case 5:
System.out.println("Vineri");
break;
case 6:
case 7:
System.out.println("Weekend");
break;
default:
System.out.println("Zi invalidă");
}
Switch cu expresii (Java 12+):
String rezultat = switch (zi) {
case 1 -> "Luni";
case 2 -> "Marți";
case 3 -> "Miercuri";
case 4 -> "Joi";
case 5 -> "Vineri";
case 6, 7 -> "Weekend";
default -> "Zi invalidă";
};
Operatorul ternar (? :)
Sintaxă:
rezultat = condiție ? valoare_dacă_adevărat : valoare_dacă_fals;
Exemplu:
int varsta = 20;
String status = (varsta >= 18) ? "adult" : "minor";
3. Structuri Repetitive
Bucla while
Execută blocul de cod atât timp cât condiția este adevărată. Verifică condiția înainte de execuție.
Sintaxă:
while (condiție) {
// cod executat repetat atât timp cât condiția este adevărată
}
Exemplu:
int i = 1;
while (i <= 5) {
System.out.println("Numărul: " + i);
i++;
}
Bucla do-while
Execută blocul de cod cel puțin o dată, apoi repetă execuția atât timp cât condiția este adevărată. Verifică condiția după execuție.
Sintaxă:
do {
// cod executat cel puțin o dată, apoi repetat atât timp cât condiția este adevărată
} while (condiție);
Exemplu:
int i = 1;
do {
System.out.println("Numărul: " + i);
i++;
} while (i <= 5);
Bucla for
O structură compactă care include inițializarea, condiția și incrementarea într-o singură linie.
Sintaxă:
for (inițializare; condiție; incrementare) {
// cod executat repetat
}
Exemplu:
for (int i = 1; i <= 5; i++) {
System.out.println("Numărul: " + i);
}
Bucla for-each (enhanced for)
Folosită pentru iterarea prin colecții și array-uri într-un mod simplificat.
Sintaxă:
for (tip element : colecție) {
// cod care utilizează elementul
}
Exemplu:
int[] numere = {1, 2, 3, 4, 5};
for (int numar : numere) {
System.out.println("Numărul: " + numar);
}
4. Instrucțiuni de control al buclelor
Instrucțiunea break
Termină execuția celei mai apropiate bucle sau structuri switch.
Exemplu:
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // ieșire din buclă când i ajunge la 5
}
System.out.println("Numărul: " + i);
}
Instrucțiunea continue
Sare peste restul iterației curente și trece la următoarea iterație.
Exemplu:
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // sare peste numerele pare
}
System.out.println("Număr impar: " + i);
}
Instrucțiunea return
Termină execuția metodei curente și poate returna o valoare.
Exemplu:
public boolean estePar(int numar) {
if (numar % 2 == 0) {
return true;
}
return false;
}
5. Structuri imbricate
Structurile de control pot fi imbricate în interiorul altor structuri de control pentru a crea logică mai complexă.
Exemple de structuri condiționale imbricate
int varsta = 25;
boolean areDreptDeVot = true;
if (varsta >= 18) {
if (areDreptDeVot) {
System.out.println("Poate vota");
} else {
System.out.println("Nu poate vota deși are vârsta legală");
}
} else {
System.out.println("Nu are vârsta necesară pentru a vota");
}
Exemple de bucle imbricate
// Afișarea unui model de stele
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("* ");
}
System.out.println();
}
Output:
*
* *
* * *
* * * *
* * * * *
6. Bune practici
- Simplitate: Păstrează structurile de control cât mai simple posibil.
- Indentare: Folosește indentări consistente pentru a face codul mai lizibil.
- Acolade: Folosește întotdeauna acolade, chiar și pentru blocuri de o singură linie.
- Evită blocurile adânc imbricate: Mai mult de 3 niveluri de imbricare pot face codul greu de înțeles.
- Folosește switch pentru variabile cu valori discrete și multiple căi de execuție.
- Alege bucla potrivită:
for
când știi numărul de iterații dinaintewhile
când iterezi până la îndeplinirea unei condițiido-while
când trebuie să execuți codul cel puțin o datăfor-each
când iterezi prin colecții sau array-uri
7. Exemple complexe
Exemplu 1: Verificarea unui număr prim
public static boolean estePrim(int numar) {
if (numar <= 1) {
return false;
}
if (numar <= 3) {
return true;
}
if (numar % 2 == 0 || numar % 3 == 0) {
return false;
}
for (int i = 5; i * i <= numar; i += 6) {
if (numar % i == 0 || numar % (i + 2) == 0) {
return false;
}
}
return true;
}
Exemplu 2: Calculul factorialului
public static long factorial(int n) {
if (n < 0) {
throw new IllegalArgumentException("Numărul trebuie să fie pozitiv");
}
long rezultat = 1;
for (int i = 2; i <= n; i++) {
rezultat *= i;
}
return rezultat;
}
Exemplu 3: Afișarea numerelor din seria Fibonacci
public static void afiseazaFibonacci(int n) {
int a = 0, b = 1;
System.out.print("Seria Fibonacci până la " + n + " termeni: ");
for (int i = 1; i <= n; i++) {
System.out.print(a + " ");
int sum = a + b;
a = b;
b = sum;
}
}
Exemplu 4: Tabel de multiplicare
public static void tabelMultiplicare(int n) {
System.out.println("Tabel de multiplicare până la " + n + ":");
// Afișare antet
System.out.print(" |");
for (int i = 1; i <= n; i++) {
System.out.printf("%4d", i);
}
System.out.println("\n--+" + "-".repeat(4 * n));
// Afișare tabel
for (int i = 1; i <= n; i++) {
System.out.printf("%2d|", i);
for (int j = 1; j <= n; j++) {
System.out.printf("%4d", i * j);
}
System.out.println();
}
}
8. Exerciții practice
Exercițiul 1
Scrieți un program care verifică dacă un an este bisect. Un an este bisect dacă este divizibil cu 4 dar nu cu 100, sau dacă este divizibil cu 400.
Exercițiul 2
Implementați un program care afișează toate numerele prime din intervalul [1, 100].
Exercițiul 3
Scrieți un program care calculează suma cifrelor unui număr întreg pozitiv.
Exercițiul 4
Creați un program care afișează un triunghi Pascal cu n rânduri.
Exercițiul 5
Implementați un program care convertește un număr din baza 10 în orice bază între 2 și 16.
Exercițiul 6
Scrieți un program care să determine dacă un șir de caractere este palindrom (se citește la fel de la stânga la dreapta și de la dreapta la stânga).
Exercițiul 7
Creați un joc simplu “Ghicește numărul” în care computerul generează un număr aleatoriu între 1 și 100, iar utilizatorul trebuie să-l ghicească. După fiecare încercare, programul va oferi indicii de tipul “prea mare” sau “prea mic”.