CODE
Revista informatica
Probleme rezolvate.Tablouri bidimensionale.Siruri de caractere
Aceasta este o matrice cu 6 linii si 6 coloane. Acest tip de matrice, in care numarul de linii este egal cu numarul de coloane se numeste matrice patratica, iar in C++ are anumite proprietati ajutatoare.
Matricea se declara folosind comanda: tip [numar max. de linii] [numar max. de coloane];. Exemplu: int x[10][5]. Se declara o matrice de tip int cu maxim 10 linii si 5 coloane. Trebuie sa ii atribuim elemente fiecarui spatiu liber. Atribuirea se face aproximativ ca la vectori, doar ca aici exista doua repetitii, deoarece fiecarei linii ii corespunde n-1 coloane, etc, si este necesara o variabila i, ce va reprezenta linia, si una j, ce va reprezenta coloana. Se vor folosi inca 2 variabile, n si m, care vor reprezenta numarul actual de linii, respectiv coloane
2|Page
Iata matricea de mai sus, careia i-am atribuit cateva numere alese aleator:
3|Page
Citire .Afisare
#include <iostream.h> void main () { int x[10][10], n, m, i, j; //m=matricea, n, m= nr actual de linii/coloane, i, j=linia, respectiv coloana cout<<Dati numarul de linii: ; cin>>n; //citim nr de linii cout<<Dati numarul de coloane: ; cin>>m; //citim nr. de coloane cout<<Introduceti elementele matricei: <<endl; for (i=0; i<n; i++) for (j=0; j<m; j++) { cout<<x*"<<i<<"+*"<<j<<"+=; cin>>x[i][j]; //citim elementele matricei } cout<<Afisam matricea: <<endl; for (i=0; i<n; i++) for (j=0; j<m; j++) ,cout<<x*i+*j+<< ; //si afisam fiecare linie, respectiv coloana, dar cu un mic spatiu intre elemente cout<<endl; //dupa fiecare linie terminata, trebuie sa trecem la alt rand }}
4|Page
5|Page
Matrice patratica
ntr-o matrice ptratic numarul de linii= numarul de coloane (n=m). ntr-o matrice ptratic avem: Diagonala principala elementele a[i][i], cu i=1,n sau a[i][i], cu i=0,n-1
6|Page
Un element din matrice, n funcie de poziia sa, are 3, 5 sau 8 vecini. Pentru a nu verifica poziia elementului, se bordeaz matricea (cu o valoare dependent de problema care se rezolv, se adaug o linie sus, o linie jos, o coloan la stnga, o coloan la dreapta), astfel toate elementele vor avea 8 vecini. Deplasarea se va face cu ajutorul a doi vectori care indic poziia relativ a unui vecin fa de elementul a*i+*j+. int dx[8]={-1,-1,0,1,1,1,0,-1}; int dy[8]={0,1, 1,1,0,-1,-1,-1}; int k; //afisam vecinii for (k=0; k<8; k++) cout<<a*i+dx*k++*y+dy*k++<<\n; Observaie: n unele probleme ne putem deplasa numai pe linie i pe coloan, vom avea in acest caz numai 4 vecini (N, E, S, V)
* In practica apar cazuri in care matricele au anumite caracteristici care permit o stocare mai eficienta decat cea standard.Un astfel de exemplu este reprezentat de matricea simetrica. Matricele simetrice sunt matrice patratice in care corespondentele de sub si de peste diagonala principala sunt egale (adica m[i][j] = m[j][i]pentru oricare i si j).
7|Page
8|Page
// ==== produsul elementelor de pe diagonal secundara ====== produs=1;for(i=1;i<=n;i++) for(j=1;i<=n;i++) if(i+j==n+1) produs*=a[i][j]; cout<<"Produsul elementelor de pe diagonal secundara este "<<produs<<endl; // ==== minimul elementelor de deasupra diagonalei principale == min1=32768; for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(i<j) if(min1>a[i][j]) min1=a[i][j]; cout<<"Minimul de deasupra diag. pricipale este "<<min1; // ===== minimul elementelor de sub diagonal principale ==== min2=32768; for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(i>j) if(min2>a[i][j]) min2=a[i][j]; cout<<"Minimul de sub diag. pricipala este "<<min2; // == maximul elementelor de deasupra diagonalei principale ==== max1=-32768; for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(max1<a[i][j]) max1=a[i][j]; cout<<"Maximul de deasupra diag. pricipale este "<<max1; // ==== maximul elementelor de sub diagonal principale ==== max2=-32768; for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(max2<a[i][j]) max2=a[i][j]; cout<<"Minimul de sub diag. principala este "<<max2;}
9|Page
.Se considera o matrice A n*m cu elemente numere intregi. Sa se determine linia (liniile) din matrice care contine cele mai multe elemente nenule. #include<iostream.h> void main(void) {int a[30][30],n,m,i,j,max,nr; 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<<endl<<"Matricea A are elementele:"<<endl; for(i=1;i<=n;i++) {for(j=1;j<=m;j++) cout<<a[i][j]<<" "; cout<<endl; } max=0; for(i=1;i<=n;i++) {nr=0; for(j=1;j<=m;j++) if(a[i][j]!=0) nr++; if(max<nr) max=nr; } for(i=1;i<=n;i++) {nr=0; for(j=1;j<=m;j++) if(a[i][j]!=0) nr++; if(max==nr) cout<<"Linia "<<i<<" are "<<max<<" elemente nenule"<<endl; }}
10 | P a g e
Se consider dou tablouri bidimensionale (matrici) A i B cu n*m, respectiv m*p numere ntregi. Se cere s se calculeze matricea produs: C = A * B. #include<iostream.h> int main(void) { int a[10][10], b[10][10], c[10][10]; int n, m, i, j, k, p; cout<<"Dati dimensiunile matricei A "<<endl; 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++) 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 dimensiunile matricei B " <<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++) 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]<<" "; for(j=1; j<=p; j++) for(k=1; k<=m; k++) c[i][j] = c[i][j] + a[i][k] * b[k][j]; } cout<<endl; }
cout<<"Elementele matricei produs C sunt : <<endl; for(i=1; i<=n; i++) { 11 | P a g e for(j=1; j<=p; j++) cout<<c[i][j]<<" "; cout<<endl;}}
SIRURI DE CARACTERE
Declarare:
char sir[dim]; sau char *sir;
Citire:
cin>>sir; (daca nu sunt spatii) cin.get(sir,dim); (daca are spatii)
Afisare:
cout<<sir;
Prelucrare caractere:
for(i=0;i<strlen(s);i++) //prel s[i]
Observatii:
litera+32=LITERA cifra=cifra-48 a are codul 97 A are codul 65 0 are codul 48
3 4
strncat(s1,s2,nr); strupr(s);
Adauga la sfarsitul lui s1 sirul s2 Adauga la sfarsitul lui s1 primele nr caractere din s2 Transforma litere mici ale lui s in litere mari, restul
12 | P a g e
Nr. Crt.
Numele functiei
Rolul functiei caracterelor ramanand neschimbate Transforma litere mari in litere mici restul caracterelor ramanand neschimbate Compara s1 cu s2 din punct de vedere alfabetic. Rezultatul comparrii este : >0 daca s1>s2; =0 daca s1=s2; <0 daca s1<s2 Compara s1 cu s2 fara a face distinctie intre litere mari si mici Inverseaza sirul s Determina adresa primei aparitii a caracterului c in sirul s. Daca nu se afla c in s atunci rezultatul este 0 (pointerul NULL) Determina adresa ultimei aparitii a caracterului c in sirul s. Daca nu se afla c in s atunci rezultatul este 0 (pointerul NULL) Determina adresa de inceput a primei aparitii a sirului s2 in sirul s1. Daca nu se afla s2 in s1 atunci rezultatul este 0 (pointerul NULL) Determina adresa de inceput a ultimei aparitii a sirului s2 in sirul s1. Daca nu se afla s2 in s1 atunci rezultatul este 0 (pointerul NULL)
Exemplu
strlwr(s);
strcmp(s1,s2);
Strcmp(nicu,Nicu)=0
6 7
stricmp(s1,s2); strrev(s);
strchr(s,c);
strrchr(s,c);
char s[]=acasa; strrev(s); s=asaca Char s[]=abracadabra, c=b,s1[]=br; Cout<<strchr(s,c); bracadabra Cout<<strrchr(s,c); bra Cout<<strstr(s,s1); bracadabra Cout<<strrstr(s,s1); bra Cout<<strchr(s,x);0 Obs: verificarea daca un character c este vocala: if(strchr(aeiouAEIOU,c)!=0) .. obs: afisarea pozitiei pe care se afla un character intr-un sir : cout<<strchr(s,c)-s; (analog la restul functiilor de cautare)
10
strstr(s1,s2);
11
strrstr(s1,s2);
Inlocuieste separatorul prin caracterul nul si furnizeaza ca rezultat un pointer catre primul caracter al primei strtok(s1,s2); 12 entitati (extrage cuvinte dintr-un text, in care cuvintele sunt separate prin caractere din s2, cu rol de separatori) b. incluse in <stdlib.h> (functii de conversie) Nr. Crt. Numele functiei Rolul functiei
Exemplu
13 | P a g e
Nr. Crt. 13
Rolul functiei Converteste sirul s intr-o variabila de tip int. Daca sirul contine si alfel de caractere decat cifre, rezultatul conversiei e 0 (conversia esueaza) Converteste sirul s intr-o variabila de tip float. Daca sirul contine si alfel de caractere decat cifre, rezultatul conversiei e 0 (conversia esueaza) Converteste sirul s intr-o variabila de tip long. Daca sirul contine si alfel de caractere decat cifre, rezultatul conversiei e 0 (conversia esueaza) Converteste sirul s intr-o variabila de tip long double. Daca sirul contine si alfel de caractere decat cifre, rezultatul conversiei e 0 (conversia esueaza) Converteste un numar nr de tip int scris in baza baza intr-un sir de caractere (baza e de obicei 10) Converteste un numar nr de tip long scris in baza baza intr-un sir de caractere (baza e de obicei 10) Converteste un numar nr de tip unsigned long scris in baza baza intr-un sir de caractere (baza e de obicei 10)
Exemplu x=atoi(123); x=123 x=atoi(1a23); x=0 x=atof(123.45); x=123.45 x=atoi(1a23.cd); x=0 x=atol(123456789); x=123456789 x=atol(1a23575986); x=0 x=atof(123.45); x=123.45 x=atoi(1a23.cd); x=0 itoa(123,s,10); s= 123
14
x=atof(s)
15
x=atol(s)
16
x=atold(s)
17
18
19
14 | P a g e
15 | P a g e
Se citete un cuvnt. S se afieze cuvintele obinute din cuvntul dat prin eliminarea succesiv a primei i ultimei litere. #include<iostream> using namespace std; int main() {int i=0,j=0; char *p,a[256],v[100]="aeiouAEIOU",aux; cin.get(a,100); while(strlen(a)>2) { p=a; strcpy(p,p+1); a[strlen(a)-1]=NULL; cout<<a<<endl; }} .Se citesc doua siruri de la tastatura. Sa se scrie un program care sa afiseze toate literele mici care apar in ambele siruri o singura data. #include<iostream> using namespace std; int main() {int i,k=0; char a[100],b[100],aux[100]={0}; cin>>a; cin>>b; for(i=0;i<strlen(a);i++) if(islower(a[i])) if(strchr(aux,a[i])==0) if(strchr(b,a[i])) {aux[k]=a[i];k++;} aux[k]=0; cout<<aux; }
16 | P a g e
. Se citeste un sir de caracterece nu contine caractere albe. Sa se elimine vocalele din sir. #include<iostream.h> #include<string.h> void main() { char s[20],vocale[]="aeiouAEIOU"; int gasit=1; cin>>s; int i; while(gasit) for(i=0;i<strlen(s);i++) { gasit=0; if (strchr(vocale,s[i])!=0) {strcpy(s+i,s+i+1); gasit=1;} }cout<<s;}
17 | P a g e
Se citesc n cuvinte.Sa se sorteze alfabetic #include<iostream.h> #include<string.h> void main() { char cuvinte[10][25],aux[25]; int n,i,gasit; cout<<"n=";cin>>n; for(i=0;i<n;i++) {cout<<"cuvant:";cin>>cuvinte[i];} do { gasit=0; for(i=0;i<n-1;i++) if(strcmp(cuvinte[i],cuvinte[i+1])>0) { strcpy(aux,cuvinte[i]); strcpy(cuvinte[i],cuvinte[i+1]); strcpy(cuvinte[i+1],aux); gasit=1; } }while(gasit); for(i=0;i<n;i++) cout<<cuvinte[i]<<" ";}
18 | P a g e
Cuprins
Tablouri bidimensionale (Matrici) ...................................................................................................... 2 Atribuirea in C++ ...................................................................................................................................... 3 Citire .Afisare............................................................................................................................................. 4 Interschimbarea a doua linii de indici x si y .............................................................................................. 5 Interschimbarea a doua coloane de indici x si y ....................................................................................... 5 Matrice patratica ................................................................................................................................... 6 Zonele determinate de diagonale: ............................................................................................................ 6 Vecinii unui element din matrice .............................................................................................................. 7 Probleme rezolvate tablouri bidimensionale............................................................................................ 8 SIRURI DE CARACTERE...................................................................................................................... 12 Declarare: ................................................................................................................................................ 12 Citire: ....................................................................................................................................................... 12 Afisare: .................................................................................................................................................... 12 Prelucrare caractere: .............................................................................................................................. 12 Observatii ................................................................................................................................................ 12 Functii de prelucrare a sirurilor de caractere ......................................................................................... 12 Probleme rezolvate siruri de caractere................................................................................................... 15
19 | P a g e