În acest articol voi prezenta câteva probleme elementare ce țin de elementele de bază ale limbajului C++ (operatori și expresii, structura alternativă, structura repetitivă). Puteți găsi câteva dintre aceste probleme și pe PbInfo. Sper că este suficient să scriu doar secvențele de cod esențiale și nu tot programul pentru fiecare exercițiu 🙂

Probleme cu operatori și expresii C++

Problema 1.

Să se scrie o expresie care testează dacă a este divizibil cu b, a și b fiind naturale, iar b nenul.

Dacă a este divizibil cu b înseamnă că restul împărțirii lui a la b este 0. Expresia va fi a % b == 0.

Problema 2.

Să se scrie o expresie care testează dacă numărul natural a este nenul, și respectiv una care testează dacă este 0.

Soluția imediată, care folosește operatorul diferit de este a != 0. Există și o soluție mai scurtă, ce testează exact același lucru, și anume a. Într-o structură de genul if (a), numărul a se convertește la tipul bool. Astfel, dacă a este diferit de 0, expresia devine true, iar altfel false. Similar, expresia !a testează dacă a nu este nenul, adică dacă este 0.

Problema 3.

Să se testeze dacă a și b dau același rest la împărțirea la k. Considerăm că a > b și k > 0.

Se observă că dacă a și b dau același rest la împărțirea la k, atunci diferența lor este divizibilă cu k, deci soluția va fi (a - b) % k == 0.

Problema 4.

Să se afișeze rădăcina pătrată a numărului natural n, pătrat perfect.

Pentru a nu implementa un algoritm care să extragă radicalul unui număr, vom folosi funcția sqrt din biblioteca cmath. Pentru a funcționa, trebuie inclusă la început biblioteca unde este definită funcția (#include <cmath>). Expresia va fi cout << sqrt(n).

Problema 5.

Să se afișeze partea întreagă a numărului real n.

Vom folosi operatorul de conversie a tipului (din double în int). Acesta returnează partea întreagă a lui n, deci soluția este (int) n.

Problema 6.

Să se testeze dacă numărul n este pătrat perfect folosind funcția sqrt.

Funcția sqrt returnează mereu un double (un număr real). Cum un pătrat perfect are mereu rădăcina pătrată număr întreg, soluția constă în a testa dacă radicalul lui n este este egal cu partea sa întreagă folosind operatorul de conversie a tipului: sqrt(n) == (int) sqrt(n). Desigur, putem folosi o variabilă auxiliară care să rețină radicalul, pentru a nu se calcula de două ori:

Problema 7.

Să se scrie o expresie care testează dacă numărul întreg x aparține intervalului închis la ambele capete determinat de numerele a și b.

De multe ori în problemele de informatică cu intervale nu se specifică care dintre capete este mai mare, așa că vom avea două cazuri: când a <= b și când a > b.

Expresia va fi: a <= x && x <= b || b <= x && x <= a.

Problema 8.

Să se afișeze codul ASCII al caracterului chr.

O variabilă de tip char reține codul ASCII al caracterului pe care-l reprezintă, diferențele dintre un char și un int cu aceeași valoare sunt doar la citire și afișare. Când afișăm o variabilă de tip char, afișăm caracterul corespunzător ei, însă când afișăm un int, afișăm un număr. Deci, cea mai simplă soluție constă în conversia caracterului la int, pentru a putea fi afișat drept număr: cout << (int) chr.

Problema 9.

Să se scrie o expresie care testează dacă un caracter dat (chr) este o literă a alfabetului englez.

Vom testa dacă chr este o literă mică sau mare. Ne vom folosi de faptul că dacă două litere sunt consecutive în alfabet, atunci și codurile lor ASCII sunt consecutive. Cu alte cuvinte, literele apar în ordine alfabetică în tabelul ASCII.

Deci, expresia va fi 'a' <= chr && chr <= 'z' || 'A' <= chr && chr <= 'Z'.

Problema 10.

Se dă un caracter chr. Să se testeze dacă acesta este un caracter alb.

Vom testa dacă chr este spațiu, tab sau enter: chr == ' ' || chr == '\t' || chr == '\n'.

Problema 11.

Să se afișeze modulul diferenței a două numere a și b.

Avem două cazuri, a > b și a <= b. Putem folosi instrucțiunea if, dar o soluție simplă ce folosește operatorul condițional ternar este a > b ? a - b : b - a.

Probleme cu instrucțiunea alternativă if

Problema 1.

Să se afișeze suma, diferența, produsul, câtul și restul împărțirii a două numere întregi date. Cazul în care b este 0 se va trata separat.

Problema 2.

Să se afișeze maximul a două numere a și b.

Problema 3.

Fiind dată nota unui elev, să se afișeze dacă acesta rămâne corigent sau promovează.

Problema 4.

Să se afișeze minimul a trei numere date (a, b, c).

Ne putem încurca în 100 de if-uri, dar cea mai simplă soluție este să calculăm minimul dintre a și b, iar apoi minimul dintre acest rezultat și c. Ideea se aplică și pentru determinarea minimului/maximului a n numere.

Problema 5.

Stabiliți dacă numărul nenul n este negativ sau pozitiv.

Problema 6.

Să se stabilească dacă un an calendaristic dat este bisect sau nu. Un an este bisect dacă se divide cu 4 și nu se divide cu 100, sau dacă se divide cu 400.

Și o soluție mai concisă:

Problema 7.

Să se verifice dacă trei numere întregi date pot fi laturile unui triunghi.

Ne folosim de inegalitatea triunghiului. Ca trei numere să fie laturile unui triunghi, suma oricăror două laturi trebuie să fie mai mare decât a treia latură. În plus, vom mai testa dacă numerele date sunt strict pozitive.

Problema 8.

Fiind date laturile unui triunghi, să se determine dacă acesta este isoscel și nu este echilateral.

Problema 9.

Fiind date laturile unui triunghi (a ≥ b ≥ c), să se determine dacă acesta este dreptunghic, ascuțitunghic sau obtuzunghic.

Din teorema cosinusului putem deduce că:

  • b2 + c2 > a2 ⇔ triunghi ascuțitunghic
  • b2 + c2 = a2 ⇔ triunghi dreptunghic
  • b2 + c2 < a2 ⇔ triunghi obtuzunghic

Problema 10.

Se dau coordonatele a două puncte în plan (x1, y1, x2, y2). Să se stabilească dacă dreapta este verticală, orizontală sau oblică.

Dacă x1 == x2, atunci dreapta este paralelă cu axa [latex]OY[/latex], deci verticală. Dacă y1 == y2, atunci dreapta este paralelă cu axa [latex]OX[/latex], deci orizontală. Altfel, dreapta este oblică.

Problema 11.

Se dă un număr n de maxim trei cifre. Să se determine câte cifre are.

Problema 12.

Se dau coeficienții din ecuația de gradul al II-lea ax2 + bx + c = 0, cu a nenul. Să se determine rădăcinile sale.

Problema 13.

Se dă o dată calendaristică (ziua: z, luna: l, anul: a), cele trei numere fiind nenule. Să se determine dacă este o dată corectă.

Probleme cu instrucțiunile repetitive (for, while, do while)

Problema 1.

Să se afișeze primele n numere naturale pare nenule în ordine crescătoare.

Vom folosi o variabilă i cu care vom itera de la 1 la n, iar la fiecare pas afișăm dublul ei.

Putem optimiza un pic soluția, și doar să creștem i-ul din 2 în 2, ca să nu se calculeze un produs la fiecare pas.

Totuși n-am făcut mare brânză, pentru că la fiecare pas se calculează 2 * n când se evaluează condiția. Ar fi o idee bună să calculăm acest număr înaintea for-ului, din moment ce nu se va schimba.

Acum se face doar o adunare la fiecare pas. Uneori optimizările de genul ăsta chiar contează pentru numere mari, dar pentru cerința asta prefer prima variantă. O înmulțire cu 2 și o incrementare la fiecare pas nu înseamnă mai nimic.

Problema 2.

Să se calculeze ab, pentru a nenul.

Vom lua o variabilă p inițializată cu 1, în care calculăm rezultatul, și o vom înmulți cu a de b ori. Astfel nici nu va mai trebui să tratăm separat cazul în care b este 0. Problema se poate rezolva mai eficient, în timp logaritmic; despre asta am scris aici.

Problema 3.

Să se afișeze 10n.

Atenție, scrie să se afișeze, deci nu trebuie neapărat să calculăm într-o variabilă răspunsul 😉 Vom afișa cifra 1 urmată de n de 0. Astfel, programul va funcționa și pentru valori foarte mari ale lui n.

Problema 4.

Să se afișeze un dreptunghi format din cifre 0, de lățime m (linii) și lungime n (coloane).

Pentru fiecare linie afișăm n caractere de 0, urmate de enter.

Problema 5.

Să se afișeze o piramidă de ordinul n ca mai jos.

Pentru linia i vom afișa primele i numere naturale nenule.

Problema 6.

Să se afișeze un romb de ordinul n ca mai jos. Exemplul este pentru n == 5:

Nimic special, doar facem câteva observații pentru numărul de spații și de cifre de pe fiecare rând.

Problema 7.

Se citește câte un număr natural până la introducerea lui 0. Calculați suma lor.

Este un exemplu bun pentru folosirea instrucțiunii do while. O putem utiliza ca mai jos deoarece adunarea lui 0 la sumă nu afectează rezultatul.

Problema 8.

Se citește câte un număr natural nenul până la introducerea a două numere egale. Să se calculeze suma tuturor numerelor introduse.

Folosim o variabilă xPrec unde reținem x-ul citit la pasul anterior. Dacă acesta este egal cu x-ul curent, ne putem opri. Vom inițializa xPrec cu 0 pentru a fi siguri că va fi diferit de primul x. Cel mai sugestiv este să folosim while și break.

Problema 9.

Se citesc n numere naturale, n > 0. Să se calculeze media aritmetică a celor impare.

Citim numerele cu un for. La fiecare pas testăm dacă numărul curent este impar. Dacă da, actualizăm suma și numărul de numere impare. La final împărțim cele două variabile.

Acestea sunt cele mai importante exerciții ce pun în evidență elementele de bază ale limbajului C++. Dacă aveți vreo astfel de problemă care nu vă iese, lăsați un comentariu și vă voi ajuta 🙂

Îți place conținutul acestui site?

Dacă vrei să mă susții în întreținerea server-ului și în a scrie mai multe articole de calitate pe acest blog, mă poți ajuta printr-o mică donație. Află aici cum o poți face!