Sunteți pe pagina 1din 7

Prelucrări elementare – tablouri unidimensionale

1. Determinarea elementului minim/maxim


Metoda tipică de determinare a elementului minim/maxim dintr-un vector este următoarea :
se iniţializează minimul/maximul cu primul element din vector apoi se compară cu celelalte
elemente din vector reţinându-se, pe rând, valorile mai mici/mai mari.
minim=a[0]; /* maxim=a[1]; */
for(i=1; i<n; i++)
if(minim>a[i]) /* (maxim<a[i]) */
minim=a[i]; /* maxim=a[i]; */
2. Determinarea primului element cu o anumită proprietate
Pentru a determina primul element (de indice minim) cu o anumită proprietate, se parcurge
vectorul de la stânga la dreapta până când găsim primul element cu proprietatea cerută sau până
când epuizăm elementele vectorului. De exemplu, determinarea primului element nul dintr-un
vector se realizează cu secvenţa:
f=-1;
for(j=0;j<n;j++)
if(!a[j])
{ f=j; break; }

Verificând valoarea variabilei f decidem dacă în vectorul există cel puţin un element cu
proprietatea cerută (f=indicele acestuia) sau nici unul (f =-1).

3. Determinarea sumei elementelor de pe pozitii pare


s=0;
for(i=0; i<n; i+=2)
s+=a[i];
// parcurg vectorul doar pe pozitiile pare si insumez in s valorile din vector, respectiv i va lua
valorile 0, 2, 4,....

4. Determinarea produsului elementelor de pe pozitii impare


p=1;
for(i=1;i<n;i+=2)
p*=a[i];
// parcurg vectorul doar pe pozitiile impare si inmultesc in p valorile din vector, respectiv i va lua
valorile 1,3, 5,....

5. Determinarea numarului elementelor din vector care sunt numere impare


nr=0;
for(i=0;i<n;i++)
if(a[i]%2==1)
// parcurg vectorul si pentru fiecare valoare din vector impara, a[i]%2==1, o numar in variabila nr

6. Inversarea elementelor din vector


Ex. a=(1 2 3 4 5)  a=(5 4 3 2 1)
for(i=0;i<n/2;i++)
{
aux=a[i], a[i]=a[n-1-i]; a[n-1-i]=aux; }

//se interschimba valorile din vector aflate la distante egale fata de marni, a[i] cu a[n-1-i]

7. Mutarea elementelor din vector cu o pozitie la dreapta (permutare circulara la


dreapta)
Ex. a=(1 2 3 4 5)  a=(5 1 2 3 4)
aux=a[n-1]; // se salveaza ultima valoare din vector in aux
for(i=1;i<n;i++)
a[i]=a[i-1];//se “muta” primele n-1 valori cu o pozitie la dreapta
a[0]=aux;//se memoreaza pe prima pozitie din vector valoarea din aux

8. Mutarea elementelor din vector cu o pozitie la stanga (permutare circulara la stanga)


Ex. a=(1 2 3 4 5)  a=( 2 3 4 5 1)
aux=a[0]; // se salveaza prima valoare din vector in aux
for(i=0;i<n-1;i++)
a[i]=a[i+1]; ];//se “muta” ultimele n-1 valori cu o pozitie la stanga
a[n-1]=aux; ;//se memoreaza pe ultima pozitie din vector valoarea din aux

9. Stergerea elementelor cu o anumita proprietate

Stergerea elementelor pare

i=0;//plec de la inceputul vectorului


while(i<n)//cat timp nu am terminat de sters
if(a[i]%2==0)//verific elemental daca este par
{
for(j=i;j<n;j++)//mut elementele cu o pozitie mai in fata
a[j]=a[j+1];
n--; // resetez numarul de elemente
i=0;// pornesc cautarea de la inceput
}
else
i++;// elemental nu este par, inaintez

10. Să se mute la sfârşitul unui vector componentele sale nule, păstrându-se ordinea
acestora .
SE mut fiecare element nenul mai in pozitia ++j , unde j va retine pozitia in care deplasez
elemental nenul. La sfarsit completez cu 0 pn la n.
Exemplu:
1023024010
1 2 2 3 0 2 4 01 0
123024010
123224010
12324010
12323110
1232410000

j=0;
for(i=1;i<=n;i++)
if(a[i]) // daca elemental este diferit de 0 se muta
a[++j]=a[i];
for(i=j+1;i<=n;i++) a[i]=0; // completez cu 0 pn la n.

11. Se cere să se determine componentele distincte din x împreună cu frecvenţa lor de


apariţie.

//in b memoram valorile distincte,iar in f de cate ori apare fiecare


//element distinct

b[1]=a[1]; f[1]=1; k=1;


for(i=2;i<=n;i++)
{
ok=1;
for(j=1;j<=k;j++)
if(a[i]==b[j]) {f[j]++; ok=0; break;}
if(ok){b[++k]=a[i]; f[k]=1; } }

12. Să se construiască şi să se afişeze un nou vector cu componentele pare ale celui


iniţial.
j=0;
for(i=1;i<=n;i++)
if(!(a[i]%2)) a[++j]=a[i];
n=j;

13. Să se calculeze suma elementelor divizibile cu a, pentru a număr natural dat.


s=0;
for(i=1;i<=n;i++)
if(!(x[i]%a)) s+=x[i];

14. Să se insereze între oricare două componente alăturate media aritmetică a celorlalte n-2
componente.
for(i=1;i<=n;i++)
{
Cin>>a[i];
s+=a[i];
}
i=1;
do{
m=(s-a[i]-a[i+1])/(n-2);
for(j=n+1;j>=i+2;j--) a[j]=a[j-1];
a[i+1]=m;
i+=2; n++;
}while(i<n);

15. Se cere să se afişeze primele k componente în ordine crescătoare iar celelalte în


ordine descrescătoare.
do{
cin>>k;
if(k<1 || k>n) cout<<"pozitie eronata\n";
}while(k<1 || k>n);
//sortam in ordine crescatoare vectorul pana in pozitia k
for(i=1;i<=k-1;i++)
for(j=i+1;j<=k;j++)
if(a[i]>a[j])
{
aux=a[i]; a[i]=a[j]; a[j]=aux;
}
//sortam descrescator din pozitia k+1 pana la n
for(i=k+1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
if(a[i]<a[j])
{ aux=a[i]; a[i]=a[j]; a[j]=aux; }
16. Să se determine cel mai mare divizor comun şi cel mai mic multiplu comun a n
numere naturale.

p=1;
for(i=1;i<=n;i++)
{
cin>>a[i]);
p*=a[i];
}
c=a[1];
for(i=2;i<=n;i++)
{
d=a[i];
while(c!=d)
if(c>d)
c-=d;
else
d-=c;
}
cout<<"\ncmmdc=\n"<<c;
cout<<”cmmmc=\n"<<p/c;

17. Să se verifice dacă reprezintă o mulţime în sens matematic (valorile nu se repetă).

for(i=2;i<=n;i++)
for(j=1;j<=i-1;j++)
if(a[i]==a[j]) { ok=0; break; }
if(ok)
cout<<"\n este o multime in sens matematic\n";
else
cout<<"\n nu este o multime in sens matematic\n";

18. Să se determine cel mai mare număr negativ şi poziţiile pe care se află el în şirul dat.

max=-1<<15;
for(i=1;i<=n;i++)
if(a[i]<0 || a[i]>max) max=a[i];
cout<<"\ncel mai mare numar negativ este”<< max<< “ si apare in
pozitiile: ";
for(i=1;i<=n;i++)
if(a[i]==max) cout<<i<<’ ‘;

19. Să se verifice dacă cei doi vectori sunt mulţimi în sens matematic şi , în caz afirmativ,
să se calculeze intersecţia şi reuniunea lor.
for(i=2;i<=m;i++)
for(j=1;j<=i-1;j++)
if(a[i]==a[j])
{
Cout<<"A nu este multime in sens matematic\n";
exit(0);
}
for(i=2;i<=n;i++)
for(j=1;j<=i-1;j++)
if(b[i]==b[j])
{
cout<<"B nu este multime in sens matematic\n";
exit(0); }
cout<<"\nA si B sunt multimi in sens matematic\n";
t=m; //numarul elementelor din reuniune
k=0; //numarul elementelor din intersectie
for(i=1;i<=n;i++)
{
ok=1;
for(j=1;j<=m;j++)
if(b[i]==a[j]) { ok=0; break; }
if(ok)
a[++t]=b[i]; //se adauga la reuniune
else
c[++k]=b[i]; //se adauga la intersectie
}
cout<<"\n Reuniunea este:\n";
for(i=1;i<=t;i++) cout<<a[i]<<” ”;
cout<<"\n Intersectia este:\n");
for(i=1;i<=k;i++) cout<<c[i];

20. Să se stabilească dacă o valoare dată y se află printre componentele unui vector de
numere întregi şi, în caz afirmativ, să se tipărească toate poziţiile în care apare printr-o
singură parcurgere a vectorului.

for(i=1;i<=n;i++)
if(a[i]==y) p[++k]=i;
if(!k)
cout<<y<<” nu apare in vector\n";
else
{
cout<<y<” apare in vector in pozitiile: \n";
for(i=1;i<=k;i++) cout<<p[i]<<” ”;
}
21. Să se înlocuiască fiecare element cu media aritmetică a celorlalte n-1
elemente.
for(i=1;i<=n;i++)
{
Cin>>a[i];
s+=a[i];
}
for(i=1;i<=n;i++) a[i]=(s-a[i])/(n-1);
cout<<”\n\t Vectorul obtinut este:\n";
22. Să se determine elementul maxim din şir şi toate poziţiile în care acesta apare printr-o singură
parcurgere a şirului.
max=a[1]; p[1]=1; k=1;
for(i=2;i<=n;i++)
if(max==a[i]) p[++k]=i;
else
if(max<a[i]) { max=a[i]; p[1]=i; k=1; }
cout<<"\nmaximul este “<<max<< “ si apare in pozitiile:\n";
for(i=1;i<=k;i++) cout<<p[i]<<” “;

23. Să se determine printr-o singură parcurgere a sa cea mai lungă secvenţă de elemente consecutive
egale. Se va preciza lungimea şi poziţia de început a primei astfel de secvenţe fără a folosi
memorie suplimentară.

a[n+1]=a[n]+1;
poz=pmax=1; lung=lmax=1;
for(i=2;i<=n+1;i++)
if(a[i]==a[i-1]) lung++;
else
{
if(lung>lmax) { lmax=lung; pmax=poz; }
poz=i; lung=1;
}
cout<<"\n\t cea mai lunga secventa incepe in pozitia “<<pmax<<” si
este:\n";
for(i=pmax;i<=pmax+lmax-1;i++) cout<<a[i]<<” ”;

24. Să se scrie un program care determină ce element se află pe poziţia k dată în şirul ordonat,
fără a face efectiv ordonarea şi fără a folosi memorie suplimentară. (0<=k<=n-1).
//Pe pozitia k in vectorul ordonat se va gasi acel element care are
//exact k-1 elemente mai mici decat el.
cin>>k;
for(i=1;i<=n;i++)
{
nr=0;
for(j=1;j<=n;j++)
if(a[j]<a[i]) nr++;
if(nr==k-1;
)
{
cout<<"\nin pozitia “<< “ se gaseste elementul “<<;
break;
}
25. Să se rearanjeze elementele lui x astfel încât toate numerele mai mici decât a
să fie înaintea tuturor numerelor mai mari sau egale cu a, fără a ordona efectiv
şirul.
Cin>>a;
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
if(x[i]>=a && x[j]<a)
{
aux=x[i]; x[i]=x[j]; x[j]=aux;
break;
}
cout<<"\n\t Vectorul obtinut este:\n";
for(i=1;i<=n;i++) cout<<x[i]<<” ”;

26. Săse elimine din şir toate elementele mai mici decât a fără a folosi memorie
suplimentară.
Cin>>a;
for(i=1;i<=n;i++)
if(x[i]>=a) x[++k]=x[i];
n=k;
cout<<"\n\t Vectorul obtinut este:\n";
for(i=1;i<=n;i++) cout<<x[i]<<” ”;
27. Să se ordoneze vectorul crescător după distanţa lor faţă de numărul a.
Cin>>a;
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
if(x[i]-a>x[j]-a)
{
aux=x[i]; x[i]=x[j]; x[j]=aux;
}
cout<<"\n\t Vectorul obtinut este:\n";
for(i=1;i<=n;i++) cout<<x[i]<<” ”;

28. Săse determine cea mai lungă secvenţă de elemente consecutive din şir cu
proprietatea că doi vecini au semne diferite.
a[n+1]=a[n];
poz=1; lung=1; pmax=1; lmax=1;
for(i=2;i<=n+1;i++)
if(a[i]*a[i-1]<0)
lung++;
else
{
if(lung>lmax) { lmax=lung; pmax=poz; }
poz=i; lung=1;
}
if(lmax>1)
{
cout<<"\n cea mai lunga secvnta are “<<lmax<<” elemente si
este:\n";
for(i=pmax;i<=pmax+lmax-1;i++) cout<<a[i]<<” ”;

29. La
o adunare a oamenilor de afaceri s-a propus înfiinţarea de către un grup de
investitori a unei societăţi comerciale cu un capital de pornire c, dat.
Cunoscând suma de care dispune fiecare din cei n oameni de afaceri, să se
aleagă acele persoane care totalizează suficient capital pentru a putea înfiinţa
societatea şi în acelaşi timp să formeze un grup cât mai restrâns (pentru ca
posibilităţile de a interveni neînţelegeri între ei să fie cât mai reduse).
//Pentru a forma un grup cat mai redus, sortam oamenii de
//afaceri in ordinea descrescatoare a sumelor detinute si
ii //alege in aceasta ordine pana cand se obtine capitalul
//necesar.

30. Să se localizeze elementul maxim şi toate elementele dinaintea lui să se ordoneze


crescător, iar cele de după el, descrescător, afişându-se rezultatul.

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