Приступ елементима матрице – проласци кроз матрицу

Научили смо како да унесемо и испишемо елементе матрице. Да видимо сада како можемо да приступамо елементима матрице. Али пре него што наставимо, дефинишимо неке појмове.Број редова матрице означићемо промењивом r а број колона промењивом k

Шта је квадратна матрица?

Квадратна матрица има исти број редова и колона, што значи да обе димензије имају исту вредност, па се дефинише само једна променљива n која представља и број редова и број колона.

За унос елемената матрице и даље су неопходни два циклуса и два различита бројача за редове, односно колоне (иако су границе у којима се крећу вредности ових бројача исте!).

Код квадратне матрице дефинише се главна дијагонала која иде од горњег левог угла до доњег десног угла, и то тако што оба бројача имају исту вредност (i == j).

Постоји и споредна дијагонала, која иде од доњег левог угла до горњег десног угла и дефинише се тако што је збир оба бројача једнак димензији матрице (i + j == n - 1).

Поред тога, постоје и троуглови изнад главне, односно изнад споредне дијагонале, као и троуглови испод главне, односно испод споредне дијагонале.

Кренимо да анализирао случај по случај.

Приступ елементима матрице – главна и споредна дијагонала

Посматрајмо једну квадратну матрицу димензија 3 х 3.

../_images/image16.png

Написати програм за унос елемената квадратне матрице целобројног типа елемената и максималних димензија 5 х 5, као и за испис елемената главне дијагонале.

Решење::

#include<stdio.h>
int main(void)
{
    int A[5][5], i, j, n;
    printf("Unesite broj redova odnosno kolona ");
    scanf("%d", &n);
    printf("Unesite elemente matrice:\n");
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
        {
            printf("A[%d][%d] = ", i, j);
            scanf("%d", &A[i][j]);
        }
    printf("\nElementi na glavnoj dijagonali su:\n");
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
        if (i == j)
            printf("%6d", A[i][j]);
        else
            printf("\t", A[i][j]);
        }
         printf("\n");
    }
    return 0;
}

Излаз:

Unesite broj redova odnosno kolona 3
Unesite elemente matrice:
A[0][0] = 1
A[0][1] = 2
A[0][2] = 3
A[1][0] = 4
A[1][1] = 5
A[1][2] = 6
A[2][0] = 7
A[2][1] = 8
A[2][2] = 9

Elementi na glavnoj dijagonali su:
     1
          5
               9

Написати програм за унос елемената квадратне матрице целобројног типа елемената и максималних димензија 5 х 5, као и за испис елемената споредне дијагонале.

Решење::

#include<stdio.h>
int main(void)
{
    int A[5][5], i, j, n;
    printf("Unesite broj redova odnosno kolona ");
    scanf("%d", &n);
    printf("Unesite elemente matrice\n");
    for(i = 0; i < n; i++)
        for (j = 0; j < n; j++)
        {
            printf("A[%d][%d] = ", i, j);
            scanf("%d", &A[i][j]);
        }
    printf("\nElementi na sporednoj dijagonali su: \n");
    for(i = 0; i < n ; i++)
        {
        for (j = 0; j < n; j++)
        {
            if(i + j == n - 1)
                printf("%6d", A[i][j]);
            else
                printf("\t", A[i][j]);
        }
        printf("\n");
        }
    return 0;
}

Излаз:

Unesite broj redova odnosno kolona 3
Unesite elemente matrice
A[0][0] = 1
A[0][1] = 2
A[0][2] = 3
A[1][0] = 4 
A[1][1] = 5
A[1][2] = 6
A[2][0] = 7
A[2][1] = 8
A[2][2] = 9

Elementi na sporednoj dijagonali su:
                     3
             5
     7

Приступ елементима матрице изнад и испод главне дијагонале

Посматрајмо једну квадратну матрицу димензија 3 х 3 и пробајмо да уочимо у ком су односу индекси реда и колоне изнад, односно испод главне дијагонале.

../_images/image17.png

Примећујемо да је за приступ елементима изнад главне дијагонале услов да је i < j, односно за приступ елементима испод главне дијагонале да је i > j. Направимо програм који ће исписати елементе изнад и испод главне дијагонале.

Написати програм за унос елемената квадратне матрице целобројног типа елемената и максималних димензија 5 х 5, као и за испис елемената изнад и испод главне дијагонале. На преосталим местима исписати бланко.

Решење::

#include<stdio.h>
int main(void)
{
    int A[5][5], i, j, n;
    printf("Unesite broj redova odnosno kolona: ");
    scanf("%d", &n);
    printf("Unesite elemente matrice:\n");
    for(i = 0; i < n; i++)
        for (j = 0; j < n; j++)
        {
            printf("A[%d][%d] = ", i, j);
            scanf("%d",&A[i][j]);
        }
printf("\nUneli ste matricu: \n");
    for(i = 0; i < n; i++)
        {
        for (j = 0; j < n; j++)
            printf("%d\t", A[i][j]);
        printf("\n");
        }
    printf("\nElementi iznad glavne dijagonale su: \n");
    for(i = 0; i < n; i++)
        {
        for (j = 0; j < n; j++)
        {
            if (i < j)
                printf("%d\t", A[i][j]);
            else
                printf("\t", A[i][j]);
        }
        printf("\n");
        }
    printf("\nElementi ispod glavne dijagonale su: \n");
    for(i = 0; i < n; i++)
        {
        for (j = 0; j < n; j++)
        {
            if (i > j)
                printf("%d\t", A[i][j]);
            else
                printf("\t", A[i][j]);
        }
        printf("\n");
        }	
    return 0;
}

Излаз:

Unesite broj redova odnosno kolona: 3
Unesite elemente matrice:
A[0][0] = 1
A[0][1] = 2
A[0][2] = 3
A[1][0] = 4
A[1][1] = 5
A[1][2] = 6
A[2][0] = 7
A[2][1] = 8
A[2][2] = 9

Uneli ste matricu:
1       2       3
4       5       6
7       8       9

Elementi iznad glavne dijagonale su:
        2       3
                6

Elementi ispod glavne dijagonale su:

4
7       8

Приступ елементима матрице изнад и испод споредне дијагонале

Посматрајмо једну квадратну матрицу димензија 3 х 3 и пробајмо да уочимо у ком су односу индекси реда и колоне изнад, односно испод споредне дијагонале.

../_images/image18.png

Примећујемо да је за приступ елементима изнад споредне дијагонале услов да је i + j < n - 1, односно за приступ елементима испод главне дијагонале да је i + j > n - 1. Пробајмо да направимо програм који ће исписати елементе изнад и испод главне дијагонале.

Написати програм за унос елемената квадратне матрице целобројног типа елемената и максималних димензија 5 х 5, као и за испис елемената изнад и испод споредне дијагонале. На преосталим местима исписати бланко.

Решење::

#include<stdio.h>
int main(void)
{
    int A[5][5], i, j, n;
    printf("Unesite broj redova odnosno kolona: ");
    scanf("%d",&n);
    printf("Unesite elemente matrice:\n");
    for(i = 0; i < n; i++)
        for (j = 0; j < n; j++)
        {
            printf("A[%d][%d] = ", i, j);
            scanf("%d", &A[i][j]);
        }
printf("\nUneli ste matricu: \n");
    for(i = 0; i < n; i++)
        {
        for (j = 0; j < n; j++)
            printf("%d\t", A[i][j]);
        printf("\n");
        }
    printf("\nElementi iznad sporedne dijagonale su: \n");
    for(i = 0; i < n; i++)
        {
        for (j = 0; j < n; j++)
        {
            if (i + j < n - 1)
                printf("%d\t", A[i][j]);
            else
                printf("\t", A[i][j]);
        }
        printf("\n");
        }
    printf("\nElementi ispod sporedne dijagonale su: \n");
    for(i = 0; i < n; i++)
        {
        for (j = 0; j < n; j++)
        {
            if (i + j > n - 1)
                printf("%d\t", A[i][j]);
            else
                printf("\t", A[i][j]);
        }
        printf("\n");
        }	
    return 0;
}

Излаз:

Unesite broj redova odnosno kolona: 3
Unesite elemente matrice:
A[0][0] = 1
A[0][1] = 2
A[0][2] = 3
A[1][0] = 4
A[1][1] = 5
A[1][2] = 6
A[2][0] = 7
A[2][1] = 8
A[2][2] = 9

Uneli ste matricu:
1       2       3
4       5       6
7       8       9

Elementi iznad sporedne dijagonale su:
1       2
4

Elementi ispod sporedne dijagonale su:

                6
        8       9

Проласци кроз матрицу

Видели смо како можемо проћи кроз матрицу користећи два циклуса и одговарајуће услове. Пробајмо сада да те циклусе што више упростимо. Код приступа елементима по редовима и колонама немамо промене, док ћемо видети како можемо преуредити све остале проласке. Ако нисте сигурни, можете увек користити два циклуса и услов.

Посматрајмо сада неке случајеве.

  • Циклуси за обилазак матрице по редовима:

for (i = 0; i < r; i++)
    for (j = 0; j < k; j++)
        {
            //Upotreba elemenata a[i][j]
        }
  • Циклуси за обилазак матрице по колонама:

for (j = 0; j < k; j++)
    for (i = 0; i < r; i++)
        {
            //Upotreba elemenata a[i][j]
        }

Главна и споредна дијагонала, као и троуглови изнад и испод њих постоје само код квадратне матрице. Код квадратне матрице број реова мора бити једнак броју колона па ћемо у наредним примерима посматрати да је број редова једнак броју колона n = r = k.

  • Циклуси за обилазак матрице по главној дијагонали:

Услов за елементе на главној дијагонали је да је индекс i = j

    for (i = 0; i < n; i++)
        {
            //Upotreba elemenata a[i][i]
        }
  • Циклуси за обилазак матрице по споредној дијагонали:

Услов за елементе на споредној дијагонали је да је i + j = n - 1

    for (i = 0; i < n; i++)
        {
            //Upotreba elemenata a[i][n - 1 - i]
        }
  • Циклуси за обилазак матрице по споредној дијагонали – један циклус:

    for (i = 0, j = (n - 1); i < n; i++, j--)
        {
            //Upotreba elemenata a[i][j]
        }

Следе циклуси за обилазак матрице по троугловима изнад и испод главне дијагонале:

  • Циклуси за обилазак матрице по горњем троуглу по редовима (врстама) :

Услов за елементе у горњем троуглу је да је индекс i < j

    for (i = 0; i < n - 1; i++)
        for (j = i + 1; j < n; j++)
            {
                //Upotreba elemenata a[i][j]
            }
  • Циклуси за обилазак матрице по горњем троуглу по колонама:

Услов за елементе у горњем троуглу је да је индекс i < j

    for (j = 0; j < n; j++)
        for (i = 0; i < j; i++)
            {
                //Upotreba elemenata a[i][j]
            }
  • Циклуси за обилазак матрице по доњем троуглу по колонама:

Услов за елементе у доњем троуглу је да је индекс i > j

    for (j = 0; j < n - 1; j++)
        for (i = j + 1; i < n; i++)
            {
                //Upotreba elemenata a[i][j]
            }
  • Циклуси за обилазак матрице по доњем троуглу по редовима (врстама):

Услов за елементе у доњем троуглу је да је индекс i > j

    for (i = 1; i < n - 1; i++)
        for (j = 0; j < i; j++)
            {
                //Upotreba elemenata a[i][j]
            }

На основу горњих циклуса креирати програме за приказ свих могућих циклуса за пролазак кроз матрицу. Пробајте за домаћи да дефинишете циклусе за обиласке троуглова изнад и испод споредне дијагонале.