Viacrozmerné pole
ôsma prednáška
Stiahnuť PDF · 469 kBPreber si túto poznámku so svojou AI
Skopíruj pripravený podklad a vlož ho do ChatGPT, Claude alebo inej AI — bude ťa učiť alebo skúšať len z tejto poznámky.
Náhľad poznámky
Fakulta riadenia a informatiky ŽU
Viacrozmerné pole
1/60
Pojmy zavedené v 7. prednáške
Obaľovacie triedy
Primitívne typy ako objekty
Knižnice
balíčky
príkaz import
2/60
Pojmy zavedené v 7. prednáške
Cykly
for
do-while
Operatory ++, --
3/60
Pojmy zavedené v 7. prednáške
Pole
kontajner s pevným počtom prvkov
definícia
Vytvorenie a inicializácia
práca s poľom ako celkom
práca s prvkami poľa
dĺžka poľa - length
4/60
Pojmy zavedené v 7. prednáške
Diagramy aktivít
foreach
while
for
do-while
5/60
Cieľ
Viacrozmerné polia
Vnorené cykly
this
Sekcie rozhrania
Základná práca so súbormi
Projekt: Sudoku
6/60
Sudoku
7/60
Sudoku
Hlavolam
– v každých novinách
Cieľ: čiastočne vyplnenú mriežku doplniť tak, aby
obsahovala každé číslo 1 až 9 práve raz v troch
rôznych zoskupeniach.
8/60
Sudoku
Mriežka 9x9 políčok (aj iné rozmery)
Tri typy zoskupení políčok mriežky
riadky
– 9 riadkov
stĺpce – 9 stĺpcov
bloky 3x3
– 9 blokov v zostave 3x3
9/60
Sudoku
10/60
Sudoku – 1. cieľ projektu
Podpora pre riešiteľa
Požadované funkcie:
zobrazenie mriežky
vloženie čísla do políčka
načítanie zadania
priebežná kontrola pravidiel
11/60
Sudoku – rozhranie
12/60
Sudoku – mriežka
Doteraz
– jednorozmerné problémy
Diár – zápis poznámok pod sebou
Analyzátor logu – hodiny idú po sebe
Sudoku
– dvojrozmerná mriežka
Má políčka vedľa seba aj pod sebou
Podobné úlohy
Šach, Dáma, Skákaná – šachovnica
Krížovky
Maľované krížovky
Matematika
– matice
...
13/60
Polia ako prvky iného poľa
Prvkom poľa môže byť objekt
Môže byť prvkom poľa iné pole?
pole je objekt
=>
prvkami poľa môžu byť aj iné polia
14/60
Polia ako prvky iného poľa
:int[]
9
0
0
1
0
2
0
3
8
4
0
5
0
6
5
7
0
8
:int[]
0
1
2
3
4
5
6
7
8
2
5
0
7
0
0
9
0
4
:int[]
0
1
2
3
4
5
6
7
8
0
1
0
0
9
0
0
0
3
:int[][]
0
1
8
15/60
Pole polí – definícia
Java
– špeciálna syntax – historické dôvody
Definícia poľa:
Definícia poľa polí
typPrvkov[][] menoPola;
typ prvkov
typPrvkov[] menoPola;
typ prvkov
?
16/60
Pole polí – vytvorenie
Java
– špeciálna syntax – historické dôvody
Vytvorenie poľa:
Vytvorenie poľa polí
menoPola = new typPrvkov[pocetPrvkov][];
typ prvkov!!!
menoPola = new typPrvkov[pocetPrvkov];
typ prvkov
17/60
Pole polí – definícia
Java
– špeciálna syntax – historické dôvody
Definícia poľa:
Definícia poľa polí
typPrvkov[][] menoPola;
typ prvkov
typPrvkov[] menoPola;
typ prvkov
18/60
Polia ako prvky iného poľa
:int[][]
0
1
8
mriezka = new int[9][];
19/60
Pole polí – inicializácia
pocetPrvkov
– počet prvkov vnoreného poľa
for (int i = 0; i < pole.length; i++) {
pole[i] = new typPrvkov[pocetPrvkov];
}
20/60
Pole polí – inicializácia
:int[]
0
0
0
1
0
2
0
3
0
4
0
5
0
6
0
7
0
8
:int[]
0
1
2
3
4
5
6
7
8
0
0
0
0
0
0
0
0
0
:int[][]
0
8
for (int i = 0; i < mriezka.length; i++) {
mriezka[i] = new int[9];
}
21/60
Pole polí
prvok-pole
prvky rovnakých rozmerov –> obdĺžniková forma
(matica)
rozmery
– riadky a stĺpce
nepravidelné viacrozmerné polia
jednotlivé riadky – rôzny počet prvkov
22/60
Pole polí – matica
:int[][]
9
0
0
1
0
2
0
3
8
4
0
5
0
6
5
7
0
8
2
5
0
7
0
0
9
0
4
0
0
0
0
0
0
0
8
6
0
8
0
1
3
0
0
0
2
0
0
6
0
4
0
1
0
0
5
0
0
0
6
9
0
4
0
3
7
0
0
0
0
0
0
0
8
0
2
0
0
3
0
1
5
0
1
0
0
9
0
0
0
3
0
1
2
3
4
5
6
7
8
riadok
stĺpec
23/60
Java – prístup k prvkom poľa polí
pomenovanie prvkov
– meno poľa + index riadku
+ index stlpca
0 ≤ index riadku < počet riadkov
0 ≤ index stĺpca < počet stĺpcov
prvok poľa – premenná
operácie – pravidlá pre typ prvkov
index
riadku, index stĺpca – celočíselné
aritmetické výrazy
menoPola[indexRiadku][indexStlpca]
24/60
Java – prístup k prvkom dvojrozmerného poľa
// 3. riadok, 4. stlpec
System.out.println(mriezka[2][3]);
25/60
Java – vytvorenie poľa polí – matica
zjednodušená syntax
príklad
typPrvkov[][] menoPola
= new typPrvkov[pocetRiadkov][pocetStlpcov];
int[][] mriezka = new int[9][9];
26/60
n-rozmerné pole
dvojrozmerné pole – matica
int[][] matica;
trojrozmerné pole
int[][][] kocka;
...
27/60
Sudoku – vnútorný pohľad
28/60
Reprezentácia mriežky Sudoku
Mriežka = matica
prvky matice
– čísla 1-9
Nevyplnené hodnoty?
Náhrada prázdneho políčka číslom mimo
rozsahu 1-9
Môžeme teda použiť číslo 0
29/60
Sudoku – definícia triedy
public class Sudoku
{
private int[][] aMriezka;
...
}
matica celých čísel
30/60
Sudoku – konštruktor
public Sudoku()
{
aMriezka = new int[9][9];
}
matica celých čísel - núl
31/60
Sudoku – metóda načítaj zadanie
Načíta zadanie vložené do zdrojových kódov
Testovacie sudoku
32/60
Vytvorenie poľa polí pomocou konštanty
Vytvorenie a inicializácia poľa:
Vytvorenie a inicializácia poľa polí:
typPrvkov[] menoPola = {zoznamPrvkov};
typPrvkov[][] menoPola = {
{zoznamPrvkovPrvehoRiadku},
{zoznamPrvkovDruhehoRiadku},
…
};
33/60
Vytvorenie poľa pomocou konštanty
S definíciou:
Bez definície:
V prípade inicializácie s definíciou nie je new
povinné – môže sa písať
typPrvkov[] menoPola = {zoznamPrvkov};
menoPola = new typPrvkov[] {zoznamPrvkov};
typPrvkov[] menoPola =
new typPrvkov[] {zoznamPrvkov};
povinn
é
nepovinn
é
34/60
Sudoku – metóda nacitajZadanie
public void nacitajZadanie()
{
aMriezka = new int[][] {
{9, 0, 0, 0, 8, 0, 0, 5, 0},
...
{8, 0, 2, 0, 0, 3, 0, 1, 5},
{0, 1, 0, 0, 9, 0, 0, 0, 3}
};
}
povinn
é
35/60
Sudoku – vykreslenie mriežky
Vypísanie na konzolu
Znaky:
„1“-„9“: Známe hodnoty v mriežke
„.“: Nevyplnená hodnota
36/60
Sudoku – metóda vykresliMriezku
public void vykresliMriezku()
{
for (int riadok = 0; riadok < 9; riadok++) {
this.vykresliRiadok(riadok);
}
}
37/60
Posielanie správ
Digitálne hodiny – objekt celok posiela správy
častiam
Projekt Sudoku
– trieda Sudoku
objekt posiela správy sám sebe
formát správy
adresát.selektor(parametre)
adresát this – kľúčové slovo
implicitný parameter každej metódy
objekt sám seba označuje this (self)
38/60
explicitné použitie this
public void vykresliMriezku()
{
for (int riadok = 0; riadok < 9; riadok++) {
this.vykresliRiadok(riadok);
}
}
objekt si posiela spr
ávu
adresát
39/60
implicitné použitie this
public void vykresliMriezku()
{
for (int riadok = 0; riadok < 9; riadok++) {
vykresliRiadok(riadok);
}
}
this
je podľa syntaxe nepovinné
40/60
Sudoku – metóda vykresliRiadok
public void vykresliRiadok(int paRiadok)
{
for (int stlpec = 0; stlpec < 9; stlpec++) {
System.out.print(aMriezka[paRiadok][stlpec]);
}
System.out.println();
}
41/60
Sekcie rozhrania
verejné – obsahuje správy, ktoré môže poslať
ľubovoľný objekt
definícia triedy obsahuje metódy public
neverejné – obsahuje správy, ktoré si môže
poslať len objekt sám
definícia triedy obsahuje metódy private
42/60
Sekcie rozhrania
existujú neverejné správy
43/60
Sudoku – metóda vykresliRiadok
private void vykresliRiadok(int paRiadok)
{
for (int stlpec = 0; stlpec < 9; stlpec++) {
System.out.print(aMriezka[paRiadok][stlpec]);
}
System.out.println();
}
44/60
Rozdeľuj a panuj
for (int stlpec = 0; stlpec < 9; stlpec++) {
System.out.print(aMriezka[paRiadok][stlpec]);
}
System.out.println();
for (int riadok = 0; riadok < 9; riadok++) {
this.vykresliRiadok(riadok);
}
vykresliMriezku:
vykresliRiadok:
45/60
Urob všetko sám
public void vykresliMriezku()
{
for (int riadok = 0; riadok < 9; riadok++) {
for (int stlpec = 0; stlpec < 9; stlpec++) {
System.out.print(aMriezka[riadok][stlpec]);
}
System.out.println();
}
}
vnorený cyklus
46/60
For-each pre polia
Pole je objekt
Pole je kontainer
Na prechádzanie poľa teda môžeme použiť
for-each
Prvkami dvojrozmerných polí sú polia – riadky
47/60
For-each pre polia - príklad
public void vykresliMriezku()
{
for (int[] riadok : aMriezka) {
for (int policko : riadok) {
System.out.print(policko);
}
System.out.println();
}
}
polia - kontajnery
48/60
Výsledok
mala byť
bodka
49/60
Sudoku – metóda vykresliMriezku
System.out.print(policko);
if (policko == 0) {
System.out.print(".");
} else {
System.out.print(policko);
}
50/60
Výsledok
51/60
Jednoduchá úloha
doplňte deliace čiary pre bloky sudoku
52/60
Sudoku – metóda nastavPolicko
public void nastavPolicko
(int paRiadok, int paStlpec, int paHodnota)
{
if (paRiadok >= 0 && paRiadok < 9 &&
paStlpec >= 0 && paStlpec < 9 &&
paHodnota > 0 && paHodnota <= 9) {
aMriezka[paRiadok][paStlpec] = paHodnota;
}
}
53/60
Priebežné kontroly pravidiel
Kedy kontrolovať?
Odpoveď: pri vkladaní čísla
Typy kontrol:
riadková – nemôžem vložiť číslo, ktoré sa už v riadku
nachádza
stĺpcová – nemôžem vložiť číslo, ktoré sa už v stĺpci
nachádza
bloková – nemôžem vložiť číslo, ktoré sa už v bloku
nachádza
54/60
Sudoku – kontroly
vkladám
kontrola
55/60
Sudoku – metóda kontrolaRiadkova
private boolean kontrolaRiadkova
(int paRiadok, int paHodnota)
{
for (int stlpec = 0; stlpec < 9; stlpec++) {
if (aMriezka[paRiadok][stlpec] == paHodnota) {
return false;
}
}
return true;
}
predčasné ukončenie cyklu
56/60
Sudoku – metóda kontrolaStlpcova
private boolean kontrolaStlpcova
(int paStlpec, int paHodnota)
{
for (int riadok = 0; riadok < 9; riadok++) {
if (aMriezka[riadok][paStlpec] == paHodnota) {
return false;
}
}
return true;
}
57/60
Sudoku – metóda kontrolaBlokova
private boolean kontrolaBlokova
(int paRiadok, int paStlpec, int paHodnota)
{
int startR = (paRiadok/3)*3;
int startS = (paRiadok/3)*3;
...
}
58/60
Sudoku – metóda kontrolaBlokova
…
for (int r = startR; r < (startR + 3); r++) {
for (int s = startS; s < (startS + 3); s++) {
if (aMriezka[r][s] == paHodnota) {
return false;
}
}
}
return true;
…
59/60
Sudoku – metóda kontrola
private boolean kontrola
(int paRiadok, int paStlpec, int paHodnota)
{
return
this.kontrolaRiadkova(paRiadok, paHodnota) &&
this.kontrolaStlpcova(paStlpec, paHodnota) &&
this.kontrolaBlokova
(paRiadok, paStlpec, paHodnota);
}
60/60
Sudoku – metóda nastavPolicko
public void nastavPolicko
(int paRiadok, int paStlpec, int paHodnota)
{
if (paRiadok >= 0 && paRiadok < 9 &&
paStlpec >= 0 && paStlpec < 9 &&
paHodnota > 0 && paHodnota <= 9 &&
this.kontrola(paRiadok, paStlpec, paHodnota)) {
aMriezka[paRiadok][paStlpec] = paHodnota;
}
}
Ďakujem za pozornosť
Automaticky vygenerovaný textový náhľad. Pre plné formátovanie si stiahnite súbor.
nechodím na prednášky