Sunteți pe pagina 1din 15

/*Calculati suma: S=1-1/(2!)+1/(3!)-1/(4!)+...+ (-1)^(n+1)*1/(n!) unde x!=1*2*3*...*x*/ #include<stdio.

h> void main() { int n,i,fact,semn; float s; printf("n="); scanf("%d",&n); s=0; fact=1; semn=1; for(i=1;i<=n;i++) { fact=fact*i; s=s+semn*(float)1/fact; semn=-semn; } printf("S=%.2f",s); } /*Sa se calculeze suma S= 1+x+x^2+x^3+...+x^n cu n natural*/ #include<stdio.h> void main() { int n,x,i=0,S=0,P=1; //P va retine puterile lui x printf("n=");scanf("%d",&n); printf("x=");scanf("%d",&x); while (i<=n) { S=S+P; i++; P=P*x; } printf("Suma este %d",S); } /*Sa se calculeze suma S= 1-x+x^2-x^3+...+ (-1)^n*x^n cu n natural*/ #include<stdio.h> void main() { int n,x,i=0,S=0,P=1,semn=1; //P va retine puterile lui x printf("n=");scanf("%d",&n); printf("x=");scanf("%d",&x); while (i<=n) { S=S+semn*P; i++; semn=-semn; P=P*x; } printf("Suma este %d",S); } /*Sa se calculeze suma S= 1-1/x+1/x^21/x^3+...+1/(-1)^n*x^n cu n natural */ #include<stdio.h> void main() { int n,x,i=0,P=1,semn=1; //P va retine puterile lui x float S=0; printf("n=");scanf("%d",&n); printf("x=");scanf("%d",&x); while (i<=n) { S=S+semn*(float)1/P; //oblig calculatorul sa convertesca catul spre real i++; semn=-semn; P=P*x; } printf("Suma este %.3f",S); } /*determina recursiv cifra maxima a unui numar n de maxim 9 cifre */ int maxim(unsigned long n) { int a=n%10,b; if (n==0) return 0; else { b=maxim(n/10); if (a>b) return a; else return b; } } apel: cout<<"cifra maxima este:"<<maxim(n); /*determina recursiv numarul de cifre al unui numar*/ int nrcifre(unsigned long n)

{ if (n==0) return 0; else return 1+nrcifre(n/10); } apel: if (n==0) cout<<"numarul cifrelor:1"; else cout<<"numarul cifrelor:"<<nrcifre(n); getch(); /*calculul recursiv al inversului unui numar*/ unsigned long invers(unsigned long n,int i,int k) { if (n==0) return 0; else return n%10*pow(10,k-i)+invers(n/10,i+1,k); } apel: cout<<"inversul numarului:"<<invers(n,0,k1); //unde k este numarul de cifre al numarului n /*calculul recursiv al produsului cifrelor unui numar n*/ unsigned long prod(unsigned long n) { if (n==0) return 1; else return n%10*prod(n/10); } apel: if (n==0) cout<<"produsul cifrelor:0"; else cout<<"produsul cifrelor:"<<prod(n); /*calculul iterativ a cmmdc din doua numere cu Euclid*/ METODA 1: int cmmdc(int a, int b) { if (b==0) return a; int r=a%b; while (r) { a=b; b=r; r=a%b; } return b; } METODA 2: int cmmdc(int a, int b) { int r; if (b==0) return a; do{ r=a%b; a=b; b=r; }while(r); return a; } apel: int a,b; cout<<"a=";cin>>a; cout<<"b=";cin>>b; cout<<"cmmdc="<<cmmdc(a,b); /*calculul recursiv a cmmdc din doua numere cu Euclid*/ int cmmdc(int a,int b) { if (b==0) return a; else return cmmdc(b,a%b); } apel: cout<<"cmmdc="<<cmmdc(a,b); /*calculul iterativ a cmmdc-ului a doua numere cu scadere*/ int cmmdc(int x,int y) { while (x!=y) if (x>y) x=x-y; else y=y-x; return x; } apel: if (!x && !y) cout<<0; else if (!x && y) cout<<y; else if (x && !y) cout<<x; else cout<<cmmdc(x,y); /*calculul recursiv a cmmdc-ului a doua numere cu scadere*/ int cmmdc(int x,int y) { if (x==y) return x; else if (x>y) return cmmdc(x-y,y); else return cmmdc(x,y-x); } apel: if (!x && !y) cout<<0; else if (!x && y) cout<<y; else if (x && !y) cout<<x;

else cout<<cmmdc(x,y); /*verifica iterativ daca un numar n este prim sau nu*/ METODA 1: int prim(int n) { if (n<2) return 0; for (int i=2;i<=sqrt(n);i++) if (n%i==0) return 0; return 1; } apel: if (prim(n)==1) cout<<"prim"; else cout<<"neprim"; METODA 2: int prim(int n) {int i=2; while (i<n && n%i!=0) i++; if (n==i) return 1; else return 0; } apel: if (prim(n)==1) printf("numarul este prim"); else printf("numarul nu este prim"); /*verifica iterativ daca un numar n este prim sau nu*/ int prim(int d,int n) { if (d<=sqrt(n)) { if (n%d==0) return 0; return prim(d+1,n); } else return 1; } apel: if (n<1) cout<<"nu e prim"; if (prim(2,n)) cout<<"e prim"; else cout<<"nu e prim"; /*Se citeste un numar real x. Se cere sa se gaseasca doua nr prime p si q a.i. p<=x<=q si diferenta intre p si q sa fie minima. */ #include<stdio.h> void main() { int p,q,i,x1,gasit,k; float x; printf("x=");scanf("%f",&x); x1=(int)x; //determin in jos primul nr prim gasit=0; for (k=x1;k>=2 && gasit==0;k--) { i=2; while (i<k && k%i!=0) i++; if (i==k) { p=k; gasit=1;} } if (gasit==1) printf("p=%d ",p); gasit=0; k=x1+1; while (gasit==0) //gasit devine 1 daca gasim primul nr prim>x1 { i=2; while (i<k && k%i!=0) i++; if(i==k) { q=k; gasit=1;} k++; } if (gasit==1) printf("q=%d ",q); } /*descompunerea unui numar in factori primi*/ void descompune(int n) { int i=2,pp; while (n!=1) { pp=0; //numara puterea lui i in descompunere while (n%i==0) { pp++; n=n/i; } if (pp!=0) cout<<i<<^<<pp<<*; i++; } cout<<\b ; } apel: descompune(n);

/*afiseaza iterativ primii n termeni din Sirul lui Fibonacci 0 1 1 2 3 5 8 13 21 34 ... (primii doi termeni se dau; un termen= suma ultimilor doi termeni anteriori)*/ void main() { int n,i,t0,t1,t2; printf("dati n=");scanf("%d",&n); if (n<=0) printf("nu exista sir"); else if (n==1) printf("0 "); else if (n==2) printf("0 1 "); else { t0=0; t1=1; printf ("%d %d ",t0,t1); for (i=3;i<=n;i++) { t2=t0+t1; printf("%d ",t2); t0=t1; t1=t2; } } } /*calculeaza recursiv termenul n din sirul lui Fibonacci*/ long fibo(int n) {if (n==0) return 0; else if (n==1) return 1; else return fibo(n-1)+fibo(n-2); } apel: cout<<fibo(n); /*afiseaza primii n termeni din sirul lui Fibonacci recursiv*/ void fibo_n(int n) { if (n>=0) { fibo_n(n-1); cout<<fibo(n)<< ; //unde fibo este o functie de calcul normal a termenului n din sir } } /*calculeaza recursiv suma 2+4+..+2n. */ int suma(int n) { if (n==0) return 0; else return 2*n+suma(n-1); } apel: cout<<"n=";cin>>n; cout<<"suma:"<<suma(n); /*calculeaza recursiv suma 1+1/2+1/4+..+1/2n. */ float suma(int n) { if (n==0) return 1; else return 1.0/(2*n)+suma(n-1); } apel: cout<<"n=";cin>>n; cout<<"suma:"<<suma(n); /* calculeaza recursiv produsul 2*2^2*2^3*...*2^20. */ unsigned long prod(int n) { if (n==0) return 1; else return pow(2,n)*prod(n-1); } apel: cout<<"n=";cin>>n; if (n>20) cout<<"eroare"; else cout<<"produsul:"<<prod(n); /*afiseaza recursiv inversul unui cuvant, citit caracter cu caracter pana la caracterul punct*/ #include<iostream.h> #include<stdio.h> void inv() { char c; if ((c=getchar())!='.') inv(); else cout<<"c"; } void main() { inv(); } /*inversul recursiv a n cuvinte, fiecare cuvant se citeste pana la caracterul spatiu. Se afiseaza pe

fiecare linie cuvantul initial, apoi cuvantul inversat, dupa care se trece la linie noua*/ #include<iostream.h> #include<stdio.h> void inv() { char c; if ((c=getchar())!=' ') { cout<<c; inv(); cout<<c; } } void invers_n(int n) { if (n>0) { inv();cout<<endl; invers_n(n-1); } } void main() {int n; cout<<"n=";cin>>n; invers_n(n); } /*Se citeste un numar in baza 10, mai mci decat 1024. Se cere sa se transforme in baza 2 cu retinerea intr-un numar de tip long de maxim 10 cifre. Ex 29(10)=11101(2) */ #include<stdio.h> void main() {int n10,r; long n2=0,p=1; printf("n10=");scanf("%d",&n10); while (n10!=0) { r=n10%2; n2=n2+r*p; p=p*10; n10=n10/2; } printf("numarul in baza 2:%lu",n2); } /*Se citesc, fara a se retine in vector, n cifre care reprezinta un numar in baza 2. Se cere sa se transforme in baza 10. */ #include<stdio.h> void main() {int n,i,nr10=0,c; printf("n=");scanf("%d",&n); for (i=1;i<=n;i++) { printf("c="); scanf("%d",&c); nr10=nr10*2+c; } printf("numarul in baza 10 este %d",nr10); } /*citeste un vector cu elemente aflate in ordine strict crescatoare*/ void citire(int x[20],int &dim) { int i; cout<<"dim=";cin>>dim; cout<<"x["<<0<<"]=";cin>>x[0]; for(i=1;i<dim;i++) do { cout<<"x["<<i<<"]="; cin>>x[i]; } while(x[i]<x[i-1]); } /*numara recursiv de cate ori apare intr-un vector valoarea x*/ int nrap(int a[20],int n,int x) { if (n==-1) return 0; else if (a[n]==x) return 1+nrap(a,n-1,x); else return nrap(a,n-1,x); } apel: cout<<"x=";cin>>x; cout<<"nr aparitii:"<<nrap(a,n-1,x); /*citeste un numar in baza 10 si o baza b si afiseaza recursiv transformatul numarului n in baza b*/

void transform(int n,int b) { int r=n%b; if (n>=b) transform(n/b,b); cout<<r; } void main() { int n,b; cout<<"n=";cin>>n; cout<<"b=";cin>>b; cout<<"nr in baza b="; transform(n,b); } /*sa se transforme recursiv un numar din baza 10 in baza b (2<b<9), cu retinerea cifrelor intr-un nou numar nr (in baza b)*/ #include<iostream.h> #include<conio.h> unsigned long p=1; void transform(int n,int b,unsigned long &nr) { int r=n%b; if (n>=b) { nr=nr+r*p; p=p*10; transform(n/b,b,nr); } } void main() { int n,b; unsigned long nr=0; cout<<"n=";cin>>n; cout<<"b=";cin>>b; transform(n,b,nr); cout<<"nr in baza b="<<nr; } /*transforma recursiv un vector care reprezinta un numar in baza 2 in numarul corespunzator in baza 10*/ int b210(int a[],int n) { if (n>=0) return a[n]+2*b210(a,n-1); else return 0; } apel: cout<<b210(a,n-1); /*afiseaza o secventa de lungime maxima care contine elemente in ordine strict crescatoare dintr-un vector*/ void cautare(int a[20], int n) { int i,j,max=0,p1max,p2max,p; for (i=0;i<n;i++) { j=i+1; p=i; while (j<n && a[i]<a[j]) { j++; i++; } //o secventa!! if (max<j-p+1) { max=j-p+1; p1max=p; p2max=j; } } for (i=p1max;i<p2max;i++) cout<<a[i]<<" "; } /*se considera un sir de numere; verificati daca sunt numere care se repeta, printr-o functie care returneaza 0 sau 1*/ int verificare(int a[], int n) { int i,j; //0 daca nu contine for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) if (a[i]==a[j]) return 1; return 0; } apel: if (verificare(a,n)==1) cout<<"contine dubluri"; else cout<<"nu contine dubluri";

/*verifica recursiv daca un vector cu cel putin trei elemente reprezinta un sir de elemente din sirul lui Fibonacci*/ int verificare(int a[], int i, int n) { if (i<n) if (a[i]!=a[i-1]+a[i-2]) return 0; else return verificare(a,i+1,n); else return 1; } apel: if (verificare(a,2,n-1)==1) cout<<"e fibo"; //indicii incep de la 0 else cout<<"nu e fibo"; /*citirea recursiva a unui vector*/ METODA 1: void citire(int a[],int i,int n) { if (i<n) { cout<<"a["<<i<<"]="; cin>>a[i]; citire(a,i+1,n); } } apel: cin>>n; citire(a,0,n); // indicii incep de la 0 METODA 2: void citire(int a[],int n) { if (n>=0) { citire(a,n-1); cout<<"a["<<n<<"]="; cin>>a[n]; } } apel: cin>>n; citire(a,n-1); // indicii incep de la 0 /*afisarea unui vector recursiv*/ METODA 1: void afisare(int a[],int n) { if (n>=0) { afisare(a,n-1); cout<<a[n]<<" "; } } apel: afisare(a,n-1); //indicii incep de la 0 METODA 2: void afisare(int a[],int i,int n) { if (i<n) { cout<<a[i]<< ; afisare(a,i+1,n); } } apel: afisare(a,0,n); //indicii incep de la 0 /*Se citesc nr pana la citirea lui 0. Retineti nr negative intr-un sir recursiv si afisati sirul.*/ void citire(int a[], int &n) { int x; cout<<"x=";cin>>x; if (x==0) afisare_n(a,n-1); else {if (x<0) a[n++]=x; citire(a,n); } } apel: int a[20],n=0; citire(a,n); /*calculul iterativ a cmmdc-ului tuturor elementelor unui vector*/ void divizor(int a[20],int n) { int i,d=a[0]; //initializez cmmdc cu primul numar for (i=1;i<n;i++) //calculez cmmdc dintre d si a[i], i=1,...,n-1 d=cmmdc(d,a[i]); cout<<"cmmdc="<<d; } /*calculul recursiv a cmmdc-ului tuturor elementelor unui vector*/ METODA 1:

void divizor(int a[],int i,int n,int &d) //returneaza cmmdc prin intermediul parametrului d { if (i<n) { d=cmmdc(d,a[i]); //cmmdc este o functie care calculeaza obisnuit cmmdc din doua numere divizor(a,i+1,n,d); } } apel: d=a[0]; divizor(a,1,n,d); cout<<"\ncmmdc="<<d; METODA 2: cu divide et impera int divizor(int a[],int st,int dr) { if (st==dr) return a[st]; else return cmmdc(divizor(a,st,(st+dr)/2),divizor(a, (st+dr)/2+1,dr))); //cmmdc este o functie care calculeaza obisnuit cmmdc din doua numere } apel: cout<<divizor(a,0,n-1); /*calculul recursiv al maximului dintr-un vector*/ METODA 1: void maxim(int a[],int i,int n,int &max) { if (i<n) { if (max<a[i]) max=a[i]; maxim(a,i+1,n,max); } } apel: int max=a[0]; maxim(a,1,n,max); cout<<max=<<max; METODA 2: folosind metoda divide et impera int maxim(int a[],int st,int dr) { if (st==dr) return a[st]; else { int m1=maxim(a,st,(st+dr)/2); int m2=maxim(a,(st+dr)/2+1,dr); if (m1<m2) return m2; else return m1; } } apel: cout<<max=<<maxim(a,0,n-1); /*generarea aleatoare a elementelor unui vector*/ #include<stdlib.h> void generare(int a[20], int &n) { cout<<"n=";cin>>n; randomize(); for (int i=0;i<n;i++) { a[i]=random(10); //in sir voi avea elemente intregi intre 0 inclusiv si 9 inclusiv cout<<a[i]<<" "; } cout<<endl; } /*intr-un vector care are elemente numere naturale cuprinse intre 0 si 9 numara pe categorii cate elemente are din fiecare. Se initializeaza un vector cu 0.*/ void numarare(int a[20], int n) { int j,k,i,b[10]={0,0,0,0,0,0,0,0,0,0}; for (i=0;i<10;i++) { k=0;//numara cifrele de o categorie for (j=0;j<n;j++) if (i==a[j]) k++; b[i]=k; } for (i=0;i<10;i++) cout<<"cifra "<<i<<" de "<<b[i]<<" ori\n"; } /*afiseaza toate pemutarile circulare la dreapta ale caracterelor unui sir de caractere*/ #include<string.h> #include<iostream.h> #include<stdio.h> void main() { char x[50],car;

int i,k,n; printf("dati cuvantul:"); gets(x); n=strlen(x); cout<<x<<" "; for (i=0;i<n-1;i++) { car=x[0]; for(int p=0;p<n-1;p++) x[p]=x[p+1]; x[n-1]=car; cout<<x<<" "; } } /*afisarea iterativa a prefixelor unui sir de caractere*/ char cuv[20],cuv1[20]; void pref_iter() { for(int i=1;i<=strlen(cuv);i++) { strncpy(cuv1,cuv,i); cuv1[i]='\0'; cout<<cuv1<<endl; } } apel: pref_iter(); /*afisarea recursiva a prefixelor unui sir de caractere*/ void pref_rec(int i) { if(i<=strlen(cuv)) { strncpy(cuv1,cuv,i); cuv1[i]='\0'; cout<<cuv1<<endl; pref_rec(i+1); } } apel: pref_rec(1); /*afisarea iterativa a sufixelor unui sir de caractere*/ void scrie_iter() { for(int i=0;i<=strlen(cuv);i++) cout<<(cuv+i)<<endl; //la adresa de inceput a cuvantului adaugi i(nr. natural) } apel: scrie_iter(); /*afisarea recursiva a sufixelor unui sir de caractere*/ void scrie_rec(int i) { if(i<strlen(cuv)) {cout<<(cuv+i)<<endl; scrie_rec(i+1); } } apel: scrie_rec(0); /*Numara vocalele dintr-un sir de caractere, pe categorii si afiseaza histograma aparitiilor lor*/ #include <iostream.h> #include <string.h> void main() { char text[100],voca[]={'a','e','i','o','u'}; //sirul voca[] se initializeaza cu vocale int i,j, cnt[]= { 0 , 0 , 0 , 0 , 0}; //contorizeaza aparitiile, este initial 0 cout<<"Introduceti un text:"<<endl; cin.get(text,100); strlwr(text); //transforma sirul numai in litere mici for(i=0;i<strlen(text);i++) for(j=0;j<5;j++) if (text[i]==voca[j]) cnt[j]++; for(i=0;i<5;i++) { cout<<voca[i]<<":"; for(j=0;j<cnt[i];j++) cout<<"*";

cout<<endl; } /*Se citeste un sir de caractere. Se cere sa se imparta in cuvinte, sa se retina cuvintele intr-un vector de cuvinte si sa se ordoneze crescator acest vector.*/ void main() { clrscr(); char x[300],sep[8]=",.; \n\t!?",a[20][15],*p; //maxim 20 de cuvinte de maxim 15 caractere char aux[20],y[20]; int n=0; gets(x); p=strtok(x,sep); while (p) { strcpy(a[n++],p); //pentru vectorul a primul indice retine numarul componentei p=strtok(NULL,sep); } cout<<"numarul de cuvinte:"<<n<<endl; cout<<"sirul de cuvinte initial: "; for(int i=0;i<n;i++) cout<<a[i]<<" "; for (i=0;i<n-1;i++) for(int j=i+1;j<n;j++) if (strcmp(a[i],a[j])>0) { strcpy(aux,a[i]); strcpy(a[i],a[j]); strcpy(a[j],aux); } cout<<"sirul de cuvinte final: "; for(int i=0;i<n;i++) cout<<a[i]<<" "; } /*Se citeste un sir de caractere dintr-un fisier text. Sa se elimine din sir spatiile. Cuvintele in fisierul initial sunt separate de , ;?!.\n\t*/ void main() {char a[300],*p; f=fopen("in.txt","r"); fgets(a,300,f); fclose(f); p=strchr(a,' '); while (p) { strcpy(p,p+1); p=strchr(a,' '); } cout<<a<<endl; } /*Se citeste un sir de caractere dintr-un fisier text. Sa se elimine din sir toate aparitiile unui subsir de caractere b. Cuvintele in fisierul initial sunt separate de , ;?!.\n\t*/ void main() { FILE *f; char a[300],b[300],*p; f=fopen("in.txt","r"); fgets(a,300,f); gets(b); fclose(f); p=strstr(a,b); while (p) { strcpy(p,p+strlen(b)); p=strstr(a,b); } cout<<a<<endl; } /*sa se listeze indicii aparitiilor unui caracter intrun sir de caractere*/ #include<stdio.h> #include<string.h> void main() {char *s="abcabcdsaba",c='a',*p; //s este initializat si se pastreaza in s adresa sirului }

p=strchr(s,c); //p retine adresa primei aparitii a lui c in s while (p) { printf("%d ",p-s); p=strchr(p+1,c); }

} /*sa se inlocuiasca toate aparitiile unui caracter intr-un sir cu alt caracter. Inlocuiesc a cu z*/ void main() { char *s="abcabcdsaba",c='a',*p; p=strchr(s,c); while (p) { *p='z';//la adresa p inserez caracterul z p=strchr(p+1,c); //reiau cautarea de la caracterul urmator } printf("%s",s); } /*sa se listeze indicii aparitiilor unui subsir intr-un sir (indicele primei litere din subsir)*/ void main() {char *s="abcabcdsaba",*c="ab",*p; p=strstr(s,c); while (p) { printf("%d ",p-s); p=strstr(p+strlen(c),c); //reincep cautarea de la sfarsitul subsirului } } /*sa se stearga aparitiile unui subsir intr-un sir*/ void main() {char *s="abcabcdsaba",*c="ab",*p; p=strstr(s,c); while (p) { strcpy(p,p+strlen(c)); p=strstr(p,c); } printf("%s",s); } /*Se citesc doua sirui de caractere. Sa se afiseze daca cele doua siruri sunt anagrame. Ex: armata tamara milenare minerale */ void main() {char x[50],y[50]; int nx,ny,i,k,j; printf("dati sirul 1 de caractere:"); gets(x); printf("dati sirul 2 de caractere:"); gets(y); printf("%s %s\n",x,y); nx=strlen(x); ny=strlen(y); if (nx!=ny) printf("nu sunt anagrame "); else {for (i=0;i<nx;i++) for (j=0;j<ny;j++) if (x[i]==y[j]) //gasesc doua caractere egale, il sterg din al doilea {for (k=j;k<ny-1;k++) x[k]=x[k+1]; ny--; } if (ny==0) printf("sunt anagrame"); else printf("nu sunt anagrame"); } /*Se citeste o linie de text si un cuvant. Sa se inlocuiasca primele k aparitii ale cuvantului cu un alt cuvant citit de la tastatura.*/ #include<iostream.h> #include<string.h> #include<stdio.h> void main() { char linie[100],cuv1[10],cuv2[10],*p,temp[100]; int k,i=0; cout<<"dati linia"; gets(linie); cout<<"dati primul cuv"; cin>>cuv1; cout<<"dati cuv2"; cin>>cuv2; cout<<"dati k"; cin>>k;

p=strstr(linie,cuv1); while (p && i<k) { strcpy(temp,p+strlen(cuv1)); strcpy(p,cuv2); strcat(linie,temp); i++; p=strstr(p+strlen(cuv2),cuv1); } cout<<"linia formata este "<<linie; } /*Se citeste un text terminat cu punct. Eliminati caracterele albe (spatii, Enter, Tab)*/ void elimin() {cout<<"dati textul:"; cin.get(a,200,'.'); for (i=0;i<strlen(a);i++) while (a[i]==' ' || a[i]=='\n' || a[i]=='\t') for (j=i; j<strlen(a); j++) a[j]=a[j+1]; cout<<"textul modificat:"<<a; } /*Se considera un sir de caractere. Se cere sa se scrie caracterele pe mai multe randuri de lungimefixa, citita. Nu se tine seama daca se strica cuvintele. Ultimul rand poate sa ramana necompletat in intregime. Ex x=mama merge la piata sa cumpere verdeata. l=8 mama mer ge la pi ata sa c umpere v erdeata. */ void main() { char x[50]; int n,i,l,j; printf("dati sirul de caractere:"); gets(x); printf("lungimea liniei: "); scanf("%d",&l); printf("%s\n",x); n=strlen(x); printf("sirul aliniat este:\n"); for(i=0;i<n;i++) { for(j=0;j<l;j++,i++) printf("%c",x[i]); printf("\n"); i--; //sa nu piarda caractere la trecere la linie noua } } /*Se considera un vector. Sa se stearga din el elementul de pe pozitia p.*/ void eliminare(int v[20],int &n,int p) { int i; for (i=p;i<n-1;i++) v[i]=v[i+1]; n--; } apel: printf("p=");scanf("%d",&p); eliminare(v,n,p); /*elimina dintr-un vector dublurile elementelor; se vor retine elementele distincte*/ void eliminare(int a[20], int &n) { int i,j,k; for (i=0;i<n-1;i++) { for (j=i+1;j<n;j++) if (a[i]==a[j]) { for (k=j+1;k<n;k++) a[k-1]=a[k]; n--; j--; //revine sa cerceteze pozitia j } } } /*elimina dintr-un vector elementele care apar de mai multe ori; se vor retine elementele unicat*/ void eliminare(int a[20], int &n) { int i,j,k,x,p; for (i=0;i<n;i++) { x=a[i]; p=0; for (j=0;j<n;j++) if (x==a[j]) p++;

if(p>1) //daca numarul aparitiilor este mai mare decat 1 for (j=0;j<n;j++) if (x==a[j]) { for (k=j+1;k<n;k++) a[k-1]=a[k]; n--; j--; } } } /*sa se elimine elementele pare dintr-un sir */ void eliminare(int a[], int &n) { for (int i=0;i<n;i++) while (a[i]%2==0) { for (int j=i;j<n-1;j++) a[j]=a[j+1]; n--; } } apel: eliminare(a,n); if (n!=0) afisare(a,n); else cout<<"nu mai are elemente"; /*Se considera un vector. Sa se adauge in el elementul x pe pozitia p.*/ void adaugare(int v[20],int &n,int p,int x) { int i; for (i=n;i>p;i--) v[i]=v[i-1]; n++; v[p]=x; } apel int p,x; printf("p=");scanf("%d",&p); printf("x=");scanf("%d",&x); adaugare(v,n,p,x); /*adauga un 0 intre oricare doua elemente dintrun vector*/ void adaugare(int v[20],int &n,int p) //adauga un element pe pozitia p { int i; for (i=n;i>p;i--) v[i]=v[i-1]; n++; v[p]=0; } void adaugare0(int v[20],int &n) //parcurge vectorul sa adauge cate un 0 { int i; for(i=1;i<n;i++) { adaugare(v,n,i); i++; //va trece peste 2 poz } } apel: adaugare0(v,n); /*se cauta recursiv toate aparitiile unei litere in text.*/ int aparitii(char x[], char c) {char *p=strchr(x,c); if (!p) return 0; else return 1+aparitii(p,c); } apel: char x[200],c; gets(x); cin>>c; cout<<"nr. de aparitii:"<<aparitii(x,c); /*diferenta a doua multimi reprezentate prin vectori A\B*/ void diferenta(int a[],int m,int b[],int n,int c[],int &p) {int i,j,sw; p=0; for (i=0;i<m;i++) { sw=0; for(j=0;j<n&&!sw;j++) if(a[i]==b[j]) sw=1; //am gasit elemente egale if (sw==0) c[p++]=a[i];

} } /*intersectia a doua multimi reprezentate prin vectori AB*/ void intersectia(int a[],int m,int b[],int n,int c[],int &p) {int i,j,sw; p=0; for (i=0;i<m;i++) { sw=0; for(j=0;j<n&&!sw;j++) if(a[i]==b[j]) sw=1; //am gasit elemente egale if (sw==1) c[p++]=a[i]; } } /*reuniunea a doua multimi reprezentate prin vectori AUB=(A\B)UB*/ void reuniunea(int a[],int m,int b[],int n,int c[],int &p) {int i,j,sw; p=0; for (i=0;i<m;i++) { sw=0; for(j=0;j<n&&!sw;j++) if(a[i]==b[j]) sw=1; //am gasit elemente egale if (sw==0) c[p++]=a[i]; for (i=0;i<n;i++) c[p++]=b[i]; } } /*produsul cartezian a doua multimi reprezentate prin vectori A\B*/ void produs(int a[],int m,int b[],int n) {if (!m || !n) cout<<nu se poate calcula ; else { for (i=0;i<m;i++) for(j=0;j<n;j++) cout<<(<<a[i]<<,<<b[j]<<),; } } /*generarea tuturor submultimilor unei multimi folosind vectori caracteristici*/ void afisare() { cout<<"{"; for (int i=1;i<=n;i++) if (v[i]==1) cout<<i<<","; cout<<"\b}"<<endl; } int suma() { int s=0; for(int i=1;i<=n;i++) s=s+v[i]; return s; } void generare() { int i; for(i=1;i<=n;i++) v[i]=0; cout<<""<<endl; do { v[n]++;//adun la ultimul element din vector o unitate //transport cifre spre stanga for (i=n;i>=2;i--) if (v[i]>1) { v[i]=0; v[i-1]++; } afisare(); }while (suma()<n); } /*sortarea vectorului crescatoare cu metoda bulelor*/ void ordonare(int a[], int n) {int sw; do{sw=0; for (int i=0;i<n-1;i++) if (a[i]>a[i+1]) {int aux=a[i]; a[i]=a[i+1]; a[i+1]=aux; sw=1;

} /*sortarea vectorului crescatoare cu metoda interschimbarii*/ void ordonare(int a[], int n) { for (int i=0;i<n-1;i++) for (int j=i+1;j<n;j++) if (a[i]>a[j]) {int aux=a[i]; a[i]=a[j]; a[j]=aux; } } /*sortarea vectorului crescatoare cu metoda insertiei */ void ordonare(int a[], int n) { int i,j,x,k,b[20]; for (k=0;k<n;k++) { x=a[k]; i=0; while (i<k && b[i]<=x) i++; for (j=k;j>i;j--) b[j]=b[j-1]; b[i]=x; } for (i=0;i<n;i++) a[i]=b[i]; } /*sortarea vectorului crescatoare cu metoda numararii*/ void ordonare (int a[], nt n) {for (i=0;i<n;i++) b[i]=0; for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) if (a[i]<a[j]) b[j]++; else b[i]++; for (i=0;i<n;i++) c[b[i]]=a[i]; } //se va afisa sirul c /*cautarea binara iterativ (numai in vector ordonat)*/ void cautare(int a[20], int n) { int x,mij,st=0,dr=n-1,sw=0; cout<<"elementul de cautat:";cin>>x; do { mij=(st+dr)/2; if (x==a[mij]) sw=1; else if (x<a[mij]) dr=mij-1; else st=mij+1; }while(st<=dr && sw==0); if (sw==1) cout<<"x este in sir pe pozitia "<<mij; else cout<<"x nu este in sir"; } /*cautarea binara recursiv(numai in vector ordonat)*/ void cautare(int a[20],int st, int dr,int x,int &sw) { int mij=(st+dr)/2; if (x==a[mij]) sw=1; else if (st<dr) if (x<a[mij]) cautare(a,st,mij-1,x,sw); else cautare(a,mij+1,dr,x,sw); } apel: int a[20],n,x,sw=0; cout<<"elementul de cautat:";cin>>x; cautare(a,0,n-1,x,sw); if (sw==1) cout<<"x este in sir"; else cout<<"x nu este in sir"; /*interclasarea a doi vectori a si b ordonati crescator in sirul c (care va fi tot crescator)*/ void interclasare(int a[20],int b[20],int m,int n,int c[20],int &p) { int i,j,k,l; i=0; j=0; k=0; while (i<m && j<n) //pana nu s-a terminat nici unul din vectori if (a[i]<b[j]) { c[k]=a[i]; //<=> c[k++]=a[i++];

} }while(sw);

k++; i++; } else { c[k]=b[j]; //<=> c[k++]=b[j++]; k++; j++; } //daca s-a terminat primul vector copiez elementele ramase din celalalt if (i<m) //mai sunt in primul sir for (l=i;l<m;l++) c[k++]=a[l]; else //mai sunt elemente in al doilea for (l=j;l<n;l++) c[k++]=b[l]; p=m+n; //p este dimensiunea sirului rezultat } apel: interclasare(a,b,m,n,c,p); /*afiseaza indicele liniei pe care suma elementelor este maxima */ void calcul() { int i,j,max,s,l; max=-32000; for (i=0;i<n;i++) { s=0; for (j=0;j<m;j++) s=s+a[i][j]; if (s>max) { max=s; l=i; } cout<<"s"<<i<<"="<<s<<endl; } cout<<"suma maxima apare pe linia "<<l; } /*adauga o linie k (care contine numere citite) la o matrice cu m linii si n coloane*/ void adaugarel(int a[20][20],int k,int &m,int n) { int i,j; for (i=m;i>k;i--) for (j=0;j<n;j++) a[i][j]=a[i-1][j]; m++; for (j=0;j<n;j++) { cout<<a[<<k<<][<<j<<}=; cin>>a[k][j]; } } apel: do{ cout<<"linia de adaugat k=";cin>>k; }while (k<0 || k>m-1); adaugarel(a,k,m,n); /*adauga o coloana c(care contine numere citite) la o matrice cu m linii si n coloane*/ void adaugarec(int a[20][20],int c,int m,int &n) { int i,j; for (i=0;i<m;i++) for (j=n;j>c;j--) a[i][j]=a[i][j-1]; n++; for (i=0;i<m;i++) { cout<<a[<<i<<][<<c<<}=; cin>>a[i][c]; } } apel: do{ cout<<"coloana de adaugat c=";cin>>c; }while (c<0 || c>m-1); adaugarec(a,c,m,n); /*elimina o linie l dintr-o matrice*/ void elim_l(int a[20][20],int &m,int n,int l) {int i,j; for(i=l+1;i<=m;i++) for(j=1;j<=n;j++) a[i-1][j]=a[i][j]; m--; } apel: elim_l(a,m,n,l); /*elimina o coloana c dintr-o matrice*/ void elim_c(int a[20][20],int m,int &n,int c) {int i,j; for(i=1;i<=m;i++) for(j=c+1;j<=n;j++) a[i][j-1]=a[i][j];

n--; } apel: elim_c(a,m,n,c); /*verifica daca o matrice are linii simetrice (palindroame) si daca da, afiseaza linia*/ void verific(int a[10][10],int m,int n) { int i,j,k=0; cout<<"liniile simetrice:\n"; for (i=0;i<m;i++) { int sw=1; //pp. ca este simetrica for (j=0;j<n/2;j++) if (a[i][j]!=a[i][n-1-j]) sw=0; if (sw==1) { k++; //e simetrica deci o numar for (j=0;j<n;j++) cout<<setw(4)<<a[i][j]; //afiseaza pe 4 caractere #include<iomanip.h> cout<<endl; } } if (k==0) cout<<"nu exista linii simetrice"; else cout<<"exista linii simetrice"; } /*se cere sa se faca produsul a doua matrice a(m,n) si b(n,p) intr-o matrice c(m,p)*/ void produs(int c[20][20], int a[20][20], int b[20][20], int m, int n, int p) { int i,j,k,l; for (i=0;i<m;i++) for (j=0;j<p;j++) { c[i][j]=0; for (k=0;k<n;k++) c[i][j]=c[i][j]+a[i][k]*b[k][j]; } } /*parcurgerea matricei in spirala (melcul)*/ for (k=0;k<=n/2;k++) { cout<<endl; for (i=k;i<=n-k-1;i++) cout<<a[k][i]<<" "; //prima linie for (i=k+1;i<=n-k-1;i++) cout<<a[i][n-k-1]<<" "; //ultima coloana for (i=n-k-2;i>=k;i--) cout<<a[n-k-1][i]<<" "; //ultima linie for (i=n-k-2;i>=k+1;i--) cout<<a[i][k]<<" "; //prima coloana } /*Se considera o matrice binara (are numai 0 si 1) cu m linii si n coloane. Se cere sa se transforme fiecare linie in numarul in baza 10 corespunzator. ex 0 1 1 1 => 7 1 0 1 0 => 10 1 1 1 0 => 14*/ void transform() {int i,j,nr; for (i=0;i<n;i++) { nr=0; //transformatul in baza 10 for (j=0;j<m;j++) nr=nr+a[i][j]*pow(2,m-1-j); cout<<"pe linia "<<i<<": "<<nr<<endl; } } /*Se citeste un numar natural n. Sa se genereze o matrice de forma ex n=5: 12345 //elemente simetrice fata de d.p. 22345 //aij=aji 33345 44445 5 5 5 5 5*/ void generare(int a[20][20],int &n) { int i,j; cout<<"n=";cin>>n; for (i=0;i<n;i++) for (j=0;j<=i;j++) { a[i][j]=i+1; a[j][i]=a[i][j]; //matricea este simetrica fata de diagonala principala

} } /*Se citeste un numar natural n. Sa se genereze o matrice de forma ex n=5: 12221 51213 55133 51413 1 4 4 4 1*/ void generare((int a[20][20],int &n) { int i,j; cout<<"n=";cin>>n; for (i=0;i<n;i++) for (j=0;j<n;j++) { if (i==j || i+j==n-1) a[i][j]=1; if (i<j && i+j<n-1) a[i][j]=2; if (i<j && i+j>n-1) a[i][j]=3; if (i>j && i+j>n-1) a[i][j]=4; if (i>j && i+j<n-1) a[i][j]=5; } } /*suma elementelor de pe diagonala principala*/ s=0; for (i=0;i<n;i++) s=s+a[i][i]; cout<<"suma de pe d.p.="<<s<<endl; /*suma elementelor de pe diagonala secundara*/ s=0; for (i=0;i<n;i++) s=s+a[i][n-i-1]; cout<<"suma de pe d.s.="<<s<<endl; /*suma elementelor de sub diagonala principala*/ s=0; for (i=1;i<n;i++) for (j=0;j<i;j++) s=s+a[i][j]; cout<<"suma de sub d.p.="<<s<<endl; /*suma elementelor de deasupra diagonalei principale*/ s=0; for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) s=s+a[i][j]; cout<<"suma de deasupra d.p.="<<s<<endl; /*suma elementelor de sub diagonala secundara*/ s=0; for (i=0;i<n;i++) for (j=0;j<n;j++) if (i+j>n-1) s=s+a[i][j]; cout<<"suma de sub d.s.="<<s<<endl; /*suma elementelor de deasupra diagonalei secundare*/ s=0; for (i=0;i<n;i++) for (j=0;j<n;j++) if (i+j<n-1) s=s+a[i][j]; cout<<"suma de deasupra d.s.="<<s<<endl; /*afiseaza elementele comune de pe cele doua diagonale ale unei matrice*/ void comune() { int p[20],s[20],i,j; for (i=0;i<n;i++) p[i]=a[i][i]; for (i=0;i<n;i++) s[i]=a[i][n-1-i]; cout<<"elementele comune diagonalelor: "; k=0; for (i=0;i<n;i++) for(j=0;j<n;j++) if (p[i]==s[j]) //fac intersectia a doua siruri { cout<<p[i]<<" "; k++; } if (k==0) cout<<"nu au elemente comune";

} /*permutari circulare la stanga in matrice: mut ultima coloana pe prima pozitie*/ void stanga(int a[20][20],int k,int m) //aduc ultimul pe prima pozitie (permutare circulara de vector) { int i,j,aux; aux=a[k][m-1]; for (j=m-1;j>0;j--) a[k][j]=a[k][j-1]; a[k][0]=aux; } void matrstanga() { int i,j; for (j=0;j<m;j++) { for (i=0;i<n;i++) stanga(a,i,m); //apelez afisare(); } } /*permutari circulare la dreapta in matrice: mut prima coloana pe ultima pozitie*/ void dreapta(int a[20][20],int k,int m) //aduc primul pe ultima pozitie (permutare circulara de vector) { int i,j,aux; aux=a[k][0]; for (j=0;j<m-1;j++) a[k][j]=a[k][j+1]; a[k][m-1]=aux; } void matrdreapta() { int i,j; for (j=0;j<m;j++) { for (i=0;i<n;i++) dreapta(a,i,m); afisare(); } } /* Se citesc informatii despre persoane: nume, prenume, varsta, stare, sex.Se cere sa se sorteze descrescator dupa varsta si crescator dupa nume si prenume (doua persoane care au aceeasi varsta se sorteaza dupa nume; daca au acelasi nume se sorteaza dupa prenume). */ struct persoana { char nume[20], prenume[20]; int varsta; char stare,sex; }x[20]; void citire(persoana x[20],int &n) {int i; cout<<"numarul de persoane analizate este:";cin>>n; for(i=0;i<n;i++) {cout<<"numele subiectului este:";cin>>x[i].nume; cout<<"prenumele subiectului este:";cin>>x[i].prenume; cout<<"varsta subiectului este:";cin>>x[i].varsta; cout<<"starea civila a subiectului este:";cin>>x[i].stare; cout<<"sexul subiectului este:";cin>>x[i].sex; } } void afisare(persoana x[20],int n) {int i; for(i=0;i<n;i++) cout<<x[i].nume<<" "<<x[i].prenume<<" "<<x[i].varsta<<" "<<x[i].stare<<" "<<x[i].sex<<endl; } void sortare(persoana x[20],int n) { int i,j; persoana aux; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) { if (x[i].varsta<x[j].varsta) {

aux=x[i]; x[i]=x[j]; x[j]=aux; } if (x[i].varsta==x[j].varsta) if (strcmp(x[i].nume,x[j].nume)>0) { aux=x[i]; x[i]=x[j]; x[j]=aux; } else if (strcmp(x[i].nume,x[j].nume)==0) if(strcmp(x[i].prenume,x[j].prenume)>0) { aux=x[i]; x[i]=x[j]; x[j]=aux; } } } /*In fisierul NUMERE.IN se afla numere naturale de maxim 10 cifre, separate prin spatiu. Sa se construiasca fisierul NUMERE.OUT care contine: - pe prima linie numarul de numere din fisierul initial - pe a doua linie numarul de numere care au exact trei cifre - pe a treia linie cel mai mare numar din fisierul NUMERE.IN */ #include<iostream.h> #include<conio.h> #include<stdio.h> void main() {FILE *f,*g; int k=0,k3=0; unsigned long x,max=0; f=fopen("numere.in","r"); while(!feof(f)) {fscanf(f,"%lu",&x); k++; if(x>max) max=x; if(x>=100&&x<=999) k3++; } fclose(f); g=fopen("numere.out","w"); fprintf(g,"%d\n%d\n%lu",k,k3,max); fclose(g); } /*Numarati liniile dintr-un fisier text. Afisati pe ecran linia cea mai lunga. */ #include<stdio.h> #include<iostream.h> #include<string.h> void main() { FILE *f1; f1=fopen("c:\\a\\f1.txt","r"); char x[200]; int max=0; while (!feof(f1)) { fgets(x,200,f1); //citesc o linie if (max<strlen(x)) max=strlen(x); } fclose(f1); f1=fopen("c:\\a\\f1.txt","r"); while (!feof(f1)) { fgets(x,200,f1); //citesc o linie if (max==strlen(x)) puts(x); } fclose(f1); } /*Se citeste un sir de caractere dintr-un fisier text. Sa se afiseze pe cate o linie in alt fsier cuvintele din primul text. Cuvintele in fisierul initial sunt separate de , ;?!.\n\t */

10

#include<iostream.h> #include<stdio.h> #include<string.h> void main() { FILE *f,*g; char lin[300],*p; f=fopen("in.txt","r"); g=fopen("ies.txt","w"); while (!feof(f)) { fgets(lin,300,f); p=strtok(lin,",. ;!?\n\t"); while (p) { fputs(p,g); fputs("\n",g); p=strtok(NULL,",. ;!?\n\t"); } } fclose(f); fclose(g); } /*Se dau doua fisiere ordonate alfabetic. Sa se interclaseze in al treilea tot alfabetic.*/ #include<iostream.h> #include<conio.h> #include<stdio.h> #include<string.h> void main() { FILE *f,*g,*h; char x[200],y[200]; f=fopen("fis1.txt","r"); g=fopen("fis2.txt","r"); h=fopen("fis3.txt","w"); fgets(x,200,f); fgets(y,200,g); while (!feof(f) && !feof(g)) { if (strcmp(x,y)<0) { fputs(x,h); fgets(x,200,f); } else { fputs(y,h); fgets(y,200,g); } } if (feof(f)) while (!feof(g)) { fputs(y,h); fgets(y,200,g); } if (feof(g)) while (!feof(f)) { fputs(x,h); fgets(x,200,f); } fcloseall(); getch(); } /*generarea iterativa a tuturor permutarilor multimii A={1,2,,n}*/ int st[20],n,k,nrsol=0; void afisare() { nrsol++; for (int i=1;i<=k;i++) cout<<st[i]<<" "; cout<<endl; } void init() {st[k]=0;} int succesor() {if (st[k]<n) { st[k]++; return 1; } return 0; } int valid() { for (int i=1;i<k;i++)

} int solutie() {return (k==n);} void back() { k=1; init(); while (k>0) { do{as=succesor(); if (as) ev=valid(); }while (as && !ev); if (as) if (solutie()) afisare(); else { k++; init (); } else k--; } } void main() { clrscr(); cout<<"n="; cin>>n; back(); cout<<"numarul de solutii:"<<nrsol; getch(); } /*generarea recursiva a tuturor permutarilor multimii A={1,2,,n}*/ int st[20],n,nrsol=0; void afisare(int k) { nrsol++; for (int i=1;i<=k;i++) cout<<st[i]<<" "; cout<<endl; } int valid(int k) { for (int i=1;i<k;i++) if (st[k]==st[i]) return 0; return 1; } void back(int k) { for (int i=1;i<=n;i++) { st[k]=i; if (valid(k)) if (k==n) afisare(k); else back(k+1); } } void main() { clrscr(); cout<<"n="; cin>>n; back(1); cout<<"numarul de solutii:"<<nrsol; getch(); } /*generarea aranjamentelor de n elemente luate cate m din multimea A={1,2,,n}*/ programul de la permutari dar solutie este cand k=m /*generarea aranjamentelor de n elemente luate cate m din multimea A={1,2,,n}*/ programul de la permutari dar solutie este cand k=m si validul se modifica: int valid(int k) { if (k>1 && st[k]<=st[k-1]) return 0; return 1; } /*generarea tuturor functiilor de la multimea A={1,2,,n} cu valori in aceeasi multime, folosind backtracking (produs cartezian)*/ #include<iostream.h> #include<conio.h> int st[20],n; void afisare(int k) { for (int i=1;i<=k;i++) cout<<i<<" "; cout<<endl; for (i=1;i<=k;i++) cout<<st[i]<<" ";

if (st[k]==st[i]) return 0; return 1;

11

cout<<endl<<endl; } void back(int k) { for (int i=1;i<=n;i++) { st[k]=i; if (k==n) afisare(k); //nu este nevoie de valid, orice valori sunt bine puse else back(k+1); } } void main() { clrscr(); cin>>n; back(1); getch(); } /*crearea listei simplu inlantuite prin adaugare in fata (la fel la stiva)*/ void creare(nod *&prim,int x) { if (!prim) { prim=new nod; prim->info=x; prim->urm=NULL; } else { q=new nod; q->info=x; q->urm=prim; prim=q; } } /*crearea listei simplu inlantuite prin adaugare in spate (la fel la coada)*/ void creare(nod *&prim,int x) { if (!prim) { prim=new nod; prim->info=x; prim->urm=NULL; } else { q=new nod; cout<<"info=";cin>>q->info; q->urm=NULL; ultim->urm=q; ultim=q; } } /*crearea listei simplu inlantuite direct ordonate*/ void adaugare(nod *&prim,nod *&ultim, int x) { nod *p,*q; if (prim==NULL) //creezi primul nod { prim=new nod; prim->info=x; prim->urm=NULL; ultim=prim; } else if (x<prim->info) //adaugare in fata { p=new nod; p->info=x; p->urm=prim; prim=p; } else //trebuie sa adaug undeva in interirorul listei { p=prim; while (p->urm->info<x && p->urm!=NULL) p=p->urm; //fac inserare dupa nodul p q=new nod; q->info=x; q->urm=p->urm; p->urm=q; if (p==ultim) //daca p era ultimul nod ultim=q;

} } /*afisarea normala a listei simplu inlantuite*/ void afisare(nod *prim) { nod *p; if (prim==NULL) cout<<"vida"; else { p=prim; while (p) { cout<<p->info<<" "; p=p->urm; } } } /*afisarea invers a listei simplu inlantuite (recusiv)*/ void afisare(nod *p) { if (p!=NULL) { afisare(p->urm); cout<<p->info<<" "; } } apel: if (!prim) cout<<lista vida; else { cout<<lista este; afisare(prim); } /*inserarea unui nod in dupa un nod indicat*/ void inserare_noddupa() { int y; cout<<"dati nodul dupa care vreti sa inserati: ";cin>>y; r=prim; while(r&&r->info!=y) r=r->urm; if(r==NULL) cout<<"nodul nu e in lista"; else { q=new nod; cout<<"info= ";cin>>q->info; q->urm=r->urm; r->urm=q; } } /*inserarea unui nod in fata unui nod indicat*/ void inserare_nodfata() { int y; cout<<"dati nodul in fata caruia inserati: ";cin>>y; r=prim; while(r&&r->info!=y) r=r->urm; if(r==NULL) cout<<"nodul nu e in lista"; else { q=new nod; *q=*r; r->urm=q; cout<<"info= ";cin>>r->info; } } /*stergerea unui nod indicat*/ void sterge_nod() { int x; cout<<"nodul de sters: ";cin>>x; r=prim; while(r&&r->info!=x) r=r->urm; if(r==NULL) cout<<"nodul nu e in lista"; if (r==prim) { q=prim; prim=prim->urm; delete q; } else if (r==ultim) { q=prim; while(q->urm->urm!=NULL) q=q->urm; r=q->urm; q->urm=NULL;

12

ultim=q; delete r; } else { q=r->urm; *r=*q; delete q; } } /*crearea listei circulare*/ void adaugare(nod *&prim,int nr) { if (prim==NULL) //creez primul nod si adaug dupa primul { prim=new nod; prim->info=nr; prim->urm=prim; //se indica pe el insusi } else //adaug dupa primul nod si zic ca noul nod este primul { nod *p=new nod; p->info=nr; p->urm=prim->urm; prim->urm=p; prim=p; } } /*afisarea normala a listei circulare*/ void afisare(nod *prim) { nod *p; if(prim==NULL) cout<<"lista vida"; else { cout<<"lista este:"; p=prim; do{ cout<<p->info<<" "; p=p->urm; }while (p!=prim); } } /*afisarea invers a listei circulare (recusiv)*/ void afisare(nod *p,nod *prim) { if (p->urm!=prim) { afisare(p->urm,prim); cout<<p->info<<" "; } else cout<<p->info<<" "; } apel: if(prim==NULL) cout<<"lista vida"; else { cout<<"lista este:"; afisare(prim,prim); } /*intersectia a doua liste*/ void intersectie(nod *&p3,nod *&u3) { nod *q1,*q2; p3=NULL; q1=p1; while(q1) { q2=p2; int sw=0; while(q2&&!sw) { if (q1->info==q2->info) sw=1; q2=q2->urm; } if (sw==1) adaugare_s(p3,u3,q1->info); //adaugare in spate q1=q1->urm; } } /*diferenta a doua liste*/ void diferenta(nod *&p4,nod *&u4) { nod *q1,*q2; p4=NULL; q1=p1; while(q1) { q2=p2; int sw=0; while(q2&&!sw) { if (q1->info==q2->info) sw=1; q2=q2->urm;

} if (sw==0) adaugare_s (p4,u4,q1->info); q1=q1->urm; } } /*reuniunea a doua liste*/ void reuniune(nod *&p5, nod *&u5) { nod *q1,*q2; p5=p4; q1=p5; //pun elementele din A-B while(q1->urm) q1=q1->urm; q1->urm=p2; q2=p2; //pun elementele din B while(q2) { adaugare_s (p5,u5,q2->info); q2=q2->urm; } } /*produsul cartezian a doua liste*/ void produs_cartezian() { nod *q1,*q2; if (!p1||!p2) cout<<"\nprodusul cartezian nu se poate calcula"; else { cout<<"\nprodusul cartezian:"; q1=p1; while(q1) { q2=p2; while(q2) { cout<<"("<<q1->info<<","<<q2->info<<") "; q2=q2->urm; } q1=q1->urm; } } } /*adaugare in fata in lista dublu inlantuita*/ void adaugare_f(nod *&prim,nod *&ultim,int nr) { nod *p; p=new nod; p->info=nr; p->urm=prim; p->prec=NULL; prim->prec=p; prim=p; if(ultim==NULL) ultim=prim; } /*adaugare in spate in lista dublu inlantuita*/ void adaugare_s(nod *&prim,nod *&ultim,int nr) { nod *p; if(!prim) { prim=new nod; prim->info=nr; prim->prec=prim->urm=NULL; ultim=prim; } else { p=new nod; p->info=nr; p->prec=ultim; p->urm=NULL; ultim->urm=p; ultim=p; } } /*cautarea unui nod in lista*/ nod *cautare(nod *prim,int nr) { nod *p; p=prim; do{ if(p->info==nr) return p; p=p->urm; }while(p!=NULL); return NULL; } apel: if (cautare(prim,nr)==NULL) cout<<nu exista; else cout<<nodul cautat:<<; /*inserare inaintea nodlui indicat in dublu inl. */

13

void inserare_inainte(nod *&prim,nod *&ultim) { int nr,x; nod *p,*q; cout<<"Nodul de inserat: ";cin>>x; cout<<"Nodul in fata caruia inserez: ";cin>>nr; p=cautare(prim,nr); if (p==prim) adaugare_f(prim,ultim,x); else { q=new nod; q->info=x; q->urm=p; q->prec=p->prec; p->prec->urm=q; p->prec=q; } } /*inserare dupa nod indicat in dublu inlantuita*/ void inserare_dupa(nod *&prim,nod *&ultim) { int nr,x; nod *p,*q; cout<<"Nodul de inserat: ";cin>>x; cout<<"Nodul dupa care inserez: ";cin>>nr; p=cautare(prim,nr); if (p==ultim) adaugare_s(prim,ultim,x); else { q=new nod; q->info=x; q->urm=p->urm; q->prec=p; p->urm->prec=q; p->urm=q; } } /*stergerea unui nod in lista dublu inlantuita*/ void sterg_nod(nod *&prim,nod *&ultim) { int nr; nod *p; if(prim==NULL) cout<<"Lista vida"; else { cout<<"Nodul de sters: ";cin>>nr; p=cautare(prim,nr); if(p==prim && prim==ultim) { prim=ultim=NULL; delete p; } else { if (p!=prim) p->prec->urm=p->urm; else { prim=prim->urm; prim->prec=NULL; } if (p!=ultim) p->urm->prec=p->prec; else { ultim=ultim->prec; ultim->urm=NULL; } delete p; } } } /*Se citeste dintr-un fisier text o scrisoare, care poate sa contina semnele de punctuatie ",;. ?!". Impartiti textul in cuvinte si puneti in lista cuvintele alfabetic si retineti pentru fiecare si frecventa intr-o lista dublu inlantuita ordonata alfabetic. Lista se creeaza direct ordonata. Daca nu mai este in lista se insereaza si frecventa devine 1. Daca acel cuvant mai exista in lista se mareste frecventa cu o unitate. */ #include<iostream.h> #include<conio.h> #include<stdio.h> #include<string.h> struct nod { char info[20]; int fr; nod *urm,*prec;

}; void afisare(nod *prim); void creare(nod *&prim,nod *&ultim,char a[20]); void main() { char x[300],sep[8]=",;. ?!\n\\",*a; FILE *f; nod *prim=NULL,*ultim=NULL; f=fopen("pr1.txt","r"); while(!feof(f)) { fgets(x,300,f); a=strtok(x,sep); while (a) { int sw=0; nod *p=prim; while (p) if (strcmp(p->info,a)==0) {sw=1; break;} else p=p->urm; if (sw==0) creare(prim,ultim,a); else p->fr++; a=strtok(NULL,sep); } } fclose(f); afisare(prim); getch(); } void creare(nod *&prim,nod *&ultim,char a[20]) { nod *p,*q; if(prim==NULL) //daca lista este vida { prim=new nod; prim->urm=NULL; prim->prec=NULL; strcpy(prim->info,a); prim->fr=1; ultim=prim; } else if(strcmp(prim->info,a)>0) //daca noul uvant este mai mic ca primul { p=new nod; strcpy(p->info,a); p->fr=1; p->urm=prim; p->prec=NULL; prim->prec=p; prim=p; } else if(strcmp(ultim->info,a)<0) //daca noul cuvant este mai mare ca ultimul { p=new nod; strcpy(p->info,a); p->fr=1; ultim->urm=p; p->prec=ultim; p->urm=NULL; ultim=p; } else { q=prim; //daca trebuie sa insereze undeva in interiorul sirului while(strcmp(q->urm->info,a)<0 && q->urm! =NULL) q=q->urm; p=new nod; strcpy(p->info,a); p->fr=1; p->prec=q; p->urm=q->urm; q->urm->prec=p; q->urm=p; } }

14

void afisare(nod *prim) { nod *p; if(prim==NULL) cout<<"lista e vida"; else { p=prim; while(p) { cout<<p->info<<" "<<p->fr<<" "; p=p->urm; } } } /*Greedy: Se dau doua siruri de numere intregi nenule a=(a1,a2,...,am) si b=(b1,b2,...,bn) cu m<=n. Se cere sa se maximizeze expresia E=a1*x1+a2*x2+...+am*xm, alegand pentru x1, x2,..., xm valori convenabile aflate pe pozitii diferite in sirul b. */ #include<iostream.h> int a[10],m,b[10],n,s; void citire(int x[],int &dim) {cout<<"dim=";cin>>dim; for(int i=0;i<dim;i++) { cout<<"x["<<i<<"]="; cin>>x[i]; } } void sortare(int x[],int dim) {for(int i=0;i<dim-1;i++) for(int j=i+1;j<dim;j++) if (x[i]>x[j]) { int aux=x[i]; x[i]=x[j]; x[j]=aux; } } void suma() { int i,k,emax; k=0; //numara cate negative am i=0; while (a[i]<0) { k++; i++; } emax=0; for (i=0;i<k;i++) { emax=emax+a[i]*b[i]; cout<<a[i]<<"*"<<b[i]<<"+"; } if (k<n) for(i=k;i<m;i++) { emax=emax+a[i]*b[n-m+i]; cout<<a[i]<<"*"<<b[n-m+i]<<"+"; } cout<<"\bEmax="<<emax; } void main() { clrscr(); citire(a,m); sortare(a,m); citire(b,n); sortare(b,n); suma(); getch(); } /*Greedy: Se da o suma de bani S si n tipuri de monede. Se cere sa se scrie suma cu numar minim de monede, din cele date (se pp. ca avem suficienete monede de orice tip). Se pp.ca avem monede de 1 leu. !!! Se cere o singura solutie.*/ #include<conio.h> #include<iostream.h> int a[10],n,s; void citire() {cout<<"suma ceruta s=";cin>>s; cout<<"n=";cin>>n; for(int i=0;i<n;i++) { cout<<"a["<<i<<"]="; cin>>a[i]; } }

void sortare() { //sortez monedele descrescator dupa valoare } void plata() { int i,k; for(i=0;i<n;i++) //iau monedele in ordinea descrescatoare { k=0; //numara cate monede de un tip am gasit while (s>=a[i]) { s=s-a[i]; k++; } if (k!=0) cout<<k<<" monede de "<<a[i]<<" lei\n"; } } void main() { citire(); sortare(); plata(); } /*Greedy: N obiecte se pun la dispozitia unei persoane spre a fi transportatate cu un rucsac in care incape o greutate maxima G. Fiecare obiect K are greutatea gk si prin transportul sau se realizeaza un profit pk. Se cere sa se incarce rucsacul astfel incat la destinatie persoana sa obtina profitul maxim. Presupunem ca se pot transporta si fractiuni de obiecte. */ #include<iostream.h> struct obiect { int c,g,ord; //ord retine indicele obiectului float ef; }; obiect x[10]; int gmax,n,i; float castig=0; void citire() {cout<<"dim=";cin>>n; for(int i=0;i<n;i++) { cout<<"cost="; cin>>x[i].c; cout<<"greutate="; cin>>x[i].g; x[i].ef=(float)x[i].c/x[i].g; x[i].ord=i+1; } } void sortare() { obiect aux; for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) if (x[i].ef<x[j].ef) { aux=x[i]; x[i]=x[j]; x[j]=aux;} } void greedy() { int i=0; while(i<n && gmax>0) { if (gmax>=x[i].g) //incape intreg { castig=castig+x[i].c; gmax=gmax-x[i].g; cout<<"obiectul "<<x[i].ord<<" incape intreg\n"; } else //nu incape intreg { castig=castig+((float)gmax/x[i].g)*x[i].c; cout<<"obiectul "<<x[i].ord<<" incape "<<gmax<<"/"<<x[i].g; gmax=0; } i++; } cout<<"\ncastigul total:"<<castig; } void main() {citire(); cout<<"greutatea de transportat: G "; cin>>gmax; sortare(); greedy(); }

15

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