MyCodeSchool
C++ inițiere · operatori, condiții, while
mycodeschool.ro

Operatori, condiții și bucla while în C++

Prima lecție serioasă de C++, întreagă: cum vorbește programul cu tine, ce fac operatorii (inclusiv capcana int / int), cum se execută un lanț de if-uri și cum arată o buclă care chiar se oprește. Teoria e de citit, cele 30 de exerciții sunt de scris și de rulat.

cin / cout tipuri de date operatorii / și % if / else if / else bucla while acumulator și contor 30 de exerciții

Teorie

Partea asta e de citit și de ținut la îndemână, nu de rezolvat. Fiecare bucată de cod de aici o poți scrie și rula ca s-o vezi funcționând — durează un minut și lămurește mai mult decât zece rânduri de explicație.

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:

cout << "x=" << x << endl; // daca x este 12, scrie: x=12

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

tipce țineexemplu
intnumăr întreg7 · -3 · 1250
doublenumăr cu virgulă12.7 · 3.14
charun singur caracter'a'
booladevărat sau falstrue · 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 13

O 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ă.

5 / 2 -> 2 (int / int: zecimalele se pierd) 5 % 2 -> 1 (restul impartirii) 5.0 / 2 -> 2.5 (cel putin unul e double) int medie = (9 + 10 + 10) / 3; // 29/3 = 9 (gresit, s-a pierdut ,66)

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 unitati

Din % 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)

if (varsta >= 7 && varsta <= 14) // intre 7 si 14, inclusiv if (nota == 8 || nota == 9) // sau 8, sau 9

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ă.

int i = 1; // 1. PORNIREA — inainte de bucla while (i <= 5) { // 2. CONDITIA — se verifica INAINTE de fiecare repetare cout << i << endl; // corpul buclei i++; // 3. PASUL — inauntru, altfel nu se termina niciodata }

Ce se întâmplă de fapt, pas cu pas

Pentru codul de mai sus, programul face asta:

ii <= 5 ?ce se întâmplă
1adevăratscrie 1, apoi i devine 2
2adevăratscrie 2, apoi i devine 3
3adevăratscrie 3, apoi i devine 4
4adevăratscrie 4, apoi i devine 5
5adevăratscrie 5, apoi i devine 6
6falsbucla 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.

int i = 1; while (i <= 5) { cout << i << endl; // lipseste i++ -> scrie 1 la infinit }

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 mereu
Trei lucruri de reținut din toată teoria:
1. 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

Ce ai voie să folosești: 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 / 23), iar % dă restul (7 % 21). 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ă

ușor

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
Introduceti varsta: 7 Bilet redus: 15 lei

Testează exact 7 și exact 18 — acolo se rup de obicei lanțurile de condiții.

ușor

2. Semnul numărului

Citește un număr întreg și afișează Pozitiv, Negativ sau Zero.

Introduceti un numar: 0 Zero

Trei situații, dar nu trei if-uri independente: ultima ramură este else.

ușor

3. Calificativul notei

Citește o notă și afișează calificativul: 10Excelent; 8 sau 9Foarte bine; 6 sau 7Bine; 5Promovat; între 1 și 4Respins. Orice altceva (de exemplu 0, 11, -3) — Nota invalida.

Introduceti nota: 11 Nota invalida

Nicio notă tastată nu are voie să lase ecranul gol.

Partea 2 — un pic mai grele

mai greu

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 cRândul 1Rândul 2
5 3 1Maxim: 5Un singur castigator
1 3 5Maxim: 5Un singur castigator
5 5 3Maxim: 5Doua numere sunt la egalitate
3 5 5Maxim: 5Doua numere sunt la egalitate
5 3 5Maxim: 5Doua numere sunt la egalitate
4 4 4Maxim: 4Toate trei sunt egale

Rezolvă întâi maximul singur (două comparații ajung), abia apoi întreabă câte numere sunt egale cu el.

mai greu

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.
Pretul (in bani): 1250 Bancnota (in bani): 2000 Rest: 7 lei si 50 bani

/ 100 și % 100 se calculează doar pe ramura care chiar are rest.

mai greu

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.

a b c: 1 2 9 Nu se poate forma un triunghi a b c: 5 5 8 Isoscel

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

provocare

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.

Introduceti trei numere: 7 2 5 2 5 7 Introduceti trei numere: 4 4 1 1 4 4

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.

provocare

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.
Suma dorita: 780 Bancnote de 100: 7 Bancnote de 50: 1 Bancnote de 10: 3

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.

Înainte să treci mai departe, trece fiecare exercițiu prin trei întrebări:
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

Ce ai voie: 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.
1

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.

Introduceti un numar: 5 1 2 3 4 5

Cea mai simplă buclă posibilă. Scrie-o pe cele trei părți: pornirea înainte, condiția în paranteză, pasul înăuntru.

2

Numărătoare inversă

Citește n și afișează numerele de la n până la 1, iar la final Start!.

Introduceti un numar: 4 4 3 2 1 Start!

Se schimbă toate trei părțile: pornești de la n, condiția devine >= 1, iar pasul merge în jos cu i--.

3

Numerele pare până la n

Citește n și afișează toate numerele pare de la 2 până la n.

Introduceti un numar: 9 2 4 6 8

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ă.

4

Tabla înmulțirii

Citește n și afișează tabla lui de la 1 la 10, în formatul din exemplu.

Introduceti un numar: 7 7x1=7 7x2=14 ... 7x10=70

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.

5

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.

Introduceti un numar: 23 5 10 15 20

Testează și cu n = 3: acolo nu trebuie să se afișeze nimic, iar asta e corect — e capcana nr. 2 din teorie.

6

Suma numerelor de la 1 la n

Citește n și afișează suma tuturor numerelor de la 1 la n.

Introduceti un numar: 5 Suma este 15

Primul exercițiu cu acumulator: o variabilă suma, declarată înainte de buclă și pornită de la 0. Verifică pe n = 1 (trebuie 1).

7

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.

Introduceti un numar: 9 Sunt 4 numere pare

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ă.

Verifică fiecare buclă înainte s-o consideri gata:
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

Toate sunt construite ca exercițiul cu bancomatul: o situație reală, câteva verificări care trebuie făcute în ordinea potrivită, fiecare cu mesajul ei, și abia la final calculul — cu / ș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.
1

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.

Suma introdusa: 500 Monede de 50: 4 Monede de 10: 2 Monede de 5: 1 Suma introdusa: 278 Nu pot da restul exact
2

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.

Minute: 61 De plata: 8 lei Minute: 600 De plata: 25 lei
3

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.

Greutatea (g): 4300 4 kg si 300 g Tarif: 20 lei Greutatea (g): 850 0 kg si 850 g Tarif: 12 lei
4

Timpul de joc

Citește o durată în secunde. Dacă e negativă — Durata invalida. Altfel desfă-o în ore, minute și secunde.

Secunde: 3661 1 ore, 1 minute, 1 secunde Secunde: 90 0 ore, 1 minute, 30 secunde
5

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.

Banii si pretul: 1000 350 2 sandvisuri, iti raman 300 bani
6

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.

kWh: 150 De plata: 102 lei si 50 bani kWh: 80 De plata: 48 lei si 0 bani
7

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ă.

Greutatea si clasa: 25500 2 Suprataxa: 120 lei Greutatea si clasa: 20000 2 Bagaj acceptat
8

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.

Numarul locului: 25 Randul 3, locul 1 Numarul locului: 24 Randul 2, locul 12
9

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.

Luni: 15 1 ani si 3 luni De plata: 1620 lei Luni: 5 0 ani si 5 luni De plata: 600 lei
10

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.

Studenti, paturi, camere: 47 4 15 11 camere pline si 3 studenti in a 12-a camera Studenti, paturi, camere: 47 4 10 Nu ajung camerele
11

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.

Ora, minutul, durata: 13 50 45 Se termina la 14:35 Ora, minutul, durata: 23 30 45 Se termina la 0:15
12

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.

Centi de euro: 5000 Primesti 244 lei si 2 bani
13

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.

Felii: 20 3 pizza, total 135 lei Felii: 10 2 pizza, total 105 lei
14

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.

Ore: 45 De plata: 1500 lei Ore: 38 De plata: 1140 lei
15

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ă.

Pretul si ziua: 600 1 Reducere: 15% De plata: 510 lei Pretul si ziua: 80 0 Reducere: 0% De plata: 80 lei
Regula setului, la fiecare provocare:
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?
Scrie fiecare exercițiu ca o funcție separată și testeaz-o pe rând din main(). Nu le lua neapărat în ordine dacă te blochezi — treci mai departe și revino.