Sunteți pe pagina 1din 33

LICEUL COLEGIUL NATIONAL GEORGE COSBUC MOTRU

PROIECT ATESTAT
INFORMATICA

ELEV: SIMNICIUC THOMAS


TEMA: TABLOURI UNIDIMENSIONALE
CLASA: A XII-A C
PROFESOR COORDONATOR: CIOCAN NATALIA

TEMA:
TABLOURI
UNIDIMENSIONALE

CUPRINS
1. Tablouri unidimensionale
pag. 4
2. Vectori de frecventa
pag. 10
3. Tablouri multidimensionale
..... pag. 13
4. Sortari ..
..... pag. 14
5. Exerciti si probleme
.. pag. 21
6. Bibliografie
. pag.
30

S presupunem c avem urmtoarea problem: S se afieze numele tuturor


studenilor care au nota maxim; numele i notele se citesc de la tastatur.
Pn acum, problemele rezolvate de genul acesta, presupuneau citirea unor date i
prelucrarea lor pe msur ce sunt citite, fr a reine toate valorile citite (vezi
problema 1 cu funcia F(x) nu se reineau toate valorile lui x, ci doar una la un
moment dat!) . Acest lucru ns nu este posibil aici, deoarece trebuie ca mai nti s
aflm nota maxim printr-o prim parcurgere a datelor de intrare i apoi s mai
parcurgem nc o dat aceste date pentru a afia studenii cu nota maxim. Pentru
aceasta este necesar memorarea tuturor studenilor (a datelor de intrare, numenota). Cum memorm ns aceste valori? Cu siguran nu vom folosi n variabile
pentru nume: nume1, nume2, etc. i n variabile pentru nota: nota1, nota2, etc., mai
ales c nici nu tim exact ct este n - ci studeni vor fi!
Vom folosi n loc o singur variabil de tip tablou, cu mai multe elemente, pentru
nume i o singur variabil de tip tablou, cu mai multe elemente, pentru note.
Prin tablou se nelege n programare o colecie finit, liniar, de date de acelai tip
numit tip de baz al tabloului colecie care, ocup un spaiu continuu de
memorie. n limba englez se folosete cuvntul array.
n funcie de numrul de dimensiuni putem avea mai multe tipuri de tablouri, cele
mai utilizate fiind cele unidimensionale, care poart denumirea de vectori, i
cele bidimensionale cunoscute sub numele de matrice.

1.Tablouri

unidimensionale: vectori
Un tablou unidimensional care conine valorile Val1, Val2, etc., poate fi reprezentat
grafic astfel:
Nume vector: a

Dimensiune vector: n
Elemente:

Val1

Primul element

Val2

Val3

Val4

Val5

Ultimul element

Elementele sale sunt memorate unele dup altele ocup un spaiu continuu de
memorie. Modul de declarare al unui vector cu dimensiune constant este
urmtorul:
Sintaxa:
tip_de_baz nume_tablou [dimensiune] = { const0, const1, ...}

Unde:
tip_de_baz este tipul elementelor;
dimensiune reprezint numrul maxim de elemente ale tabloului i este n
general o
constant ntreag (de obicei o constant simbolic);
const0, const1, etc. reprezint valori constante de iniializare, i prezena
lor este opional.
Memoria ocupat de un vector este egal cu dimensiune * sizeof(tip).
Exemple:
int tab[10];

//definete un tablou de 10 elemente ntregi

float v[60];

//definete un tablou de 60 elemente reale

#define N 10
int tab[N];

// definitie echivalenta cu prima

Pentru a crea un vector, trebuie s cunoatem dimensiunea (lungimea) vectorului n


avans, deoarece odat creat, dimensiunea sa este fix, este alocat la compilare i
nu mai poate fi modificat la execuie!
Uneori nu putem cunoate n avans dimensiunea vectorului (de exemplu, ci
studeni vom avea?). n astfel de cazuri vom estima o dimensiune maxim pentru
vector, dimensiune care este o limit a acestuia i vom declara vectorul ca avnd
aceast dimensiune maxim acoperitoare, ns ct mai mic. Acesta este probabil
principalul dezavantaj al utilizrii unui vector. De obicei se folosesc constante
simbolice pentru aceste dimensiuni

i se verific ncadrarea datelor citite n

dimensiunile maxime. De asemenea, vom mai avea o variabil n care vom pstra
numrul efectiv de elemente din vector numele variabilei este de obicei n!

Exemplu:
#define M 100
// dimensiune maxima vector
int main () {
int a[M], n;
scanf ("%d", &n); // citeste dimensiune efectiva
if ( n > M) {
printf ("Eroare: n > %d \n",M); return;
}
... // citire i utilizare elemente vector

Este permis iniializarea unui vector la declarare, prin precizarea constantelor de


iniializare
ntre acolade i separate prin virgule. Dac numrul
acestora:
== dimensiune - elementele tabloului se iniializeaz cu constantele
precizate
< dimensiune - constantele neprecizate sunt implicit 0
> dimensiune - apare eroare la compilare.
Daca este prezent partea de iniializare, dar lipsete dimensiune, aceasta este
implicit egal cu numrul constantelor i este singurul caz n care este posibil
omiterea dimensiunii!
Exemple:
// Declararea si initializarea unui vector de 3 numere intregi:
int azi[3] = { 01, 04, 2001 }; // zi,luna,an
/* Vectorul a are dimensiune
constantelor de initializare: */
double a[]={2,5.9};

2,

dimensiunea

fiind

data

//numarul constantelor < numarul elementelor:


#define NR_ELEM 5
float t[NR_ELEM]={1.2,5,3};
int prime[1000] = {1, 2, 3};
/*primele trei elemente se initializeaza cu constantele
urmatoarele cu 0. Poate fi confuz. Nu e recomandat! */
int a[1000] = { 0 };

de

numarul

precizate,

// toate elementele sunt iniializate cu zero

int numbers[2] = {11, 33, 44};

// EROARE: too many initializers

Putem afla dimensiunea cu care a fost declarat un vector folosind expresia:


sizeof(nume_tablou) / sizeof(tip_de_baz)
sizeof(nume_tablou) returneaz numrul total de octei ocupai de vector.

Fiecare element din vector este identificat printr-un indice ntreg, pozitiv care arat
poziia sa n vector; selectarea unui element folosete operatorul de indexare: []
paranteze drepte. Se spune c accesul este direct la orice element din vector.
Selectarea unui element dintr-un vector:
nume_tablou [indice]
unde indice este o expresie ntreag cu valori ntre 0 i
dimensiune -1.
Un element de tablou poate fi prelucrat ca orice variabil avnd tipul
de baz.
Numerotarea elementelor fiind de la zero, primul element din orice vector are
indicele zero, iar ultimul element dintr-un vector are un indice mai mic cu 1 dect
numrul elementelor din vector.

Exemple:

//dac avem un vector de 5 note:


int note[5];
//atribuim valori elementelor astfel:
note[0] = 95; note [1]
= 85; note [2] = 77;
note [3] = 69; note [4]
= 66;
//afisarea valorii unor elemente:
printf("prima nota este %d\n", note[0]);
printf("suma ultimelor doua note este %d\n", note[3]+note[4]);

Utilizarea unui vector presupune repetarea unor operaii asupra fiecrui element
din vector deci folosirea unor structuri repetitive. De obicei, pentru a realiza o
prelucrare asupra tuturor elementelor tabloului se folosete instruciunea for cu o
variabil contor care s ia toate valorile indicilor ( ntre 0 si dimensiune -1 ).

Exemplu:
#define N 10 int tab[N], i;
for(i=0; i<N; i++)
//prelucrare tab[i]

Dup cum spuneam, de obicei nu toate elementele tabloului sunt folosite, ci doar
primele nr_elem<=dimensiune ( vezi programul urmtor, se pot citi doar primele
nr_elem ):

int a[100], n, i;
// vectorul a de max 100 de intregi, n numrul efectiv de elemente folosite
//citirea i afiarea unui vector de ntregi:
scanf ("%d",&n);
// citete nr efectiv de elemente din vector
for (i=0;i<n;i++)
scanf ("%d", &a[i]);
// citire elemente vector
for (i=0;i<n;i++)
printf ("a[%d]=%d\n", i, a[i]); // scrie elemente vector
//suma elementelor 0..n-1 din vectorul a
int s;
for (i=0, s=0; i<n; i++)
s = s + a[i];

Observa ii:
Nici compilatorul, nici mediul de execuie nu verific valorile indicilor.
Cu

alte

cuvinte,

nu

sunt

generate

mod

normal

avertizri/erori

(warning/error) dac indexul este n afara limitelor; programatorul trebuie s


codifice astfel nct indicele s ia valori n intervalul 0 .. dimensiune-1, deoarece
pot apare erori imprevizibile, ca de exemplu modificarea nedorit a altor
variabile.

Exemple:
#define N 10 int
tab[N];
tab[N]=5; // se modifica zona de 2 octeti urmatoare tabloului
tab[-10]=6; /* se modifica o zona de 2 octeti situata la o adresa cu 20
de octeti inferioara tabloului */
// Exemplu ce poate compila i chiar rula dar cu posibile erori
colaterale:
const int dim = 5;
int numere[dim];
// vector cu index de la 0 la 4
numere[88] = 999;
printf("%d\n", numere[77]);
// Index out of bound! Index in afara limitelor, nesemnalat!

Aceasta este un alt dezavantaj C/C++. Verificarea limitelor indexului ia timp i


ptere de calcul micornd performanele. Totui, e mai bine s fie sigur dect
repede!
Numele unui vector nu poate s apar n partea stng a unei atribuiri
deoarece are asociat o adres constant (de ctre compilator), care nu poate fi
modificat n cursul executiei.
Exemplu greit:

int a[30]={0}, b[30];


b=a; // eroare !

Pentru copierea datelor dintr-un vector ntr-un alt vector se va scrie un ciclu
pentru copierea elemnt cu element, sau se va folosi functia memcpy.
Exemplu:
int a[30]={1,3,5,7,9}, b[30], i, n;
....
for (i=0;i<n;i++)
b[i]=a[i];

Dimensiunea unui vector poate fi i valoarea unei variabile, dar


atenie!, declararea vectorului se va face dup iniializarea variabilei, nu nainte,
deoarece tentativa de a citi valoarea variabilei dup declararea vectorului va
genera eroare!

Exemple:
int size;
printf("Introduceti dimensiunea vectorului:");
scanf("%d", &size);
float values[size];
// NU!
int size;
float values[size];
printf("Introduceti dimensiunea vectorului:");
scanf("%d", &size);

Totui, acesta nu este un mod recomandat de declarare a vectorilor


datorit complicaiilor care pot apare. (???)

2.Vectori

de frecventa

O utilizare interesant a vectorilor este pentru a determina frecvena de apariie a


unor valori dintr-un domeniu dat printre datele de intrare ale unei aplicaii.
S considerm, de exemplu, c se d un fiier text care conine maxim 1 milion de
valori din mulimea 0..9 (cifre zecimale), valorile fiind separate prin cte un spaiu i

se cere s determinm pentru fiecare cifr zecimal numrul de apariii (frecvena) n


fiierul text.
Desigur c utilizarea unui vector cu 1 milion de elemente (chiar dac le declarm de
tip char sau unsigned char) este prohibit din cauza consumului execesiv de
memorie i lipsit de sens. De fapt este vorba doar de 10 valori distincte (cifrele
zecimale) care conteaz. O soluie eficient, care conduce la un algoritm liniar de
rezolvare, este s asociem primii zece indici din tablou celor zece valori distincte
posibile. n acest fel semnificaia elementelor tabloului devine:

a[0] - frecventa de aparitie a valorii 0 in fisier

a[1] - frecventa de aparitie a valorii 1 in fisier

.....

a[9] - frecventa de aparitie a valorii 9 in fisier

Dup construirea vectorului de frecvene este suficient s listm


valorile i i a[i] pentru i=0,1,...9 i problema este rezolvat.
Programul C++ complet este:
#include<iostream.h>
#include<fstream.h>
int main()
{
unsigned char x,i;
long unsigned a[10]={0}; //tabloul frecventelor initializat cu 0
ifstream f("date.in");
while(!f.eof())
{
f>>x; a[x]++; //creste frecventa valorii x
}
f.close();
for(i=0; i<10; i++)
cout<<i<<" apare de "<<a[i]<<" ori in fisier"<<endl;
return 0;
}

Vectorul de frecven este numit uneori i vector de marcare deoarece poate fi folosit
pentru a determina valorile distincte care apar (sau care nu apar) printre datele de
intrare ale unei aplicaii.
Exemplu: Se consider un fiier text care conine maxim 100000 de numere naturale
<=6000. S se afieze valorile din mulimea 0..100 care nu apar n fiier
Dei numrul valorilor din fiier este foarte mare i valorile posibile sunt cuprinse ntre
limitele 0 i 60000 (deci 60001 valori distincte posibile), singurele valori care conteaz
pentru rezolvarea problemei sunt 0, 1...100, adic 101 valori distincte. Asociem
fiecrei valori din mulimea 0..100 un element n tabloul a cu urmtoarea
semnificaie:

a[i]=0 - dac valoarea i lipsete din fiier

a[i]=1 - dac valoarea i apare cel puin o dat n fiier


pentru fiecare i=0, 1, ...100.
Listnd valorile i pentru care a[i]=0 dup citirea tuturor valorilor din fiier obinem
valorile din mulimea 0,1...100 care lipsesc din fiier. n rezolvarea acestei probleme
vectorul a a devenit un vector de marcare (marcheaz starea binar a unui element,
de exemplu cu semnificaia apare/nu apare).
Programul C++ complet este:
#include<iostream.h>
#include<fstream.h>
int main()
{
unsigned x; unsigned char i;
unsigned char a[101]={0}; //vectorul de marcare initializat cu 0
ifstream f("date.in");
while(!f.eof())
{
f>>x;

if(x<=100) //selectam numai valorile care intereseaza


a[x]=1; //marcam valoarea x ca fiind gasita in fisier
}
f.close();
for(i=0; i<=100; i++)
if(a[i]==0)

//valoarea i nu apare in fisier

cout<<i<<" ";
return 0;
}

Folosirea unui vector de frecven sau marcare asociat este eficient numai n cazul n
care valorile care intereseaz sunt ntregi i numrul valorilor distincte posibile este
cel mult 10000. Uzual folosirea acestui tip de vectori duce la optimizarea consumului
de memorie i la obinerea unor algoritmi de rezolvare eficieni.

3.Tablouri

multidimensionale

Modul de declarare al unui tablou multidimensional este urmtorul:


Sintaxa:
tip_de_baza nume_tablou [dim1] [dim2] ... [dimn] = { {const10,...},
{const20,...}, ...,
{constn0,...} };
unde:
tip_de_baz este tipul elementelor;
dim1, dim2, ..., dimn - expresii ntregi constante ( de obicei constante
simbolice ).
const10, const20, etc. reprezint valori constante de iniializare, i
prezena lor este opional.
Memoria continu ocupat de tablou este de dimensiune:

dim1 * dim2 * ... * dimn * sizeof(tip_de_baza).


Elementele tabloului multidimensional sunt memorate astfel nct ultimul indice
variaz cel mai rapid. Tabloul poate fi iniializat la definire - vezi partea opionala
marcat - prin precizarea constantelor de iniializare.
Selectarea unui element dintr-un tablou multidimensional:
nume_tablou [ind1] [ind2] *indn]

Unde ind1, ind2, ..., indn - expresii ntregi cu valori ntre 0 i dimi-1 pentru
i=1..n. Un element de tablou poate fi prelucrat ca orice variabila avnd
tipul de baz.

4.Sortari
1. BUBLE SORT
PREZENTAREA METODEI
Prin metoda de sortare prin metoda buleleor se parcurge vectorul i se
compar fiecare element cu succesorul su. Dac nu sunt n ordine cele
dou elemente, acestea se interschimb ntre ele. La prima parcurgere
elementul de valoare maxim se deplaseaz ctre ultima poziie. La a doua
parcurgere, elementul imediat urmtor ca valoare dup elementul maxim
se deplaseaz ctre penultima poziie. Vectorul se parcurge de mai multe
ori, pn cnd la o parcurgere complet nu se mai execut nici o
interschimbare ntre elemente, nici o deplasare.

PREZENTAREA ALGORITMULUI

Algoritmul de sortarea prin metoda bulelor va sorta elementele din vectorul


v1, v2 ,...,vn astfel nct dup sortare, acestea vor fi n ordinea v1 v2 ...
vn. Ne propunem s facem o ordonare cresctoare a vectorului v1,
v2 ,...,vn. Algoritmul const n parcurgerea tabloului v de mai multe ori,
pn cnd devine ordonat. La fiecare pas se compar dou elemente
consecutive vi i vi+1 . Dac vi > vi+1 , (i = 1, 2, ..., n - 1), atunci cele
dou valori se interschimb ntre ele. Controlul aciunii repetitive este dat
de variabila boolean ok, care la fiecare reluare a algoritmului primete
valoarea iniial adevrat, i care se schimb n fals dac s-a efectuat o
interschimbare de dou elemente consecutive. n momentul n care tabloul
v s-a parcurs fr s se mai efectueze nici o schimbare, ok rmne cu
valoarea iniial adevrat i algoritmul se termin, deoarece tabloul este
ordonat. Interschimbarea a dou elemente se realizeaz prin intermediul
variabilei auxiliare aux care are acelai tip ca i elementele tabloului.

ALGORITM:
void Metoda_bulelor(int (&v)[20], int n) {
int ok,i,aux;
do{
ok=1;
for(i=1;i<=n-1;i++)
if(v[i]>v[i+1]) {
ok=0;
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux; }
} while(ok!=1);
}

2. SORTAREA PRIN SELECTIE

Sortarea prin selecie ofer unele mbuntiri n ceea ce privete complexitatea, ns


este departe de a fi considerat un algoritm eficient. Presupunnd c se dorete
sortarea cresctoare a vectorului, se caut minimul din vector, i se interschimb cu
primul element - cel cu indexul 0. Apoi se reia acelai procedeu pentru restul
vectorului. Motivul pentru care algoritmul de sortare prin selecie este mai eficient
este acela c vectorul n care se caut minimul devine din ce n ce mai mic, i,
evident, cutarea se face mai repede la fiecare pas.
Studiul unor algoritmi mai avansai de sortare, precum i studiul complexitii lor nu
constituie obiectul acestui laborator. Acestea se vor relua mai detaliat n cadrul altor
cursuri.

ALGORITM:

#include<iostream.h>
int v[25],n,i,j,aux;
void main()
{cout<<nr de elemente=;
cin>>n;
for(i=0;i<n;i++)
{cout<<v[<<i<<]=;
cin>>v[i];}
for(i=0;i<n;i++)
cout<<v[i]<< ;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)

if(v[i]>v[j])
{ aux=v[j]; v[j]=v[i]; v[i]=aux; }
cout<<endl;
for(i=0;i<n;i++)

cout<<v[i]<< ;
}

3.SORTAREA PRIN NUMARARE


Se folosete un vector auxiliar b unde n b[i] se pstreaz numrul de elemente din vectorul a care sunt mai
mici ca a[i]. Pentru a nu numra de dou ori acelai element se folosesc dou for-uri cu indicii de la 1 la n-1
respectiv i+1, . . . , n. Apoi fiecrui element a[i] i va corespunde poziia b[i] n vectorul c.

ALGORITM
#include <iostream.h>
int a[100], n, i;
void numarare(int a[100], int n) // a - tabloul de numere intregi care se va ordona crescator
// n - numarul de elemente al tabloului {
int i, j, b[100], c[100], x;
for(i=1; i<=n; i++)
b[i]=0;
for(i=1; i<=n-1; i++)
for(j=i+1; j<=n; j++)
if( a[i] < a[j] )
b[j] = b[j]+1;
else
b[i] = b[i]+1;
for(i=1; i<=n; i++) {

x=b[i];

c[x]=a[i]; // sau c[b[i]]=a[i];


}
for(i=1; i<=n; i++)
a[i] = c[i];
return;
}
int main(void) {
cout<<"Dati dimensiunea tabloului n = ";
cin>>n;
cout<<"Dati elementele tablourile \n";
for(i=1; i<=n; i++) {
cout<<"a["<<i<<"] = ";
cin>>a[i];
} numarare(a, n);
cout<<"Tabloul ordonat crescator \n";
for(i=1; i<=n; i++) cout<<a[i]<<" ";
}

4.SORTAREA PRIN INSERTIE DIRECTA

Sortarea prin inserie direct se bazeaz pe urmtoarea metod: Fie un


vector a de n numere.
Elementul aflat pe poziia a[2] se compar cu a[1] i ncercm s gsim
poziia n care ar trebui s se introduc. Dac a[2]< a[1] atunci a[2]
trebuie s fie nainte, deci l mutm pe a[1] pe poziia urmtoare.
La un pas j avem vectorul sortat a[1],...,a[j-1] i ncercm s-l inserm pe
a[j] astfel nct s pstrm vectorul ordonat ntre 1 i j-1.
Pentru aceasta, se compar succesiv a[j] cu elementele a[j-1], a[j-2], ...,
a[1] (n aceast ordine), mutnd elementul de la poziia curent cu o
poziie la dreapta atunci cnd a[i]>a[j].
Cnd a[i]<=a[j] procesul de inserie se oprete, poziia la care se
realizeaz inserarea fiind i+1.

Rezumatul metodei de sortare prin insertie directa:


Se compar primul element cu toate elementele care urmeaz dup el.
Dac gsim un element mai mic dect primul atunci le interschimbm pe
cele dou.
Apoi continum cu al doilea element al irului, pe care, de asemenea l
comparm cu toate elementele care urmeaz dup el i n caz de
inversiune interschimbm cele dou elemente. Apoi procedm la fel cu al
treilea element al irului, iar procesul continu astfel pn la penultimul
element al 03.01.2014 irului care va fi comparat cu ultimul element din
ir.
ALGORITM:

#include <iostream.h>
int a[100], n, i;
void inserare(int a[100], int n) // a - tabloul de numere intregi care se va
ordona crescator // n - numarul de elemente al tabloului {
int i, j, x;
for(i=2; i<=n; i++) {
x = a[i];
j = i-1;
while( j >= 1 && a[j] > x ) {
a[j+1] = a[j]; j--;
}
a[j+1] = x;
}
return;
}
int main(void) {
cout<<"Dati dimensiunea tabloului n = ";
cin>>n;
cout<<"Dati elementele tablourile \n";
for(i=1; i<=n; i++) {

cout<<"a["<<i<<"] = ";
cin>>a[i]; } inserare(a, n);
cout<<"Tabloul ordonat crescator \n";
for(i=1; i<=n; i++)
cout<<a[i]<<" ";
}

5.Exerciti

si probleme

Se citeste un vector cu componente numere naturale. Sa se afiseze numarul


cifrelor nule cu care se termina numarul format din produsul celor n componente.
Exemplu:
n=6
tabloul: 34 25 100 444 16 32321
numarul de cifre nule cerut este 4

REZOLVARE:

#include <iostream>
using namespace std;
int main()
{
int a[100],n,i,p2=0,p5=0;
cin>>n;
for (i=0;i<n;i++)

cin>>a[i];

for (i=0;i<n;i++)
{
while(a[i]%2==0)
{
p2++;
a[i]=a[i]/2;
}
while(a[i]%5==0)
{
p5++;
a[i]=a[i]/5;
}
}
if(p2<p5) cout<<p2;

else cout<<p5;
return 0;
}

2.Secvente

de

suma

(cu

sir

de

sume

partiale

O(n*n))

Se da un vector a cu n elemente numere naturale si o valoare naturala s. Afisati toate


secventele de valori din vectorul a care au suma egala cu s.

REZOLVARE:

using namespace std;


ifstream is("date.in");
ofstream os("date.out");
int main()
{
int a[100],sp[100],n,s;
is>>n;
is>>a[0]; sp[0]=a[0];
for(int i=1;i<n;i++)
{
is>>a[i];
sp[i]=sp[i-1]+a[i];
}
is>>s;
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
if(sp[j]-sp[i-1]==s || (i==0 && sp[j]==s))
{

for(int k=i;k<=j;k++) os<<a[k]<<" ";


os<<"\n";

}
is.close();
os.close();
return 0;
}

sau

#include <fstream>
using namespace std;
ifstream is("date.in");
ofstream os("date.out");
int main()
{

int a[100],sp[100],n,s;
is>>n;
sp[0]=0;
for(int i=1;i<=n;i++)
{
is>>a[i];
sp[i]=sp[i-1]+a[i];
}
is>>s;
for(int i=1;i<n;i++)
for(int j=i;j<=n;j++)
if(sp[j]-sp[i-1]==s)
{

for(int k=i;k<=j;k++) os<<a[k]<<" ";


os<<"\n";

}
is.close();
os.close();
return 0;
}

3. Se citeste o multime a cu n elemente numere naturale. Sa se afiseze toate submultimile


multimii a.
Indicatie: Se contruiesc intr-un vector caracteristic toate modalitatile de a pune valorile 0 si 1
pe n pozitii si corespunzator fiecarei variante se asociaza o submultime astfel: pozitiile pe
care este valoarea 1 corespund elementelor alese in submultime, iar cele cu valoarea 0 celor
care nu sunt alese in submultime.

REZOLVARE:
#include<iostream>
using namespace std;
int main()
{
int a[100],n,i,p[100],t,c;
cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n+1;i++) p[i]=0;
while(p[n+1]!=1)

{
for(i=1;i<=n;i++)
if(p[i]==1) cout<<a[i]<<" ";
cout<<endl;
i=1;
while(p[i]==1 && i<=n)
{ p[i]=0;
i++;
}
p[i]=1;
}
return 0;
}
4. Se citeste un vector cu n elemente numere naturale cu elementele numerotate incepand
de la 1.
Sa se inlocuiasca fiecare element a[i] cu cea mai mare putere a lui i care este mai mica sau
egala cu a[i], exceptand primul element al vectorului, element care va ramane neschimbat.
Exemplu: Pentru vectorul 23 24 43 90 80 rezulta vectorul 23 16 27 64 25.

REZOLVARE:
#include<iostream>
using namespace std;
int main()
{
int a[100],n,i,p;
cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=2;i<=n;i++)
{
p=1;
while(p*i<=a[i]) p=p*i;
a[i]=p;
}
for(i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}

5. Se citeste un vector a cu n elemente numere naturale. Sa se determine daca vectorul a


este o permutare a multimii {1, 2, ...,n}.
Exemplu: vectorul 4 3 2 5 1 este o permutare a multimii 1 2 3 4 5, dar vectorul 4 2 1 5 5 nu
este.

REZOLVARE:
#include<iostream>
using namespace std;
int main()
{
int a[100],n,i,j,aux,p;
cout<<"n="; cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i]>a[j])
{
aux=a[i];
a[i]=a[j];
a[j]=aux;
}
p=1;
for(i=1;i<=n;i++)
if(a[i]!=i) p=0;

if(p==1) cout<<"da";
else cout<<"nu";
return 0;
}
6. Se citeste un vector a cu n elemente numere intregi. Stergeti toate aparitiile primului
element si afisati vectorul ramas.
Exemplu: n=6 si vectorul 3 4 5 3 3 6
se afiseaza 4 5 6

REZOLVARE:

#include<iostream>
using namespace std;
int main()
{
int a[100],n,i,x,k;
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
x=a[1];
for(i=1;i<=n;i++)
if(a[i]==x)
{
for(k=i;k<n;k++)
a[k]=a[k+1];
n--;
i--;
}
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}

7. Fiind dat un vector v cu n elemente numere intregi , sa se construiasca alti doi vectori :
primul va contine numai elementele pare , iar al doilea numai elementele impare ale
vectorului initial.

REZOLVARE:
#include<fstream>
using namespace std;
ifstream fin("1.in");

ofstream fout("1.out");
int main()
{
int v[100],n,x[100],y[100],m,p,i;
fin>>n;
for(i=0;i<n;i++) fin>>v[i];
m=0;p=0;
for(i=0;i<n;i++)
if(v[i]%2==0) { x[m]=v[i];
m++;
}
else { y[p]=v[i];
p++;
}
for(i=0;i<m;i++) fout<<x[i]<<" ";
fout<<endl;
for(i=0;i<p;i++) fout<<y[i]<<" ";
fin.close();

fout.close();
return 0;
}

8. Se citeste un vector a cu cel mult 9 valori cifre. Sa se afiseze pe randuri separate


permutarile circulare ale vectorului.

REZOLVARE:
#include<iostream>
using namespace std;

void Permutare( int a[10] , int n )


{
int aux = a[1];
for ( int i = 1 ; i <= n -1; i++ )
a[i] = a[i+1];
a[n] = aux;
}
void Afisare( int x[10] ,int n)
{
int i;
for ( i = 1 ; i <= n ;i++)
cout << x[i] << ' ';
cout << '\n';
}
int main()
{
int i , x[10] , n;
cin >> n;
for ( i = 1 ; i <= n ; i++ )

cin >> x[i];


for ( i = 1 ; i <= n; i++ )
{
Permutare ( x , n );
Afisare ( x , n
}
system("pause");
return 0;
}

);

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

  • Tester
    Tester
    Document22 pagini
    Tester
    DeekyDZ
    Încă nu există evaluări
  • Grupmotor
    Grupmotor
    Document20 pagini
    Grupmotor
    DeekyDZ
    Încă nu există evaluări
  • Etichete Seturi Mini Sapun 3 Si 5
    Etichete Seturi Mini Sapun 3 Si 5
    Document1 pagină
    Etichete Seturi Mini Sapun 3 Si 5
    DeekyDZ
    Încă nu există evaluări
  • Grupmotor
    Grupmotor
    Document21 pagini
    Grupmotor
    DeekyDZ
    Încă nu există evaluări
  • Tensiuni
    Tensiuni
    Document14 pagini
    Tensiuni
    DeekyDZ
    Încă nu există evaluări
  • Aparate
    Aparate
    Document26 pagini
    Aparate
    DeekyDZ
    Încă nu există evaluări
  • A Parate
    A Parate
    Document19 pagini
    A Parate
    DeekyDZ
    Încă nu există evaluări
  • Strung Uri
    Strung Uri
    Document21 pagini
    Strung Uri
    DeekyDZ
    Încă nu există evaluări
  • Curent
    Curent
    Document21 pagini
    Curent
    DeekyDZ
    Încă nu există evaluări
  • Microf Oane
    Microf Oane
    Document18 pagini
    Microf Oane
    DeekyDZ
    Încă nu există evaluări
  • Aparate
    Aparate
    Document26 pagini
    Aparate
    DeekyDZ
    Încă nu există evaluări
  • Amplificator
    Amplificator
    Document23 pagini
    Amplificator
    DeekyDZ
    100% (2)
  • Tester
    Tester
    Document22 pagini
    Tester
    DeekyDZ
    Încă nu există evaluări
  • Masinisincrone
    Masinisincrone
    Document19 pagini
    Masinisincrone
    DeekyDZ
    Încă nu există evaluări
  • Programarec
    Programarec
    Document49 pagini
    Programarec
    DeekyDZ
    Încă nu există evaluări
  • Aparate
    Aparate
    Document26 pagini
    Aparate
    DeekyDZ
    Încă nu există evaluări
  • Masinisincrone
    Masinisincrone
    Document26 pagini
    Masinisincrone
    DeekyDZ
    Încă nu există evaluări
  • Aparate
    Aparate
    Document26 pagini
    Aparate
    DeekyDZ
    Încă nu există evaluări
  • Aparate
    Aparate
    Document26 pagini
    Aparate
    DeekyDZ
    Încă nu există evaluări
  • A Parate
    A Parate
    Document19 pagini
    A Parate
    DeekyDZ
    Încă nu există evaluări
  • Strung Uri
    Strung Uri
    Document21 pagini
    Strung Uri
    DeekyDZ
    Încă nu există evaluări
  • Artafotografica
    Artafotografica
    Document32 pagini
    Artafotografica
    DeekyDZ
    Încă nu există evaluări
  • Regulator
    Regulator
    Document18 pagini
    Regulator
    DeekyDZ
    Încă nu există evaluări
  • Programarec
    Programarec
    Document38 pagini
    Programarec
    DeekyDZ
    Încă nu există evaluări
  • Memoria Extern A
    Memoria Extern A
    Document24 pagini
    Memoria Extern A
    DeekyDZ
    Încă nu există evaluări
  • Microf Oane
    Microf Oane
    Document18 pagini
    Microf Oane
    DeekyDZ
    Încă nu există evaluări
  • Sistem
    Sistem
    Document47 pagini
    Sistem
    DeekyDZ
    Încă nu există evaluări
  • Sistem
    Sistem
    Document47 pagini
    Sistem
    DeekyDZ
    Încă nu există evaluări
  • Regulator
    Regulator
    Document18 pagini
    Regulator
    DeekyDZ
    Încă nu există evaluări