Materijali/Čas 09

Čas 09 · Dva indeksa i osnovni prolazi

Matrice: redovi, kolone i dijagonale

Matrica čuva podatke u vrstama i kolonama. Vežbamo dva indeksa, ugnježdene petlje, rezultate po vrstama i kolonama, dijagonale i osnovne oblasti kvadratne matrice.

MAPA ČASA

Element → obilazak → vrste i kolone → dijagonale → oblasti

1
A[i][j]
2
ugnježdene petlje
3
vrste i kolone
4
dijagonale
5
oblasti

Na kraju je dovoljno da:

  • Odredi element matrice na osnovu indeksa vrste i kolone.
  • Napiši unos i ispis matrice pomoću dve petlje.
  • Izračunaj rezultat za svaku vrstu ili svaku kolonu.
  • Pronađi prvu vrstu ili kolonu sa najvećim zbirom.
  • Napiši uslove za glavnu i sporednu dijagonalu.
  • Prevedi opis oblasti matrice u uslov sa indeksima.

01 · KORAK

Jedno polje određuju dva indeksa

U zapisu A[i][j], i je indeks vrste, a j indeks kolone. Indeksi počinju od nule, pa korišćeni deo matrice sa n vrsta i m kolona završava na A[n - 1][m - 1].

Deklaracija int A[10][12] rezerviše mesto za najviše 10 vrsta i 12 kolona. Vrednosti n i m govore koliki deo tog kapaciteta trenutno koristimo.

int A[10][12];
int n = 3, m = 4;

/* poslednji element korišćenog dela */
printf("%d\n", A[n - 1][m - 1]);
Pročitaj koordinateZa matricu sa 3 vrste i 4 kolone odredi gde se nalaze A[0][2], A[2][0] i A[2][3]. Zatim proveri zašto A[3][0] i A[2][4] nisu deo korišćene matrice.
Kapacitet nije trenutna veličinaA[10][12] ima kapacitet 120 elemenata, ali ako su n = 3 i m = 4, petlje smeju da koriste samo 12 elemenata od A[0][0] do A[2][3].

02 · KORAK

Spolja vrsta, unutra kolona

Za uobičajen obilazak matrice spoljašnja petlja bira vrstu i, a unutrašnja prolazi kroz sve kolone j te vrste. Tek kada se završi unutrašnja petlja, prelazimo u sledeću vrstu.

Isti par petlji koristimo za unos, ispis i obradu svakog elementa. Menja se samo naredba unutar unutrašnje petlje.

for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        scanf("%d", &A[i][j]);
    }
}

for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) printf("%d ", A[i][j]);
    printf("\n");
}
Prati prvih osam korakaZa matricu 3 x 4 napiši parove (i, j) za prvih osam prolazaka. Zatim zameni mesta petljama i objasni kako se menja redosled obilaska.
Najčešća granicaZa n vrsta i m kolona granice su i < n i j < m. Uslovi i <= n ili j <= m odlaze jedan korak izvan korišćenog dela.

03 · KORAK

Svaka vrsta dobija svoj rezultat

Kada računamo zbir svake vrste, zbir mora da se vrati na nulu na početku svake nove vrste. Zato se nalazi unutar spoljašnje petlje, neposredno pre petlje po kolonama.

Ako tražimo vrstu sa najvećim zbirom, bezbedno je najpre izračunati zbir vrste 0. Tako program radi i kada su svi zbirovi negativni. Operator > zadržava prvu vrstu u slučaju jednakih maksimuma.

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

for (int i = 1; i < n; i++) {
    int zbir = 0;
    for (int j = 0; j < m; j++) zbir += A[i][j];
    if (zbir > max_suma) {
        max_suma = zbir;
        imax = i;
    }
}
Prvo predvidi, zatim napiši programZa vrste 4 -3 8 1, zatim -5 -2 -7 -1 i 6 0 3 9 izračunaj zbirove i odredi indeks najvećeg. Posle toga napiši ceo program koji isti postupak radi za unetu matricu.
Zbir na pogrešnom mestuAko je int zbir = 0 napisan pre spoljašnje petlje, druga vrsta nastavlja da sabira rezultat prve. To više nije zbir jedne vrste.

04 · KORAK

Za obradu kolona menjamo uloge petlji

Kada želimo poseban rezultat za svaku kolonu, prvo biramo kolonu j. Zatim i prolazi od prve do poslednje vrste i uzima A[i][j].

Za prikaz izabrane kolone j ostaje isti, a menja se samo i. Ovaj obrazac se koristi u zadacima koji traže zbir, minimum, broj negativnih ili kolonu sa najvećim zbirom.

for (int j = 0; j < m; j++) {
    int zbir = 0;
    for (int i = 0; i < n; i++) {
        zbir += A[i][j];
    }
    printf("Kolona %d: %d\n", j, zbir);
}
Prikaži najbolju kolonuNapiši program koji nalazi kolonu sa najvećim zbirom, pa prikazuje njen indeks, zbir i sve njene elemente odozgo nadole.
Ne mešaj indeks i vrednostjmax čuva broj kolone. Elementi te kolone su A[0][jmax], A[1][jmax] i tako dalje.

05 · KORAK

Dijagonale imaju pravilo za indekse

Glavna dijagonala kvadratne matrice ima jednake indekse: i == j. Sporedna dijagonala ima zbir indeksa n - 1: i + j == n - 1.

Obe dijagonale možemo obraditi jednom petljom. A[i][i] uzima element glavne, a A[i][n - 1 - i] element sporedne dijagonale. Kod neparnog n srednji element pripada obema.

int suma_g = 0, suma_s = 0;
for (int i = 0; i < n; i++) {
    suma_g += A[i][i];
    suma_s += A[i][n - 1 - i];
}
Obe dijagonale bez traženja napametZa matricu reda 5 napiši parove indeksa obe dijagonale. Zatim odredi koji element pripada obema i kako se računa zbir unije dijagonala bez ponavljanja srednjeg elementa.
Dijagonale traže kvadratnu matricuU ovom gradivu uslovi za glavnu i sporednu dijagonalu koristimo za matricu n x n.

06 · KORAK

Strogo iznad i strogo ispod znači bez dijagonale

U odnosu na glavnu dijagonalu važi: i < j iznad, i == j na dijagonali i i > j ispod. U odnosu na sporednu gledamo i + j: manje od n - 1 je iznad, jednako je na dijagonali, a veće je ispod.

Reč strogo je važna: koristi < ili >, bez znaka jednakosti. Kada zadatak poredi dve oblasti, svaka suma ima svoj nezavisan uslov.

int ispod_glavne = 0, ispod_sporedne = 0;
for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        if (i > j) ispod_glavne += A[i][j];
        if (i + j > n - 1) ispod_sporedne += A[i][j];
    }
}
Uporedi dve oblastiZa matricu 1 2 3 / 4 5 6 / 7 8 9 označi elemente strogo ispod glavne i strogo ispod sporedne dijagonale. Izračunaj obe sume, pa napiši ceo program.
Obrazac sa pismenih zadatakaU ranijim ispitnim zadacima traženo je poređenje zbirova oblasti ispod glavne i sporedne dijagonale. Najvažniji korak je da uslove napišeš iz indeksa, a zatim proveriš na maloj matrici.

ZATVARANJE

Kratka provera bez gledanja

  1. Koji indeks bira vrstu, a koji kolonu u A[i][j]?
  2. Gde postavljaš zbir na nulu kada računaš zbir svake vrste?
  3. Koja petlja je spoljašnja kada obrađuješ kolone?
  4. Koji su uslovi za glavnu i sporednu dijagonalu?
  5. Koja je razlika između i < j i i <= j?
  6. Kako bezbedno postavljaš početni najveći zbir ako svi zbirovi mogu biti negativni?