PDF

Viacrozmerné pole

ôsma prednáška

Formát
PDF
Veľkosť
469 kB
Pridané
Stiahnutí
1 434
Stiahnuť PDF · 469 kB

Preber 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.

Otvoriť AI: ChatGPT · Claude · Gemini

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.