320 likes | 488 Views
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
E N D
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čujekapacitu 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á indexpocetPrvkov – 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.