Programovßnφ v jazyce Java

Kurz programovßnφ v Jav∞ - 9. dφl

 ┌vodem  |  Kurz programovßnφ v Jav∞  |  Kurz programovßnφ v Jav∞ pro mobilnφ telefony  |  Soubory ke sta₧enφ  |  Otßzky a odpov∞di

 

┌vod

V dneÜnφm devßtΘm dφle kurzu se budeme zab²vat poli.


Pole

Pole je skupina prom∞nn²ch stejnΘho datovΘho typu, na kterΘ se lze odkazovat jednφm jmΘnem. JednotlivΘ prom∞nnΘ v poli majφ svoje Φφslo, tzv. index, pomocφ kterΘho lze p°esn∞ urΦit se kterou prom∞nnou v poli chceme pracovat. Existujφ pole jednorozm∞rnß, ale i vφce rozm∞rnß, ukß₧eme si p°φklady obou typ∙. Mo₧nß nejsou v²hody pole zatφm z°ejmΘ, ale nap°φklad uklßdat n∞jak² graf nebo tabulku do jednotliv²ch prom∞nn²ch, kterΘ byste nejd°φve museli deklarovat, potom inicializovat, by vßs moc nebavilo. Na takovΘ p°φpady je pole ideßlnφ kandidßt. P°edstavte si, ₧e pot°ebujete vypoΦφtat vaÜi hrubou mzdu, ale na to je pot°eba v∞d∞t kolik hodin mßte odpracovßno (je to sice trochu zjednoduÜenΘ, ale budeme poΦφtat s tφm, ₧e vÜechny hodiny budou honorovßny stejn∞), prßv∞ odpracovanΘ hodiny za den by se daly zapisovat do jednotliv²ch prvk∙ pole. Nejd°φve deklarujeme pole a vytvo°φme v n∞m 31 prvk∙ typu byte, pro ka₧d² den jeden. Potom ho musφme jeÜt∞ naplnit hodnotami. U₧ te∩ je pole v²hodn∞jÜφ, ne₧ deklarovßnφ 31 prom∞nn²ch, pro kterΘ byste navφc museli vym²Ület nßzvy. Ale hlavnφ v²hody pole teprve p°ijdou. Nap°φklad te∩ m∙₧ete v jednom cyklu vypoΦφtat souΦet hodin vÜech dn∙ nebo souΦet hodin jednotliv²ch t²dn∙, zkrßtka pokud pracujete s vφce prom∞nn²mi stejnΘho typu v₧dy pou₧ijte pole. JeÜt∞ malß poznßmka, zkuste si p°edstavit sΦφtßnφ hodin, kdybyste nepou₧ili pole, t°eba scφtßnφ jen lich²ch dn∙, nebo ka₧dΘho pßtΘho dne, to by byla hr∙za a s polem to vy°eÜφte o dost jednoduÜeji.

Jak se ale pole deklaruje? To vßm ukß₧e nßsledujφcφ p°φklad.

Deklarace a vytvo°enφ pole
...

byte[] dny;
dny = new byte[31];

...
	  

JeÜt∞ jsme si nepovφdali o objektech, ale s poli se pracuje podobn∞ jako s objekty. U objekt∙ se nejd°φve vytvo°φ odkaz, kter² mß specifikovan² datov² typ i nßzev a ten odkazuje na n∞jak² objekt, kter² m∙₧eme p°i°adit pozd∞ji. Na p°edchozφm p°φkladu na prvnφm °ßdku deklarujeme prom∞nnou typu pole, kterß bude obsahovat prom∞nnΘ typu byte a nßzev jsme zvolili dny, v podstat∞ je to jen odkaz na objekt. HranatΘ zßvorky urΦujφ, ₧e se deklaruje pole a ne prom∞nnß jednoduchΘho datovΘho typu, jeden pßr zßvorek znaΦφ ₧e jde o pole jednorozm∞rnΘ. Na dalÜφm °ßdku probφhß vytvo°enφ pole, co₧ je vlastn∞ p°i°azenφ objektu odkazu, kter² byl vytvo°en na prvnφm °ßdku.

V tomto p°φklad∞ je vytvß°eno pole o velikosti 31 prvk∙. Prvnφ prvek bude mφt index 0, pozor na to, proto₧e poslednφ prvek mß index 30. Pole o n prvcφch bude mφt poslednφ prvek s indexem n - 1. Pole je sice vytvo°eno, ale neobsahaju ₧ßdnΘ prvky (pokud je pole celoΦφselnΘho typu, m∞ly by vÜechny prvky mφt hodnotu 0). Inicializovat ho lze p°φmo p°i vytvß°enφ, nebo dodateΦnΘ, t°eba pomocφ cyklu.

Pole m∙₧e b²t jakΘholiv typu, jak jednoduchΘcho, tak objektovΘho.

Te∩ u₧ p°ibli₧n∞ vφte, jak vytvo°it jednorozm∞rnΘ pole, tak p°ejdeme k n∞jakΘmu celΘmu p°φkladu, na kterΘm si ukß₧eme v∞ci, kterΘ lze s polem provßd∞t.

P°φklad pou₧itφ pole
public class ArrayTest {

	   public static void main(String[] args) {
	   
	   int[] pole = {10, 16, 20, 30};  // deklarace a inicializace pole ctyrmi prvky
	   
	   System.out.println("pocet prvku pole: " + pole.length);
	   
	   System.out.println("soucet vsech prvku");
	   int a = 0;
	   for (int i = 0; i < pole.length; i ++) {
	   
	   	   a += pole[i];
	   
	   }
	   System.out.println("soucet hodnot pole: " + a);
	   
	   System.out.println("soucet kazdeho druheho prvku");
	   a = 0;
	   for (int i = 0; i < pole.length; i += 2) {
	   
	   	   a += pole[i];
	   
	   }
	   System.out.println("soucet hodnot pole: " + a);
	   
	   System.out.println("soucet prvniho a posledniho prvku");
	   a = pole[0] + pole[pole.length -1];
	   
	   System.out.println("soucet hodnot pole: " + a);
	   
	   }
}
	  
	  

Poznßmka na zaΦßtek, vÜimn∞te si jak² argument oΦekßvß metoda main(), je to pole typu String s nßzvem args. Toto pole obsahuje °et∞zcovΘ hodnoty, kterΘ se pou₧ili p°i spuÜt∞nφ vaÜeho programu. Pokud vßm nenφ p°esn∞ jasnΘ co myslφm, tak je to stejnΘ jako kdy₧ nap°. pou₧φvßte n∞jak² p°φkaz v p°φkazovΘ interpreteru, t°eba p°φkaz cp (copy) oΦekßvß dva argumenty, nap°.: c:\>cp test.txt c:\documents, a prßv∞ tyto dva argumenty se p°edajφ jako pole obsahujφcφ dva °et∞zce metod∞ main(). Te∩ u₧ by vßm mohla b²t celß deklarace metody main() jasnß, pokud ne, stejn∞ si ji jeÜt∞ budeme probφrat p°i vysv∞tlovßnφ metod.

UrΦit∞ jste se takΘ vÜimli prom∞nnΘ length. Tuto prom∞nnou vlastnφ ka₧d² odkaz a obsahuje poΦet prvku v poli na kterΘ odkazuje. U prom∞nnΘ typu pole ne°φkßte p°i deklaraci, kolik mß mφt prvk∙, ale pouze ji pole p°i°adφte, to znamenß, ₧e jednou ji p°i°adφte pole o velikosti 10 prvk∙ a hned jak ho vyu₧ijete, m∙₧ete tomu stejnΘmu odkazu p°i°adit ·pln∞ novΘ pole t°eba o 500 prvcφch.

Pro kompletnφ vysv∞tlenφ uvedu pßr p°φklad∙:
Pole
V²raz V²znam
int[] a; deklarace jednorozm∞rnΘho pole
int[] a = new int[5]; deklarace a vytvo°enφ jednorozm∞rnΘho pole s p∞ti prvky, bez inicializace
int[] a = {10, 20, 30}; deklarace, vytvo°enφ a inicializace jednorozm∞rnΘho pole o t°ech prvcφch
int[] a = new int[2]; a[0] = 10; a[1] = 20; a[2] = 30; to samΘ jako p°edchozφ °ßdek, ale jinak


Te∩ se vrhn∞me na komplexn∞jÜφ p°φklad, kter² pou₧φvß jak pole, tak i mnoho v∞cφ co u₧ umφte, tak₧e ho peΦliv∞ prozkoumejte a t°eba n∞jak upravte.

Velk² p°φklad pole a ostatnφch v∞cφ
import java.io.*;

public class ArrayTest2 {

	   public static void main(String[] args) throws IOException {
	   		  
			  int operace;
			  char o;		  
			  
			  System.out.println("Kolik znaku chcete pouzit?");
			  System.out.println("a = 3");
			  System.out.println("b = 5");

			  char a = (char) System.in.read();

			  int b = 3;

			  switch(a) {

				case 'a':

					b = 3;
					break;

				case 'b':

					b = 5;
					break;

			  }

			  
			  
	   		  int[] cisla = new int[b];

			  
			  for (int i = 0; i < cisla.length; i ++) {
			  
			  	  System.out.print("Zadejte znak: ");
				  cisla[i] = System.in.read();
				  			
			  }
			  
			  boolean end = false;
			  
			  
			  do {
			  
			    System.out.println("Jakou operaci pozadujete?");
			  	System.out.println("a = scitani");
			  	System.out.println("b = nasobeni"); 
			  	System.out.println("c = vypsani jednotlivych cisel");
				System.out.println("z = ukonceni programu");

				o = (char) System.in.read();
				
				if (o == 'a') {
				   
				   int soucet = 0;
				   for (int i = 0; i < cisla.length; i ++) {
				   
				   	   soucet += cisla[i];
					   
				   }
				   
				   System.out.println("Soucet cisel je " + soucet);
				
				} else if (o == 'b') {
				
				  int soucin = 0;
				  for (int i = 0; i < cisla.length; i ++) {
				  
				  	  soucin *= cisla[i];
					  
				  }
				  
				  System.out.println("Soucin cisel je " + soucin);
				
				} else if (o == 'c') {
				
				  System.out.println("Pole obsahuje nasledujici cisla:");
				  for (int i = 0; i < cisla.length; i ++) {
				  
				  	  
					  System.out.print(cisla[i] + ", ");
					  
				  }
				
				} else if (o == 'z') {
				
				  end = true;
				
				}
				
			  } while (! end);   
	   }
}
	  

	  
	  

Tento p°φklad je ukßzkou vyu₧itφ vÜech v∞cφ, co jste se doposud nauΦili. ┌pln∞ vÜechny v∞ci sice neznßte, ale ty kterΘ neznßte myslφm ₧e z tohoto p°φkladu pochopφte. Na zaΦßtku je importovßn balφk java.io, o balφcφch si budeme povφdat n∞kdy p°φÜt∞. Statickß metoda System.in.read() vracφ jeden p°eΦten² bajt z konzole. Tento p°φklad je urΦen k experimentovßnφ tak₧e se toho nebojte. Pokud vßm n∞co nebude fungovat, poÜlete mi zdrojov² k≤d a jß se na n∞j podφvßm.

Na zaΦßtku jsem °φkal, ₧e existujφ i vφcerozm∞rnß pole, ale zatφm jsem o nich nic ne°ekl, te∩ to napravφm. ZaΦneme u polφ dvourozm∞rn²ch. Dvourozm∞rnΘ pole si lze p°edstavit jako pole jednorozm∞rn²ch polφ.

Vφcerozm∞rnΘ pole
...

int[] pole = new int[]; // deklarace a vytvoreni jednorozmerneho pole
int[][] pole2D = new int[][]; // dvourozmerne pole

...
	  

Na prvnφ pohled je z°ejm² rozdφl mezi deklaracφ jednorozm∞rnΘho a dvourozm∞rnΘho pole. Zkrßtka pokud deklarujete jednorozm∞rnΘ pole, napφÜet jeden pßr hranat²ch zßvorek a s ka₧d²m dalÜφm rozm∞rem poΦet pßr∙ zßvorek p°ib²vß, u dvourozm∞rnΘho samoz°ejm∞ dva pßry. U vφcerozm∞rn²ch polφ je jeÜt∞ jedna zajφmavost a to ta, ₧e p°i vytvß°enφ pole staΦφ specifikovat pouze prvnφ index.

Vφcerozm∞rnΘ pole - deklarace, vytvo°enφ a inicializace
...

int[][] pole2D = new int[2][3]; // vytvoreni dvourozmerneho pole 

int[][] pole2D = new int[2][]; // to same, ale jinak
pole2D[0] = new int[3];
pole2D[1] = new int[3];

int[][] npole2D = new int[2][]; // lze vytvaret i nepravidelne pole
pole2D[0] = new int[2];
pole2D[1] = new int[5];

...
	  

Nßsledujφcφ p°φklad vytvo°φ pole, kterΘ bude mφt dva prvky a t∞mi budou pole o t°ech prvcφch.

Vφcerozm∞rnΘ pole
...

int[][] pole2D = new int[2][3]; // dvourozmerne pole

pole2D[0][0] = 1;
pole2D[0][1] = 2;
pole2D[0][2] = 3;
pole2D[1][0] = 10;
pole2D[1][1] = 20;
pole2D[1][2] = 30;

...
	  

V nßsledujφcφ tabulce mßte nßzornou ukßzku p°edeÜlΘho pole v tabulce. Horizontßlnφ tuΦnß Φφsla oznaΦujφ druh² index dvourozm∞rnΘho pole a vertikßlnφ prvnφ index pole.

pole2D
0 1 2
0 1 2 3
1 10 20 30

Pokud mßte stßle nemßte ·pln∞ jasno, jak dvourozm∞rnΘ pole funguje, p°edstavte si Ükolnφ rozvrh (nebo pracovnφ, ale rozvrh), ten by se dob°e zapsal do dvourozm∞rnΘho pole. Pokud by m∞li vÜechny dny stejn² poΦet hodin, bylo by to pravidelnΘ dvourozm∞rnΘ pole, kterΘ by m∞lo jednotlivΘ dny jako prvnφ index a jednotlivΘ hodiny jako druh² index. Nap°φklad pole pro rozvrh, kter² by byl od pond∞lφ do pßtku a ka₧d² den osm hodin, by vypadalo takto.

Pole - rozvrh hodin
...

boolean rozvrhHodin[][] = new boolean[5][8];

...
	  

Do tohoto pole byste t°eba mohli zaznamenßvat navÜtφvenΘ hodiny :-).

Zßv∞r

V tomto dφle jsme probrali pole a r∙znΘ v∞ci s nimi, ale jeÜt∞ nßm n∞co zbylo na p°φÜt∞.



Alen Dvo°ßk