joi, 26 aprilie 2012

Bibliografie


http://www.didactic.ro/materiale-didactice/49646_test-tablouri-bidimensionale

http://www.scritube.com/stiinta/informatica/c/TABLOURI43453.php

http://www.codebox.ro/forum/Thread-c-clasa-ix-partea-ii

http://www.rotutorial.net/tag/tablouri-bidimensionale-c/

http://www.tutorialeprogramare.ro/Tutorial%20C/Tablouri%20bidimensionale.html

http://ler.is.edu.ro/~cex_is/Informatica/2012/teme/9/t10.pdf

http://www.scribd.com/doc/64150607/10/Tablouri-bidimensionale-%C5%9Fi-multidimensionale

http://profinfocntv.wordpress.com/tablouri-bidimensionale/

http://www.didactic.ro/materiale-didactice/93626_tablouri-bidimensionale

http://portofoliuflavius.wordpress.com/2011/05/11/tablouri-bidimensionale/


Galerie foto














Mada si Gina......realizatoarele blogului:P

Teorie


Matricele sunt o colectie de date de dimensiuni arbitrare,indexate numeric.
Tablourile bidimensionale (cu doua dimensiuni) se numesc matrice.
 Declararea acestora se va face cu 2 indici, astfel:

tip_data nume matrice[nr1] [nr2]

Unde
 -tip data este tipul elementelor matricei (poate fi int,float,duble etc.)
 -nume matrice este identificatorul matricei (de exemlu a)
 -nr1 este numarul de linii
 -nr2 este numarul de coloane

Exemplu:

int a[4] [5];

Matricea a are elemente de tip int, 4 linii si 5 coloane.

Citirea elementelor unei matrice:

*Pentru a face acest lucru avem nevoie de un indice pentru linii i si unul pentru coloane j.Trebuie sa specific ca m reprezinta numarul de linii al matricei, iar n numarul de coloane.Astfel avem:


 for (i=0;i<m;i++) //i ia valori de la 0 pana la numarul de linii
  for (j=0;j<n;j++) //j ia valori de la 0 pana la numarul de coloane
  {
  cout<<"a["<<i+1<<","<<j+1<>a[i] [j];
  }

Pentru ca la un moment dat, cititul elementelor matricei poate devenii enervant, este bine de retinut si urmatoarea metoda de declarare:

tip data nume matrice[nr1] [nr2]={lista de vlori}

Exemplu:

int a[2] [3]={1,2,3,4,5,6};

Matricea va arata in felul urmator:

1 2 3
 4 5 6

Matrici patrate (sau patratice):

Sunt matricile care au acelasi numari de coloane si acelasi numar de linii.

Exemplu:

m=3 n=3

1 0 0
 3 5 6
 2 0 1

Diagonala principala intr-o matrice patratica:

1 0 0
 3 5 6
 2 0 1

Diagonala secundara intr-o matrice patratica:

1 0 0
 3 5 6
 2 0 1

Exercitii:



Probleme propuse...


1) Sa se calculeze suma elementelor de pe diagonala principala a unei matrice patrate si suma elementelor de pe diagonala secunara, de dimensiune n.Elementele matricei sunt numere intregi.


2) Se considera o matrice patrata cu elemente numere intregi de dimeniunea n*n.Numarul n si elementele matrici se citesc de la tastatura.Sa se afiseze:
a)suma elementelor situate deasupra diagonalei principale
 b)suma elementelor situate sub diagonala secundara
 
 3.Se da o matrice cu m linii si  n coloane.Sa se memoreze intr-un vector b sumele elementelor de pe fiecare linie a matricii ( b[i] va reprezenta suma elementelor de pe linia i in matrice).

4.O matrice patratica cu n linii *  n coloane se numeste triunghiulara superior daca toate elementele aflate sub diagonala principala sunt nule. Realizati un program care verifica daca matricea este triunghiulara superior.


4.Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (1≤n≤100)şi apoi elementele unui tablou bidimensional cu n linii şi n coloane, care memorează numere naturale cu cel mult 9 cifre fiecare; programul afişează pe ecran acele valori din tablou care sunt strict mai mici decât toate elementele cu care se învecinează direct (aflate pe aceeaşi linie dar pe o coloană alăturată sau pe aceeaşi coloană dar pe o linie alăturată).Numerele afişate vor fi separate prin câte un spaţiu.

5. Ştiind ca datele de intrare sunt: x = 1, k = 2 şi matricea a =  
var n,k,x,i,j,nr:integer;
a:array[1..20,1..20]of integer;
begin
write('n = '); readln(n); write('x = '); readln(x); write('k = '); readln(k);
for i:=1 to n do
for j:=1 to n do begin
write ('a[',i,',',j,'] = ');
readln (a[i,j]); end;
nr:=0;
for i:=1 to n do
for j:=1 to n do
if a[i,j] = x then  begin    nr:= nr+1;
                 if nr = k then write( i );
                  end;
end.
a) Ce se afişează? 0,5 p
b) Pentru ce valoare a datelor de intrare ale programului anterior se afişează 3?.   0,5 p
c) Să se modifice programul anterior, astfel încât să afişeze numărul elementelor pare de pe linii impare. 1 p
d) Să se scrie o secvenţă care să calculeze pătratul sumei elementelor de pe diagonala principală a unei matrici pătratice   .2 p
  • . Să se scrie un program care afişează transpusa unei matrici a cu n linii şi m coloane, cu elemente numere naturale. 2 p
  •  Se citeşte de la tastatură o matrice a cu m linii şi n coloane şi elemente numere întregi. Să se memoreze într-un vector b sumele elementelor de pe fiecare coloană a matricei (b[i] va reprezenta suma elementelor de pe coloana j în matrice). 3 p



   6. Ştiind ca datele de intrare sunt: x = 1, k = 2 şi matricea a =  
var n,k,x,i,j,nr:integer;
a:array[1..20,1..20]of integer;
begin
write('n = '); readln(n); write('x = '); readln(x); write('k = '); readln(k);
for i:=1 to n do
for j:=1 to n do begin
write ('a[',i,',',j,'] = ');
readln (a[i,j]); end;
nr:=0;
for i:=1 to n do
for j:=1 to n do
if a[i,j] = x then  begin    nr:= nr+1;
                 if nr = k then write( j );
                  end;
end.
a) Ce se afişează? 0,5 p
b) Pentru ce valoare a datelor de intrare ale programului anterior se afişează 1?   0,5 p
c) Să se modifice programul anterior, astfel încât să afişeze numărul elementelor impare de pe coloane impare. 1p
d) Să se scrie o secvenţă care să calculeze cubul produsului elementelor de pe diagonala principală a unei matrici pătratice.  2p
  •  Să se scrie un program care afişează transpusa transpusei unei matrici a cu m linii şi n coloane, cu elemente numere reale.    2 p
  •  Se citeşte de la tastatură o matrice a cu m linii şi n coloane şi elemente numere întregi. Să se memoreze într-un vector b sumele elementelor de pe fiecare linie a matricei (b[i] va reprezenta suma elementelor de pe linia i în matrice). 3 p
    VARIANTA 2

1. Se consideră un tablou bidimensional cu n linii și m coloane. Realizați un program care afișează coloanele care au elementele ordonate crescător.

2. Se consideră un tablou bidimensional cu n linii și m coloane. Realizați un program care identifică și afișează coloana care are cele mai multe elemente divizibile cu primul element situat pe ea. Dacă sunt mai multe coloane care îndeplinesc această condiție, se va afișa coloana cu numărul de ordine cel mai mare.
3. Se consideră un tablou bidimensional cu n linii și m coloane. Realizați un program care ordonează descrescător fiecare coloană a tabloului.
4. Se consideră un tablou bidimensional cu n linii și m coloane. Realizați un program care calculează suma elementelor de pe fiecare coloană care are primul element număr prim.
5. Se consideră un tablou bidimensional cu n linii și m coloane. Realizați un program care afișează numărul de numere prime de pe fiecare linie a matricii.
6. Se consideră un tablou bidimensional cu n linii și m coloane. Realizați un program care afișează cel mai mare divizor comun al elementelor situate pe fiecare coloană a matricii.
7. Se consideră un tablou bidimensional cu n linii și m coloane. Realizați un program care ordonează crescător elementele impare de pe fiecare linie a matricii, elementele pare nu își vor schimba pozițiile.
8. Se consideră un tablou bidimensional cu n linii și m coloane. Realizați un program care afișează numărul de linii care conțin cele mai multe valori palindrom.
9. Se consideră un tablou bidimensional cu n linii și m coloane. Realizați un program care liniarizează matricea, adică formează un vector cu elementele matricii, parcurse pe coloane.
10. Se consideră un tablou bidimensional cu n linii și m coloane. Realizați un program care interschimbă coloana x cu coloana y, unde x și y sunt citite.
11. Se citește n și m. Se cere să se formeze o matrice cu nxm elemente ale șirului lui Fibonacci, matricea  fiind parcursă pe linii.
12. Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale nenule n şi m
(2≤m≤10, 2≤n≤10) şi care construieşte în memorie şi apoi afişează o matrice A cu n linii (numerotate de la 1la n) şi m coloane (numerotate de la 1 la m) cu proprietatea că fiecare element Aij memorează cea mai mică dintre valorile indicilor i şi j (1≤i≤n, 1≤j≤m). Matricea se va afişa pe ecran, câte o linie a matricei pe câte o linie a ecranului, elementele fiecărei linii fiind separate prin câte un spaţiu. Exemplu: pentru n=4 şim=5 se va afişa matricea alăturată.

1 1 1 1 1

1 2 2 2 2

1 2 3 3 3

1 2 3 4 4

13. Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale n şi m (2≤m≤10,2≤n≤10) şi care construieşte în memorie şi apoi afişează o matrice A cu n linii (numerotate de la 1la n) şi m coloane (numerotate de la 1 la m) cu proprietatea că fiecare element Aij memorează cea mai mare dintre valorile indicilor i şi j (1≤i≤n, 1≤j≤m). Matricea se va afişa pe ecran, câte o linie a matricei pe câte o linie a ecranului, elementele fiecărei linii fiind separate prin câte un spaţiu. Exemplu: pentru n=4 şi m=5 se va afişa matricea alăturată.

1 2 3 4 5

2 2 3 4 5

3 3 3 4 5

4 4 4 4 5

14. Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale n şi p (2≤n≤20,1≤p≤20) şi construieşte în memorie un tablou bidimensional cu n linii şi p coloane. Tabloul va fi construit astfel încât, parcurgând tabloul linie cu linie de sus în jos şi fiecare linie de la stânga la dreapta, să se obţină şirul primelor n*p pătrate perfecte impare, ordonat strict crescător, ca în exemplu. Tabloul astfel construit va fi afişat pe ecran, fiecare linie a tabloului pe câte o linie a ecranului, cu câte un spaţiu între elementele fiecărei linii. Exemplu: pentru n=2, p=3 se va afişa tabloul alăturat:

1 9 25

49 81 121

15. Se consideră tabloul bidimensional cu n linii şi n coloane ce conţine numere naturale cu cel mult patru cifre fiecare. Scrieţi programul C/C++ care citeşte de la tastatură numărul natural n(2≤n≤23) şi cele n*n elemente ale tabloului şi apoi afişează pe ecran elementele primului pătrat concentric, separate prin câte un spaţiu. Pătratul este parcurs în sensul acelor de ceasornic începând din colţul său stânga-sus, ca în exemplu. Primul pătrat concentric este format din prima şi ultima linie, prima şi ultima coloană a tabloului. Exemplu: pentru n=5 şi tabloul alăturat, se va afişa: 1 2 3 4 5 1 6 2 7 6 5 4 3 7 2 6

1 2 3 4 5

6 7 8 9 1

2 3 4 5 6

7 8 9 1 2

3 4 5 6 7

16. Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale n şi p (2≤n≤20, 1≤p≤20) şi construieşte în memorie un tablou bidimensional cu n linii şi p coloane. Tabloul va fi construit astfel încât, parcurgând matricea linie cu linie de sus în jos şi fiecare linie de la stânga la dreapta, să se obţină şirul primelor n*p pătrate perfecte pare, ordonat strict crescător, ca în exemplu. Tabloul astfel construit va fi afişat pe ecran, fiecare linie a tabloului pe câte o linie a ecranului, cu câte un spaţiu între elementele fiecărei linii. Exemplu: pentru n=2, p=3 programul va afişa tabloul alăturat:
0 4 16

36 64 100

17. Scrieţi un program C/C++ care citeşte de la tastatură două valori naturale nenule m şin (m≤10, n≤10) şi apoi m*n numere naturale nenule cu cel mult 4 cifre fiecare, reprezentând elementele unei matrice cu m linii şi n coloane. Programul determină apoi valorile minime de pe fiecare linie a matricei şi afişează pe ecran cea mai mare valoare dintre aceste minime. Exemplu: pentru m=3, n=5 şi matricea
5 13 7 2 3

9 6 12 9 10

3 6 5 4 7

se afişează pe ecran valoarea 6 (cea mai mică valoare de pe prima linie a matricei este 3, cea mai mică valoare de pe linia a doua este 6, cea mai mică valoare de pe linia a treia este 2. Cea mai mare dintre aceste trei valori este 6).

18. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (2<n<25) şi apoi construieşte în memorie o matrice cu n linii şi n coloane, numerotate de la 1 la n, ale cărei elemente primesc valori după cum urmează: elementul din linia i şi coloana j primeşte ca valoare ultima cifră a produsului i*j (1≤i≤n şi 1≤j≤n). Programul va afişa matricea astfel construită pe ecran, câte o linie a matricei pe o linie a ecranului, elementele fiecărei linii fiind separate prin câte un spaţiu. Exemplu: pentru n=4 se va afişa matricea alăturată.

1 2 3 4

2 4 6 8

3 6 9 2

4 8 2 6

19. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural nenul, cu maximum 18cifre, construieşte în memorie şi afişează apoi pe ecran o matrice pătratică, având numărul de linii şi de coloane egal cu numărul de cifre ale numărului dat, completată cu cifrele numărului citit. Astfel, elementele de pe prima coloană a matricei vor fi toate egale cu cifra unităţilor numărului dat, elementele de pe a doua coloană a matricei vor fi toate egale cu cifra zecilor numărului dat, şi aşa mai departe, ca în exemplu. Exemplu: dacă se citeşte numărul 1259, matricea construită va fi cea alăturată.

9  5  2  1

9  5  2  1

9  5  2  1

9  5  2  1

 

20.  Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (2<n<20) şi

construieşte în memorie o matrice cu n linii şi n coloane, numerotate de la 1 la n, în care

fiecare element aflat pe chenarul exterior al matricei este egal cu suma dintre indicele liniei

şi indicele coloanei pe care se află, iar fiecare dintre celelalte elemente este egal cu suma

celor trei “vecini” situaţi în matrice pe linia anterioară. Două elemente din matrice se numesc

vecine dacă se găsesc alături pe linie, coloană sau diagonală. Chenarul exterior al unei

matrice este format din prima linie, ultima linie, prima coloană şi ultima coloană.

Elementele matricei vor fi afişate pe ecran, câte o linie a matricei

pe câte o linie a ecranului cu câte un spaţiu între elementele

fiecărei linii.

Exemplu: pentru n=5 se va obţine matricea alăturată.

2 3 4 5 6

3 9 12 15 7

4 24 36 34 8

5 64 94 78 9

6 7 8 9 10




Operatii cu tablouri bidimensionale


Initializarea elementelor unei matrici in momentul declararii acesteia:

 int mat[4][3]={
 {10, -50, 3},
 {32, 20, 1},
 {-1, 1, -2},
 {7, -8, 19} };

 Citirea de la tastatura a elementelor unei matrici de maxim 10 linii si 10 coloane si afisarea elementelor tabloului:

 #include <stdio.h>
 #include <conio.h>

 int main(void)
 {
 int A[10][10];
 int nr_lin, nr_col;
 int i, j;
 printf("Nr. linii = ");
 scanf("%d", &nr_lin);
 printf("Nr. coloane = ");
 scanf("%d", &nr_col);

 // citirea elementelor unei matrici
 for(i=0; i < nr_lin; i++)
 for(j=0; j < nr_col; j++)
 {
 printf("\nA[%d][%d] = ");
 scanf("%d", &A[i][j]);
 }

 // afisarea elementelor matricii
 for(i=0; i < nr_linii; i++)
 {
 for(j=0; j < nr_col; j++)
 printf("%d ", A[i][j]);
 printf("\n");
 // dupa afisarea elementelor une linii se trece la linia urmatoare

 }
 }


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

Functie care sa efectueze:citirea si afisarea



Afisarea elementelor din matrice

#include<iostream.h>
int a[10][10],n,m,s,p;

void citire(int a[10][10],int n)
{
int i,j;
cout<<"dati elem. matricii "<
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
}

void afisare_matrice(int a[10][10],int n)
{
int i,j;
cout<<"matricea este "<
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++) cout<
cout<
}
}
void main()
{
cout<<"Dati numarul linii si de coloane n = ";cin>>n;
citire(a,n);
afisare_matrice(a,n);

miercuri, 25 aprilie 2012

Probleme bacalaureat matrice

1.Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (1≤n≤100)şi apoi elementele unui tablou bidimensional cu n linii şi n coloane, care memorează numere naturale cu cel mult 9 cifre fiecare; programul afişează pe ecran acele valori din tablou care sunt strict mai mici decât toate elementele cu care se învecinează direct (aflate pe aceeaşi linie dar pe o coloană alăturată sau pe aceeaşi coloană dar pe o linie alăturată).Numerele afişate vor fi separate prin câte un spaţiu.
#include<fstream.h>
#include<string.h>
#include<stdlib.h>
ifstream f("matrice.txt");
long a[101][101];
int n,i,j;
int verifica(int i,int j)
{
long x=a[i][j];
if((i+1<=n)&&
(x>=a[i+1][j]))return 0;
if((i-1>=1)&& (x>=a[i-1][j]))return 0;
if((j-1>=1)&& (x>=a[i][j-1]))return 0;
if((j+1<=n)&&(x>=a[i][j+1]))return 0;
return 1;
}
void main()
{ do{cin>>n;}while(n<=1 ||n>=100);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if (verifica(i,j)==1)
cout<<a[i][j]<<" ";
}

2.Scrieti programul C sau C++ care construiete în memorie o matrice p cu n linii si n coloane formata numai din valori 1 si 2 astfel încât elementele de pe diagonala secundara si cea principala sa fie egale cu 1, iar restul elementelor din matrice sa fie egale cu 2
#include<iostream.h>
int n,i,j,a[23][23];
void matrice(int x)
{
for(i=1;i<=x;i++)
for(j=1;j<=x;j++)
if(i==j || i==x-j+1)
{
a[i][j]=1;
}
else
{
a[i][j]=2;
}
}
void afis()
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}

3. Sa se calculeze suma elementelor de pe diagonala principala a unei matrice patratica  si suma elementelor de pe diagonala secunara, de dimensiune n.Elementele matricei sunt numere intregi.

  #include<iostream.h>
 void main()
 {
 int a[10][10],i,j,n,sp=0,ss=0; //ss=suma de pe diagonala principala
 cout<>n; //sp=suma de pe diagonala secundara
 for (i=0;i<n;i++)
 for (j=0;j<n;j++)
  {
  cout<<"a["<<i+1<<","<<j+1<>a[i][j];
  }
 for (i=1;i<n;i++)
  for (j=1;j<n;j++)
  if (i==j) sp+=a[i][j];
 for (i=1;i<n;i++)
 for (j=n+1)
 ss+=a[i][j];
 cout<<"Suma de pe diagonala principala: "<<sp;
 cout<<"Suma de pe diagonala secundara: "<
 }