matriciincpp
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/
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: "<
}
#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: "<
}
Abonați-vă la:
Postări (Atom)