pr1j_08_polia.ppt
Stiahnuť PPT · 775 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
Zoznamy
polia
– základné operácie
– celočíselné pole
– pole reťazcov
konštanty
náhodné čísla
usporiadanie údajov v poli
viacrozmerné polia
Uchovanie údajov
doposiaľ sme sa stretli s úlohami typu:
–
vyhľadať v zozname maximálnu/minimálnu hodnotu
–
zistiť priemer zadaného zoznamu
–
zistiť počet žien v zadanom zozname a pod.
úlohy sme riešili tak, že:
–
hodnotu sme prečítali, spracovali...
–
... a zabudli => viac sme sa k nej nedokázali vrátiť
v praxi sa často stretávame s postupom:
–
načítať údaje
–
spracovať údaje po 1. raz, po 2. raz atď. – údaje
máme k dispozícii prakticky neustále
Údaje rovnakého typu v pamäti
pokiaľ by sme chceli v pamäti uchovávať údaje
rovnakého typu (pre jednoduchosť uvažujme len
integer), potrebovali by sme nasledovnú konštrukciu:
int prvaPremenna;
int druhaPremenna;
...
int x-taPremenna;
čo by bol náročné ako na písanie zdrojového kódu, tak
i na samotné programovanie
– každú operáciu by bolo nutné naprogramovať pre každú
premennú osobitne,
– napr. prvapremenna++; druhapremenna++ atď.
Pole - array
našťastie, rovnako ako vieme indexovať znaky v
stringu, dokážeme vytvoriť aj zoznam celých
čísel
údajový typ umožňujúci takúto prácu s údajmi
sa označuje ako pole – array
vo všeobecnosti pole predstavuje zoznam
hodnôt rovnakého typu
Vytvorenie
pokiaľ chceme pole používať, potrebujeme túto informáciu
oznámiť:
– pole deklaruje prostredníctvom []:
int[] mojePole; // alebo
int tvojePole[];
–
mojePole a tvojePole sú odkazy na celočíselné polia, ale ešte im
nie je priradená žiadna pamäť.
mojePole = new int[100]; // pole 100 cisel
– kľúčové slovo new vyhradzuje pamäť mojePole a int[100] určuje
kapacitu pre 100 premenných typu int.
Štandardný zápis
pre zjednodušenie a zvýšenie prehľadnosti môžeme zápis
realizovať ako:
int[] mojePole = new int[2];
pole sa začína od nulového indexu a posledný prvok má
index pocetPrvkov – 1
informáciu o počte prvkov poskytuje zápis
pocetPrvkov = mojePole.length;
počet prvkov v poli nemožno meniť
Inicializácia poľa
po vytvorení sú v poli typu int uložené hodnoty 0.
počas behu programu možno hodnotu vložiť nasledovne:
mojePole[3] = 7;
pole sa možno už pri deklarácii inicializovať na požadované
hodnoty (a takýmto zápisom zároveň určiť, koľko prvkov pole bude
mať:
int[] mojePole={2,8,15,22,34};// pole s 5 prvkami
veľkosť poľa je určená počtom počiatočných hodnôt, a tým pádom
pre definíciu pola nie je potrebná žiadna ďalšia informácia.
–
pokiaľ sa zadajú inicializačné hodnoty pre pole, tak musia byť uvedené
hodnoty všetkých prvkov
–
pre nastavenie iba niektorých prvkov pola na určitú hodnotu je nutné použiť
priraďovacie príkazy
Príklad
Pre zadané pole čísel nájdite maximum.
Riešenie
public static void main(String[] args) {
int[] pole={2,8,15,22,34,12,15,87,98,54};
int max = pole[0];
for(int i=0;i<pole.length;i++) {
if (pole[i]>max) max = pole[i];
}
System.out.println(max);
}
Pole typu string
pole typu int je po vzniku inicializované na
hodnoty 0
pole typu string NEMÁ DEFINOVANÉ
hodnoty, preto je ho pred použitím potrebné
naplniť
Príklad
Zistite, koľkokrát sa v poli s definovanými
textovými hodnotami nachádza zadané meno.
Riešenie
public static void main(String[] args) {
String[] pole={"Eva","Anna","Jan","Eva",
"Jan","Eva"};
int pocet = 0;
String meno = JOptionPane.showID("meno");
for(int i=0;i<pole.length;i++) {
if (meno.compareTo(pole[i])==0) pocet++;
}
System.out.println(pocet);
}
Príklad
Pre číslo zadané ako string zistite počet
výskytov jednotlivých cifier a vypíšte ich.
Riešenie
public static void main(String[] args) {
int[] pole= new int[10];
int cifra;
String ret = JOptionPane.showID("cislo");
for(int i=0;i<ret.length();i++) {
cifra=Integer.parseInt(ret.substring(i, i+1));
pole[cifra]++;
}
for(int i=0;i<10;i++)
System.out.println(i+"-"+pole[i]);
}
Premenné
doposiaľ sme sa stretávali s premennými, ktoré
počas behu programu menili svoju hodnotu
– výnimkou bol v určitom zmysle len string
sú situácie, keď je žiaduce, aby hodnotu
premennej nebolo možné počas behu programu
zmeniť
Premenné nemenné
ak napr. vyhradíme pamäťový priestor pre pole:
– je vhodné pamätať si počet vyhradených
pamäťových miest, aby sme ho mohli v prípade
potreby zväčšiť/zmenšiť na jednom mieste
– je nevhodné dovoliť zmeniť počas behu programu
hodnotu premennej obsahujúcu informáciu o počte
prvkov v poli
možno samozrejme namietnuť, že táto informácia je
uložená v informácii pole.length
Príklad
public static void main(String[] args) {
int pocet=10;
int[] pole=new int[pocet];
for(int i=0;i<pocet;i++) {
pole[i]=i;
}
// tu by sme nebodaj pocet zmenili
pocet=15;
for(int i=0;i<pocet;i++) {
System.out.println(pole[i]);
}
}
Konštanty – konštantné premenné
premenná označená ako konštantná zabraňuje
akejkoľvek zmene jej hodnoty.
– ak raz inicializujeme premennú na nejakú hodnotu a
označíme ju ako konštantnú pomocou kľúčového slova final,
tak jej hodnota je nemenná
– akýkoľvek pokus o zmenu hodnoty konštantnej premennej je
považovaný za chybu už v prostredí, a teda nemožný
final int pocet = 10;
– môžeme ju aj najprv deklarovať a až potom jej priradiť
hodnotu – avšak len RAZ
Náhodné číslo
zadávanie hodnôt do poľa
– manuálnym zápisom v kóde: pole[1]=5; pole[2]=7; atď
– vkladaním v deklarácii
– vkladaním do poľa prostredníctvom používateľského dialógu
(JOptionPane)
rýchlejší spôsob predstavuje vloženie náhodných
hodnôt
vrátenie náhodného čísla zabezpečí funkcia
Math.random(),
ktorá vráti reálnu hodnotu z intervalu <0,1) - rozsah
zahŕňa aj hodnotu 0.0 hodnotu 1.0 však nie.
– inými slovami: 0.0 <= Math.random() < 1.0.
Náhodné čísla >1
pokiaľ chceme získať väčšie hodnoty, je potrebné
vynásobiť získanú hodnotu maximálnou hodnotou
našej požiadavky,
pokiaľ chceme vygenerovať celé číslo, je potrebné
pretypovanie:
int cislo = (int)(Math.random() * 9);
– ak do celočíselnej premennej vložíme
Math.random()*9, získame náhodnú hodnotu 0-8
– ak do reálnej premennej vložíme hodnotu
Math.random()*5, získame hodnotu 0-4.99999999999....
Náhodné hodnoty z intervalu
Math.random()*i vráti hodnotu 0-i, okrem i
ak chceme hodnoty napr. od 5 do 10, potrebujeme
výpočet upraviť
–
interval, v ktorom požadujeme náhodnosť, má rozsah 5
–
získanú hodnotu treba zvýšiť o 5
int x = (int) (5 + Math.random()*5)
–
minimálna hodnota bude 5+0, t.j. 5
–
maximálna hodnota bude 5+4, resp. 5+4.999999999, t.j. skoro
10
Náhodné hodnoty z intervalu
ak chceme hodnoty napr. od -5 do 5, postupujeme
nasledovne:
– rozsah intervalu je 10, minimálna hodnota –5 =>
int x = (int) (-5 + Math.random()*10)
– resp. ak požadujeme aj hodnotu 5
int x = (int) (-5 + Math.random()*11)
Vloženie náhodných hodnôt do poľa
vezmime interval <-50,50)
public static void main(String[] args) {
int[] pole= new int[10];
for(int i=0;i<pole.length;i++) {
pole[i] = (int) (-50+Math.random()*100);
System.out.println(pole[i]);
}
}
Usporiadanie údajov v poli
kritérium pre usporiadanie
–
číselné (0,1,2,10,11,20...)
–
textové (0,1,10,11,2,20...)
usporiadanie = triedenie
triediace algoritmy
–
usporiadajú údaje rôznymi algoritmami
–
najjednoduchší (ale aj jeden z najpomalších) =
BUBBLE-SORT
Bubble-sort
porovnáva susedné prvky
–
ak je pravý menší ako ľavý vymení ich
po prvom prechode bude na konci zoznamu najväčšie číslo
Bubble-sort prechod
po druhom prechode bude zaradený
predposledný atď.
Bubble-sort analýza
počet prechodov bude n-1, pretože:
–
pri prvom prechode je na svojom mieste 1. prvok
–
pri druhom prechode 2. prvok
–
atď. až pri n-1 prechode n-1. prvok a tým pádom aj
posledný
pri prechodoch sa porovnávajú susedné prvky,
nemusíme však ísť až do konca, vždy je pri
ďalšom prechode potrebné skúmať o jeden
prvok menej
Bubble-sort program
for(int i=0;i<pole.length-1;i++) {
for(int j=0;j<pole.length-i-1;j++) {
if (pole[j]>pole[j+1]) {
pom = pole[j];
pole[j] = pole[j+1];
pole[j+1] = pom;
}
}
}
Viacrozmerné polia
doposiaľ sme sa stretávali s jednorozmernými poľami
okrem nich existujú i dvoj- a viacrozmerné
–
dvojrozmerné pole sa často označuje ako matica a možno si
ho predstaviť ako tabuľku so stĺpcami a riadkami
–
jeho vytvorenie môže mať podobu:
int[][] moje2DPole = new int[3][3];
–
možno vytvárať aj viacrozmerné polia, ktorých deklarácia
pozostáva z troch a viac indexov v hranatých zátvorkách...
Viacrozmerné polia - práca
prístup k položkám:
moje2DPole[1][3] = 48;
–
a nie
moje2DPole[1,3] = 48;
Príklady na riešenie
Napíšte program na určenie počtu výskytov daného prvku v poli a výpis indexov
jeho výskytu.
Zostavte program na určenie prvého a posledného výskytu daného prvku v poli.
Napíšte program na určenie počtu kladných, nulových a záporných čísel v
jednorozmernom poli.
Napíšte program na presun prvkov jednorozmerného poľa tak, aby na začiatku
boli záporné, potom nulové a nakoniec kladné čísla.
Napíšte program na výpis žiakov z poľa podľa začiatočného písmena
priezviska.
Napíšte program na výpis žiakov z poľa podľa dĺžky priezviska.
Napíšte program na výpis žiakov z poľa podľa abecedy.
Napíšte program na porovnanie dvoch polí (nech vypíše v koľkých prvkoch sa
polia zhodujú – zhodné sú prvky s rovnakou hodnotou na rovnakej pozícii).
Vymažte v poli všetky prvky obsahujúce zadanú hodnotu tak, že prvky poľa
nachádzajúce sa za mazanou hodnotou „posuniete doľava“.
Pre zadaný reťazec zistite počet výskytov jednotlivých znakov (‘a’ – ‘z’) vypíšte
ich.
Napíšte program na zistenie výskytu zadanej hodnoty v dvojrozmernom poli.
Napíšte program, ktorý v matici nepárne čísla vynásobí dvoma a párne prepíše
na 1. Pri výpise dbajte na vzhľad matice.
Napíšte program na sčítavanie dvoch matíc.
Document Outline
- Slide 1
- Slide 2
- Slide 3
- Slide 4
- Slide 5
- Slide 6
- Slide 7
- Slide 8
- Slide 9
- Slide 10
- Slide 11
- Slide 12
- Slide 13
- Slide 14
- Slide 15
- Slide 16
- Slide 17
- Slide 18
- Slide 19
- Slide 20
- Slide 21
- Slide 22
- Slide 23
- Slide 24
- Slide 25
- Slide 26
- Slide 27
- Slide 28
- Slide 29
- Slide 30
- Slide 31
Automaticky vygenerovaný textový náhľad. Pre plné formátovanie si stiahnite súbor.
nechodím na prednášky