net/publication/320518711
CITATION READS
1 110
1 author:
Adrian Runceanu
University of Craiova
26 PUBLICATIONS 22 CITATIONS
SEE PROFILE
All content following this page was uploaded by Adrian Runceanu on 20 October 2017.
2003
Autorul
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
LUCRAREA nr. 1
ALGORITMI RECURSIVI
A. Consideraţii teoretice
B. Exemple de programe
1
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
#include<iostream.h>
#include<conio.h>
long int factorial(long int n)
{
if(n==0) return 1;
else factorial(n-1)*n;
}
void main(void)
{
long int n;
clrscr();
cout<<"Introduceti n= ";cin>>n;
cout<<"n! = "<<factorial(n)<<endl;
}
#include<iostream.h>
#include<conio.h>
int n,nn,p[20];
void partitie(int i,int n)
2
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
{
int j,k;
for(j=1;j<=n;j++)
{
p[i]=j;
if(n-j>0) partitie(i+11,n-j);
else if(i>1)
{
cout<<nn<<" = "<<p[1];
for(k=2;k<=i;k++)
if(p[k]!=0) cout<<"+"<<p[k];
cout<<endl;
}
}
}
void main(void)
{
clrscr();
cout<<"Introduceti n= ";cin>>n;
nn=n;
partitie(1,n);
}
Căutăm relaţia de recurenţă pentru Sn, ştiind că x1, respectiv x2 sunt rădăcinile
ecuaţiei date şi deci îndeplinesc relaţiile :
x12 Sx1 P 0
x22 Sx2 P 0
Înmulţim aceste relaţii cu x1n 2 şi x 2n 2 şi adunăm relaţiile obţinute şi rezultă:
Sn = x1n x2n = S * ( x1n1 x2n1 ) – P * ( x1n2 x2n2 ) = S*Sn-1 - P*Sn-2.
S0 = x0 + x0 = 2,
S1 = x1 + x2 = S,
Sn = S*Sn-1 - P*Sn-2, pentru n2.
#include<iostream.h>
#include<conio.h>
int n;
float s,p,r;
float suma(int n)
3
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
{
if(n==0) return 2;
else if(n==1) return s;
else return(s*suma(n-1)-p*suma(n-2));
}
void main(void)
{
clrscr();
cout<<"Introduceti valorile ecuatiei de gradul II "<<endl;
cout<<"Dati s = ";cin>>s;
cout<<"Dati p = ";cin>>p;
cout<<" N = ";cin>>n;
r=suma(n);
cout<<"Valoarea lui S("<<n<<") este "<<r;
}
#include<iostream.h>
#include<conio.h>
int a[100],n,i;
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int maxim(int a[],int n)
{
if(n==1) return a[0];
else return max(a[n],maxim(a,n-1));
}
void main(void)
{
clrscr();
cout<<"Introduceti dimensiunea sirului n = ";cin>>n;
for(i=0;i<n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
cout<<"Elementul maxim din vector este = "<<maxim(a,n);
}
4
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
#include<iostream.h>
int a[40],b[40],n,i;
void tipar()
{
for(i=1;i<=n;i++)
if(a[i]==1) cout<<b[i]<<" ";
cout<<endl;
}
void submultime(int i)
{
int j;
for(j=0;j<=1;j++)
{
a[i]=j;
if(i==n) tipar();
else submultime(i+1);
}
}
void main(void)
{
cout<<"Dati numarul de elemente n = ";cin>>n;
cout<<"Dati elementele multimii "<<endl;
for(i=1;i<=n;i++) cin>>b[i];
submultime(1);
}
5
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
}
}
void main(void)
{
clrscr();
cout<<"Dati numarul in baza 10, n = ";cin>>n;
cout<<"Dati baza in care vreti sa se transforme "; cin>>b;
cout<<n<<" in baza "<<b<<" este ";
baza(n);
}
#include<iostream.h>
#include<conio.h>
#include<string.h>
char n[255],i,l;
void invers(int i)
{
if(i<l) invers(i+1);
cout<<n[i];
}
void main(void)
{
clrscr();
cout<<"Dati numarul in n = ";cin>>n;
l=strlen(n);
cout<<"Numarul rasturnat este ";
invers(0);
}
#include<iostream.h>
#include<conio.h>
int x[50],y[50],z[50],i,n;
long int putere(int a,int b)
{
long int i,p=1;
for(i=1;i<=b;i++) p*=a;
return p;
}
int suma(int t[50],int i)
{
6
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
if(i<n) return(t[i]+suma(t,i+1));
else return 0;
}
void main(void)
{
clrscr();
cout<<"Dati numarul de elemente n = ";cin>>n;
cout<<"Dati elementele primului vector X "<<endl;
for(i=0;i<n;i++) cin>>x[i];
cout<<"Dati elementele celui de-al doilea vector Y "<<endl;
for(i=0;i<n;i++) cin>>y[i];
for(i=0;i<n;i++) z[i]=z[i]+putere(x[i],y[i]);
cout<<" suma este "<<suma(z,1);
}
C. Exerciţii şi teme
7
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
LUCRAREA nr. 2
IMPLEMENTAREA STATICĂ A
STIVELOR ŞI A COZILOR
A. Consideraţii teoretice
B. Exemple de implementare
1. // programul cu stiva
#include<iostream.h>
#include<conio.h>
int n,i,nr,k;
int st[50];
char c;
int stiva_vida(int k)
{
if(k==0) return 1;
else return 0;
}
int stiva_plina(int k)
{
8
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
if(k==n) return 1;
else return 0;
}
void stiva_init(int k)
{
st[k]=0;
return;
}
void stiva_adaug(int e)
{
if(stiva_plina(k)==0)
{
k++;
st[k]=e;
}
else cout<<"Nu se mai poate adauga nici un element!!";
}
int stiva_sterg(void)
{
int e;
if(stiva_vida(k)==0)
{
e=st[k];
k--;
return e;
}
else cout<<"Nu se mai poate sterge nici un element";
}
void tipar(int k)
{
int i;
for(i=1;i<=k;i++) cout<<st[i]<<" ";
cout<<endl;
}
void main(void)
{
clrscr();
cout<<"Dati dimensiunea stivei n = ";cin>>n;
k=0;
stiva_init(k);
do{
cout<<endl;
cout<<"Alegeti operatia dorita"<<endl;
cout<<"(A)daugare"<<endl;
cout<<"(S)coatere"<<endl;
cout<<"verificare stiva (V)ida"<<endl;
cout<<"verificare stiva (P)lina"<<endl;
cout<<"(T)iparire"<<endl;
9
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
cout<<"(I)esire"<<endl;
cin>>c;
switch(c)
{
case 'A','a' :{cout<<"Dati numarul care se adauga ";cin>>nr;
stiva_adaug(nr);break;}
case 'S','s' :{nr=stiva_sterg();
cout<<"S-a eliminat numarul "<<nr;break;}
case 'V','v' :{if(stiva_vida(k)==1) cout<<"Stiva este VIDA!";
else cout<<"Stiva nu este vida ";break;}
case 'P','p' :{if(stiva_plina(k)==1) cout<<"Stiva este PLINA!";
else cout<<"Stiva nu este plina ";break;}
case 'T','t' :{cout<<"continutul stivei este "; tipar(k); break;}
}
}while( (c!='i') && (c!='I'));
}
10
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
C. Exerciţii şi teme
11
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
LUCRAREA nr. 3
A. Consideraţii teoretice
INF ADR
unde INF reprezinta informaţia pentru care se constuieşte lista, iar ADR
reprezintă adresa de memorie unde se află următorul element din listă.
B. Exemple de program
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
typedef struct lista
{
int inf;
lista *adr;
}lista;
lista *p,*prim,*ultim;
12
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
void creare()
{
int n;
lista *p;
cout<<"dati inf. <> 0 ";cin>>n;
p=NULL;
while(n!=0)
{
if(prim==NULL)
{
prim=new lista;
prim->inf=n;
prim->adr=NULL;
ultim=prim;
}
else
{
p=new lista;
p->inf=n;
ultim->adr=p;
ultim=p;
}
cout<<"dati inf. <> 0 ";cin>>n;
}
ultim->adr=NULL;
}
void afisare(void)
{
lista *p;
p=prim;
while(p!=NULL)
{
cout<<p->inf<<" ";
p=p->adr;
}
}
void adaug_la_sf(void)
{
int n;
cout<<"Dati informatia care se adauga ";cin>>n;
p=new lista;
p->inf=n;
ultim->adr=p;
p->adr=NULL;
ultim=p;
}
void adaug_la_inceput(void)
13
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
{
int n;
cout<<"Dati informatia care se adauga ";cin>>n;
p=new lista;
p->inf=n;
p->adr=prim;
prim=p;
}
void adaug_dupa_o_informatie_data(void)
{
int n1,n2;
lista *q;
cout<<"Dati informatia dupa care se adauga ";cin>>n1;
cout<<"Dati informatia care se adauga ";cin>>n2;
p=prim;
while( (p!=NULL) && (p->inf!=n1) ) p=p->adr;
if(p == NULL) cout<<"Informatia nu EXISTA in lista!";
else
{
q=new lista;
q->inf=n2;
q->adr=p->adr;
p->adr=q;
}
}
void stergere(void)
{
int n;
lista *q;
p=prim;
cout<<"informatia care se sterge ";cin>>n;
if(prim->inf!=n)
{
q=p->adr;
while(q->inf!=n)
{
p=q;q=q->adr;
}
p->adr=q->adr;
}
else
{
prim=p->adr;
}
}
void main()
{
clrscr();
14
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
#include<iostream.h>
#include<conio.h>
#include<alloc.h>
lista *prim,*ultim;
void crearelista()
{
15
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
int y,i;
lista *p;
cout<<"Creati lista pina la citirea elementului cu informatia 0"<<endl;
cout<<"dati informatia : ";cin>>y;
prim=new lista;
prim->inf=y;
prim->adr=NULL;
ultim=prim;
cout<<"dati informatia : ";cin>>y;
while(y!=0)
{
p=new lista;
p->inf=y;
ultim->adr=p;
ultim=p;
cout<<"dati informatia : ";cin>>y;
}
ultim->adr=NULL;
}
void listarelista()
{
lista *p;
p=prim;
while(p!=NULL)
{
cout<<p->inf<<" ";
p=p->adr;
}
}
lista *inversare(lista *prim)
{
lista *p1,*p2,*p3;
if ( !prim || !prim->adr )
return prim;
else
{
p1=prim;
p2=prim->adr;
prim->adr=NULL;
while (p2 != NULL)
{
p3=p2->adr;
p2->adr=p1;
p1=p2;
p2=p3;
}
return p1;
}
}
16
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
void main()
{
clrscr();
cout<<"Creare lista : "<<endl;
crearelista();
cout<<"Afisare lista initiala : "<<endl;
listarelista();
prim=inversare(prim);
cout<<endl;
cout<<"Afisare lista inversata : "<<endl;
listarelista();
getch();
}
3. Sa se creeze o lista liniara simplu inlantuita in care informatiile (nr. intregi) sa fie
ordonate in ordine crescatoare.
Indicatie: Se va folosi sortarea prin insertie.
#include<iostream.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void creare()
{
int y;
lista *p,*a;
p=new lista;
cout<<"Introduceti informatia primului element : "; cin>>y;
p->inf=y;
prim=p;
ultim=p;
17
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
while(y!=100)
{
cout<<"Introduceti informatia dorita dar <>100 : "; cin>>y;
p=new lista;
if (y<prim->inf)
{
p->inf=y;
p->adr=prim;
prim=p;
}
else
if (y>ultim->inf)
{
p->inf=y;
ultim->adr=p;
ultim=p;
}
else {
p->inf=y;
a=prim;
while((y>=a->adr->inf)) a=a->adr;
p->adr=a->adr;
a->adr=p;
}
}
ultim->adr=NULL;
}
void afisare()
{
lista *p;
p=prim;
while(p->adr!=NULL)
{
cout<<p->inf<<" ";
p=p->adr;
}
}
void main()
{
clrscr();
cout<<" Vom crea o lista simplu inlantuia pana la introducerea"<<endl;
cout<<" unui element egal cu 100."<<endl;
creare();
cout<<"\n";
afisare();
getch();
}
18
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
19
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
}
void scoate()
{
int y;
lista *p;
p=prim;
while(p->adr!=NULL)
{
y=p->inf;
if(y%5==0) sterge(y);
p=p->adr;
}
}
void afisare()
{
lista *p;
p=prim;
while(p->adr!=NULL)
{
cout<<p->inf<<" ";
p=p->adr;
}
}
void main()
{
clrscr();
creare();
cout<<"lista initiala "<<endl;
afisare();
cout<<"\n";
scoate();
cout<<"lista dupa stergere "<<endl;
afisare();
}
5. Sa se creeze o lista liniara simplu inlantuita folosind tehnica recursivitatii.
#include<iostream.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct lista
{
int inf;
struct lista *adr;
}lista;
lista *prim;
lista *creare(void)
{
20
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
int n;
lista *p;
cout<<"Dati informatia <>0 ";cin>>n;
if(n!=0)
{
p=new lista;
p->inf=n;
p->adr=creare();
return p;
}
else return NULL;
}
void afisare()
{
lista *p;
p=prim;
while(p!=NULL)
{
cout<<p->inf<<" ";
p=p->adr;
}
}
void main()
{
clrscr();
cout<<" Vom crea o lista simplu inlantuita pana la introducerea unui
element egal cu 0."<<endl;
prim=creare();
cout<<"\n";
afisare();
getch();
}
C. Exerciţii şi teme
21
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
LUCRAREA nr. 4
A. Consideraţii teoretice
AS INF AD
unde:
- inf reprezintă informaţia utilă ce urmează a fi prelucrată;
- as reprezintă adresa stânga a elementului aflat înaintea celui curent
- ad reprezintă adresa dreapta a elementului aflat după cel curent
În plus se pot construi şi liste liniare înlănţuite simplu sau dublu înlănţuite
circulare, adică liste în care ultimul element să fie legat de primul element.
B. Exemple de programe
22
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
#include<iostream.h>
#include<conio.h>
typedef struct lista
{
int inf;
lista *as,*ad;
};
lista *p,*prim,*ultim,*q;
int opt;
void creare(void)
{
int n;
prim=new lista;
ultim=new lista;
prim->ad=ultim;
prim->as=NULL;
ultim->as=prim;
cout<<"Dati informatia !=0 ";cin>>n;
while(n!=0)
{
p=ultim;
p->inf=n;
ultim=new lista;
p->ad=ultim;
ultim->as=p;
cout<<"Dati informatia !=0 ";cin>>n;
}
ultim->ad=NULL;
cout<<"Apasa o tasta pentru continuare"<<endl;
getch();
}
void afisare_stanga_dreapta(void)
{
cout<<"parcurgerea listei de la stanga la dreapta"<<endl;
p=prim->ad;
if(p==ultim) cout<<"Lista este VIDA!!";
else
{
do{
cout<<p->inf<<" ";
p=p->ad;
}while(p!=ultim);
}
cout<<"Apasa o tasta pentru continuare"<<endl;
getch();
}
void afisare_dreapta_stanga(void)
{
23
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
24
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
p=q;
q=q->ad;
}
q->ad->as=p;
p->ad=q->ad;
}
else
{
prim=p->ad;
prim->as=NULL;
}
cout<<"Apasa o tasta pentru continuare"<<endl;
getch();
}
void main(void)
{
do{
clrscr();
cout<<endl;
cout<<" 1. Crearea listei"<<endl;
cout<<" 2. Adaugare la inceputul listei"<<endl;
cout<<" 3. Adaugare la sfarsitul listei"<<endl;
cout<<" 4. Parcurgerea de la stanga la dreapta"<<endl;
cout<<" 5. Parcurgerea de la dreapta la stanga"<<endl;
cout<<" 6. Stergerea unei informatii date"<<endl;
cout<<" 7. Terminare program"<<endl;
cout<<endl;
cout<<"Dati optiunea ";cin>>opt;
switch (opt){
case 1:{creare();break;}
case 2:{adaug_la_inceput();break;}
case 3:{adaug_la_sfarsit();break;}
case 4:{afisare_stanga_dreapta();break;}
case 5:{afisare_dreapta_stanga();break;}
case 6:{stergere();break;}
}
}while(opt!=7);
}
#include<iostream.h>
#include<conio.h>
25
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
26
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
getch();
}
void cautare_dreapta_stanga(void)
{
p=ultim;
q=p->as;
while(p!=NULL)
{
while(q->inf!=a)
{
p=q;
q=q->as;
}
if(q->inf==a)
{
q->as->ad=p;
p->as=q->as;
break;
}
p=p->as;
}
cout<<"Apasa o tasta pt. continuare"<<endl;
getch();
}
void afisare_stanga_dreapta(void)
{
cout<<"parcurgerea listei de la stanga la dreapta"<<endl;
p=prim->ad;
if(p==ultim) cout<<"Lista este VIDA!!";
else
{
do{
cout<<p->inf<<" ";
p=p->ad;
}while(p!=ultim);
}
cout<<"Apasa o tasta pentru continuare"<<endl;
getch();
}
void main(void)
{
clrscr();
cout<<endl;
creare();
afisare_stanga_dreapta();
cout<<endl;
cout<<" Dati numarul care va fi sters ";cin>>a;
27
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
cautare_stanga_dreapta();
afisare_stanga_dreapta();
cout<<endl;
cautare_dreapta_stanga();
afisare_stanga_dreapta();
}
#include<iostream.h>
#include<conio.h>
typedef struct lista
{
int inf;
lista *as,*ad;
};
lista *p,*prim,*ultim;
void creare(void)
{
int n;
prim=NULL;
cout<<"Dati informatia !=0 ";cin>>n;
while(n!=0)
{
if(prim==NULL)
{
prim=new lista;
prim->inf=n;
prim->as=NULL;
prim->ad=NULL;
ultim=prim;
}
else
{
p=new lista;
p->inf=n;
p->ad=NULL;
p->as=ultim;
ultim->ad=p;
ultim=p;
}
cout<<"Dati informatia !=0 ";cin>>n;
}
cout<<"Apasa o tasta pentru continuare"<<endl;
28
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
getch();
}
void afisare_stanga_dreapta(void)
{
cout<<"parcurgerea listei de la stanga la dreapta"<<endl;
p=prim;
do{
cout<<p->inf<<" ";
p=p->ad;
}while(p!=NULL);
cout<<"Apasa o tasta pentru continuare"<<endl;
getch();
}
void eliminare(void)
{
lista *p,*q,*t;
int k;
p=prim;
while(p!=NULL)
{
k=0;
q=p->ad;t=q->as;
while( (q!=NULL) && (k==0) )
{
if(q->inf==p->inf) k=1;
else {t=q;q=q->ad;}
}
if(k==1)
{
t->ad=q->ad;
q->ad->as=t;
}
p=p->ad;
}
}
void main(void)
{
clrscr();
cout<<endl;
creare();
afisare_stanga_dreapta();
cout<<endl;
cout<<endl;
eliminare();
afisare_stanga_dreapta();
}
29
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
C. Exercitii si teme
30
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
LUCRAREA nr. 5
A. Consideraţii teoretice
Definiţie. Numim graf o pereche de mulţimi G=(V, E), unde V - reprezintă mulţimea
vârfurilor din graf, iar E - reprezintă mulţimea muchiilor din graf.
La curs s-au prezentat modalităţile de reprezentare a unui graf neorientat.
Acum prezentam două modalităţi de parcurgere.
2 3 4
5 6
7 8
2. Parcugerea în adâncime, constă în a “vizita” vârful iniţial i şi a continua cu
vecinii săi nevizitaţi j. Tot timpul mergem în adâncime, cât este posibil, cât nu ne
întoarcem şi plecăm, dacă este posibil, spre vecinii nevizitaţi încă.
31
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
dintre vecinii săi nevizitaţi, acesta din urmă fiind plasat în vârful stivei; cu acest nod
se continuă la fel. Varianta aleasă este cea recursivă.
Exemplu: Pentru graful din figura următoare, ordinea de parcurgere DF a
vârfurilor, plecând de la nodul 1 este : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10.
10
3 4 6 7
5 9
8
B. Exemple de programe
#include<iostream.h>
#include<conio.h>
int viz[30],n,m,i,j,u,v,p,a[20][20],c[30];
void main(void)
{
clrscr();
cout<<"Dati numarul de varfuri n = ";cin>>n;
cout<<"Dati numarul de muchii m = ";cin>>m;
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
{
cout<<"a["<<i<<","<<j<<"]= ";cin>>a[i][j];
a[j][i]=a[i][j];
}
cout<<"Dati varful de plecare ";cin>>i;
for(j=1;j<=n;j++) viz[j]=0;
c[1]=i;p=1;u=1;viz[i]=1;
while(p<=u)
{
v=c[p];
for(j=1;j<=n;j++)
{
if( (a[v][j]==1) && (viz[j]==0) )
{
u++;
32
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
c[u]=j;
viz[j]=1;
}
}
p++;
}
cout<<"Lista varfurilor in parcugerea in latime : "<<endl;
cout<<i<<" ";
for(j=2;j<=u;j++) cout<<c[j]<<" ";
getch();
}
#include<iostream.h>
#include<conio.h>
int s[30],n,m,i,j,p,a[20][20];
void df(int k)
{
int l;
cout<<k<<" ";
s[k]=1;
for(l=1;l<=n;l++)
if( (a[k][l]==1) && (s[l]==0) )
df(l);
return;
}
void main(void)
{
clrscr();
cout<<"Dati numarul de varfuri n = ";cin>>n;
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
{
cout<<"a["<<i<<","<<j<<"]= ";cin>>a[i][j];
a[j][i]=a[i][j];
}
cout<<"Dati varful de plecare ";cin>>p;
df(p);
getch();
}
#include<iostream.h>
#include<conio.h>
int x[30],k,n,m,i,j,p,
int a[20][20]; // matricea de adiacenţă a grafului
33
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
34
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
}
if(k==1) cout<<"Graful este conex";
else
{
cout<<"S-au gasit urmat. componente conexe" <<endl;
for(i=1;i<=kk;i++)
{
cout<<"Componenta conexa : "<<i<<" = { ";
for(j=1;j<=tt;j++)
cout<<c[i][j]<<",";
cout<<"}"<<endl;
}
}
getch();
}
C. Exerciţii şi teme
35
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
LUCRAREA nr. 6
ARBORI BINARI
B. Consideraţii teoretice
Nivel 4 8 9
Definitie: Numim arbore binar un arbore în care fiecare nod are zero, unul sau cel
mult doi fii (descendenţi).
Definitie: Un arbore binar cu proprietatea că fiecare nod cu excepţia frunzelor
(nodurilor terminale) are exact doi descendenţi se numeşte arbore binar complet.
2 3
4 5 6 7
8 9
36
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
2 3
2 1
1
2 5 4
1
6 7
Avem n = 7 noduri, RAD = 1 si ST = { 2, 0, 5, 0, 6, 0, 0 } şi DR = { 3, 0, 4, 0, 7,
0, 0 }.
2. Se folosesc vectorii TATĂ care precizează pentru fiecare nod i, nodul părintelui
său – TATĂ[i] şi DESC, vector care reţine valorile –1 sau 1 în funcţie de nodul i
care este fie descendent stâng, fie descendent drept.
Pentru acelasi exemplu, vectori consideraţi mai sus au următoarele valori:
TATĂ = { 0, 1, 1, 3, 3, 5, 5 } şi DESC = { 0, -1, 1, 1, -1, -1, 1 }.
3. Se foloseşte alocarea dinamică a memoriei astfel încât fiecare nod este compus
din un câmp de informaţie şi două câmpuri de adrese stânga şi dreapta. Definirea
unui astfel de nod se face astfel:
typedef struct pnod
{
int inf;
struct *as,*ad;
}
Un exemplu de arbore binar reprezentat prin alocarea dinamică memoriei este
următorul:
2 3
NIL NIL
NIL
4 5
37
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
1) Travesarea în preordine
- se viziteaza rădăcina
- se traversează subarborele stang
- se traversează subarborele drept
2) Travesarea în inordine
- se traversează subarborele stang
- se vizitează rădăcina
- se traversează subarborele drept
3) Travesarea în postordine
- se traversează subarborele stang
- se traversează subarborele drept
- se vizitează rădăcina
C. Exemple de programe
#include<iostream.h>
#include<conio.h>
int st[20],dr[20],i,n,rad;
void inordine(int k)
{
if(st[k]!=0) inordine(st[k]);
cout<<k<<" ";
if(dr[k]!=0) inordine(dr[k]);
}
void preordine(int k)
{
cout<<k<<" ";
if(st[k]!=0) preordine(st[k]);
if(dr[k]!=0) preordine(dr[k]);
}
void postordine(int k)
{
if(st[k]!=0) postordine(st[k]);
if(dr[k]!=0) postordine(dr[k]);
cout<<k<<" ";
38
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
void main(void)
{
clrscr();
cout<<"Dati numarul de noduri ale arborelui ";
cin>>n;
cout<<"Dati radacina arborelui ";cin>>rad;
cout<<"Dati elementele pentru vectorii ST si DR "
<<endl;
for(i=1;i<=n;i++)
{
cout<<"st["<<i<<"]= ";cin>>st[i];
cout<<"dr["<<i<<"]= ";cin>>dr[i];
}
cout<<"Parcurgere Stanga Varf Dreapta - INORDINE : ";
inordine(rad);
cout<<endl;
cout<<"Parcurgere Varf Stanga Dreapta - PREORDINE : ";
preordine(rad);
cout<<endl;
cout<<"Parcurgere Stanga Dreapta Varf - POSTORDINE : ";
postordine(rad);
cout<endl;
getch();
}
#include<iostream.h>
#include<conio.h>
typedef struct arbore
{
int inf;
struct arbore *st,*dr;
}arbore;
arbore *rad;
arbore *creare(void)
{
int n;
arbore *c;
cout<<" Dati n = ";cin>>n;
if(n!=0)
{
c=new arbore;
c->inf=n;
c->st=creare();
39
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
c->dr=creare();
return c;
}
else return(NULL);
}
void INORDINE(arbore *c)
{
if(c!=NULL)
{
INORDINE(c->st);
cout<<c->inf<<" ";
INORDINE(c->dr);
}
return;
}
void PREORDINE(arbore *c)
{
if(c!=NULL)
{
cout<<c->inf<<" ";
PREORDINE(c->st);
PREORDINE(c->dr);
}
return;
}
void POSTORDINE(arbore *c)
{
if(c!=NULL)
{
POSTORDINE(c->st);
POSTORDINE(c->dr);
cout<<c->inf<<" ";
}
return;
}
void main(void)
{
clrscr();
rad=creare();
cout<<"Parcurgere Stanga Varf Dreapta - INORDINE : ";
INORDINE(rad);
cout<<endl;
cout<<"Parcurgere Varf Stanga Dreapta - PREORDINE : ";
PREORDINE(rad);
cout<<endl;
cout<<"Parcurgere Stanga Dreapta Varf - POSTORDINE : ";
POSTORDINE(rad);
cout<endl;
40
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
getch();
}
#include<iostream.h>
#include<conio.h>
typedef struct arbore
{
int inf;
struct arbore *st,*dr;
}arbore;
arbore *rad;
arbore *creare(void)
{
int n;
arbore *c;
cout<<" Dati n = ";cin>>n;
if(n!=0)
{
c=new arbore;
c->inf=n;
c->st=creare();
c->dr=creare();
return c;
}
else return(NULL);
}
void PREORDINE(arbore *c)
{
if(c!=NULL)
{
cout<<c->inf<<" ";
PREORDINE(c->st);
PREORDINE(c->dr);
}
return;
}
int suma(arbore *p)
{
if(p==NULL) return 0;
else
if(p->inf%2==0) return (p->inf+suma(p->st)+suma(p->dr));
else return (suma(p->st)+suma(p->dr));
}
void main(void)
{
41
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
clrscr();
rad=creare();
cout<<"Suma cheilor pare este “<<
suma(rad)<<endl;
cout<<"Parcurgere Varf Stanga Dreapta - PREORDINE : ";
PREORDINE(rad);
cout<<endl;
getch();
}
#include<iostream.h>
#include<conio.h>
typedef struct arbore
{
int inf;
struct arbore *st,*dr;
}arbore;
arbore *rad,*q;
int val;
arbore *creare(void)
{
int n;
arbore *c;
cout<<" Dati n = ";cin>>n;
if(n!=0)
{
c=new arbore;
c->inf=n;
c->st=creare();
c->dr=creare();
return c;
}
else return(NULL);
}
void INORDINE(arbore *c)
{
if(c!=NULL)
{
INORDINE(c->st);
cout<<c->inf<<" ";
INORDINE(c->dr);
}
return;
}
arbore *cautare_recursiva(arbore *p,int val)
42
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
{
if( (p==NULL) || (p->inf==val) ) return p;
else
if(val < p->inf)
return (cautare_recursiva(p->st,val));
else return (cautare_recursiva(p->dr,val));
}
void main(void)
{
clrscr();
rad=creare();
cout<<"Parcurgere INORDINE (stanga-varf-dreapta) ";
cout<<endl;
INORDINE(rad);
cout<<"Dati informatia pe care o cautati ";
cin>>val;
q=cautare_recursiva(rad,val);
if(q==NULL) cout<<"Valoarea "<<val<<" NU exista in arbore";
cout<<"EXISTA!!";
getch();
}
D. Exerciţii şi teme
43
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
LUCRAREA nr. 7
a. Consideraţii teoretice
Exemple de programe
44
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
#include<iostream.h>
#include<conio.h>
int n,i,p,q,a[100];
void sort(int p,int q,int a[100])
{
int t;
if(a[p]>a[q])
{
t=a[p];a[p]=a[q];a[q]=t;
}
return;
}
void interclasare(int p,int q,int m, int a[100])
{
int i,j,k,b[100];
i=p;j=m+1;k=1;
while( (i<=m) && (j<=q) )
if(a[i]<=a[j])
{
b[k]=a[i];i++;k++;
}
else
{
b[k]=a[j];j++;k++;
}
if(i<=m)
for(j=i;j<=m;j++)
{
b[k]=a[j];
k++;
}
else
for(i=j;i<=q;i++)
{
b[k]=a[i];
k++;
}
k=1;
for(i=p;i<=q;i++)
{
a[i]=b[k];
k++;
}
return;
}
void divide_impera(int p,int q, int a[100])
{
int m;
45
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
if(q-p<=2) sort(p,q,a);
else
{
m=(p+q)/2;
divide_impera(p,m,a);
divide_impera(m+1,q,a);
interclasare(p,q,m,a);
}
return;
}
void main(void)
{
clrscr();
cout<<"Dati numarul de elemente ";cin>>n;
cout<<endl<<"Dati elementele vectorului "<<endl;
for(i=1;i<=n;i++)
{
cout<<"a["<<i<<"]= ";
cin>>a[i];
}
divide_impera(1,n,a);
cout<<"vectoarul sortat este ";
for(i=1;i<=n;i++) cout<<a[i]<<" ";
getch();
}
CAUTAREA BINARĂ
#include<iostream.h>
#include<conio.h>
int n,i,nr,v[100];
int caut(int i,int j)
{
if(nr==v[(i+j)/2]) return ((i+j)/2) ;
else
if(i<j)
if(nr<v[(i+j)/2]) return(caut(i,(i+j)/2 - 1));
else return(caut((i+j)/2 + 1,j));
}
void main(void)
{
clrscr();
cout<<"Dati numarul de elemente ";cin>>n;
cout<<endl<<"Dati elementele vectorului "<<endl;
46
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
for(i=1;i<=n;i++)
{
cout<<"v["<<i<<"]= ";
cin>>v[i];
}
cout<<"Dati numarul care se cauta ";cin>>nr;
cout<<"Am gasit elementul pe pozitia "<<caut(1,n);
getch();
}
#include<iostream.h>
#include<conio.h>
int n,i,k,a[100];
int poz(int li,int ls,int a[100])
{
int i,j,c,i1,j1;
i1=0;j1=-1;i=li;j=ls;
while(i<j)
{
if(a[i]>a[j])
{
c=a[i];a[i]=a[j];a[j]=c;
c=i1;i1=-j1;j1=-c;
}
i=i+i1;
j=j+j1;
}
return i;
}
void quick(int li,int ls)
{
if(li<=ls)
{
k=poz(li,ls,a);
quick(li,k-1);
quick(k+1,ls);
}
return;
}
void main(void)
{
clrscr();
cout<<"Dati numarul de elemente ";cin>>n;
cout<<endl<<"Dati elementele vectorului "<<endl;
47
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
for(i=1;i<=n;i++)
{
cout<<"a["<<i<<"]= ";
cin>>a[i];
}
quick(1,n);
cout<<"vectorul sortat este ";
for(i=1;i<=n;i++) cout<<a[i]<<" ";
getch();
}
Exerciţii şi teme
4. Fiind dat un sir ordonat, sa se scrie un program recursiv care realizeaza cautarea
binara, prin impartirea multimii initiale in doua multimi care contin 1/3 respectiv
2/3 din elementele multimii initiale.
48
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
LUCRAREA nr. 8
METODA GREEDY
a. Consideraţii teoretice
procedure Greedy1(A, n, B)
Begin
B<-
for i=1 to n do
begin
ALEGE(A, i, x)
POSIBIL(B, x, v)
if v=1 then ADAUG(B, x)
end
end
procedure Greedy2(A, n, B)
begin
PREL
B<-
for i=1 to n do
begin
POSIBIL(B, ai, x )
if v=1 then ADAUG(B, ai)
end
49
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
end
1. Suma maximă
program submultime(X, n, S, k)
begin
k<-0
for i=1 to n do
if xI>0 then
begin
k<-k+1
sk<-xi
end
end
2. K divizori naturali
Fiind dat numărul natural k > 1, se cere să se determine cel mai mic număr
natural n având exact k divizori naturali proprii (diferiţi de 1 şi n).
procedure VERFI(n, k, v)
begin
i<=0
for j=2 to n-1 do
if n mod j = 0 then i<=i+1
if i=k then v<-true
else v<=false
end
program divizori(k,n)
begin
read k
n<-k+2
s<-0
while s=0 do
begin
VERIF(n,k,v)
If v=true then
begin
write n
s<-1
end
n<-n+1
50
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
end
end.
b. Exemple de programe
1. SUMA MAXIMĂ
#include<iostream.h>
#include<conio.h>
int n,i,k;
float s[20],x[20];
void main(void)
{
clrscr();
cout<<"Dati numarul de elemente n = ";cin>>n;
cout<<endl<<"Dati elementele matricei "<<endl;
for(i=1;i<=n;i++)
{
cout<<"x["<<i<<"]= ";
cin>>x[i];
}
k=0;
for(i=1;i<=n;i++)
if(x[i]>0)
{
k++;s[k]=x[i];
}
cout<<"Submultimea ceruta este formata din : ";
for(i=1;i<=k;i++) cout<<s[i]<<" ";
getch();
}
2. K DIVIZORI NATURALI
Fiind dat numărul natural k > 1, se cere să se determine cel mai mic numar
natural n având exact k divizori naturali proprii (diferiti de 1 şi n).
(Ioan Odagescu, Felix Furtuna –
METODE SI TEHNICI DE PROGRAMARE)
#include<iostream.h>
#include<conio.h>
int n,i,k,s,v;
51
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
3. PROBLEMA COMIS-VOIAJORULUI
Soluţia dată este generalizată astfel încât se reiau pe rând calculele pentru
fiecare nod de pornire {1,2,...,n}.
#include<iostream.h>
#include<conio.h>
float c[20],g[20],ef[20];
52
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
void main(void)
{
clrscr();
cout<<"Greutatea ce poate fi transportata ";
cin>>gr;
cout<<endl<<" Dati numarul de obiecte ";cin>>n;
for(i=1;i<=n;i++)
{
cout<<endl<<"cost["<<i<<"]= ";cin>>c[i];
cout<<"greutate["<<i<<"]= ";cin>>g[i];
ordine[i]=i;
ef[i]=c[i]/g[i];
cout<<"eficienta pt. obiectul "<<i<<" este "<<ef[i];
}
do{
invers=0;
for(i=1;i<=n-1;i++)
if(ef[i]<ef[i+1])
{
//sortam vectorul ef
aux=ef[i];ef[i]=ef[i+1];ef[i+1]=aux;
//sortam vectorul c
aux=c[i];c[i]=c[i+1];c[i+1]=aux;
//sortam vectorul g
aux=g[i];g[i]=g[i+1];g[i+1]=aux;
invers=1;
//sortam vectorul ordine aux1=ordine[i];
ordine[i]=ordine[i+1];
ordine[i+1]=aux1;
}
}while(invers!=0);
castig=0;i=1;
cout<<endl;
cout<<"Posibilitatea de incarcare eficienta a rucsacului este : "<<endl;
53
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
#include<iostream.h>
#include<conio.h>
const nmax=15;
const inf=15000;
int c[nmax][nmax],k,i,j,n,m,x,y,xp,z,arc,g;
int s[nmax],d[nmax],prec[nmax];
int min(void)
{
m=inf*2;
for(i=1;i<=n;i++)
if( (s[i]==0) && (d[i]<m) )
{
m=d[i];k=i;
}
return k;
}
void drum(int i)
{
if(i!=0)
{
drum(prec[i]);
cout<<i;
}
else cout<<endl;
54
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
return;
}
void main(void)
{
clrscr();
cout<<endl<<" Dati numarul n = ";cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) c[i][j]=inf;
for(i=1;i<=n;i++) c[i][i]=0;
cout<<"Arc = ";cin>>arc;
for(i=1;i<=n;i++)
{
cout<<"Dati arcul "<<i<<" : "<<endl;
cout<<"x = ";cin>>x;
cout<<"y = ";cin>>y;
cout<<"z = ";cin>>z;
c[x][y]=z;
}
cout<<"xp = ";cin>>xp;
for(i=1;i<=n;i++)
{
d[i]=c[xp][i];
s[i]=0;
if(c[xp][i]<inf) prec[i]=xp;
else prec[i]=0;
}
s[xp]=1;
prec[xp]=0;
g=1;
x=0;
do{
k=min();
x++;
if( (d[k]==inf) || (x==n) ) g=0;
else
{
s[k]=1;
for(j=1;j<=n;j++)
if( (s[j]==0) && (d[j]>d[k]+c[k][j]) )
{
d[j]=d[k]+c[k][j];
prec[j]=k;
}
}
}while(g!=0);
for(i=1;i<=n;i++)
if(i!=xp)
if(d[i]==inf)
55
METODE SI TEHNICI DE PROGRAMARE – Limbajul C++
ADRIAN RUNCEANU
c. Exerciţii şi teme
56