If/Else If/Else
Uneori avem nevoie de mai mult de două ramuri. Imaginează-ți un mainframe care pornește dimineața la centrul de calcul. În funcție de câte secunde mai sunt până la pornirea completă, sistemul trece prin etape diferite
Dacă mai sunt 100 de secunde → verificăm memoria
Dacă mai sunt 60 de secunde → verificăm perifericele
Dacă mai sunt 20 de secunde → încărcăm nucleul sistemului de operare
Dacă mai sunt 10 secunde → pornim procesele de sistem
Altfel → nu facem nimic special
În C înlănțuim ramurile cu else if
#include <stdio.h>
int main(void) {
int secunde = 100;
if (secunde == 100) {
printf("Verific memoria\n");
} else if (secunde == 60) {
printf("Verific perifericele\n");
} else if (secunde == 20) {
printf("Incarc nucleul sistemului de operare\n");
} else if (secunde == 10) {
printf("Pornesc procesele de sistem\n");
} else {
printf("%d secunde nu au niciun efect\n", secunde);
}
return 0;
}
Hai să urmărim ce se întâmplă dacă schimbăm secunde la 60, 20, 10, 42
Lanțul rulează de sus în jos. La prima ramură care este adevărată, C rulează acel bloc și apoi iese din întregul lanț. Ramurile rămase nu sunt verificate niciodată. Așadar pentru secunde = 60, se afișează o singură linie, nu toate
De ce să nu scriem pur și simplu o grămadă de if-uri separate? Așa
#include <stdio.h>
int main(void) {
int secunde = 60;
if (secunde == 100) { printf("100\n"); }
if (secunde == 60) { printf("60\n"); }
if (secunde == 20) { printf("20\n"); }
else { printf("altceva\n"); }
return 0;
}
Problema: fiecare if este independent. else-ul de la final aparține doar ultimului if. Așadar pentru secunde = 60, a treia condiție eșuează (60 != 20), iar else-ul ar afișa "altceva": greșit, am tratat deja 60 mai sus
Regulă practică: când testăm aceeași variabilă pentru mai multe valori, înlănțuim cu if / else if / else
C are de asemenea o instrucțiune switch care se potrivește bine acestui tipar, dar o vom lăsa pentru o lecție mai avansată. Pentru moment, if / else if / else este suficient
Putem îmbrica if-uri unul în altul
#include <stdio.h>
int main(void) {
int secunde = 5;
int eroare_detectata = 0;
if (secunde < 10) {
if (eroare_detectata) {
printf("Eroare detectata. Anulez pornirea\n");
} else {
printf("Nicio eroare detectata. Pornesc sistemul...\n");
}
}
return 0;
}
if-urile îmbricate sunt în regulă, dar dacă ajungi la 5 niveluri de adâncime, codul devine ilizibil. Încearcă să păstrezi lucrurile plate când poți
Misiune: Secvența de pornire a mainframe-ului
Tu ești operatorul de tură. Cronometrul de pornire afișează câte secunde mai sunt până la boot complet, iar un senzor separat îți spune dacă a fost detectată vreo eroare hardware.
Scrie un program care, în interiorul lui main
- declară un int numit secunde
- declară un int numit eroare_detectata
- folosește un lanț if / else if / else:
- dacă
secundeeste 100 → afișeazăVerific memoria - altfel dacă
secundeeste 60 → afișeazăVerific perifericele - altfel dacă
secundeeste 30 → afișeazăIncarc nucleul sistemului de operare - altfel dacă
secundeeste 10 → afișeazăPornesc procesele de sistem - altfel dacă
secundeeste mai mic decât 10 → verificăeroare_detectata: dacă este 1, afișeazăEroare detectata. Anulez pornirea, altfel afișeazăNicio eroare detectata. Pornesc sistemul... - altfel → afișează
%d secunde nu au niciun efect(cu numărul de secunde în loc de%d)
- dacă
Exemplu
Pentru un secunde de 5 și un eroare_detectata de 1, programul tău ar afișa ceva de genul
Eroare detectata. Anulez pornirea