Programování v jazyce Java

Kurz programování v Javě - 7. 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ítejte u 7. pokračování kurzu programování v Javě. V tomto díle probereme některé příkazy.

Příkazy

Příkazy slouží k řízení chodu programu. Mohou se provádět jeden za druhým, jak jsou napsány, ale také se mohou některé přeskočit, tomu se říká větvení programu.

Složený příkaz

Složený příkaz, nebo také blok, je více příkazů tvářících se jako jeden příkaz. Začátek složeného příkazu tvoří levá složená závorka { a konec pravá složená závorka }. Mezi těmito dvěma závorkami je tělo bloku. Příkazy se oddělují středníkem a pro přehlednost je lepší psát každý příkaz na svůj řádek. Blok může obsahovat více příkazů, jeden příkaz, nebo také žádný příkaz.

Bloky lze také do sebe vnořovat, tzn. že v jednom bloku bude blok další. Ve vnořeném bloku lze používat proměnné, které jsou deklarovány v obklopujícím bloku, ale naopak ne. Pokud tedy deklarujete ve vnořeném bloku nějakou proměnnou, nemůžete ji použít jinde než v tom bloku, kde jste ji deklarovali.

Příklad složeného příkazu - bloku
...
	  
{  // zacatek slozeneho prikazu (bloku)

  System.out.println("prvni prikaz ve slozenem prikazu");
  int i = 10; // druhy prikaz

  {  // zacatek vnitrniho bloku

    System.out.println("vnitrni blok"); // prvni vnitrni prikaz
    int a = 5;  // druhy vnitrni prikaz

  }  // konec vnitrniho bloku
  
  int b = i + 20;  // treti prikaz
  // a = 12; nelze kvuli tomu, ze platnost promenne a uz zkoncila
  ...
 
} // konec slozeneho prikazu

...
	  

V tomto díle budeme složené příkazy často používat.

Prázdný příkaz

Možná to zní podivně, ale opravdu se používá a docela často. Je to příkaz, co neděla vůbec nic. Jeho použítí je nutné v případě, že je někde požadován příkaz, ale my nechceme nic dělat. Prázdný příkaz lze zapsat buď středníkem ;, nebo složenými závorkami {}.

Příklad použití prázdného příkazu
...
int i = 0
while ((nejakaMetoda(i ++)) == 20) {

}

// nebo
while ((nejakaMetoda(i ++)) == 20) 
  ;

...
	  

Tento příklad není nic moc, ale pro demonstraci prázdného příkazu stačí (a o to přeci jde :-)).


Příkaz if

První příkaz umožňující větvení programu, který probereme je příkaz if. Používá se tam, kde chceme provést něco jen za určité podmínky. Jeho nejjednodušší formu jsme použili v minulém díle. Jeho další možné podoby naleznete v následujících tabulkách.

if
if ( výraz ) příkaz ;
nebo
if ( výraz ) {
     prikaz1;
     prikaz2;
     prikaz3;
     ...
}

Výraz (podmínka) musí být typu boolean např.: 5 > 3. Pokud vyhodnocení výrazu vrátí true je příkaz splněn, pokud ale vrátí false, příkaz se neprovede. U druhé možnosti se při splnění výrazu provede celý složený příkaz, tzn. že se provedou všechny příkazy ve složených závorkách.

Někdy je potřeba provést příkaz právě při nesplnění podmínky a na to tu je další forma příkazu if a to if - else.

if - else
if ( výraz ) příkaz1 ;
else příkaz2 ;
nebo
if ( výraz ) {
     prikaz1;
     prikaz2;
     ...
}
else {
     prikaz5;
     prikaz6;
     ...
}

Při splění podmínky je proveden příkaz1 a při nesplnění příkaz2. Druhá možnost ukazuje to samé, ale s použitím složených příkazů.

Příkazy if - else lze do sebe vnořovat, ukážeme si to na příkladu:

if - else
...

int a = 3; 
if (a == 0) {

  prikaz;
  
} else if (a == 1) {

  prikaz2;
  
} else if (a == 2) {

  if (b == 3) {
  
    prikaz3;
	
  }
  
} else  {

  prikaz4;
  
}

...
	  

Myslím, že fungování vnořených podmínek je z příkladu jasné. Kdyby ne, tak to funguje tak, že za else je očekáván příkaz a právě tam se vloží další příkaz if. V tomto případě by se provedl prikaz4. U třetí podmínky je ještě vložen jeden příkaz if, pro ukázku všech možností.

Odsazování jednotlivých příkazů a odřádkování nemusíte dělat přesně podle mě, protože to záleží na každém jak mu to vyhovuje. Samozřejmě existují určité konvence, které je nutné dodržovat, ale i tak je v nich mnoho místa na vlastní styl odsazování a odřádkování. Například závorky nemusíte používat pokud použijete jen jeden příkaz, ale já je vždy používám kvůli přehlednosti, takže záleží na vás co si vyberete, já třeba preferuji přehlednost zdrojového kódu.


Příkaz switch

Další příkaz pro větvení programu je switch. Česky by se také dal nazvat přepínač. Jedna z možných forem je ukázána v následující tabulce.

switch
switch ( výraz ) {
     case konstanta : příkaz;
     case konstanta : příkaz;
     case konstanta : příkaz;
     ...
     default: příkaz; // default je nepoviný
}

Výraz může být pouze typu char, byte, short nebo int. Výsledek výrazu se porovnává s konstantami. Pokud se narazí na odpovídající konstantu, provedou se všechny výrazy za dvojtečkou až do konce příkazu switch. Toto řešení nemusí vyhovovat každému a tak se používá příkaz break k přeskočení všech dalších příkazů. Příkaz break je vysvětlen dále, ale my si jeho použítí ukážeme na příkladu. Pokud se odpovídající konstanta nenajde, provede se příkaz za default:. Default se používat nemusí, ale pak se neprovede žádný příkaz, pokud se nenajde odpovídající konstanta.

Příklad použítí příkazu switch
...

int a = 5;
int b = 7;
int c = 0;

switch (a * b) { 
 
     case 30 :
	   c = 1;
	   break;
     case 35 :
	   c = 2;
	   break;  
     case 40 :
	   c = 3;
	   break;
     default: c = 10;

}  

...
	  

Pro jeho úplné pochopení bude nejlepší, když si ho každý pořádně prozkouší všemi možnými způsoby. Příkaz break je zde použit proto, aby se další zbylé příkazy uvedené za break přeskočili. Někdy je zase potřeba aby se přovedli všechny další příkazy, tak se break neuvede. Zde má výraz hodnotu 35, nalezne se odpovídající konstanta a za dvojtečkou je nalezen příkaz: c = 2; a break. Kdyby tam příkaz break nebyl provedly by se i příkazy c = 3; a c = 10;(Jen tehdy pokud by nebyly použity příkazy break nikde).


Příkaz while

Příkaz while se řadí to tzv. cyklů. Cyklus proto, že se jeho tělo opakuje tak dlouho, dokud platí podmínka (výraz). Výraz, jako obvykle musí být typu boolean, to znamená, že výsledek výrazu musí být true nebo false.

while
while ( výraz ) příkaz

Je dobré ho používat v situacích, kdy je potřeba opakovat příkazy, ale není známo kolikrát, před začátkem cyklu, například načítání dat ze souboru. Většinou nidky nevíme, kolik daný soubor bude mít dat, takže se data načítají tak dlouho, dokud nějaká jsou. My si po vysvětlení cyklu do-while ukážeme příklad pro načítání dat z konzole pomocí while i do-while.


Příkaz do-while

Tento cyklus je podobný obyčejnému cyklu while. Nejdříve provede příkaz a pak teprve kontroluje výraz, který když má hodnotu true, znovu provede příkaz. Například by se dal využít pro čtení znaků po znaku z konzole, jde to provést i pomocí použití obyčejného cyklu while. Oba příklady si ukážeme.

Příklad použití do - while
import java.io.*;

public class Cteni1 {

  public static void main(String[] args) throws Exception {

    char znak;
    StringBuffer sb = new StringBuffer(20);
    InputStreamReader isr = new InputStreamReader(System.in);
			
    System.out.println("Start programu (pro konec zadejte 'q')");
	  
    do {

      znak = (char) isr.read();
	  
      if (znak == '\n') {

        System.out.println("Zadali jste: " + sb);
        sb.delete(0, sb.length());

      } else {

        sb.append(znak);
		
      }

    } while (znak != 'q');
	
    System.out.println("Konec programu");
	
  }
}	


	   
	  
Příklad použití while
import java.io.*;

public class Cteni2 {

  public static void main(String[] args) throws Exception {

    char znak;
    StringBuffer sb = new StringBuffer(20);
    InputStreamReader isr = new InputStreamReader(System.in);
			
    System.out.println("Start programu (pro konec zadejte 'q')");
	  
    while ((znak = (char) isr.read()) != 'q') {
	  
      if (znak == '\n') {
	  
        System.out.println("Zadali jste: " + sb);
        sb.delete(0, sb.length());

      } else {

        sb.append(znak);
		
      }
    }
	
    System.out.println("Konec programu");
	
  }
}	
	  

Toto jsou zdrojové kódy programů, které fungují úplně stejně, ale jeden používá cyklus do-while a druhý while. Věci které dosud nebyly probrány, budou určitě probrány v následujích dílech. Příkaz import se používá proto, aby se nemuseli psát celé názvy tříd i balíků ve kterých jsou. Balíky jsme ještě neprobírali, takže někdy příště je určitě probereme, zatím to berte tak, že to musí být. Použili jsme objekt třídy StringBuffer, ten také bude vysvětlen později. Je to objekt, který se používá pro řetězce, stejně jako String, je to zde použito kvůli lepšímu výkonu aplikace (i když nám je teď jedno jak je aplikace rychlá). Třída InputStreamReader se používá pro čtení znaků. System.in je statický objekt, který standardně uchovává odkaz na vstupní konzoli. Metoda read() objektu InputStreamReader načítá jeden znak z konzole. Asi je vám z toho plno věcí nejasných, ale to nevadí, protože tohle nebyl příklad pro naučení čtení dat z konzole, ale pro ukážku dvou cyklů, které jsme se v tomto díle naučili.

Příkaz for

Nejvíce používaný cyklus, který nesmí chybět v žádném jazyku, je cyklus for, který ani v Javě nechybí. Standardně se používá, tak, že se deklaruje a inicializuje řídící proměnná pro tento cyklus. Dále se uvede podmínka. A poslední věcí je iterace řídící proměnné.

for
for (inicializace; výraz; změna inicializované proměnné ) příkaz
například:
for (int i = 0; i < 10; i ++) System.out.println("neco vypis");

Zajímavostí na tomto cyklu je, že všechny parametry v závorkách jsou nepovinné. Ukážeme všechny druhy použítí, s parametry i bez v následujícím tabulce.

Možnosti cyklu for
...

for (int i = 0; i < 10; i ++) {

	System.out.prinln("jedna moznost");

}

...

int i = 0;
for ( ; i < 10; i ++) {

	System.out.println("dalsi moznost");
	
}

...

int i = 0;
for ( ; ; i ++) {

	System.out.println("tento cyklus by se provadel nekonecne dlouho bez break");
	
	if ( i > 10) {
	
	   break;
	   
	}	
}

...

int i = 0;
for ( ; ; System.out.println("dalsi moznost")) {
	
	if ( i > 10) {
	
	   break;
	   
	}
	
	i ++;
}	   

...

int i = 0;
for ( ; ; ;) {

	System.out.println("dalsi moznost");
	
	if ( i > 10) {
	
	   break;
	   
	}
	
	i ++;
}	   
	  

Tyto možnosti tu sice jsou, ale nejlepší (doporučovaná) a nejpřehlednější je možnost první.


Příkaz break a continue

Příkazy break a continue by zasloužili hlubší výklad, a tak si je necháme na příště. Dnes si pouze řekneme, že příkaz break, který jsme používali v našich příkladech přeskočí tělo příkazu a pokračuje za ním. Příkaz continue se používá v cyklech a přeskočí zbytek těla přílazu, ale pokračuje dalším cyklem. Podrobně, ale až příště.


Závěr

V dnešním díle jsme probrali různé druhy příkazů. Složené příkazy, neboli bloky, "rozhodovací" příkazy a cykly. V příštím díle se můžete těšit na další příkazy a nějaký větší program využívající všechny příkazy, které jsme se naučili. Nashledanou u dalších dílů.



Alen Dvořák