Sunteți pe pagina 1din 21

Programarea Calculatoarelor

Modul 1: Rezolvarea algoritmică a problemelor

 Introducere în programare
 Algoritm
Obiectele unui algoritm
 Date
 Constante
 Variabile
 Expresii
 Operaţii specifice unui algoritm şi fluxul de execuţie al
acestora
 Scheme logice
Simboluri grafice corespunzătoare operaţiilor
Exemple de algoritmi rezolvaţi în schemă logică
 Pseudocod
Codificări corespunzătoare operaţiilor
Exemple de algoritmi descrişi în pseudocod
 Probleme propuse şi rezolvate

Introducere în programare
Să considerăm următorul exemplu. Se defineşte funcţia F(x), unde x este număr real, astfel:

x2-2, x<0
F(x)= 3, x=0
x+2, x>0

Se cere să se scrie un program care să calculeze valoarea acestei funcţii pentru următoarele
100 de valori ale lui x: x = {-3, 0,1,7, 2.23, etc} – 100 valori.
Pentru a putea rezolva această cerinţă trebuie să vedem mai întâi care sunt etapele
rezolvării unei probleme utilizând un program informatic.

Etapele rezolvării unei probleme utilizând un program informatic:

1. Formularea clară a problemei:


date disponibile
prelucrări necesare
rezultate dorite
2. Elaborarea algoritmului ce implică analiza detaliată a problemei:
date: sursa (consola/ suport magnetic/…), semnificaţie, tip (numeric/
alfanumeric), restricţii asupra valorilor
rezultate: destinaţie (ecran/imprimantă/suport magnetic /…), mod de
prezentare
principalele etape de rezolvare (schemă logică sau pseudocod)
eventuale restrictii impuse de limbajul de programare în care vom
transpune algoritmul
3. Transpunerea algoritmului în limbajul de programare utilizat
4. Rulare şi ... din nou etapa 2 dacă nu am obţinut ceea ce trebuia.

În cadrul acestui capitol ne vom ocupa de primele două etape, şi anume cea de formulare a
problemei şi cea de elaborare a algoritmului, pentru ca pe parcursul următoarelor capitole
să detaliem modalităţile de implementare a programelor utilizând limbajul de programare C.
Să revenim acum la problema noastră şi să parcurgem prima etapă, cea de formulare clară a
problemei:
datele disponibile sunt cele 100 de valori de intrare x
prelucrări necesare sunt calculul lui F(x) pentru cele 100 de valori ale lui x
rezultatele dorite sunt cele 100 de valori ale lui F(x) calculate prin prelucrări.
În acest moment putem spune că ştim foarte bine ce avem de făcut. Urmează să vedem mai
departe cum anume facem aceasta.
Pentru a trece la etapa a doua a rezolvării problemei nostre vom detalia în cele ce urmează
noţiunea de algoritm precum şi obiectele acestuia.

Algoritm

Algoritm - succesiune de etape ce se poate aplica mecanic pentru rezolvarea unei clase
de probleme.

Cerinţele pe care trebuie să le îndeplinească un algoritm sunt următoarele:


Claritate – să nu existe ambiguităţi pe parcursul derulării acestuia
Generalitate – să poată fi aplicat pentru o întreagă clasă de probleme
Finitudine – să furnizeze rezultatul în timp finit

Redactarea unui algoritm se poate face utilizând:


Scheme logice
Pseudocod

În momentul în care vom căpăta suficientă experienţă în programare iar problema de


rezolvat nu este foarte complexă putem să ne reprezentăm mental algoritmul ei de
rezolvare. Totuşi, în fazele de început sau pentru un algoritm mai complex este foarte
indicat să ne schiţăm algoritmul de rezolvare înainte de a ne apuca de implementarea
propriu-zisă într-un limbaj de programare. Se practică descrierea algoritmului fie sub formă
grafică (organigrame sau scheme logice), fie folosind un “pseudocod”, ca un text
intermediar între limbajul natural şi un limbaj de programare.
O problemă poate avea mai mulţi algoritmi de rezolvare. Cum îl alegem pe cel mai bun şi ce
înseamnă cel mai bun algoritm? Pentru a răspunde la această întrebare se va lua în calcul
principalul criteriu de optimizare a algoritmului (mimimizarea timpului de execuţie, a
memoriei utilizate, etc) şi se va alege, din algoritmii propuşi cel care îndeplineşte cel ami
bine acest criteriu. Această etapă este o etapă ce implică o analiză complexă a algoritmilor
pe care deocamdată, pe parcursul acestui prim curs de programare, nu o vom lua decât
arareori în considerare.

Obiecte cu care lucrează algoritmii

Date
Principalele obiecte ale unui algoritm sunt datele. Ele pot fi:
Date de intrare - care sunt cunoscute
Date de ieşire - rezultate furnizate
După tipul lor, datele pot fi:
Întregi: 2, -4
Reale: 3.25
Logice: true şi false – adevărat şi fals
Caracter: ‘y’
Şir de caractere: “ab23_c”

Constante
În cadrul unui algoritm pot apare constantele, ce sunt date conţinute în program fără a fi
citite sau calculate. Un astfel de exemplu este constanta π din matematică.

Variabile
Programele, şi implicit algoritmii, manipulează (procesează) date. O variabilă este utilizată
pentru a stoca (a păstra) o dată. Se numeşte variabilă pentru că valoarea stocată se poate
schimba. Putem spune că are un nume unic şi poate avea conţinut diferit. Mai precis, o
variabilă este o locaţie de memorie care are un nume şi care păstrează o valoare de un
anumit tip.

O variabilă este caracterizată prin:


Nume
Tip
Valoarea la un moment dat
Locul în memorie (adresa)
Nume Valoare Tipul
variabilă variabilei

număr 123 int

suma -456 int

pi 3.1415 double

medie -12.734 double

Orice variabilă are un nume, conţine o valoare declarată de un anumit tip, valoare memorată mereu la o
aceeaşi adresă de memorie

De exemplu, în problema propusă anterior, putem păstra valorile datelor de intrare (x1, x2,
x3....) într-o variabilă numită x, care va lua pe rând fiecare din aceste valori de intrare.
Variabila x este de tip real, se află în memorie de exemplu la adresa 0xFF32 (adresă care
rămâne fixă) şi poate avea valoarea 3 la un moment dat.
În mod analog, rezultatele ( F(x1), F(x2), F(x3), ...) le vom stoca într-o variabilă F tot de tip
real.

Expresii
Expresiile sunt construite utilizând constante, variabile şi operatori. Ele pot fi de mai multe
tipuri, la fel ca şi datele: 3*x+7, x<y, etc
Operatorii utilizaţi sunt cei matematici (+, - , *, /, mod – restul împărţirii întregi), relaţionali
(<, >, <=, >=, != - diferit, == - comparaţie la egalitate), logici (şi – ambele adevărate, sau – cel
puţin una adevărată, not – negarea unei expresii).

Operaţiile specifice unui algoritm şi fluxul de execuţie al acestora

Un algoritm poate efectua operaţii de:


Intrare: preluarea unei date de la un dispozitiv de intrare (consola, suport
magnetic, etc)
Ieşire: trecerea unei date din memorie către un dispozitiv de ieşire (ecran,
imprimanta, suport magnetic, etc)
Atribuire: x=3; y=x; y=x+y
o Operaţia de atribuire se realizează astfel:
 Se evaluează expresia din dreapta atribuirii
 Valoarea obţinută este atribuită variabilei din stânga, care îşi pierde
vechea valoare
Decizie: o întrebare ridicată de programator la un moment dat în program
În programarea structurată apare teorema de structură a lui Bohm şi Jacopini:

Orice algoritm poate fi compus din numai trei structuri de calcul:


1. structura secvenţială - secvenţa;
2. structura alternativă - decizia;
3. structura repetitivă - ciclul.

Secvenţa este cea mai întâlnită, în cadrul ei instrucţiunile sunt executate în ordinea în care
sunt scrise, de sus în jos, secvenţial.

Decizia implică o întrebare ridicată de programator la un moment dat în program. In funcţie


de răspunsul la întrebare - care poate fi ori “Da”, ori “Nu” - programul se continuă pe una
din ramuri, executându-se blocul corespunzător de operaţii.

Să presupunem că vrem să calculăm funcţia F(x) din exemplu pentru toate numerele întregi
de la 1 la 1000. Pentru aceasta ar trebui să folosim o structură repetitivă (care mai poate fi
numită şi ciclu, buclă sau iteraţie) pentru a realiza una sau mai multe operaţii ce se repetă
(în acest caz calculul unei valori). La acestea sunt bune calculatoarele! Totuşi, ţine de
priceperea noastră să scriem astfel de algoritmi, ce conţin structuri repetitive care să poată
uşura foarte mult rezolvarea unei clase întregi de probleme) nu doar pentru o valoare fixă, ci
pentru orice număr real şi pentru oricâte numere!!

Putem deosebi mai multe structuri repetitive:


1. Structura repetitivă cu conditie iniţială este formată din:
O condiţie, care se află la început
Un bloc de instrucţiuni, care se execută dacă rezultatul evaluării condiţiei este
adevărat
Se mai numeşte şi structură repetitivă de tip while.

2. Structura repetitivă cu condiţie finală


Bloc de instrucţiuni, apoi condiţie.
Blocul de instrucţiuni se execută minim o dată, spre deosebire de structura repetitivă cu
test iniţial, unde blocul de instrucţiuni era posibil să nu se execute deloc, dacă rezultatul
evaluării condiţiei iniţiale era fals.
Se mai numeşte şi structură repetitivă de tip do-while.

3. Structura repetitivă cu contor


Caz particular al structurii de control cu test iniţial.
Utilizează o variabilă pe care o foloseşte ca şi contor şi care:
pleacă de la o valoare;
ajunge până la o valoare;
înaintează cu un pas.
Se mai numeşte şi structură repetitivă de tip for.
Scheme logice

Schemele logice sunt reprezentări grafice ale algoritmilor. Fiecărei operaţii îi corespunde un
simbol grafic:

Start/Stop: marchează începutul/ sfârşitul schemei logice

START STOP
T

Atribuirea: operaţia prin care unei variabile i se atribuie o valoare.

var = expresia

Atribuirea:
Se evaluează expresia, apoi se atribuie valoarea expresiei variabilei din membrul
stâng

Operaţia de intrare: programatorul preia de la tastatură una sau mai multe valori
(intrări)

Citeste x

Operaţia de intrare:
Prin operaţia de citire (denumită şi operaţia de intrare) se preiau succesiv valori de
la tastatură şi se asociază, în ordine, variabilelor specificate.

Operaţia de ieşire: afişează pe ecran o valoare (ieşirea)

Scrie x

Operaţia de ieşire:
Operaţia de scriere (denumită şi operaţia de ieşire) presupune evaluarea în ordine a
expresiilor specificate şi afişarea pe ecran a valorilor lor pe aceeaşi linie.
Acţiuni nedetaliate: un bloc de operaţii nedetaliat

Bloc

Bloc operaţii:
Se execută operaţia specifică blocului, fără ca această operaţie să fie detaliată. Este
utilizat în general pentru operaţii mai complexe, pentru a nu încărca schema logică
principală. Acest bloc va fi detaliat după realizarea schemei logice principale.

Exemplu: dacă vrem să afişăm primele n numere prime, putem avea un bloc de
operatii nedetaliat care testează dacă un număr este prim sau nu.

Secvenţa se reprezintă prin simboluri grafice conectate prin săgeţi ce sugerează


fluxul operaţiilor (secvenţial):

Secvenţial
Operaţie 1

Operaţie 2

.
.
.

Operaţie n

Secvenţa
Se execută în ordine Operaţie 1, apoi Operaţie 2, ş.a.m.d. până la Operaţie n.

Decizia

DA NU
(Adevărat) (Fals)
Conditie
Decizia
Se evaluează Condiţie;
Dacă valoarea Condiţiei este adevărat, atunci se merge pe ramura DA;
Dacă valoarea Condiţiei este fals, se se merge pe ramura NU.

Decizia poate avea una din următoarele forme:

DA NU
NU
Conditie Conditie

DA

Bloc DA Bloc DA Bloc NU

Forma 1 Forma 2

Forma 1:
Se evaluează Condiţie;
Dacă valoarea Condiţiei este adevărat, atunci se execută instrucţiunea
sau instrucţiunile din Blocul DA;
Dacă valoarea Condiţiei este fals, nu se petrece nimic.

Forma 2:
Se evaluează Condiţie;
Dacă valoarea Condiţiei este adevărat se execută instrucţiunea sau
instrucţiunile din Blocul DA;
Dacă valoarea Condiţiei este fals se execută instrucţiunea sau
instrucţiunile din Blocul NU.

Structura repetitivă cu condiţie iniţială (structură repetitivă de tip while)

Structura repetitivă cu condiţie iniţială (structură repetitivă de tip while)

Pas 1 : se evaluează Conditie ;


Pas 2:
dacă valoarea Conditiei este fals (NU), se iese din instrucţiunea
repetitivă;
dacă valoarea expresiei este adevărat (DA), se execută instrucţiunea
sau instrucţiunile din Blocul DA, apoi se reia de la Pas 1

Bucla

DA
Conditie Bloc DA

NU

Structura repetitivă cu condiţie finală (structură repetitivă de tip do-while)

Bloc

Bucla

DA
Conditie

NU

Structura repetitivă cu condiţie finală (structură repetitivă de tip do-while)


Pas 1 : se execută instrucţiunea sau instrucţiunile din Bloc;
Pas 2: se evaluează Conditie;
Pas 3: dacă valoarea Conditiei este fals (NU), se iese din instrucţiunea
repetitivă;
dacă valoarea expresiei este adevărat (DA) se reia de la Pas 1
Structura repetitivă cu contor (structură repetitivă de tip for)

Iniţializare

Bucla

DA Bloc Trecere pas


Conditie
repetitiv urmator

NU

Structura repetitivă cu contor (structură repetitivă de tip for)


Pas 1: se execută instrucţiunea sau instrucţiunile de iniţializare din blocul
Iniţializare.
În general, aceasta înseamnă atribuirea unei valori iniţiale unei variabile
contor, folosită pentru numărarea (contorizarea) paşilor efectuaţi. Fie
această valoare iniţială expresie_1;
Pas 2: se evaluează Conditie;
În general, aceasta condiţie verifică dacă valoarea variabilei contor este mai
mică decât o valoare care poate fi dată sub forma unei expresii. Fie această
această expresie expresie_2;
Pas 3:
o dacă Condiţie nu este adevărată (valoarea variabilei contor este mai
mare decât valoarea expresiei expresie_2), atunci se iese din
instrucţiunea repetitivă.
o dacă este adevărată, (valoarea variabilei contor este mai mică sau egală
cu valoarea expresie expresie_2), atunci :
 se execută instrucţiunea sau instrucţiunile din Blocul repetitiv
 apoi se execută instrucţiunea sau instrucţiunile din blocul Trecere
la pas următor (care de obicei constă în modificarea valorii
variabilei contor cu un anumit pas)
 după care se reia de la Pas 2.

Exemple de algoritmi rezolvaţi în schemă logică


Problema 1: Problema cu funcţia F(x)
Se defineşte funcţia F(x), unde x este număr real, astfel:

x2-2, x<0
F(x)= 3, x=0
x+2, x>0

Să se scrie un program care să calculeze valoarea acestei funcţii pentru 100 de valori ale lui
x.

Rezolvare:

A două etapă a rezolvării acestei probleme este elaborarea algoritmului ce implică analiza
detaliată a problemei:
Date:
x - valoare reală preluată de la consolă
Rezultate:
y - valoare reală care va fi afişată pe ecran (însoţită de un text explicativ)
Principalele etape de rezolvare
citirea datelor (se presupun corecte)
calculul valorii lui y în funcţie de intervalul în care se încadrează valoarea x citită
repetăm aceste etape pentru cele 100 de valori ale lui x.
Pentru a şti câte valori am citit vom folosi o variabilă aşa numită contor (deoarece
contorizează, numără). Este o variabilă întreagă şi o vom numi i. Ea porneşte cu valoarea
iniţială 0 (atenţie! Să nu uităm acest pas, este important!) şi la fiecare valoare citită îi vom
mări valoarea cu 1. Vom continua citirile atâta timp cât i va fi mai mic decât 100.

Urmează schema logică ce descrie în detaliu algoritmul propus:


START
T

i =0

i =i+1

DA DA
i < 100 Citeste x x<0 Scrie y=x*x-2
x2-2 2222222
NU 222222 NU
2
STOP DA
x == 0 Scrie y=3
2222222
NU

Scrie y=x+2
3xx2222222

Problema 2: Actualizarea unei valori intregi cu un procent dat: Să se actualizeze o valoare


naturală cu un procent dat.

Etapele elaborării algoritmului sunt :


1. Formularea problemei:
date:
o valoare curenta (v)
o procent actualizare (p)
prelucrare:
o calculul valorii actualizate
rezultat:
o valoarea calculată (r)

2. Analiza detaliată
Date:
2 valori preluate de la consolă:
v - valoare întreagă, strict pozitivă
p - valoare reala, pozitivă (majorare) sau negativă (diminuare)
Rezultat:
r - valoare reală, strict pozitivă, afişată pe ecran (însoţită de un text explicativ)
Principalele etape de rezolvare
citirea datelor (se presupun corecte)
calculul valorii actualizate cu formula v + v * p / 100 sau v * (1 + p / 100)
afişarea rezultatului

Urmează schema logică ce descrie în detaliu algoritmul propus:

START
T

Citeste v, p

r=v+v*p

Scrie “Valoarea
actualizătă este ”, r

STOP

Pentru problemele care urmează vom oferi doar schema logică ce descrie algoritmul.

Problema 3: Una dintre cele mai simple probleme este citirea şi scrierea unei valori reale.
Date de intrare: x variabilă reala
Date de ieşire: acelaşi x.
În acest caz rezultatul este chiar data de intrare.

START
T

Citeste x

Scrie x

STOP
Problema 4: Rezolvarea ecuaţiei de grad 1: ax+b=0. Atenţie la cazurile speciale: a egal zero
şi/sau b egal zero!
Date de intrare: a şi b, variabile reale
Date de ieşire: x, variabilă reală

START
T

Citeste a,b

DA DA Scrie
a=0 b=0 “Infinitate
de solutii”
NU NU

x = -b / a Scrie
“Nu exista
solutii”

Scrie x

STOP
Problema 5: Să se afişeze suma primelor n numere naturale, n citit de la tastatură.
Date de intrare: n, variabilă întreagă
Date de ieşire: s, variabilă întreagă pozitivă ce stochează suma primelor n numere naturale
Variabile auxiliare: i, variabilă naturală de tip contor

START
T

Citeste n

s=0

i =0
i=i+1

DA
i<n s=s+i

NU

Scrie s

STOP
Problema 6: Algoritmul lui Euclid care determină cel mai mare divizor comun a doi întregi,
prin împărţiri repetate.
Date de intrare: a şi b, variabile întregi, pozitive. Se consideră că a este mai mare ca b.
Date de ieşire: cmmdc care este calculat în b.
Variabile auxiliare: r, variabilă naturală ce păstrează restul împărţirii lui a la b.

Atenţie! Dacă la final vrem să afişăm ceva de genul „Cel mai mare divizor comun al
numerelor: ” şi vrem să urmeze valorile iniţiale pentru a şi respectiv b, nu vom putea face
acest lucru deoarece valorile de intrare ale lui a şi b se pierd, ele modificându-se pe
parcursul execuţiei algoritmului.
Pentru a rezolva această problemă, vom păstra aceste valori iniţiale în două variabile
auxiliare: copie_a şi copie_b, iar la final vom afişa valorile din aceste două variabile.

START
T

Citeste a,b

r=a%b

DA a=b
r>0 b=r
r=a%b
NU

Scrie“cmmmdc
este ”, b

STOP
Pseudocod

Un pseudocod este un text intermediar între limbajul natural şi un limbaj de programare.


Are mai puţine reguli decât un program şi descrie numai operaţiile de prelucrare (nu şi
variabilele folosite). Nu există un pseudocod standardizat sau unanim acceptat. De
asemenea, descrierea unor prelucrări în pseudocod se poate face la diferite niveluri de
detaliere.
Vom descrie în continuare operaţiile unui algoritm într-un posibil pseudocod pe care îl vom
folosi în continuare (tabel):

Operaţia Pseudocod
Start start

Terminare stop.

Atribuire variabila=valoare;

Citire citeste var;

Scriere scrie var;

Decizie daca conditie adevarata


instructiuni_1;
altfel
instructiuni_2;
Structura repetitivă cu atata timp cat conditie adevarata
conditie iniţială - while
instructiuni;

Structura repetitivă cu executa


condiţie finală - do
instructiuni;

atata timp cat conditie adevarata

Structura repetitivă cu pentru contor de la val_initiala la val_finala cu pasul pas


contor - for
instructiuni;

Vom face următoarea convenţie: liniile ce conţin instrucţiuni care se execută în interiorul
unei bucle sau a unei decizii vor fi indentate (scrise deplasat în interior cu cateva spaţii) faţă
de linia pe care începe bucla sau decizia de care aparţin, pentru a pune în evidenţă execuţia
acestora în cadrul buclei (deciziei).
O altă posibilitate de a marca şi mai puternic este aceea de a grupa aceste linii într-un bloc
unitar utilizând acolade:
{
instrucţiune 1
instrucţiune 2
….
instrucţiune 3
}
Această ultimă convenţie este foarte asemănătoare cu ceea ce vom întâlni în limbajul C.

O altă observaţie este legată de simbolul punct şi virgulă „;”, ce apare la sfârşitul
instrucţiunilor. În limbajul C prezenţa acestuia este obligatorie, de aceea, pentru a uşura
trecerea de la pseudocod la C l-am introdus şi în pseudocod, fără însă ca aici prezenţa lui să
fie neapărat obligatorie. Totuşi, în cele ce urmează vom urmări utilizarea acestuia.

Exemple de algoritmi descrişi în pseudocod

Problema 1: Problema cu functia F(x)

start
pentru i de la 0 la 100 cu pasul 1
citeste x;
daca x < 0
scrie x * x – 2;
altfel
daca x = 0
scrie 3;
altfel scrie x + 2;
stop.

Problema 2: Actualizarea unei valori naturale cu un procent dat

start
citeste v, p;
r = v + v * p;
scrie r;
stop.

Problema 3: Citirea şi scrierea unei valori.

start
citeste x;
scrie x;
stop.

Problema 4: Rezolvarea ecuaţiei de grad 1: ax+b=0

start
citeste a,b;
daca a = 0
daca b = 0
scrie “Ecuatia are o infinitate de solutii”;
altfel
“scrie Ecuatia nu are nici o solutie”;
altfel
x = -b / a;
scrie x;
stop.

Problema 5: Să se afişeze suma primelor n numere naturale, n citit de la tastatură.

start
citeste n;
s = 0;
pentru i de la 0 la n cu pasul 1
s = s + i;
scrie s;
stop.

Problema 6: Algoritmul lui Euclid care determină cel mai mare divizor comun a doi întregi,
prin împărţiri repetate:

start
citeste a,b;
r = a mod b;
atata timp cat r > 0
a = b;
b = r;
r = a mod b;
scrie b;
stop.

Probleme propuse:

Problema 1. Interschimbul valorilor a două variabile a şi b.

Indicaţie: Atenţie! Trebuie să folosim o variabilă auxiliară. Nu funcţionează a=b şi apoi b=a
deoarece deja am pierdut valoarea iniţială a lui a!

Problema 2. Rezolvarea ecuaţiei de grad 2: ax2+bx+c=0.

Indicaţie: Atenţie la cazurile speciale! Dacă a este 0 ecuaţia devine ecuaţie de gradul 1!

Problema 3. Să se afişeze în ordine crescătoare valorile a 3 variabile a, b şi c.


Indicaţie: Putem rezolva această problemă comparând două câte două cele 3 variabile. În
cazul în care nu sunt în ordine crescătoare interschimbăm valorile lor.

O altă variantă este cea în care valorile variabilelor nu se modifică ci doar se afişează aceste
valori în ordine crescătoare:

Problema 4. Să se calculeze şi să se afişeze suma: S=1+1*2+1*2*3+..+n!

Indicaţie: Vom folosi o variabilă auxiliară p în care vom calcula produsul parţial.

O altă modalitate este cea în care produsul parţial este actualizat la fiecare pas, fără a mai fi
calculat de fiecare dată de la 1:

Problema 5. Să se calculeze şi să se afişeze suma cifrelor unui număr natural n.

Indicaţie: Vom folosi o variabilă auxiliară c în care vom calcula rând pe rând cifrele. Pentru
aceasta vom lua ultima cifră a lui ca rest al împărţirii lui n la 10, după care micşorăm n
împărţindu-l la 10 pentru a ne pregăti pentru a calcula următoarea cifră, şamd.

Problema 6. Să se calculeze şi să se afişeze inversul unui număr natural n.

Indicaţie: Vom folosi o variabilă auxiliară c în care vom calcula rând pe rând cifrele ca în
problema anterioară, şi vom construi inversul pe măsură ce calculăm aceste cifre.

Problema 7. Să se afişeze dacă un număr natural dat n este prim.

Indicaţie: Pentru aceasta vom împărţi numărul pe rând la numerele de la 2 la radical din n
(este suficient pentru a testa condiţia de prim, după această valoare numerele se vor
repeta). Dacă găsim un număr care să-l împartă exact vom seta o variabilă auxiliară b
(numită variabila flag, sau indicator) pe 0. Ea are rolul de a indica că s-a găsit un număr care
divide exact pe n. Iniţial presupunem că nu există un astfel de număr, şi deci, b va avea
valoarea 1 iniţial.

Problema 8. Să se afişeze primele n numere naturale prime.

Indicaţie: Folosm algoritmul de la problema anterioară la care adăugăm o variabilă de


contorizare – numărare, k.

Problema 9. Să se descompună în factori primi un număr dat n.

Indicaţie: Pentru aceasta vom împărţi numărul pe rând la numerele începând cu 2. Dacă
găsim un număr care să-l împartă exact vom împărţi pe n de câte ori se poate la numărul
găsit, calculând astfel puterea. În modul acesta nu va mai fi necesar să testăm că numerele
la care împărţim sunt prime!
Problema 10. Să se afişeze toate numerele naturale mai mici decât 10000 care se pot
descompune în două moduri diferite ca sumă de două cuburi.

Indicaţie: Această problemă prezintă foarte bine avantajul utilizării unui calculator în
rezolvarea anumitor probleme. Calculăm, pe rând, suma de cuburi a perechilor de numere
de la 1 la 21 (cel mai apropiat întreg de radical de ordin 3 din 10000). Căutăm apoi, pentru
fiecare sumă, o a doua pereche a cărei sumă de cuburi este aceeaşi. Dacă este o pereche
diferită de prima, afişăm numerele.

Problema 11. Să se calculeze valoarea minimă, respectiv maximă, dintr-o secvenţă de n


numere reale.

Indicaţie: Vom utiliza două variabile, max şi min pe care le iniţializăm cu o valoare foarte
mică şi respectiv cu o valoare foarte mare. Vom compara pe rând valorile citite cu max şi
respectiv cu min, iar dacă găsim o valoare mai mare, respectiv mai mică decât acestea
modificăm max (sau min, după cum e cazul) la noua valoare maximă, respectiv minimă.

Problema 12. Se dă o secvenţă de n numere întregi pozitive. Să se afişeze cele mai mari
numere de 2 cifre care nu se află în secvenţa respectivă.

Indicaţie: În cadrul acestei probleme şi a următoarei vom folosi o structură numită vector.
Aceasta este utilă atunci când trebuie să memorăm ca date mai multe valori. Numărul
acestor valori poate fi variabil iar ele vor fi păstrate sub un acelaşi nume, la adrese
consecutive de memorie. Accesarea unei anumite valori se face folosind un index. De
exemplu, dacă avem mai multe valori întregi, vom folosi un vector de numere întregi, v.
Pentru a accesa prima valoare citită vom folosi notaţia v[0], pentru a doua v[1], şamd.
În acest caz vom folosi un vector ca variabilă auxiliară în care vom ţine minte dacă un număr
de două cifre a fost citit de la tastatură (v[nr] este 0 dacă nr nu a fost citit şi v[nr] devine 1
dacă nr a fost citit de la tastatură). Iniţial, toate valorile din vector sunt 0.
Pentru a afla cele mai mari numere de două cifre care nu sunt în secvenţa citită vom
parcurge vectorul v de la coadă (99) la cap până întâlnim două valori zero.
Atenţie! În cazul în care nu există una sau două valori de două cifre care să nu aparţină
secvenţei citite nu se va afişa nimic!

Problema 13. Se dă o secvenţă de n numere întregi, ale căror valori sunt cuprinse în
intervalul 0-100. Să se afişeze valorile care apar cel mai des.

Indicaţie: Vom utiliza de asemenea un vector în care vom ţine minte de câte ori a apărut
fiecare valoare de la 0 la 100 – v[nr] reprezintă de câte ori a fost citit nr. Iniţial toate valorile
din vector sunt 0. Vom determina apoi valoarea maximă din acest vector, după care, pentru
a afişa toate numerele care apar de cele mai multe ori mai parcurgem încă o dată vectorul şi
afişăm indicii pentru care găsim valoarea maximă.

S-ar putea să vă placă și