Sunteți pe pagina 1din 23

PROIECT INFORMATICA

Stanciu Daniel clasa a XI-a A prof. Buzoianu Stefan

1. SUMA CIFRELOR UNUI NUMAR #include<iostream.h> void main() { int s; long d,x; cout<<"x=";cin>>x; d=x; s=0; while(d) { s=s+d%10; d=d/10; } cout<<"s="<<s; } PRIMALITATE #include <iostream.h> long int n, prim, d; main() { cin>>n; prim=1; d=2; while (d<=n/2) if (n%d==0) prim=0; d=d+1; } if (prim==1) cout<<"Da"; else cout<<"Nu"; }

ALGORITMI FUNDAMENTALI

CMMDC + CMMMC(=a*b/CMMDC) #include<iostream.h> void main() { int a,b,r; cout<<"a=";cin>>a; cout<<"b=";cin>>b; while(a!=b) if(a>b) a=a-b; else b=b-a; cout<<"cmmdc: "<<b; }

2.TABLOURI UNIDIMENSIONALE DECLARAREA TABLOURILOR Numim tablou o colectie (grup, multime ordonata) de date, de acelasi tip, situate intr-o zona de memorie continua (elementele tabloului se afla la adrese succesive). Tablourile sunt variabile compuse (structurate), deoarece grupeaza mai multe elemente. Variabilele tablou au nume, iar tipul tabloului este dat de tipul elementelor sale. Elementele tabloului pot fi referite prin numele tabloului si indicii (numere intregi) care reprezinta pozitia elementului in cadrul tabloului. In functie de numarul indicilor utilizati pentru a referi elementele tabloului, putem intalni tablouri unidimensionale (vectorii) sau multidimensionale (matricile sunt tablouri bidimensionale). Ca si variabilele simple, variabilele tablou trebuie declarate inainte de utilizare. Modul de declarare: tip nume_tablou[dim_1][dim_2][dim_n]; unde: tip reprezinta tipul elementelor tabloului; dim_1,dim_2,...,dim_n sunt numere intregi sau expresii constante intregi (a caror valoare este evaluata la compilare) care reprezinta limitele superioare ale indicilor tabloului.

TABLOURI UNIDIMENSIONALE Tablourile unidimensionale sunt tablouri cu un singur indice (vectori). Daca tabloul contine dim elemente, indicii elementelor au valori intregi din intervalul [0, dim-1]. Un element al unui tablou poate fi utilizat ca orice alta variabila. Adresarea unei componente se face proin indicele ei, trecut intre paranteze drepte. Se pot efectua operatii asupra fiecarui element al tabloului, nu asupra intregului tablou. Exemple: int vect[20]; /* declararea tabloului vect, de maximum 20 de elemente, de tipul int. Elementele tabloului vect sunt : vect[0], vect[1], , vect[19] date de tip int*/ double p,q,tab[10]; // declararea variabilelor vectorului tab, de maximum 10 elemente, tip double #define MAX 10 char tab[MAX]; elemente de tip char*/ simple p, q si a

/*declararea tabloului tab, de maximum MAX (10)

Consideram declaratia tabloului v cu maxim 6 elemente de tip int int v[6]; Elementele tabloului pot fi initializate prin atribuire: v[0]=100; v[1]=101; v[2]=102; v[3]=103; v[4]=104; v[5]=105; 100 v[0] 101 v[1] 102 v[2] 103 v[3] 104 v[4] 105 v[5]

Variabilele tablou pot fi initializate in momentul declararii: declaratie_tablou=lista_valori; Valorile din lista de valori sunt separate prin virgula, iar intreaga lista este inclusa intre acolade: Exemple: int v[6]={100,101,102,103,104,105}; double x=9.8; double a[5]={1.2, 3.5, x, x-1, 7.5}; La declararea unui vector cu initializarea elementelor sale, numarul maxim de elemente ale tabloului poate fi omis, caz in care compilatorul determina automat marimea tabloului, in functie de numarul elementelor initializate. Exemplu: char tab[]={ A, C, D, C};

[0] float data[5]={ 1.2, 2.3, 3.4 };

[3]

[0] Citirea elementelor unui vector: double a[5]; int i; for (i=0; i<5; i++) { cout<<a["<<i<<]=; element

[4]

//afisarea

unui

mesaj

prealabil

citirii

fiecarui

cin>>a[i]; //citirea valorii elementului de indice i } Sau, pentru un vector cu n componente (n20): double a[20]; int i, n; cout<<Dim. Max. =; cin>>n; for (i=0; i<n; i++) { cout<<a[<<i<<]=; cin>>a[i]; } Pentru simplitate, se pot considera elementele vectorului incepand cu pozitia 1. In acest caz, primul element al tabloului ramane neutilizat, iar valoarea sa este cea alocata implicit la compilare. double a[20]; int i, n; cout<<Dim. Max. =; cin>>n; for (i=1; i<=n; i++) { cout<<a[<<i<<]=; cin>>a[i]; } Afisarea elementelor unui vector: cout<<Vectorul introdus este:\n; for (i=0; i<n i++) cout<<a[i]<< ; SORTARI Metoda bulelor

#include<iostream.h> void main() { int i,m,n,o,aux,v[20]; cout<<"n=";cin>>n; for(i=0;i<n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } m=n; do { o=1; for(i=0;i<m-1;i++) if(v[i]>v[i+1]) { o=0; aux=v[i];v[i]=v[i+1];v[i+1]=aux; } m--; }while(!o); for(i=0;i<=n-1;i++) cout<<v[i]<<" "; }

Interschimbare

#include<iostream.h> void main() { int i,j,n,aux,v[20]; cout<<"n=";cin>>n; for(i=0;i<n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(v[i]>v[j]) {aux=v[i];v[i]=v[j];v[j]=aux;} for(i=0;i<=n-1;i++) cout<<v[i]<<" "; } Insertie

#include<iostream.h> void main() { int i,k,n,aux,v[20]; cout<<"n=";cin>>n; for(i=0;i<n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } for(i=1;i<n;i++) { aux=v[i]; k=i; while(k && v[k-1]>aux) { v[k]=v[k-1]; k--; } v[k]=aux; } for(i=0;i<n;i++) cout<<v[i]<<" "; }

3.MATRICE Regiuni: N,S,E,V

#include<iostream.h> void main() { int a[10][10] , i , j , n ; cout<<n=; cin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { cout<<a[<<i<<][<<j<<]=; cin>>a[i][j]; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(i<j&&i+j<n+1) cout<<zona nord este<<a[i][j]<< ; if(i<j&&i+j>n+1) cout<<zona est este<<a[i][j]<< ; if(i>j&&i+j>n+1) cout<<zona sud este<<a[i][j]<< ; if(i>j&&i+j<n+1) cout<<zona vest este<<a[i][j]<< ; } } Inmultirea a doua matrici bidimensionale

#include <iostream.h> void main() { int n,m,p,i,j,k,a[10][10],b[10][10],c[10][10]; cout<<"Dati numarul de linii n = ";cin>>n; cout<<"Dati numarul de coloane m = ";cin>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { cout<<"a["<<i<<","<<j<<"]= "; cin>>a[i][j]; } cout<<"Elementele matricei A sunt: "<<endl; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) cout<<a[i][j]<<" "; cout<<endl; } cout<<"Dati numarul de linii m = ";cin>>m; cout<<"Dati numarul de coloane p = ";cin>>p; for(i=1;i<=m;i++) for(j=1;j<=p;j++)

{ cout<<"b["<<i<<","<<j<<"]= "; cin>>b[i][j]; } cout<<"Elementele matricei B sunt: "<<endl; for(i=1;i<=m;i++) { for(j=1;j<=p;j++) cout<<b[i][j]<<" "; cout<<endl; } for(i=1;i<=n;i++) for(j=1;j<=p;j++) for(k=1;k<=m;k++) c[i][j]+=a[i][k]*b[k][j]; cout<<"Elementele matricei produs "<<endl; for(i=1;i<=n;i++) { for(j=1;j<=p;j++) cout<<c[i][j]<<" "; cout<<endl; } } Diagonale

SUB DIAGONALA PRINCIPALA for(i=2;i<=n;i++) for(i=1;i<=n;i++) for(j=1;j<=i-1;j++) for(j=1;j<=n;j++) cin>>a[i][j]; if(i>j) //prelucram a[i][j] //prelucram a[i][j] DEASUPRA DIAGONALEI PRINCIPALE for(i=1;i<=n;i++) for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) for(j=1;j<=n;j++) //prelucram a[i][j] if(i<j) //prelucram a[i][j] SUB DIAGONALA SECUNDARA for(i=2;i<=n;i++) for(i=2;i<=n;i++) for(j=n-i+2;j<=n;j++) for(j=n-i+2;j<=n;j++) //prelucram a[i][j] if(i+j>n+1) //prelucram a[i][j] DEASUPRA DIAGONALEI SECUNDARE for(i=1;i<=n-1;i++) for(i=1;i<=n;i++) for(j=1;j<=n-1;j++) for(j=1;j<=n;j++) //prelucram a[i][j] if(i+j<n+1) //prelucram a[i][j]

4.SIRURI DE CARACTERE

Functii de prelucrare a sirului de caracter O constanta de tip sir de caractere de declara intre doua caractere . In memoria interna, o constanta de acest tip este retinuta sub forma unui vector de caractere. Fiecare componenta a sirului (incepand cu cea de indice 0) retine codul ASCII al caracterului pe care il memoreaza. Conventia este ca ultimul octet sa retina 0 (codul caracterului nul). Caracterul nul este memorat automat. Trebuie rezervate lungimea_sirului+1 caractere char (+1 pentru caracterul nul). Limbajul C/C++ permite initializarea unui tablou de caractere printr-o constanta sir, care include automat caracterul null. Exemplu : char vect[11]=calculator; char vect[]=calculator; (compilatorul face calculul numarului de octeti necesari) char vect[100]=calculator; (s-au rezervat mai multi octeti decat era necesar) Sirurile de caractere sunt de fapt tablouri de caractere, care au ca ultim element un terminator de sir, caracterul null. Exemplu: char tc[5] = {a, b, c, d, e}; // tablou de caractere char sc[5] = {a, b, c, d, \0}; // sir de caractere cu elementele abcd Ultima initializare este echivalenta cu: char sc[5] = abcd; //sau char sc[] = abcd; char sc1[5] = abcd; char s[10]; cout<<sc<<endln; //afiseaza abcd cout<<tc<<endl; //eroare: tabloul de caractere nu contine terminatorul de sir, deci nu poate fi afisat ca sir cout<<s<<endl; // eroare: tablou neinitializat cout<<sc1[0]; // afiseaza primul caracter din sirul sc1 cout<<sc1[2]; // afiseaza al treilea element din sirul sc1 sc1[1]=K; // elementului din sir de indice 1 i se atribuie valoarea K; FUNCTII PENTRU OPERATII CU SIRURI DE CARACTERE Functiile pentru operatii cu siruri se gasesc in header-ul <string.h>. Functia strlen int strlen(nume_sir); returneaza lungimea efectiva a unui sir (fara a numara terminatorul de sir). Exemplu: char a[50]=ora de informatica; strlen(a) = 18 Functia strcpy strcpy(sir_destinatie,sir_sursa); copiaza sirul sir_ sursa in sir_destinatie (se simuleaza atribuirea a=b). ATENTIE!! Nu este permisa atribuirea intre doua siruri de caractere folosind operatorul =. Atribuirea se face folosind functia strcpy. Exemplu:

char a[50]=primul sir,b[40]=al doilea sir; a=b; //eroare strcpy(a,b); a = al doilea sir; b=al doilea sir; Functia strcat strcat(dest,sursa); adauga sirului dest sirul sursa. Sirul sursa ramane nemodificat. Operatia se numeste concatenare si nu este comutativa. Exemplu: char *a=vine ,*b=vacanta?; strcat(a,b); a = vine vacanta?; Functia strncat strncat(dest,sursa,nr); adauga dest primele nr caractere din sirul sursa. Sirul sursa ramane nemodificat. Exemplu: char *a=vine ,*b=vacanta?; strncat(a,b,4); a = vine vaca; Functia strchr strchr(sir,c); are rolul de a cauta caracterul c in sirul sir. Cautarea se face de la stanga la dreapta, iar functia intoarce adresa subsirului care incepe cu prima aparitie a caracterului c. Daca nu este gasit caracterul, functia returneaza 0. Diferenta dintre adresa sirului initial si cea a subsirului returnat reprezinta chiar pozitia caracterului cautat in sirul dat. Exemplu: char *a=acesta este un sir,b=t,c=x,d; cout<<strchr(a,b); se tipareste ta este un sir; cout<<strchr(a,c); nu se tipareste nimic (se tipareste 0 daca se face o conversie la int a lui strchr(a,c) ; d= strchr(a,b); cout<<Caracterul apare prima data la pozitia <<d-a; Ex: Sa se afiseze toate pozitiile unui caracter intr-un sir #include <iostream.h> #include <string.h> void main() {char a[100],*p,c; cin.get(a,100); cin>>c; p=strchr(a,c); while (p) {cout<<"Pozitia "<<p-a<<endl; p++; p=strchr(p,c);}} Functia strrchr strrchr(sir,c); are acelasi rol cu strchr, cu deosebirea ca returneaza adresa ultimei aparitii a caracterului (cautarea se face de la dreapta spre stanga; r = right) Functia strcmp int strcmp(sir1,sir2); are rolul de a compara doua siruri de caractere. Valoarea returnata este <0 (daca sir1<sir2), =0 (daca sir1=sir2) si >0

(daca sir1>sir2). Functia strcmp face distinctie intre literele mari si cele mici ale alfabetului. Obs: Functia strcmp returneaza diferenta dintre codurile ASCII ale primelor caractere care nu coincid Functia stricmp int stricmp(sir1,sir2); are acelasi rol cu strcmp, cu deosebirea ca nu face distinctie intre literele mari si cele mici ale alfabetului (i = ignore). Functia strstr strstr(sir1,sir2); are rolul de a identifica daca sirul sir2 este subsir al sirului sir1. Daca este, functia returneaza adresa de inceput a subsirului sir2 in sirul sir1, altfel returneaza adresa 0. In cazul in care sir2 apare de mai multe ori in sir1, se returneaza adresa de inceput a primei aparitii. Cautarea se face de la stanga la dreapta Functia strtok strtok(sir1,sir2); are rolul de a separa sirul sir1 in mai multe siruri (cuvinte) separate intre ele prin unul sau mai multe caractere cu rol de separator. Sirul sir2 este alcatuit din unul sau mai multe caractere cu rol de separator. Functia strtok actioneaza in felul urmator: o Primul apel trebuie sa fie de forma strtok(sir1,sir2); Functia intoarce adresa primului caracter al primei entitati. Dupa prima entitate, separatorul este inlocuit automat prin caracterul nul. o Urmatoarele apeluri sunt de forma strtok(NULL,sir2); De fiecare data, functia intoarce adresa de inceput a urmatoarei entitati, adaugand automat dupa ea caracterul nul. o Cand sirul nu mai contine entitati, functia returneaza adresa nula. Exemplu: //Sa se separe cuvintele dintr-un text. #include <iostream.h> #include <conio.h> #include <string.h> void main() {char text[100],cuv[10][10],*p,*r,separator[]=",. !?";int i=0,nr=0; clrscr(); cout<<"Dati sirul:";cin.get(text,100); strcpy(p,text); p=strtok(p,separator); while (p) {strcpy(cuv[++nr],p); p=strtok(NULL,separator);} cout<<"Sunt "<<nr<<" cuvinte:"<<endl; for (i=1;i<=nr;i++) cout<<cuv[i]<<endl; getch();} Functia strspn cu forma generala int strspn(sir1,sir2); are rolul de a returna numarul de caractere ale sirului sir1 (caractere consecutive care incep obligatoriu cu primul caracter) care se gasesc in sirul sir2.

Exemplu: strspn(AB2def,1B3AQW); returneaza 2, pentru ca primele 2 caractere A si B din sir1 se gasesc in sir2. strspn(FAB2def,16A32BF); returneaza 0, deoarece caracterul F cu care incepe sir1 nu se gaseste in sir2. Functia strcspn cu forma generala int strspn(sir1,sir2); are rolul de a returna numarul de caractere ale sirului sir1 (caractere consecutive care incep obligatoriu cu primul caracter) care nu se gasesc in sirul sir2. Exemplu: strspn(AB2def,123); returneaza 2, pentru ca primele 2 caractere din sir1 nu se gasesc in sir2. //Se citeste un sir de caractere care nu contine caractere albe. Sa se decida daca sirul este alcatuit exclusiv din caractere numerice. #include <iostream.h> #include <conio.h> #include <string.h> void main() {char text[100],cifre[]="0123456789"; clrscr(); cout<<"Dati sirul:";cin.get(text,100); if (strcspn(cifre,text)==strlen(text)) cout<<"exclusiv numeric"; else cout<<nenumeric; getch();} Functia strlwr cu forma generala strlwr(sir); are rolul de a converti toate literele mari din sir in litere mici. Restul caracterelor raman neschimbate. Functia strupr cu forma generala strupr(sir); are rolul de a converti toate literele mici din sir in litere mari. Restul caracterelor raman neschimbate Functia strbrk cu forma generala strpbrk(sir1,sir2); actioneaza in felul urmator: o Cauta primul caracter al sirului sir1 in sir2. Daca este gasit, returneaza adresa sa din cadrul sirului sir1 si executia se termina. Altfel, se trece la pasul urmator. o Cauta al doilea caracter al sirului sir1 in sir2. Daca este gasit, returneaza adresa sa din cadrul sirului sir1 si executia se termina. Altfel, se trece la pasul urmator. o o Daca nici un caracter al sirului sir1 nu apartine sirului sir2, functia returneaza adresa nula. Functia atof cu forma generala double atof(sir); converteste un sir catre tipul double. Daca aceasta conversie esueaza (se intalneste un caracter nenumeric), valoarea intoarsa

este 0. Aceasta functie (ca si cele similare) necesita includerea librariei stdlib.h. Functia _atold cu forma generala long double _atold(sir); converteste un sir catre tipul long double. Daca aceasta conversie esueaza, valoarea intoarsa este 0. Functia atoi cu forma generala int atoi(sir); converteste un sir catre tipul int. Daca aceasta conversie esueaza (se intalneste un caracter nenumeric), valoarea intoarsa este 0. Functia atol cu forma generala long atol(sir); converteste un sir catre tipul long. Daca aceasta conversie esueaza (se intalneste un caracter nenumeric), valoarea intoarsa este 0. Functia itoa cu forma generala itoa(int valoare,sir,int baza); converteste o valoare de tip int in sir, care este memorat in variabila sir. Baza retine baza de numeratie catre care sa se faca conversia. In cazul bazei 10, sirul retine si eventualul semn -. Functia ltoa cu forma generala ltoa(long valoare,sir,int baza); converteste o valoare de tip long int in sir, care este memorat in variabila sir. Functia ultoa cu forma generala ultoa(unsigned long valoare,sir,int baza); converteste o valoare de tip unsigned long in sir, care este memorat in variabila sir. 5.FUNCTII tip_rezultat_returnat nume_functie (lista_parametri_formali) { /*antetul functiei*/ definirea variabilelor locale prelucrari /* instructiuni */ } /* intre { } corpul functiei */ Parametri formali

Parametrii formali sunt vizibili doar in corpul functiei care ii defineste. O functie poate deci prelucra variabilele globale, cele locale, precum si parametrii formali. Parametri efectivi

Paramentri efectivi sunt parametri reali ce vor inlocui parametri formali la executia functiei. Transmitere o prin valoare

Prin valoarea inseamna ca o copie a obiectului original se face pe stiva apelatului, iar modifcarea acestuia in functia apelata nu afecteaza obiectul din apelant. o prin referinta

In cazul transmiterii prin referinta (care contine adresa unui obiect, dar se comporta ca un obiect) modificarile in apelat inseamna modificari directe asupra obiectului din apelant. Se poate deosebi intre cele doua modalitati astfel: daca parametrul e precedat de & atunci e transmitere prin referinta; altfel e prin valoarea (copiere). Functii recursive CMMDC recursiv

#include<iostream.h> int a,b; int cmmdc(int a,int b) { if(a==b) return a; else if (a>b) return cmmdc(a-b,b); else return cmmdc(a,b-a); } void main() { cout<<"a=";cin>>a; cout<<"b=";cin>>b; cout<<"cmmdc: "<<cmmdc(a,b); } Suma cifrelor unui nr recursive

#include <iostream.h> int n; int s(int n) { if(n==0) return 0; else return n%10 + s(n/10); } void main() { cout<<"n=";cin>>n; cout<<"suma cifrelor: "<<s(n); } 6. POINTERI

Un pointer poate fi iniializat corect doar n urmtoarele trei moduri: cu adresa unei variabile alocate deja de compilator: int i=7; int* p; p=&i; cout<<*p<<endl; //7 printr-o atribuire cu o expresie corect din aritmetica pointerilor, de exemplu int tab[10]={0,1,2,3,4,5,6,7,8,9}; int* p; p=tab+5; cout<<tab[5]<<"=="<<*p<<endl; //5==5 prin alocare dinamic.

Alocarea dinamica a memoriei In C++ au fost introdui, special pentru alocarea dinamic, operatorii new i delete, care fac parte integrant din limbaj. Operatorul new poate fi utilizat n dou moduri: pentru a rezerva spaiu de memorie pentru un singur obiect, caz n care new ntoarce adresa obiectului alocat, sau pentru a rezerva spaiu pentru un tablou cu un numar variabil de obiecte (dar bine precizat, la rulare, n momentul evalurii expresiei), caz n care new ntoarce adresa primului element din tablou. Spaiul ocupat cu operatorul new (i numai acesta) poate fi eliberat cu ajutorul operatorului delete. Pentru a reui eliberarea spaiului, operatorul delete trebuie s primeasc adresa primului octet al locaiei, adic exact valoarea obinut cu operatorul new la alocare. La dealocarea unui tablou se utilizeaz forma delete [ ]. Exemplul . Alocarea i dealocarea unei variabile simple: #include<iostream> using namespace std; int main(void) { int *q,*p; p=new int; q=new int; *p=10; *q=*p+23; cout<<"p="<<p<<endl; cout<<"q="<<q<<endl; cout<<"*q="<<*q<<endl; delete q; delete p; cout<<"q="<<q<<endl; cout<<"*q="<<*q<<endl;

q=new int; *q=12; cout<<"q="<<q<<endl; cout<<"*q="<<*q<<endl; return 0; 7. LISTE Liste liniare Liste simplu inlantuite Operatii permise pe liste 1.Crearea listei Struct nod { int inf; nod*leg; } nod*creare() { nod *p, *u, *q; int n; cout<<n=; cin>>n; p=u=NULL; for(i=1 ;i<=n ;i++) { cout<<info=; cin>>info; q=new nod; q->info=info; q->leg=NULL; if(!p/p=u=q) else u->leg=q; } return p; } 2.Parcurgerea void parcurgere(nod*p) { nod*q; q=p; if (p->leg==NULL) cout<<p->info while(q->leg!=NULL) { cout<<q->info; q=q->leg; }} 3.Adaugarea unui nod LA INCEPUT nod*adi(nod*p) { nod*q; q->new nod;

cin>>q->inf; q->leg=p; p=q; return p; } LA SFARSIT nod*ad(nod*p) { nod*q,*x; q=new nod; cin>>q->inf; x=p; while(x->leg!=NULL) x=x->leg; x->leg=q; q->leg=NULL; return o; } Liste dublu inlantuite 1.Parcurgerea Struct nod { int info; nod*leg s; nod*leg d; } void parcurgere(nod*p) { nod*q; q=p; if (p->leg==NULL) cout<<p->info while(q->leg!=NULL) { cout<<q->info; q=q->leg; }} 2.Inserare nod inserare(nod *&p; int info c, int info i;) { nod *q,*a,q->p; while (q&&q->info!=info c)q=q->leg d; if(q) a=new nod; a->inf=info I; if(p==q){ q->leg s=a; a->leg d=q; a->leg s=NULL; p=a;}

Stiva Stiva este lista liniara simplu inlantuita pentru care adaugarile si extragerile se fac la un singur capat al listei. Adaugare q=new nod; q->inf=info; q->leg=vf; vf=q; Coada Coada este lista liniara simplu inlantuita pentru care adaugarea se face la un capat al listei(coada) si extragerea se face la celalalt capat al listei(cap).

8. TEHNICI DE PROGRAMARE Backtracking

Sa se afiseze toat numerele formate din cifre distincte cu proprietatea ca suma cifrelor este s, unde s se citeste de la tastatura. #include<iostream.h> #include<conio.h> int st[20],n,k,s,c; void init(int k) {st[k]=-1;} int succesor(int k) {if((st[k]<9)&&(st[k]<s)) {st[k]++; return 1; } else return 0;} int valid(int k) {int suma=0; for(int i=1;i<k;i++)

if(st[k]==st[i]) return 0; for(i=1;i<=k;i++) suma=suma+st[i]; if(suma>s) return 0; if((k==1)&&(st[k]==0)) return 0; return 1;} int sol(int k) {int suma=0; for(int i=1;i<=k;i++)suma=suma+st[i]; return(suma==s);} void tipar(int k) { //c++;cout<<"solutia"<<c<<": "; for(int i=1;i<=k;i++) cout<<st[i]; cout<<endl; //if(c%20==0) {cout<<"enter";getch();} } void bkt() {int as,k=1; init(k); while(k>0) { do{} while((as=succesor(k)) && !valid(k)); if (as) { if(sol(k)) tipar(k); if(st[k]!=0) {k++;init(k);} else {k++;init(k);} } else k--; } } void main() {cout<<"s=";cin>>s; //c=0; bkt(); getch(); } Sa se scrie un program care genereaza toate nr din 3 cifre pare,cifrele strict in ordine crescatoare. #include<iostream.h> #include<math.h> int st[20],i,p,v[]={0,2,4,6,8}; int valid(int p) { for(i=1;i<p;i++) if(st[p]<=st[i])return 0; if(p==1 && st[p]==0)return 0;

return 1; } int sol(int p) {return (p==3);} void tipar(int p) { int i; for(i=1;i<=p;i++) cout<<st[i]<<" "; cout<<endl; } void bkt(int p) {int val; for(val=0;val<=4;val++) { st[p]=v[val]; if(valid(p)) if (sol(p)) tipar(p); else bkt(p+1); }} void main() { bkt(1); } Divide et impera

Turnurile din hanoi #include<iostream.h> char x,y,z; int n; void h(int n,char x,char y, char z) { if(n==1) cout<<x<<y<<" "; else { h(n-1,x,z,y); cout<<x<<y<<" "; h(n-1,z,y,x); } } void main() { cout<<"n=";cin>>n; h(n,'x','y','z'); }

sortare rapida (quick sort) #include<iostream.h> int v[100],n,k; void poz(int li,int ls,int & k,int v[100]) { int i=li,j=ls,c,i1=0,j1=-1; while(i<j) { if(v[i]>v[j]) { c=v[j];v[j]=v[i];v[i]=c; c=i1;i1=-j1;j1=-c; } i=i+i1; j=j+j1; } k=i; } void quick(int li,int ls) { if(li<ls) { poz(li,ls,k,v); quick(li,k-1); quick(k+1,ls); } } void main() { int i; cout<<"n=";cin>>n; for(i=1;i<=n;i++) { cout<<"v["<<i<<"]="; cin>>v[i]; } quick(1,n); for(i=1;i<=n;i++) cout<<v[i]<<" "; }

9.GRAFURI

Descompunerea in componente tari conexe a unui graf orientat, dat prin matricea de adiacenta

#include <fstream.h> int s[20],p[20],a[20][20],n,nr,i,j; void df1(int nod) { int k; s[nod]=nr; for(k=1;k<=n;k++) if ((a[nod][k]==1) && (s[k]==0)) df1(k); } void df2(int nod) { int k; p[nod]=nr; for(k=1;k<=n;k++) if((a[k][nod]==1) && (p[k]==0)) df2(k); } void main() { fstream f("grafo.txt",ios::in); f>>n; while(f>>i>>j) a[i][j]=1; f.close(); nr=1; for (i=1;i<=n;i++) if (s[i]==0) { s[i]=nr; df1(i);df2(i); for(j=1;j<=n;j++) if (s[j]!=p[j]) s[j]=p[j]=0; nr++; } for(i=1;i<=n;i++) { cout<<"componenta "<<i<<endl; for(j=1;j<=nr;j++) if(s[j]==1) cout<<j<<" "; cout<<endl; } } Descompunerea in componente conexe a unui graf neorientat, dat prin matricea de adiacenta

#include<fstream.h> int s[20],a[20][20],n,i,j,k; void df(int nod) { int k; cout<<nod<<" "; s[nod]=1; for(k=1;k<=n;k++) if((a[nod][k]=1) && (s[k]==0)) df(k); } void main() { fstream f("graf.txt",ios::in); f>>n; while(f>>i>>j) a[i][j]=1; f.close(); k=1; for(i=1;i<=n;i++) if(s[i]==0) { cout<<"componenta "<<k<<endl; df(i); cout<<endl; k++; }

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