180 likes | 360 Views
Tabele, zanka for, konstante,. Zgled. Janko Vremenar si že vrsto let skrbno beleži količino mesečnih padavin. Tako je zbral podatke o padavinah za vsak mesec od leta 1999 do 2005. Radi bi: Našli mesec, ko je bilo nasploh največ padavin Našli leto, v katerem je bilo najmanj padavin
E N D
Zgled • Janko Vremenar si že vrsto let skrbno beleži količino mesečnih padavin. Tako je zbral podatke o padavinah za vsak mesec od leta 1999 do 2005. • Radi bi: • Našli mesec, ko je bilo nasploh največ padavin • Našli leto, v katerem je bilo najmanj padavin • Našli vsa leta, v katerih je količina padavin v marcu bila podpovprečna • ... • Kje hraniti podatke: • Dvodimenzionalna tabela • V stolpcih leta • V vrsticah meseci • Imena stolpcev (leta) in imena mesecev bomo hranili v posebnih tabelah
Dvo (in več) dimenzionalne tabele • int[][] razpredelnica; • razpredelnica = new int[10][6]; • Tabela velikosti 10 x 6 • razpredelnica[2][3] • tretji (no ja, dejansko četrti ;-) ) element druge (beri: z indeksom 2) vrstice • Spremenljivka za hranjenje celega števila • razpredelnica[2] • kaj je to? • Tabela celih števil!
Dvo (in več) dimenzionalne tabele • Kako določiti dimenzijo – 2. način • Dva koraka • razpredelnica = new int[10]; • S tem smo določili, da imamo 10 vrstic (0, .., 9) • razpredelnica[0], razpredelnica[1], ..., razpredelnica[9] • To so tabele • Zaenkrat še neznane velikosti • Drugi korak • Vsaki od tabel določimo velikost • Vsaka vrstica ima lahko svoje število stolpcev, če je potrebno! • kje = 0;while (kje < 10) { razpredelnica[kje] = new int[6]; kje = kje + 1;}
Naš zgled • 12 mesecev, 7 let, torej: • int[][] padavine = new int[12][7]; • Leta • int[] leta = new int[7];leta[0] = 1999;leta[1] = 2000;...leta[6] = 2005; • Gre hitreje • int[] leta = {1999, 2000, 2001, 2002, 2003, 2004, 2005}; • Povsem isto kot zgoraj, le drug zapis! • Na ta način lahko "polnimo" tabelo le ob deklaraciji! Kasneje ne!
Velikost tabele • tabela.length nam pove velikost tabele • Če torej • double[] x = new double[23]; • nam • x.length • vrne 23!
Konstante - final • Načeloma teorija pravi, da v programu ne smemo imeti konstant (vrednosti, ki se ne spreminjajo) "prosto tavajočih okrog" • S tem bo bolj jasno, kaj so. Namesto • cena = 215 * l + (7500 - 1.5 * l); • je bolje • int cenaPrevoza = 7500; • double popustnaLiter = 1.5; • int cenaOlja = 215; • cena = cenaOlja * l + (cenaPrevoza - popust * l); • Lahko pa tudi (še bolje) • final int cenaPrevoza = 7500; • final double popustnaLiter = 1.5; • final int cenaOlja = 215; • Določilofinal • Gre za konstanto (vrednost v tej spremenljivki se ne spreminja)
Zakaj imena in ne kar npr. 100 • V programu imamo dele kode • int[] tabela = new tabela[100]; • if (x < 100) • while (stevec < 100) • (x + 100) / 2 • ... • Ali imajo te vrednosti 100 kaj skupnega? Načeloma lahko le ugibamo! • Popraviti je potrebno velikost tabele (npr. na 200). Katere vrednosti 100 je potrebno spremniti v 200?
Zakaj imena in ne kar npr. 100 - II • Zato raje • int velTabele = 100; • int zgMeja = 100; • Oziroma (če vemo, da je stvar nespremenljiva) • final int velTabele = 100; • final int zgMeja = 100; • In potem • int[] tabela = new tabela[velTabele]; • if (x < zgMeja) • while (stevec < velTabele) • (x + velTabele) / 2 • ... • Sedaj ni problema, če se npr. velikost tabele spremeni. Edina sprememba v kodi: • final int velTabele = 100;
Naš zgled • final int steviloLet = 7; • final int steviloMesecev = 12; • String[] meseci = {"januar", "februar", "marec", "april", "maj", "junij", "julij", "avgust", "september", "oktober", "november", "december"}; • int[] leta = {1999, 2000, 2001, 2002, 2003, 2004, 2005}; • int[][] kolicinaPadavin = new int[steviloMesecev][steviloLet];
Naš zgled - branje • Preberemo podatke • Janko jih ima urejene po letih • indeksLeta = 0;while (indeksLeta < steviloLet) { JOptionPane.showMessageDialog(null, "Vnesi podatke za leto " + leta[indeksLeta]); indeksMeseca = 0; // po vseh mesecih, vedno od 0 dalje while (indeksMeseca < steviloMesecev) { beri = JOptionPane.showInputDialog(meseci[indeksMeseca]+": "); padavine[indeksMeseca][indeksLeta] = Integer.parseInt(beri); indeksMeseca = indeksMeseca + 1; } indeksLeta = indeksLeta + 1; // naslednje leto} • Da bomo ob testiranju hitrejši • Branje nadomestimo z naključnimi števili • maxPadavin = 100; • padavine[indeksMeseca][indeksLeta] = (int)(Math.random() * maxPadavin);
Naš zgled - izpis • Lepo izpišemo podatke • Izpis po mesecih • Zgornja vrstica z leti // izpis imen let indeksLeta = 0; System.out.print("\t\t"); // preskočimo stolpec z imeni mesecev while (indeksLeta < steviloLet) { System.out.print(leta[indeksLeta] + "\t"); indeksLeta = indeksLeta + 1; // naslednje leto } System.out.println(); // nova vrsta // izpis podatkov indeksMeseca = 0; // po vseh mesecih while (indeksMeseca < steviloMesecev) { // izpis padavin za tekoči mesec za vsa leta // ime meseca System.out.print(meseci[indeksMeseca] + "\t"); // vsa leta indeksLeta = 0; System.out.print("\t"); // preskočimo stolpec z imeni mesecev while (indeksLeta < steviloLet) { System.out.print(padavine[indeksMeseca][indeksLeta] + "\t"); indeksLeta = indeksLeta + 1; // naslednje leto } System.out.println(); indeksMeseca = indeksMeseca + 1; // naslednji mesec }
Naš zgled – mesec z najmanj padavin • Radi bi poiskali mesec v katerem je bilo najmanj padavin • Pregledati vse podatke • Dvojna zanka • "Okostje" indeksLeta = 0; while (indeksLeta < steviloLet) { indeksMeseca = 0; // po vseh mesecih, vedno od 0 dalje while (indeksMeseca < steviloMesecev) { // iščemo min *** indeksMeseca = indeksMeseca + 1; } indeksLeta = indeksLeta + 1; // naslednje leto } • Kaj je ***: • Če najdemo boljšega (z manj padavin) od trenutnega, si zapomnimo • Količino padavin • Leto (indeks) • Mesec (indeks)
Iskanje minimuma • Pred zanko // kandidat je kar prvi podatek int minPadavinKolicina = padavine[0][0]; // indeksa - kje dosežemo minimum int minPadavinLeto = 0; int minPadavinMesec = 0; • V zanki if (padavine[indeksMeseca][indeksLeta] < minPadavinKolicina) { minPadavinKolicina = padavine[indeksMeseca][indeksLeta]; minPadavinLeto = indeksLeta; minPadavinMesec = indeksMeseca; } AnalizaPadavin.java
Mimogrede Zanke
Poleg zanke while obstajajo tudi druge • Zelo pogosto: • for for(int i = kam - 1; i >= 0; i--) { System.out.print(tab[i] + " ");} System.out.println();
Zanke - for • for (<akcija pred zanko>; pogoj; <akcija za zanko>) stavek; • Izvedi <akcija pred zanko>. Preveri pogoj. Če je izpolnjen, izvedi stavek. Izvedi <akcija za zanko>. Ponovnopreveri pogoj, … • Načeloma ne potrebujemo – vse lahko naredimo z zanko while (in obratno)
while <-> for • for (int i = 1; i < n; i++) { bla = bla + i;} • lahko zapišemo kot { int i = 1; while (i < n) { bla = bla + i; i++; } } • Zunanji oklepaji – zaradi lokalnosti spremenljivke i