Vous êtes sur la page 1sur 12

Algoritmi de tablouri 2

Cautarea unui element intr-un vector


Cautarea Secventiala
Algoritmul se utilizeaza pentru un tablou nesortat.

1 #include <iostream>
2 using namespace std;
3 int main()
4{
5 int i=0,n,x,v[50];
6 cout<<"Valoarea cautata X: ";cin>>x;
7 cout<<"Dati numarul de elemente pentru tablou: ";cin>>n;
8 for (i=0;i<n;i++)
9 {
10 cout<<"v["<<i+1<<"]=";cin>>v[i];
11 }
12 i=0;
13 while ( (i<n) && (v[i]!=x) )
14 {/*se parcurg elementele tabloului pana se gaseste
15 elementul sau pana se termina de parcurs tot vectorul*/
16 i++;
17 }
18 (i!=n)?cout<<"elementul este la pozitia "<<i+1<<endl:cout<<"nu exista elementul\n";
19
20 return 0;
21 }

Pentru un tablou de tip matrice se va utiliza la bucla while urmatorul script:

i=0;j=0;
/*se parcurge matricea linie cu linie, iar pe fiecare line se parcurg coloanele
una cate una, pana se gaseste elementul sau pana se termina de parcurs toate liniile */
while ( (i<n) && (v[i][j]!=x) )
{if (j==n-1){j=0; i++;} else j++;
}
(i!=n)?cout<<"elementul este la linia "<<i+1<<",coloana "<<j+1<<endl:cout<<"nu s-a gasit elementul\n";
Cautarea Binara
1 #include<iostream>
2
3 using namespace std;
4 int n,a[20],st,dr,i,m,x,gasit;
5 int main() {
6 cout<<"n=";cin>>n;
7 cout<<"x=";cin>>x;
8
9 for(i=0;i<n;i++)
10 {cout<<"a["<<i<<"]=";cin>>a[i];}
11 st=0;dr=n-1; gasit=0;
12 while((st<dr)&&(!gasit))//cat timp vect poate fi impartit in subvectori si nu s a gasit elem
13 { m=(st+dr)/2;//m-este mijlocul vectorului
14 if(a[m]==x){gasit=1;}//daca s a gasit elem
15 else//se stabileste subvect in care se continua cautarea
16 {
17 if(x<a[m]){dr=m-1;}
18 else{st=m+1;}
19 }
20 }
21 if(st>dr){
22 cout<<"Nu s a gasit elem";}
23 else{
24 cout<<"S a gasit elem in pozitia"<<m+1;
25 }
26 return 0;
27 }

Inserare element in vector

1 #include <iostream>
2 using namespace std;
3 const int DIM = 10;
4 int n, a[DIM], i, k, x;
5 int main() {
6 cout << "n=";
7 cin >> n;
8 cout << "k=";
9 cin >> k;
10 cout << "x=";
11 cin >> x;
12
13 for (i = 0; i < n; i++) {
14 cout << "a[" << i << "]=";
15 cin >> a[i];
16 }
17 if (n + 1 < DIM) {
18 for (i = n; i > k; i--)
19 a[i] = a[i - 1];
20 a[k] = x;
21
22 for (i = 0; i < n + 1; i++)
23 cout << " " << a[i];
24 }
25
26 else{
27 for (i = n - 1; i > k; i--)
28 a[i] = a[i - 1];
29 a[k] = x;
30 for (i = 0; i < n; i++)
31 cout << " " << a[i];
32 }
33 cout<<endl;
34 return 0;
35 }
Stergere unui element din vector

1 #include <iostream>
2 using namespace std;
3 int a[20], n, i, k;
4 int main() {
5 cout << "n=";
6 cin >> n;
7 cout << "k=";
8 cin >> k;
9
10 for (i = 0; i < n; i++) //creare vector
11 {
12 cout << "a[" << i << "]=";
13 cin >> a[i];
14 }
15 for (i = k; i < n - 1; i++) {
16 a[i] = a[i + 1];
17 }
18 for (i = 0; i < n - 1; i++)
19 cout << a[i] << " ";
20 return 0;
21 }

-------------------------------------------------

Probleme rezolvate:

1 /*
2 Se citesc elementele unui tablou unidimensional cu n (n<=1OO) componente, numere ntregi din cel mult 4 cifre fiecare.
3 S se verifice dac tabloul este ordonat (cresctor sau descresctor).
4 */
5 int main()
6 {
7 int v[100];
8 int i,n,crescator;
9 cout<<"Dati dimensiunea vectorului ";cin>>n;
10 for(i=0;i<n;i++)
11 {
12 cout<<"Dati valoarea "<<i+1<<" ";cin>>v[i];
13 }
14 //presupunem ca vectorul este ordonat crescator !
15 crescator=1;
16 i=0;
17 while((i<n-1)&&(crescator!=0))
18 {
19 if(v[i]>v[i+1])crescator=0;
20 i++;
21 }
22 if(crescator==0)cout<<"Vectorul nu este ordonat crescator";
23 else cout<<"Vectorul este ordonat crescator !";
24 return 0;
-------------
1 /*
2 Se citesc elementele unui tablou unidimensional cu n (n<=100) componente, numere ntregi din cel mult 4 cifre fiecare.
3 S se realizeze urmtoarele prelucrri:
4 a. S se afieze i s se numere elementele pare de pe poziiile impare ale unui vector.
5 b. S se numere elementele pozitive i pare.
6 c. Calculati produsul elementelor negative.
7 d. S se calculeze media aritmetica a elementelor pozitive.
8 */
9 int v[100];
10 int i,n,nra,nrb,nrd;
11 int p,s;
12 float ma;
13 int main()
14 {
15 cout<<"Dati dimensinea vectorului ";cin>>n;
16 for(i=1;i<=n;i++)
17 {
18 cout<<"Dati elementul de pe pozitia "<<i<<" "; cin>>v[i];
19 }
20 //cerinta a)
21 nra=0;
22 cout<<"Elementele pare situate pe pozitii impare sunt = ";
23 for(i=1;i<=n;i++)
24 if((v[i]%2==0)&&(i%2!=0))
25 {
26 cout<<v[i]<<" ";
27 nra++;
28 }
29 cout<<endl;
30 cout<<"Am gasit "<<nra<<" elemente pare situate pe pozitii impare "<<endl;
31 //cerinta b)
32 nrb=0;
33 for(i=1;i<=n;i++)
34 if((v[i]>0)&&(v[i]%2==0))nrb++;
35 cout<<"Am gasit "<<nrb<<" numere pozitive si pare !"<<endl;
36 //cerinta c)
37 p=1;
38 int gasit=0;
39 for(i=1;i<=n;i++)
40 if(v[i]<0)
41 {
42 p=p*v[i];
43 gasit=1;
44 }
45 if(gasit==0)cout<<"Sirul de valori introduse nu contine elemente negative !"<<endl;
46 else cout<<"Produsul elementelor negative este = "<<p<<endl;
47 //cerinta d)
48 s=0;
49 nrd=0;
50 for(i=1;i<=n;i++)
51 if(v[i]>0)
52 {
53 s=s+v[i];
54 nrd++;
55 }
46 else cout<<"Produsul elementelor negative este = "<<p<<endl;
47 //cerinta d)
48 s=0;
49 nrd=0;
50 for(i=1;i<=n;i++)
51 if(v[i]>0)
52 {
53 s=s+v[i];
54 nrd++;
55 }
56 if(nrd==0)cout<<"Nu pot calcula media aritmetica a elementelor pozitve !";
57 else
58 {
59 ma=(float)s/nrd;
60 cout<<"Media aritmetica a elementelor pozitive este = "<<ma<<endl;
61 }
62 return 0;
63 }

1 /* Fie un tablou v unidimensional cu n numere


2 ntregi (n<=100). S se inlocuiasca toate .
3 valorile egale cu valoarea minim cu Valoarea
4 maxim din tablou.*/
5 int main()
6 {
7 int n,i,min,max;
8 int a[100];
9 cout<<"Dati valoarea lui n =";cin>>n;
10 for(i=0;i<n;i++)
11 {
12 cout<<"Dati valoarea "<<i<<" ";cin>>a[i];
13 }
14 max=min=a[0];
15 for(i=1;i<n;i++)
16 {
17 if(a[i]<min)min=a[i];
18 if(a[i]>max)max=a[i];
19 }
20 //urmeaza inlocuirea in vector a valorilor minime , cu valorile maxime.
21 for(i=0;i<n;i++)
22 if(a[i]==min)a[i]=max;
23 //urmeaza afisarea vectorului modificat !
24 for(i=0;i<n;i++)cout<<a[i]<<" ";
25 return 0;
26 }

1 /*Se citesc elementele unui tablou


2 unidimensional cu n (n<=5O) numere ntregi
3 cu cel mult patru cifre.
4 S se insereze dup fiecare numr impar
5 din tablou dublul acestuia.*/
6
7 int main()
8 {
9 int x[50];
10 int i,j,n;
11
12 cout<<"Dati valoarea lui n=";cin>>n;
13 for(i=0;i<n;i++)
14 {
15 cout<<"Dati valoarea elementului "<<i<<" ";
16 cin>>x[i];
17 }
18
9 int x[50];
10 int i,j,n;
11
12 cout<<"Dati valoarea lui n=";cin>>n;
13 for(i=0;i<n;i++)
14 {
15 cout<<"Dati valoarea elementului "<<i<<" ";
16 cin>>x[i];
17 }
18
19 for(i=0;i<n;i++)
20 if(x[i]%2!=0)
21 {
22 for(j=n;j>i;j--)x[j+1]=x[j];
23 x[i+1]=2*x[i];
24 n++;
25 }
26
27 for(i=0;i<n;i++)cout<<x[i]<<" ";
28
29 return 0;
30 }

1 /*Fie un tablou v unidimensional cu n


2 numere ntregi (n<=l00).
3 S se mute la sfritul tabloului
4 zerourile fr a schimba ordinea
5 elementelor nenule.*/
6
7 int main()
8 {
9 int v[100];
10 int i,n,nr;
11
12 cout<<"Dati dimensiunea vectorului ";cin>>n;
13 for(i=0;i<n;i++)
14 {
15 cout<<"Dati valoarea elementului "<<i<<" ";
16 cin>>v[i];
17 }
18 nr=0;//numar zerourile , daca sunt!
19 for(i=0;i<n;i++)
20 while(v[i]==0) // daca sunt mai multe zerouri unul dupa altul !!!
21 {
22 for(int j=i;j<n;j++)v[j]=v[j+1];
23 n--;
24 nr++;
25 }
26 //punem la loc zerourile , la sfarsitul vectorului
27 for(i=0;i<nr;i++)v[n+i]=0;
28 //afisez vectorul modificat
29 for(i=0;i<n+nr;i++)cout<<v[i]<<" ";
30 return 0;
31 }

-
1 /*Fie un tablou v unidimensional cu n numere ntregi (n<=80).
2
3 Sa se elimine valorile pare din tablou.*/
4
5 int main()
6 {
7 int v[80];
8 int i,n;
9 cout<<"Dati dimensiunea vectorului ";cin>>n;
10 for(i=0;i<n;i++)
11 {
12 cout<<"Dati valoarea elementului "<<i<<" ";
13 cin>>v[i];
14 }
15 for(i=0;i<n;i++)
16 while(v[i]%2==0)
17 {
18 for(int j=i;j<n;j++)v[j]=v[j+1];
19 n--;
20 }
21
22 for(i=0;i<n;i++)cout<<v[i]<<" ";
23 return 0;
24 }

1 /*Fie un tablou v unidimensional cu n numere ntregi (n<=80).


2
3 Sa se ordoneze crescator elementele tabloului*/
4 int main()
5 {
6 int v[80];
7 int i,j,n,t;
8 cout<<"Dati valoarea lui n=";cin>>n;
9 for(i=0;i<n;i++)
10 {
11 cout<<"Dati valoarea "<<i<<" ";cin>>v[i];
12 }
13 for(i=0;i<n-1;i++)
14 for(j=i+1;j<n;j++)
15 {
16 if(v[i]>v[j])
17 {
18 t=v[i];v[i]=v[j];v[j]=t;
19 }
20 }
21 cout<<"Vectorul sortat este : ";
22 for(i=0;i<n;i++)cout<<v[i]<<" ";
23 return 0;
24 }

1 /*Fie un tablou v unidimensional cu n numere ntregi (n<=30).S se ordoneze Cresctor


2 prima jumtate & descresctor cea de-a doua jumtate a vectorului v */
3
4 int main()
5 {
6 int v[30];
7 int i,n,gasit,t;
8
9 cout<<"Dati dimensiunea vectorului ";cin>>n;
10 for(i=0;i<n;i++)
11 {
12 cout<<"Dati valoarea elementului "<<i<<" ";
3
4 int main()
5{
6 int v[30];
7 int i,n,gasit,t;
8
9 cout<<"Dati dimensiunea vectorului ";cin>>n;
10 for(i=0;i<n;i++)
11 {
12 cout<<"Dati valoarea elementului "<<i<<" ";
13 cin>>v[i];
14 }
15 if(n%2==0) // daca dim. vectorului este para
16 {
17 do
18 {
19 gasit=0;
20 for(i=0;i<n/2;i++)
21 if(v[i]>v[i+1])
22 {
23 t=v[i];
24 v[i]=v[i+1];
25 v[i+1]=t;
26 gasit=1;
27 }
28 }while(gasit!=0);
29 do
30 {
31 gasit=0;
32 for(i=n/2;i<n-1;i++)
33 if(v[i]<v[i+1])
34 {
35 t=v[i];
36 v[i]=v[i+1];
37 v[i+1]=t;
38 gasit=1;
39 }
40 }while(gasit!=0);
41 }
42 else
43 {
44 do
45 {
46 gasit=0;
47 for(i=0;i<n/2-1;i++)
48 if(v[i]>v[i+1])
49 {
50 t=v[i];
51 v[i]=v[i+1];
52 v[i+1]=t;
53 gasit=1;
54 }
55 }while(gasit!=0);
56 do
57 {
58 gasit=0;
59 for(i=n/2+1;i<n;i++)
60 if(v[i]<v[i+1])
61 {
62 t=v[i];
63 v[i]=v[i+1];
64 v[i+1]=t;
65 gasit=1;
66 }
67 }while(gasit!=0);
68 }
69 for(i=0;i<n;i++)cout<<v[i]<<" ";
70 return 0;
71 }
1 /*Fie un tablou v unidimensional cu n numere ntregi (n<=100).S se ordoneze Cresctor
2 elementele tabloului dup prima cifr.*/
3
4 int main()
5 {
6 int v[100];
7 int i,n,t,gasit,v1,v2;
8 cout<<"Dati valoarea lui n=";cin>>n;
9 for(i=0;i<n;i++)
10 {
11 cout<<"Dati valoarea "<<i<<" ";
12 cin>>v[i];
13 }
14 do
15 {
16 gasit=0;
17 for(i=1;i<n;i++)
18 {
19 v1=v[i-1];
20 while(v1>10)v1=v1/10; // determin ultima cifra al lui v[i-1]
21 v2=v[i];
22 while(v2>10)v2=v2/10; // determin ultima cifra a lui v[i]
23 if(v1>v2)
24 {
25 t=v[i-1];
26 v[i-1]=v[i];
27 v[i]=t;
28 gasit=1;
29 }
30 }
31 }while(gasit!=0);
32 cout<<"Vectorul sortat este : ";
33 for(i=0;i<n;i++)cout<<v[i]<<" ";
34
35 return 0;
36 }

1 /*Fie Tabloul v unidimensional cu n nr ntregi (n<=100)cu max 4 cifre ordonate Cresctor.


2 S se determine dac valoarea x citit de la tastatur se gsete n tablou.
3 n caz afirmativ se va afia o poziie pe care acesta se gsete
4 altfel se va afia un mesaj.*/
5
6 using namespace std;
7 int main()
8 {
9
10 int v[100];
11 int i,j,n,m,gasit,x;
12
13 cout<<"Dati valoarea lui n=";cin>>n;
14 for(i=0;i<n;i++)
15 {
16 cout<<"Dati valoarea elementului "<<i<<" ";
7 int main()
8{
9
10 int v[100];
11 int i,j,n,m,gasit,x;
12
13 cout<<"Dati valoarea lui n=";cin>>n;
14 for(i=0;i<n;i++)
15 {
16 cout<<"Dati valoarea elementului "<<i<<" ";
17 cin>>v[i];
18 }
19 cout<<"Dati valoarea lui x=";cin>>x;
20 i=1;
21 j=n;
22 gasit=0;
23 do
24 {
25 m=(i+j)/2;
26 if(v[m]==x)gasit=1;
27 else
28 if(x<v[m])j=m-1;
29 else
30 i=m+1;
31
32 }while((i<=j)&&(gasit!=1));
33 if(gasit==0)cout<<"Elementul cautat nu exista ! ";
34 else
35 cout<<"Elementul cautat exista pe pozitia "<<m;
36
37 return 0;
38 }

1 /*Se citeste un vector A, dupa care se extrag intr-un vector B numerele pare si pozitive, intr-un vector C numerele impare negative.
2 Sa se afiseze vectorul B sortat crescator si vectorul C descrescator;*/
3 #include<iostream>
4 using namespace std;
5 int a[100], b[50], c[50], n, i, aux = 0, term = 0;
6 int main() {
7 cout << "n=";
8 cin >> n;
9 for (i = 0; i < n; i++) {
10 cout << "a[" << i << "]=";
11 cin >> a[i];
12 }
13 for (i = 0; i < n; i++) {
14 if ((a[i] % 2 == 0) && (a[i] > 1)) {
15 b[i] = a[i];
16 }
17 if ((a[i] % 2 != 0) && (a[i] < 0)) {
18 c[i] = a[i];
19 }
20 }
21 while (!term) {
22 term = 1;
23 for (i = 0; i < n - 1; i++) {
24 if (c[i] > c[i + 1]) {
25 aux = c[i];
26 c[i] = c[i + 1];
27 c[i + 1] = aux;
28 term = 0;
29 }
22 term = 1;
23 for (i = 0; i < n - 1; i++) {
24 if (c[i] > c[i + 1]) {
25 aux = c[i];
26 c[i] = c[i + 1];
27 c[i + 1] = aux;
28 term = 0;
29 }
30 }
31 }
32 aux = 0;
33 term = 0;
34 while (!term) {
35 term = 1;
36 for (i = 0; i < n - 1; i++) {
37 if (b[i] > b[i + 1]) {
38 aux = b[i];
39 b[i] = b[i + 1];
40 b[i + 1] = aux;
41 term = 0;
42 }
43 }
44 }
45 for (i = 0; i < n; i++) {
46 if (b[i] != 0) {
47 cout << b[i] << " ";
48 }
49 }
50 cout << endl;
51 //afisare inversa
52 for (i = n - 1; i >= 0; i--) {
53 if (c[i] != 0) {
54 cout << c[i] << " ";
55 }
56 }
57 cout << endl;
58 return 0;
59 }

1 /*Se da un sir de maxim 15 numere naturale


2 pozitive, sa se afle media aritmetica a
3 numerelor din sir si cate numere din sir sunt
4 mai mari decat media aritmetica aflata.*/
5 #include<iostream>
6 using namespace std;
7 int v[16], ma, n, s = 0, k = 0, i;
8 int main() {
9 cout << "n=";
10 cin >> n;
11 for (i = 0; i < n; i++) {
12 cout << "v[" << i << "]=";
13 cin >> v[i];
14 }
15 s = 0;
16 for (i = 0; i < n; i++) {
17 s += v[i];
18 }
19 ma = s / n;
11 for (i = 0; i < n; i++) {
12 cout << "v[" << i << "]=";
13 cin >> v[i];
14 }
15 s = 0;
16 for (i = 0; i < n; i++) {
17 s += v[i];
18 }
19 ma = s / n;
20 k = 0;
21 for (i = 0; i < n; i++) {
22 if (v[i] > ma) {
23 k++;
24 }
25 }
26 cout << "numerele care sunt mai mari decat media aritmetica sunt" << k;
27 return 0;
28 }

Probleme propuse:
1.Se citesc elementele unui tablou unidimensional cu n (n<=6O) numere ntregi cu cel mult patru cifre.S se insereze dup fiecare numr par din tablou inversul
acestuia.
2.Se introduc intr-un vector maxim 20 inregistrari. Sa se stearga primul element cu valoarea X, o valoare oferita de operatorul PC.(folositi cautarea secventiala si
algoritmul de stergere)

3.Un operator PC introduce sub forma de vector maxim 40 de numere intregi. Sa se insereze elementul Y inainte de primul element care are are valoarea X.
X si Y sunt date de operatorul PC. (folositi cautarea secventiala si algoritmul de inserare)

4. Se da un vector de maxim 50 de inregistrari. Verificati daca vectorul este de tip munte si afisati mesaj corespunzator.
Ex: arr{1,2,4,9,6,5,3} este un vector de tip munte.