Materijali/Čas 10

Čas 10 · uslov, zamena vrste i nova matrica

Transformacije matrica

Sada ne računamo samo rezultat iz matrice, već menjamo izabrane elemente, premeštamo celu vrstu i gradimo novu matricu po preciznom pravilu.

MAPA ČASA

Od ideje do prvog C programa

1
program
2
podaci
3
promenljiva
4
pseudokod
5
C program

Na kraju je dovoljno da:

  • Promeni samo elemente koji ispunjavaju uslov položaja i vrednosti.
  • Pronađi traženu vrstu i zameni sve njene elemente sa drugom vrstom.
  • Napravi novu matricu tako da originalni podaci ostanu sačuvani.
  • Transponuj pravougaonu matricu i pravilno zameni granice pri ispisu.
  • Podeli matricu na četiri kvadranta i preskoči srednju vrstu ili kolonu kada postoje.

01 · KORAK

Dve petlje obilaze sve, uslov bira šta se menja

Kada menjamo samo deo matrice, petlje i dalje mogu da obiđu svaki element. Uslov unutar petlji odlučuje da li trenutni A[i][j] ostaje isti ili dobija novu vrednost.

Uslov često spaja položaj i vrednost. Na primer, i > j bira polja ispod glavne dijagonale, a A[i][j] < 0 među njima bira samo negativne elemente.

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        if (i > j && A[i][j] < 0) {
            A[i][j] = -A[i][j];
        }
    }
}
Odredi tačno koja polja se menjajuZa matricu 4 x 4 najpre napiši indekse svih negativnih elemenata, a zatim zadrži samo one za koje važi i > j. Tek posle toga napiši izmenjenu matricu.
Oba uslova moraju biti tačnaOperator && znači da se element menja samo kada je istovremeno na traženom mestu i ima traženu vrednost. Element koji ispunjava samo jedan uslov ostaje isti.

02 · KORAK

Jedan rezultat može redom da menja dijagonalu

Najpre se iz originalne matrice izračuna suma glavne dijagonale. Tek zatim se obilazi sporedna dijagonala i koristi indeks A[i][n - 1 - i].

Promenljiva znak počinje od 1. Posle svake promene znak = -znak menja 1 u -1, pa ponovo u 1. Tako ista petlja redom dodaje, oduzima, dodaje i oduzima sumu.

int suma = 0;
for (int i = 0; i < n; i++) suma += A[i][i];

int znak = 1;
for (int i = 0; i < n; i++) {
    A[i][n - 1 - i] += znak * suma;
    znak = -znak;
}
Prati četiri promeneZa matricu 4 x 4 sa brojevima od 1 do 16 izračunaj sumu glavne dijagonale, pa u tabeli napiši staru i novu vrednost svakog elementa sporedne dijagonale.
Redosled faza je deo algoritmaSumu glavne dijagonale izračunaj pre menjanja matrice. Kod neparnog reda srednji element pripada obema dijagonalama, pa bi kasnije računanje moglo da koristi već promenjenu vrednost.

03 · KORAK

Prvo pronađi indeks, zatim zameni celu vrstu

Traženje vrste i njena zamena su dve odvojene faze. Najpre izračunamo zbir svake vrste i zapamtimo indeks imax. Ako svi zbirovi mogu biti negativni, početni maksimum mora biti zbir vrste 0, a ne broj 0.

Kada je imax poznat, jedna petlja po kolonama menja A[0][j] i A[imax][j]. Zamena samo promenljivih 0 i imax ne bi pomerila nijedan podatak u matrici.

int imax = 0, max_suma = 0;
for (int j = 0; j < n; j++) max_suma += A[0][j];

for (int i = 1; i < n; i++) {
    int zbir = 0;
    for (int j = 0; j < n; j++) zbir += A[i][j];
    if (zbir > max_suma) {
        max_suma = zbir;
        imax = i;
    }
}

for (int j = 0; j < n; j++) {
    int pomocna = A[0][j];
    A[0][j] = A[imax][j];
    A[imax][j] = pomocna;
}
Proveri i negativan primerNapiši program koji vrstu sa najvećim zbirom premešta na početak. Proveri običan primer, primer u kome je najbolja već vrsta 0 i matricu u kojoj su svi zbirovi negativni.
Prva pri jednakostiUslov zbir > max_suma zadržava raniju vrstu kada su zbirovi jednaki. Ako zadatak traži poslednju takvu vrstu, uslov bi morao da bude >=.

04 · KORAK

Nova matrica čuva originalne susede

Ako A[i][j] treba da bude prosek B[i][j] i njegovog desnog suseda, svaki rezultat mora da koristi dve vrednosti iz originalne matrice B. Zato rezultat upisujemo u posebnu matricu A.

Izraz (j + 1) % m daje sledeću kolonu. Za poslednju kolonu rezultat je 0, pa se kao desni sused koristi prvi element iste vrste. Deljenje sa 2.0 čuva decimalni deo.

for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        int desni = (j + 1) % m;
        A[i][j] = (B[i][j] + B[i][desni]) / 2.0;
    }
}
Izračunaj novu matricuZa vrstu 4, 9, 2, 7 napiši četiri para suseda i četiri proseka. Posebno objasni koji par se koristi za poslednji element.
Zašto ne menjamo B sleva nadesnoKada bi se B menjao na mestu, poslednji element bi kao desnog suseda koristio već promenjeni B[i][0]. Tada rezultat više ne bi bio napravljen samo od originalnih podataka.

05 · KORAK

Kod transponovanja vrste postaju kolone

Transponovanje menja uloge indeksa: element A[i][j] prelazi u B[j][i]. Ako A ima n vrsta i m kolona, B ima m vrsta i n kolona.

Petlje za formiranje B obilaze originalne dimenzije i < n i j < m. Petlje za prikaz B koriste obrnute granice: i < m i j < n.

for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
        B[j][i] = A[i][j];

for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) printf("%d ", B[i][j]);
    printf("\n");
}
Proveri na pravougaonoj matriciTransponuj matricu 2 x 3 i napiši prvih šest dodela u obliku B[...][...] = A[...][...]. Zatim napiši dimenzije dobijene matrice.
Kvadratna matrica može da sakrije greškuAko testiraš samo matricu n x n, pogrešne granice pri ispisu mogu ostati neprimećene. Bar jedan probni primer neka bude pravougaon, na primer 2 x 3.

06 · KORAK

Četiri oblasti mogu da daju matricu 2 x 2

Matrica se može podeliti na gore-levo, gore-desno, dole-levo i dole-desno. Kada je broj vrsta neparan, srednja vrsta se preskače; kada je broj kolona neparan, preskače se srednja kolona.

Posle preskakanja, i < n / 2 bira gornju polovinu, a ostali redovi donju. Isto važi za j i levu ili desnu polovinu. Četiri zbira smeštamo u B[0][0], B[0][1], B[1][0] i B[1][1].

int B[2][2] = {0};
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        if ((n % 2 == 1 && i == n / 2) ||
            (m % 2 == 1 && j == m / 2)) continue;

        int bi, bj;
        if (i < n / 2) bi = 0; else bi = 1;
        if (j < m / 2) bj = 0; else bj = 1;
        B[bi][bj] += A[i][j];
    }
}
Podeli matricu 5 x 7Za matricu 5 x 7 obeleži srednju vrstu i kolonu, zatim odredi kojem B elementu pripadaju preostala polja. Na kraju izračunaj četiri zbira.
Sredina se preskače samo kada postojiKod parnog broja vrsta nema jedne srednje vrste, pa se nijedna ne preskače. Zato se u uslovu proverava i n % 2 == 1. Isto pravilo važi za kolone.

ZATVARANJE

Brza provera pre domaćeg

  1. Koja je razlika između algoritma i programa?
  2. Šta je ime, a šta vrednost promenljive?
  3. Kako svojim rečima čitaš x = x + 1?
  4. Koji red prvog programa računa, a koji prikazuje rezultat?