Sunteți pe pagina 1din 19

2012

CODE
Revista informatica
Probleme rezolvate.Tablouri bidimensionale.Siruri de caractere

Costandache Gina Barcn Silviu Clasa aX-a C 6/5/2012

Tablouri bidimensionale (Matrici)


Tabloul bidimensional, numit si matrice este caracterizat, dupa cum ii spune si numele, de numarul de linii si numarul de coloane. Fiecare element dintr-o matrice este bine determinat de o linie si o coloana. O matrice arata aproximativ astfel:

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

CODE revista informatica

Iata matricea de mai sus, careia i-am atribuit cateva numere alese aleator:

Atribuirea in C++ se face astfel :


for (i=0; i<n; i++) for (j=0; j<m; j++) cin>>x[i][j];

3|Page

CODE revista informatica

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

CODE revista informatica

Interschimbarea a doua linii de indici x si y


for(j=1; j <= n; j++) { temp=a[x][j]; a[x][j]=a[y][j]; a[y][j]=temp; }

Interschimbarea a doua coloane de indici x si y


for(i=1; i <= n; i++) { temp=a[i][x]; a[i][x]=a[i][y]; a[i][y]=temp; } Calculul pozitiei elementului i,j dintr-o matrice de dimensiune n se face dupa formula: p=(n-1)+(n-2)++(n-i)+j=i*n-(1+2++i)+j=i*n-i*(n+1)/2+j, pentru j<=i. Daca j>i,atunci se interschimba i cu j.

5|Page

CODE revista informatica

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

Diagonala secundara elementele sau a[i][n-i-1], i=0,n-1 a[i][n-i+1], i=1,n

Zonele determinate de diagonale:


I. Pe diagonala principal i=j Sub diagonala principala: i>j Deasupra diagonalei principale: i<j II. Pe diagonala secundar j=n-i+1 Sub diagonala secundara: j>n-i+1 Deasupra diagonalei secundare:j<n-i+1

6|Page

CODE revista informatica

Vecinii unui element din matrice

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

CODE revista informatica

Probleme rezolvate tablouri bidimensionale


.Se considera o matrice A n*n. Sa se calculeze: - suma elementelor de pe diagonala principala - produsul elmentelor de pe diagonala secundara - minimele din elementele aflate deasupra, respectiv sub diagonala principala - maximele din elemenetle aflate deasupra, respectiv sub diagonala #include <iostream.h> void main(void) {int n,m,i,j,a[30][30],min1,min2,max1,max2,suma,produs; cout<<"Dati dimensiunile matricei "<<endl; cout<<"Dati numarul de linii si de coloane n =";cin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;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<=n;j++)cout<<a[i][j]<<" ";cout<<endl;} // ===== suma elementelor de pe diagonal pricipala ====== suma=0; for(i=1;i<=n;i++) for(j=1;i<=n;i++) if(i==j) suma+=a[i][j]; cout<<"Suma elementelor de pe diagonala pricipala este "<<suma<<endl;

8|Page

CODE revista informatica

// ==== 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

CODE revista informatica

.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

CODE revista informatica

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<<"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<<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; }

for(i=1; i<=n; i++) { c[i][j] = 0;

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;}}

CODE revista informatica

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

Functii de prelucrare a sirurilor de caractere


a. incluse in <string.h> Nr. Crt. 1 2 2 3 Numele functiei strlen (s); strcpy (s1, s2); strncpy(s1,s2,nr); strcat(s1,s2); Rolul functiei Determina lungimea sirului Copie sirul s2 in s1 Copie in sirul s1 primele nr caractere din s2 Exemplu strlen(siruri)=6 char s2[]=exemplu, s1[10], s3[10]; strcpy(s1,s2); -> s1=exemplu strncpy(s3, s2, 3); -> s3=exe char s2[]=exemplu, s1[]=bun, s3[10]; strcat(s1,s2); >s1=bunexemplu strncat(s1,s2,1); ->s1=bune strupr(IoniCA34); IONICA34

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

CODE revista informatica

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);

strupr(IoniCA34); ionica34 Strcmp(Nicu, Andrei)>0 Strcmp(Ion,Ion)=0 Strcmp(nicu,Nicu)>0

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

Prelucrarea entitatilor dintr-un sir: p=strtok(s,sep); while(p!=0) { //prelucram p p=strtok(0, sep); }

Exemplu

13 | P a g e

CODE revista informatica

Nr. Crt. 13

Numele functiei x=atoi (s)

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

itoa(nr, sir, baza) ltoa(nr, sir, baza) ultoa(nr, sir, baza)

18

19

14 | P a g e

CODE revista informatica

Probleme rezolvate siruri de caractere


Se citete un text, litere mari, mici i spaii. Afiai lungimea irului i numrul de consoane. S se transforme literele mari n litere mici i invers. S se afieze perechile de vocale consecutive i numrul acestora. S se interschimbe prima liter mic i ultima liter mic. #include<iostream> using namespace std; int main() {int i=0,j=0; char *p,a[256],v[100]="aeiouAEIOU",aux; cin.get(a,100); cout<<"Lungimea sirului: "<<strlen(a)<<endl; for(p=a;*p;p++) if(strchr(v,*p)==0) i++; cout<<i<<" consoane"<<endl; for(p=a;*p;p++) { if(islower(*p)) *p=toupper(*p); else if(isupper(*p)) *p=tolower(*p);} cout<<a<<endl; for(p=a;*p;p++) if(strchr(v,*p) && strchr(v,*(p+1)) && *(p+1)!=NULL) {cout<<*p<<";"<<*(p+1)<<endl;j++;} cout<<j<<" perechi"<<endl; for(i=0;i<strlen(a);) if(islower(a[i])) break; else i++; for(j=strlen(a)-1;j>=0;) if(islower(a[j])) break; else j--;aux=a[i]; a[i]=a[j];a[j]=aux; cout<<a<<endl; }

15 | P a g e

CODE revista informatica

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

CODE revista informatica

. 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

CODE revista informatica

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

CODE revista informatica

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

CODE revista informatica

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