Un program este transpunerea unui algoritm. Înainte de a scrie cod, problema trebuie descrisă ca o succesiune ordonată de pași. Această lucrare tratează reprezentarea algoritmilor și prima categorie de instrucțiuni care schimbă ordinea execuției: cele de decizie.
1Obiectivele lucrării
- Descrierea unui algoritm prin schemă logică și prin pseudocod
- Distingerea instrucțiunilor expresie de cele compuse
- Utilizarea corectă a instrucțiunilor
ifșiif-else - Rezolvarea ambiguității
elseprin folosirea acoladelor - Aplicarea instrucțiunii
switchși înțelegerea rolului luibreak
2Algoritmi și moduri de reprezentare
Algoritmul este o succesiune finită de acțiuni care, aplicate datelor de intrare, conduc la rezultatul dorit. Descrierea lui este o etapă intermediară între formularea matematică și programul scris într-un limbaj concret.
| Metodă | Avantaje | Dezavantaje |
|---|---|---|
| Limbaj natural | nu necesită pregătire specială | ambiguu la probleme complexe |
| Schemă logică | vizual clară, ușor de urmărit | devine greu de desenat pentru algoritmi mari |
| Pseudocod | concis, apropiat de codul final | nu este standardizat |
| Tabele de decizie | ideal pentru multe alternative combinate | nepotrivit pentru algoritmi secvențiali |
3Simboluri în schemele logice
4Tipuri de instrucțiuni
| Tip | Formă | Observații |
|---|---|---|
| Instrucțiune expresie | expresie; | orice expresie urmată de ; devine instrucțiune |
| Instrucțiune vidă | ; | nu face nimic; utilă acolo unde sintaxa cere o instrucțiune |
| Instrucțiune compusă (bloc) | { ... } | grupează mai multe instrucțiuni; poate conține declarații locale |
| Instrucțiuni de decizie | if, if-else, switch | aleg o ramură de execuție |
| Instrucțiuni repetitive | while, do-while, for | tratate în Laboratorul 6 |
| Instrucțiuni de salt | break, continue, return, goto | întrerup fluxul normal |
5Instrucțiunea if
if (expresie)
instructiune; // forma simpla
if (expresie)
instructiune_1;
else
instructiune_2; // forma cu alternativa
if (expresie_1) {
...
} else if (expresie_2) {
...
} else {
... // alternative in cascada
}
if nu trebuie să fie
neapărat o comparație. Orice valoare nenulă este considerată adevărată, iar zero este fals.
De aceea if (n) este echivalent cu if (n != 0).6Simulator de decizie
Urmăriți pas cu pas cum se evaluează condițiile într-o cascadă if-else if
și de ce ordinea testelor contează.
nota < 9 pare să accepte și
note sub 5, dar acele cazuri au fost deja tratate de condițiile anterioare. Într-o cascadă,
fiecare ramură presupune implicit că toate cele de dinaintea ei au fost false.7Instrucțiunea switch
switch (expresie) {
case c1:
instructiuni;
break;
case c2:
instructiuni;
break;
default:
instructiuni;
}
| Aspect | Regulă |
|---|---|
| Tipul expresiei | trebuie să fie întreg sau caracter - nu float, nu șir |
Etichetele case | trebuie să fie constante, distincte între ele |
break | oprește execuția; fără el se continuă în cazul următor |
default | opțional; se execută dacă niciun caz nu se potrivește |
break face ca execuția
să continue în cazurile următoare, indiferent de valoarea lor. Uneori este intenționat - pentru a grupa
mai multe valori care primesc același tratament - dar cel mai des este o omisiune.8Erori frecvente
if (a > b); este sintactic corect: corpul lui if devine instrucțiunea vidă,
iar blocul următor se execută întotdeauna. Compilatorul nu semnalează nimic.else se asociază întotdeauna cu cel mai apropiat if neasociat,
indiferent de indentare. Indentarea înșeală ochiul, nu compilatorul. Folosiți acolade mereu.if (0.1 + 0.2 == 0.3) este fals, din cauza reprezentării binare aproximative.
Corect: if (fabs(a - b) < 1e-9).if (x = 0) atribuie și dă fals mereu; if (x = 5) atribuie și dă adevărat mereu.
Unii programatori scriu if (5 == x) tocmai pentru ca greșeala să devină eroare de compilare.9Cod sursă
#include <stdio.h>
#include <math.h>
int main(void)
{
double a, b, c, delta, x1, x2;
printf("Coeficientii a, b, c: ");
scanf("%lf %lf %lf", &a, &b, &c);
if (a == 0) {
if (b == 0) {
if (c == 0) printf("Identitate: orice x este solutie\n");
else printf("Ecuatie imposibila\n");
} else {
printf("Ecuatie de gradul I: x = %.4f\n", -c / b);
}
} else {
delta = b * b - 4 * a * c;
if (delta > 0) {
x1 = (-b + sqrt(delta)) / (2 * a);
x2 = (-b - sqrt(delta)) / (2 * a);
printf("Doua radacini reale: %.4f si %.4f\n", x1, x2);
} else if (delta == 0) {
printf("Radacina dubla: %.4f\n", -b / (2 * a));
} else {
printf("Radacini complexe: %.4f +/- %.4fi\n",
-b / (2 * a), sqrt(-delta) / (2 * a));
}
}
return 0;
}
#include <stdio.h>
int main(void)
{
double a, b;
char op;
printf("Expresie (ex: 12 * 4): ");
scanf("%lf %c %lf", &a, &op, &b);
switch (op) {
case '+':
printf("%.2f\n", a + b);
break;
case '-':
printf("%.2f\n", a - b);
break;
case '*':
case 'x': // grupare intentionata: * si x fac acelasi lucru
case 'X':
printf("%.2f\n", a * b);
break;
case '/':
if (b == 0) printf("Impartire la zero!\n");
else printf("%.2f\n", a / b);
break;
default:
printf("Operator necunoscut: %c\n", op);
}
return 0;
}
#include <stdio.h>
int main(void)
{
int a = 1, b = 2;
// GRESIT: indentarea sugereaza altceva decat face compilatorul
if (a > 0)
if (b > 5)
printf("b mare\n");
else // se leaga de AL DOILEA if, nu de primul!
printf("Aici NU inseamna a <= 0\n");
// CORECT: acoladele elimina orice ambiguitate
if (a > 0) {
if (b > 5) {
printf("b mare\n");
}
} else {
printf("a <= 0\n");
}
return 0;
}
10Atelier de cod
Deciziile se înțeleg cel mai bine urmărindu-le pas cu pas. Rulați programele, apoi schimbați datele de intrare ca să forțați fiecare ramură.
1 -4 4 (rădăcină dublă), apoi în 1 1 5 (rădăcini complexe) și în 0 2 6 (gradul I). Fiecare set de valori duce execuția pe altă ramură.11Sarcini de lucru
- Desenați schema logică pentru determinarea maximului dintre trei numere, apoi implementați-o.
- Scrieți programul complet de rezolvare a ecuației de gradul II, tratând toate cazurile particulare.
- Implementați un calculator cu
switch, care tratează și împărțirea la zero. - Reproduceți eroarea cu
;dupăifși explicați comportamentul observat. - Rulați exemplul cu ambiguitatea
elseși verificați de careifse leagă. - Testați
if (0.1 + 0.2 == 0.3)și corectați comparația folosind o toleranță. - Scrieți un program care afișează numărul de zile dintr-o lună, folosind
switchcu grupare de cazuri.
12Aplicație de aprofundare
switch pentru afișarea numelui zilei.