21/11/2024

APLICATII SIMPLE

Matrici

Programare C++ (liceu)

PROBLEMA 1.

Se considera o matrice de dimensiune (cu n linii si n coloane) astfel incat:

-elementele de pe diagonala secundara sa fie egale cu 0

-elementele aflate deasupra diagonalei secundare sa fie egale cu 1

-restul elementelor sa fie egale cu 2 (sub diagonala secundara)

Se cere afisarea acestei matrici, dimensiunea se citeste de la tastatura. Elementele vor fi afisate linie cu linie, cu spatiu intre fiecare element de pe aceeasi linie. Consideram 2<n<20

Cum gandim?

Citirea/afisarea unei matrice de dimensiune n se face cu 2 instructiuni for:

for (i=1;i<=n;i++)

for (j=1;j<=n;j++)

DE REMARCAT

– elementele de pe diagonala principala sunt cele pentru care i=j (adica A[i][i])

– elementele de pe diagonala secundara sunt cele pentru care i+j= n +1 (adica A[i][n + 1 – j])

Exemplu: A[1][n], A[2][n-1], A[3][n-2] etc

COD C++ – se poate rula in compiler online: https://www.onlinegdb.com/online_c++_compiler

#include <iostream>

using namespace std;

int main()

{

    int n, a[100][100], i, j;

    /* i este nr liniei, j este nr coloanei; consider 100 – numarul maxim de elemente pe linie/coloana*/

    cout<<“Dimensiunea matricii:”<<endl;

    cin>>n;

    /* verificare conditie 2<n<20 */

    if(n<20 && n>2)

    {

    for (i=1;i<=n;i++)

    for (j=1;j<=n;j++)

    {

    if (i+j<n+1)     

    a[i][j] = 1;

    else   

    if (i+j==n+1) /* adica diagonala secundara */

    a[i][j] = 0;

    else

    a[i][j]=2;

    }

    /* urmeaza sa afisez matricea */

    for (i=1;i<=n;i++)

    {

    for (j=1;j<=n;j++)

    cout<<a[i][j]<<” “;

    cout<<endl;

    }

    /* inchid if de la conditie: 2<n<20 */

    }

    else

    cout<<“Dimensiunea nu verifica conditia: 2<“<<n<<“<20  (FALS)”;

    return 0;

}

RULARE

PROBLEMA 2.

Se considera o matrice cu n linii si n coloane astfel incat:

-elementele de pe diagonale sa fie 4

-restul elementelor sa fie 3

Se cere afisarea acestei matrici, dimensiunea se citeste de la tastatura. Elementele vor fi afisate linie cu linie, cu spatiu intre fiecare element de pe aceeasi linie.  Consideram 2<n<16

Cum gandim?

Putem sa punem toate elementele identice cu 3.

Cu o instructiune if verificam daca este vorba despre diagonala principala, cu alta instructiune if daca este diagonal secundara.

COD C++ – se poate rula in compiler online: https://www.onlinegdb.com/online_c++_compiler

#include <iostream>

using namespace std;

int main()

{

    int n, a[100][100], i, j;

    /* i este nr liniei, j este nr coloanei; consider 100 – numarul maxim de elemente pe linie/coloana*/

    cout<<“Dimensiunea matricii:”<<endl;

    cin>>n;

    /* verificare conditie 2<n<16 */

    if(n<16 && n>2)

    {

    for (i=1;i<=n;i++)

    for (j=1;j<=n;j++) 

    a[i][j]=3;

    /* acum toate elementele sunt egale cu 3! */

    for (i=1;i<=n;i++)

    for (j=1;j<=n;j++) 

    if (i+j==n+1 || i==j ) /* adica diagonala secundara + diagonala principala */

    a[i][j] = 4;

    /* observam ca nu avem nevoie de acolade! */

    /* urmeaza sa afisez matricea */

    for (i=1;i<=n;i++)

    {

    for (j=1;j<=n;j++)

    cout<<a[i][j]<<” “;

    cout<<endl;

    }

    /* inchid if de la conditie: 2<n<16 */

    }

    else

    cout<<“Dimensiunea nu verifica conditia: 2<“<<n<<“<16  (FALS)”;

    return 0;

}

RULARE

PROBLEMA 3.

Se considera o matrice de dimensiune (cu n linii si n coloane) astfel incat:

-elementele de pe linii impare sunt egale cu numarul liniei pe care se afla

-elementele de pe linii pare sunt egale cu numarul coloanei pe care se afla

Se cere afisarea acestei matrici, dimensiunea se citeste de la tastatura. Elementele vor fi afisate linie cu linie, cu spatiu intre fiecare element de pe aceeasi linie. Consideram 2<n<20

Cum gandim?

Putem observa ca toate elementele de pe linia 1 vor fi egale cu 1. La fel, elementele de pe linia 3, egale cu 3 etc

Ce facem daca linia este un numar par? Se observa atunci ca elementele vor fi consecutive: 1 2 3 …. n

adica fix indicele coloanei, care va fi variabila j

Cu o singura instructiune if verificam daca este vorba despre o linie para sau impara

COD C++ – se poate rula in compiler online: https://www.onlinegdb.com/online_c++_compiler

#include <iostream>

using namespace std;

int main()

{

    int n, a[100][100], i, j;

    /* i este nr liniei, j este nr coloanei; consider 100 – numarul maxim de elemente pe linie/coloana*/

    cout<<“Dimensiunea matricii:”<<endl;

    cin>>n;

    /* verificare conditie 2<n<20*/

    if(n<20 && n>2)

    {

    for (i=1;i<=n;i++)

    for (j=1;j<=n;j++) 

    if (i%2==1) /* restul impartirii la 2 este nenul, adica linie impara */

    a[i][j] = i;

    else

    a[i][j] = j;

    /* observam ca nu avem nevoie de acolade! */

    /* am iesit de tot din instructiunea for! */

    /* urmeaza sa afisez matricea */

    for (i=1;i<=n;i++)

    {

    for (j=1;j<=n;j++)

    cout<<a[i][j]<<” “;

    cout<<endl;

    }

    /* inchid if de la conditie: 2<n<20 */

    }

    else

    cout<<“Dimensiunea nu verifica conditia: 2<“<<n<<“<20  (FALS)”;

    return 0;

}

RULARE

PROBLEMA 4.

Se considera o matrice de dimensiune (cu n linii si n coloane) astfel incat:

-elementele de pe prima linie sau prima coloana este egal cu suma dintre numarul liniei si numarul coloanei pe care se afla

-orice alt element este egal cu suma dintre elementul vecin aflat pe aceeasi linie cu el, dar pe coloana din stanga sa si elementul vecin aflat pe coloana cu el, dar pe linia de deasupra sa.

Se cere afisarea acestei matrici, dimensiunea se citeste de la tastatura. Elementele vor fi afisate linie cu linie, cu spatiu intre fiecare element de pe aceeasi linie. Consideram 2<n<10

Cum gandim?

Exemplu:

Pentru n = 5 trebuie sa obtinem:

23456
36101521
410203556
5153570126
62156126252

Prima linie sau prima coloana va fi caz tratat separat: if (i==1 || j==1) ->  a[i][j] = i+j;

Altfel: a[i][j] = a[i-1][j]+a[i][j-1]

a[i-1][j] -> inseamna elementul de pe linia i-1, coloana j adica vecinul de sus!

a[i-1][j] -> inseamna elementul de pe linia i, coloana j-1 adica vecinul din stanga!

COD C++ – se poate rula in compiler online: https://www.onlinegdb.com/online_c++_compiler

#include <iostream>

using namespace std;

int main()

{

    int n, a[100][100], i, j;

    /* i este nr liniei, j este nr coloanei; consider 100 – numarul maxim de elemente pe linie/coloana*/

    cout<<“Dimensiunea matricii:”<<endl;

    cin>>n;

    /* verificare conditie 2<n<10*/

    if(n<10 && n>2)

    {

    for (i=1;i<=n;i++)

    for (j=1;j<=n;j++) 

    if (i==1 || j==1)

    a[i][j] = i+j;

    else

    a[i][j] = a[i-1][j]+a[i][j-1];

    /* observam ca nu avem nevoie de acolade! */

    /* am iesit de tot din instructiunea for! */

    /* urmeaza sa afisez matricea */

    for (i=1;i<=n;i++)

    {

    for (j=1;j<=n;j++)

    cout<<a[i][j]<<” “;

    cout<<endl;

    }

    /* inchid if de la conditie: 2<n<20 */

    }

    else

    cout<<“Dimensiunea nu verifica conditia: 2<“<<n<<“<10  (FALS)”;

    return 0;

}

RULARE

PROBLEMA 5.

Se considera o matrice cu m linii si n coloane) astfel incat:

-elementele de pe prima linie sunt: 1 2 3 … n

-elementele de pe prima coloana sunt: 1 2 3 … m

-orice alt element este dat de relatia A i, j = A i-1, j + A i, j-1

Se cere afisarea elementului de pe ultima linie, ultima coloana. Numarul de linii si de coloane se citeste de la tastatura. Elementele vor fi afisate linie cu linie, cu spatiu intre fiecare element de pe aceeasi linie. Consideram 2<m<101, 2<n<101.

Cum gandim?

Relatia este data in ipoteza! Doar prima linie si prima coloana difera – vezi problema precedenta!

COD C++ – se poate rula in compiler online: https://www.onlinegdb.com/online_c++_compiler

#include <iostream>

using namespace std;

int main()

{

    int m, n, a[100][100], i, j;

    /* i este nr liniei, j este nr coloanei; consider 100 – numarul maxim de elemente pe linie/coloana*/

    cout<<“Dimensiunea matricii:”<<endl;

    cout<<“Numarul de linii m=”; cin>>m;

    cout<<“Numarul de coloane n=”; cin>>n;

    /* verificare conditie 2<n<10*/

    if(m<101 && m>2 && n<101 && n>2)

    {

    for (i=1;i<=m;i++) /* acum m = numarul de linii */

    for (j=1;j<=n;j++)  /* acum n = numarul de coloane */

    if (i==1)  /* este prima linie?? */

    a[i][j] = j; /* adica numarul coloanei unde se afla */

    else

    if (j==1) /* este prima coloana?? */

    a[i][j] = i; /* adica numarul liniei unde se afla */

    else

    a[i][j] = a[i-1][j]+a[i][j-1];

    /* observam ca nu avem nevoie de acolade! */

    /* am iesit de tot din instructiunea for! */

    cout<<“Elementul de pe ultima linie si ultima coloana este “<<a[m][n]<<endl;

    /* urmeaza sa afisez matricea DOAR PENTRU VERIFICARE*/

    cout<<“VERIFICARE – afisez matricea:”<<endl;

    for (i=1;i<=m;i++)

    {

    for (j=1;j<=n;j++)

    cout<<a[i][j]<<” “;

    cout<<endl;

    }

    /* inchid if de la conditie: 2<n<20 */

    }

    else

    cout<<“Dimensiunea nu verifica conditia: 2<“<<m<<“<101  si 2<” << n<<“<101 (FALS)”;

    return 0;

}

RULARE

Leave a Reply

Your email address will not be published. Required fields are marked *