Teorie
1. Afișare și citire
Cum vorbește programul cu tine
cout << "text"; // scrie pe ecran ce e intre ghilimele cout << x; // scrie VALOAREA din variabila x cout << endl; // trece pe randul urmator cin >> x; // asteapta sa tastezi ceva si pune valoarea in xÎntr-un singur cout poți lega mai multe bucăți, în ordine:
Diferența e importantă: "x" între ghilimele înseamnă litera x, iar x fără ghilimele înseamnă valoarea din variabilă.
2. Tipuri de date și variabile
Cele patru tipuri pe care le folosim
| tip | ce ține | exemplu |
|---|---|---|
| int | număr întreg | 7 · -3 · 1250 |
| double | număr cu virgulă | 12.7 · 3.14 |
| char | un singur caracter | 'a' |
| bool | adevărat sau fals | true · false |
Declarare și atribuire
int x = 7; // DECLARARE (o singura data) + prima valoare x = 12; // ATRIBUIRE: acum x este 12 x = x + 1; // se calculeaza intai partea dreapta: 12+1, apoi x devine 13O variabilă se declară o singură dată, dar poate primi oricâte valori. Ține minte ultima valoare atribuită.
x = x + 1 nu e o ecuație — e o comandă: „ia ce e acum în x, adună 1, pune rezultatul înapoi în x”. Fără asta nu există bucle.
3. Operatori și operații
Operatorii aritmetici
+ adunare · - scădere · * înmulțire · / împărțire · % restul împărțirii
Capcana: dacă ambele numere sunt int, împărțirea taie zecimalele. Nu rotunjește — le aruncă.
Perechea / și % — desfacerea unui număr
Împreună, cele două împart un număr în „câte intră” și „cât rămâne”. E cea mai folosită unealtă de până acum:
250 / 100 = 2 si 250 % 100 = 50 -> 2 lei si 50 bani 47 / 10 = 4 si 47 % 10 = 7 -> 4 zeci si 7 unitatiDin % 10 scoți ultima cifră, iar cu / 10 arunci ultima cifră. Ține minte perechea asta — se întoarce în aproape fiecare exercițiu de mai jos.
Prescurtări utile
x = x + 1; se scrie mai scurt x++; x = x - 1; se scrie mai scurt x--; s = s + i; se scrie mai scurt s += i;4. Condiții — if / else if / else
Comparații și legături
Comparații: < mai mic · <= mai mic sau egal · > mai mare · >= mai mare sau egal · == egal
Atenție: = înseamnă „pune valoarea”, iar == înseamnă „este egal cu”. Sunt lucruri complet diferite.
Legături: && înseamnă și (ambele trebuie să fie adevărate) · || înseamnă sau (măcar una)
Cum se execută un lanț de condiții
if (varsta < 7) { cout << "Bilet gratuit"; } else if (varsta <= 17) { cout << "Bilet redus"; } else { cout << "Bilet intreg"; }Ramurile se verifică în ordine, de sus în jos, și se execută doar prima care e adevărată. Restul sunt sărite, chiar dacă și ele ar fi adevărate.
De aceea else if (varsta <= 17) nu are nevoie de && varsta >= 7: dacă am ajuns aici, înseamnă că prima condiție a fost falsă, deci vârsta e sigur cel puțin 7.
Regula: lanțul se închide cu else. Fără el rămân valori pentru care programul nu spune nimic — și tăcerea nu se vede ca o eroare, programul pare că merge.
Un if singur, fără else, e corect doar când chiar vrei să nu se întâmple nimic în rest.
5. Bucla while
Ce e o buclă
O buclă repetă același bloc de cod de mai multe ori, în loc să-l scrii tu de zece ori. while se citește „cât timp”: cât timp condiția e adevărată, repetă.
Ce se întâmplă de fapt, pas cu pas
Pentru codul de mai sus, programul face asta:
| i | i <= 5 ? | ce se întâmplă |
|---|---|---|
| 1 | adevărat | scrie 1, apoi i devine 2 |
| 2 | adevărat | scrie 2, apoi i devine 3 |
| 3 | adevărat | scrie 3, apoi i devine 4 |
| 4 | adevărat | scrie 4, apoi i devine 5 |
| 5 | adevărat | scrie 5, apoi i devine 6 |
| 6 | fals | bucla se oprește, programul merge mai departe |
Condiția se verifică înainte de fiecare repetare, nu în timpul ei. De aceea 6 nu se mai afișează.
Cele două capcane
1. Bucla care nu se mai oprește. Dacă uiți i++ înăuntru, i rămâne veșnic 1, condiția rămâne veșnic adevărată și programul scrie 1 la nesfârșit. Îl oprești din tastatură cu Ctrl + C.
2. Bucla care nu pornește deloc. Dacă la prima verificare condiția e deja falsă, corpul nu se execută niciodată. Nu e o eroare — e comportamentul normal, și de multe ori exact ce vrei.
int i = 1; while (i <= 0) { // fals din start cout << i << endl; // nu se afiseaza nimic, niciodata }Acumulatorul și contorul
Două unelte care apar în aproape orice buclă. Amândouă se declară înainte de buclă și se modifică înăuntru:
int suma = 0; // ACUMULATOR — aduna valori suma = suma + i; // sau, mai scurt: suma += i; int cate = 0; // CONTOR — numara de cate ori s-a intamplat ceva cate = cate + 1; // sau, mai scurt: cate++;Capcana: dacă le declari în buclă, se resetează la fiecare repetare și rezultatul iese mereu greșit.
int suma = 0; int i = 1; int i = 1; while (i <= 5) { while (i <= 5) { int suma = 0; // GRESIT suma = suma + i; suma = suma + i; i++; i++; } } // suma = 15 // suma o ia de la 0 mereu1.
int / int taie zecimalele — 29 / 3 este 9, nu 9.66.2. Un lanț de
if-uri se închide cu else, altfel programul tace pe unele valori.3. O buclă
while are trei părți: pornirea înainte, condiția în paranteză, pasul înăuntru. Dacă lipsește pasul, nu se mai oprește.
Exerciții — instrucțiunea if
int, double, bool · cin >>, cout <<, endl · operatorii + - * / % · comparațiile <, <=, >, >=, == · && și || · if / else if / else.Reține: împărțirea a două numere
int taie zecimalele (7 / 2 dă 3), iar % dă restul (7 % 2 dă 1). Un lanț de condiții se închide întotdeauna cu else — altfel există input-uri pentru care programul nu spune nimic.Încă NU folosim:
for, while, vectori, string, switch, funcții cu parametri, ! și != (le poți evita rearanjând condițiile).
Partea 1 — la fel ca la clasă
1. Biletul la film
Citește vârsta unui spectator și afișează prețul biletului:
- sub 7 ani —
Bilet gratuit - între 7 și 17 ani —
Bilet redus: 15 lei - de la 18 ani în sus —
Bilet intreg: 30 lei
Testează exact 7 și exact 18 — acolo se rup de obicei lanțurile de condiții.
2. Semnul numărului
Citește un număr întreg și afișează Pozitiv, Negativ sau Zero.
Trei situații, dar nu trei if-uri independente: ultima ramură este else.
3. Calificativul notei
Citește o notă și afișează calificativul: 10 — Excelent; 8 sau 9 — Foarte bine; 6 sau 7 — Bine; 5 — Promovat; între 1 și 4 — Respins. Orice altceva (de exemplu 0, 11, -3) — Nota invalida.
Nicio notă tastată nu are voie să lase ecranul gol.
Partea 2 — un pic mai grele
4. Cel mai mare dintre trei numere — de data asta complet
Citește trei numere a, b, c. Afișează pe primul rând Maxim: urmat de cea mai mare valoare, iar pe al doilea rând:
Toate trei sunt egale— dacă a, b și c au aceeași valoare;Doua numere sunt la egalitate— dacă exact două dintre ele ating maximul;Un singur castigator— dacă maximul este atins de un singur număr.
Programul trebuie să dea răspunsul corect pentru toate rândurile din tabel:
| a b c | Rândul 1 | Rândul 2 |
|---|---|---|
| 5 3 1 | Maxim: 5 | Un singur castigator |
| 1 3 5 | Maxim: 5 | Un singur castigator |
| 5 5 3 | Maxim: 5 | Doua numere sunt la egalitate |
| 3 5 5 | Maxim: 5 | Doua numere sunt la egalitate |
| 5 3 5 | Maxim: 5 | Doua numere sunt la egalitate |
| 4 4 4 | Maxim: 4 | Toate trei sunt egale |
Rezolvă întâi maximul singur (două comparații ajung), abia apoi întreabă câte numere sunt egale cu el.
5. Restul la casă
Citește prețul produsului și bancnota primită, ambele în bani (1 leu = 100 de bani). Afișează:
Bani insuficienti— dacă bancnota e mai mică decât prețul;Suma exacta, multumim— dacă sunt egale;- altfel, restul descompus:
Rest: 7 lei si 50 bani.
/ 100 și % 100 se calculează doar pe ramura care chiar are rest.
6. Ce fel de triunghi
Citește trei lungimi de laturi. Dacă din ele nu se poate forma un triunghi (o latură este mai mare sau egală cu suma celorlalte două), afișează Nu se poate forma un triunghi. Altfel afișează Echilateral (toate trei egale), Isoscel (exact două egale) sau Oarecare.
Prima ramură din lanț este verificarea „nu e triunghi”. Abia după ea are sens să întrebi ce fel de triunghi este.
Partea 3 — provocări
7. Trei numere în ordine crescătoare
Citește trei numere și afișează-le pe un singur rând, în ordine crescătoare, separate prin spațiu. Fără vectori și fără bucle — doar if.
Ai două drumuri: fie acoperi cele șase ordini posibile cu un lanț de else if, fie interschimbi valorile între ele folosind o variabilă ajutătoare, până ajung în ordine. Alege unul și du-l până la capăt.
8. Bancomatul
Soldul din cont este 1000 lei (îl poți pune direct în cod). Citește suma cerută și afișează:
Suma invalida— dacă suma este zero sau negativă;Fonduri insuficiente— dacă suma depășește soldul;Suma trebuie sa fie multiplu de 10— dacă nu se poate da în bancnote;- altfel, bancnotele eliberate, de la cea mai mare la cea mai mică: 100, 50 și 10 lei.
Bancnotele se calculează exact ca leii și banii: / îți dă câte bucăți intră, % îți dă cât a rămas pentru bancnota următoare.
1. Există vreun input pentru care programul tău nu afișează nimic? Dacă da, lipsește un
else.2. Ai testat valorile de la graniță (exact 7, exact 18, exact 5, două numere egale)?
3. Ce scrie pe ecran este adevărat pentru inputul dat, sau doar sună bine?
Exerciții — bucla while
int, double, bool · cin, cout, endl · + - * / % · comparațiile · &&, || · if / else if / else · while.Toate se rezolvă cu
while, nu cu for — asta e ideea setului.Încă NU folosim: vectori,
string, switch, do while, break, continue, funcții cu parametri.Dacă te blochezi, întoarce-te la anatomia buclei și la acumulator/contor din teorie.
Numerele de la 1 la n
Citește un număr n și afișează, pe rânduri, numerele de la 1 până la n.
Cea mai simplă buclă posibilă. Scrie-o pe cele trei părți: pornirea înainte, condiția în paranteză, pasul înăuntru.
Numărătoare inversă
Citește n și afișează numerele de la n până la 1, iar la final Start!.
Se schimbă toate trei părțile: pornești de la n, condiția devine >= 1, iar pasul merge în jos cu i--.
Numerele pare până la n
Citește n și afișează toate numerele pare de la 2 până la n.
Două variante: fie pornești de la 2 și mergi din 2 în 2, fie mergi din 1 în 1 și pui un if cu % 2 == 0 înăuntru. Încearcă-le pe amândouă.
Tabla înmulțirii
Citește n și afișează tabla lui de la 1 la 10, în formatul din exemplu.
Dacă ai scris-o deja cu for, rescrie-o cu while și pune-le una lângă alta — o să vezi că sunt aceleași trei părți, doar mutate.
Din 5 în 5
Citește n și afișează multiplii lui 5, de la 5 în sus, cât timp nu depășesc n.
Testează și cu n = 3: acolo nu trebuie să se afișeze nimic, iar asta e corect — e capcana nr. 2 din teorie.
Suma numerelor de la 1 la n
Citește n și afișează suma tuturor numerelor de la 1 la n.
Primul exercițiu cu acumulator: o variabilă suma, declarată înainte de buclă și pornită de la 0. Verifică pe n = 1 (trebuie 1).
Câte numere pare
Citește n și afișează câte numere pare sunt între 1 și n. Nu le afișa pe ele — doar câte sunt.
Primul exercițiu cu contor: un if înăuntru care decide, și o variabilă care crește cu 1 de fiecare dată când condiția e adevărată.
1. Variabila din condiție se schimbă înăuntru? Dacă nu, bucla nu se oprește niciodată.
2. Ai testat cu n = 1? Și cu un n prea mic, pentru care nu se afișează nimic?
3. Suma și contorul sunt declarate înainte de
while, nu înăuntru?
15 provocări cu if
/ și %.Ce ai voie:
int, double, bool · cin, cout, endl · + - * / % · comparațiile · &&, || · if / else if / else, inclusiv un if în interiorul altuia.Fără bucle — nici
for, nici while. Încă NU folosim: vectori, string, switch, funcții cu parametri, ! și !=.Setul e fără indicii. Dacă te blochezi mai mult de 20 de minute la una, treci la următoarea și revii. Exemplele de rulare sunt parte din enunț — programul tău trebuie să dea exact acele răspunsuri.
Automatul de cafea
O cafea costă 275 bani. Citește suma introdusă, tot în bani. Afișează Suma invalida dacă suma nu e pozitivă, Bani insuficienti dacă nu ajunge, Suma exacta, cafea buna! dacă e fix cât trebuie. Dacă rămâne rest, automatul îl dă din monede de 50, 10 și 5 bani, de la cea mai mare la cea mai mică. Dacă restul nu se poate da exact din monedele astea, afișează Nu pot da restul exact.
Parcarea
Citește câte minute a stat mașina. Minute negative — Valoare invalida. Zero minute — Gratuit. Altfel: prima oră începută costă 5 lei, fiecare oră începută în plus costă 3 lei, iar totalul nu poate depăși 25 de lei pe zi.
Coletul la poștă
Citește greutatea coletului în grame. Dacă nu e pozitivă — Greutate invalida. Dacă trece de 30000 de grame — Colet prea greu. Altfel afișează greutatea în kilograme și grame, apoi tariful: sub 1 kg costă 12 lei, de la 1 kg până la 5 kg costă 20 de lei, peste 5 kg costă 35 de lei.
Timpul de joc
Citește o durată în secunde. Dacă e negativă — Durata invalida. Altfel desfă-o în ore, minute și secunde.
Bufetul școlii
Citește câți bani ai (în bani) și cât costă un sandviș (tot în bani). Preț zero sau negativ — Pret invalid. Dacă nu-ți ajunge nici pentru unul — Nu-ti ajunge. Altfel afișează câte sandvișuri poți cumpăra și cât îți rămâne.
Factura de curent
Citește câți kWh s-au consumat. Valoare negativă — Consum invalid. Zero — Fara consum. Altfel: primii 100 kWh costă 60 de bani fiecare, iar ce trece peste 100 costă 85 de bani fiecare. Afișează totalul în lei și bani.
Bagajul la avion
Citește greutatea bagajului în grame și clasa biletului: 1 sau 2. Orice altă clasă — Clasa invalida. Limita este 32000 de grame la clasa 1 și 23000 la clasa 2. Dacă bagajul se încadrează — Bagaj acceptat. Dacă nu, se plătesc 40 de lei pentru fiecare kilogram început peste limită.
Locul la cinema
Sala are 12 locuri pe rând și 180 de locuri în total, numerotate de la 1. Citește numărul de pe bilet. Dacă nu există în sală — Loc inexistent. Altfel afișează pe ce rând și pe al câtelea loc de pe rând se așază spectatorul.
Abonamentul la sală
Citește pentru câte luni se face abonamentul. Număr nepozitiv — Durata invalida. Altfel afișează durata în ani și luni, apoi prețul: 120 de lei pe lună, cu 10% reducere dacă abonamentul e de cel puțin 12 luni.
Camerele la cămin
Citește câți studenți sunt de cazat, câte paturi are o cameră și câte camere sunt libere. Dacă o cameră are zero paturi sau mai puțin — Camera invalida. Dacă nu ajung camerele — Nu ajung camerele. Altfel afișează câte camere se umplu complet și câți studenți rămân în ultima cameră, ocupată doar parțial.
Sfârșitul orei
Citește ora și minutul la care începe ora de curs, apoi durata ei în minute. Dacă ora nu e între 0 și 23 sau minutul nu e între 0 și 59 — Ora invalida. Altfel afișează la ce oră se termină, în format de 24 de ore.
Schimbul valutar
Citește suma pe care o schimbi, în cenți de euro. Sumă nepozitivă — Suma invalida. Cursul este 498 de bani pentru un euro. Casa de schimb reține un comision din suma rezultată: 2% pentru sume sub 100 de euro, 1% de la 100 de euro în sus. Afișează cât primești, în lei și bani.
Comanda de pizza
Citește câte felii sunt necesare. O pizza are 8 felii și costă 45 de lei. Număr nepozitiv de felii — Comanda invalida. Se comandă atâtea pizza cât e nevoie ca să acopere feliile cerute. Livrarea costă 15 lei, dar e gratuită de la 3 pizza în sus. Afișează câte pizza se comandă și cât costă totul.
Salariul pe ore
Citește câte ore s-au lucrat într-o săptămână. Număr negativ — Valoare invalida. Mai mult de 168 de ore — Imposibil. Tariful este 30 de lei pe oră pentru primele 40 de ore, iar orele peste 40 se plătesc dublu. Afișează totalul.
Reducerea la casă
Citește prețul în lei și încă un număr care spune dacă e ziua clientului: 1 pentru da, 0 pentru nu. Preț nepozitiv — Pret invalid. Alt număr decât 0 sau 1 — Raspuns invalid. Reducerea este 0% sub 100 de lei, 5% de la 100 până la 499 de lei și 10% de la 500 în sus. De ziua clientului se mai adaugă 5%. Afișează procentul aplicat și cât are de plată.
1. Găsește un input pentru care programul tău nu afișează nimic. Dacă există unul, lipsește o ramură.
2. Găsește un input pentru care programul tău afișează ceva fals. Acela e mai periculos decât tăcerea.
3. Ai testat valorile de la graniță — exact 0, exact limita, exact pragul?
main().
Nu le lua neapărat în ordine dacă te blochezi — treci mai departe și revino.