Obsah 3. přednášky:
Řídicí struktury
Větvení - příkazy if, if-else (else if), switch
Cykly - příkazy while, for, do-while
Příkazy break a continue
Ladění programů, příkaz Assert
Tato tematika je zpracována v
Záznamy přednášek: str. 44 - 69
(zejména příklady častých pochybení a jak se jim vyvarovat)
Problém:
Je dán počet testovaných případů t (1 ≤ t ≤ 100) a pro každý takový případ je na samostatném řádku zadáno celé číslo n (-1000 ≤ n ≤ 1000).
Pro všechna zadaná n spočtěte a na samostatném řádku vypište výsledek následujícího úkolu:
Vynásobte číslo n 567-mi, poté vydělte výsledek 9, přičtěte 7492, pak vynásobte 235, výsledek vydělte 47 a odečtěte 498. Jaká číslice je ve vypočtené hodnotě na řádu desítek?
Kompletní řešení bude předvedeno na konci přednášky.
Řídicí struktury
složený příkaz (blok příkazů)
větvení sekvence - podmínky
opakování sekvencí - cykly
Zápis
v jazyce JAVA
{
P1;
…….
Pn;
}
Blok n příkazů
.
int
sum = 0, cislo = 3;
sum
+= cislo++;
V
Zápis
v jazyce JAVA
if
(PODMÍNKA) {
BLOK
PŘÍKAZŮ 1;
}
else
{
BLOK
PŘÍKAZŮ 2;
}
int
cislo
= 5;
boolean
prirozene;
if
(cislo > 0) {
prirozene
= true;
cislo--;
}
else
{
prirozene
= false;
cislo++;
}
P říkaz výběru z více možností
Zápis
v jazyce JAVA
switch
(VÝRAZ)
{
case
HODNOTA1: PŘÍKAZ1; break;
.....
case
HODNOTA_N: PŘÍKAZ_N; break;
default:
PŘÍKAZ_DEF; break;
}
switch
(cislo)
{
case
0:
System.out.println(“nula”);
break;
case
2:
case
4:
case
6:
case
8: System.out.println(“suda cislice”);
break;
default:
System.out.println(“licha
cislice,zaporne cislo,cislo >9“);
break;
}
Cyklus se známým počtem opakování
Zápis
v jazyce JAVA
for(int i
= 1; i<=n; i++) {
BLOK
PŘÍKAZŮ;
}
int[]mocnina
= new
int[10];
for
(int
i = 0; i<10; i++){
mocnina[i]
= (int)Math.pow(i,2);
}
C
Zápis
v jazyce JAVA
while
(PODMÍNKA) {
BLOK
PŘÍKAZŮ;
}
int
n = 5;
double[ ]
odmocnina
= new
double[n];
int
i = 1;
while
(i < n) {
odmocnina[i]
= Math.sqrt(i++); }
C
Zápis
v jazyce JAVA
do
{
BLOK
PŘÍKAZŮ;
}
while
(PODMÍNKA);
do
{
int
zbytek = prvni % druhe;
prvni
= druhe; druhe = zbytek;
}
while(druhe
!= 0);
Větvení - příkazy if, if-else (else if), switch
- realizuje více variant dalšího postupu
Ilustrační příklad (pozor na strukturu zápisu)
System.out.println(x
+ " > 5");
}
if
(x > 5){ //
prikaz if-else
System.out.println(x
+ " > 5");
}
else
{
System.out.println(x
+ " != 5");
}
if
(x > 5){ //
prikaz else
if
System.out.println(x
+ " > 5");
}
else
if
(x == 5){
System.out.println(x
+ " = 5");
}
else
{
System.out.println(x
+ " < 5"); }
switch
(x) {//
prepinac
case
0: case
1: case
2: case
3: case
4:
System.out.println(x
+ " : x < 5"); break;
case
5: System.out.println(x + " :x = 5"); break
;
case
6: case
7: case
8: case
9:
System.out.println(x
+ " : x > 5"); break
;
default:
System.out.println(x + " :x neni cislice!");
break;
}
Příklad:
import
java.util.*;
/**
*
Precte tri strany trojuhelnika a vypocita obsah, pokud
* strany tvori trojuhelnik
*/
public
class
Trojuhelnik {
public
static void
main(String[] args) {
Scanner
sc = new
Scanner(System.in);
System.out.print("Zadej
stranu a: ");
double
a = sc.nextDouble();
System.out.print("Zadej
stranu b: ");
double
b = sc.nextDouble();
System.out.print("Zadej
stranu c: ");
double
c = sc.nextDouble();
if
(((a+b)<=c) || ((b+c)<=a) || ((a+c)<=b))) {
System.out.println("Strany
netvori trojuhelnik.");
}
else
{
double
s =(a + b + c)/2;
double
obsah =Math.sqrt(s*(s-a)*(s-b)*(s-c));
System.out.println("O
= " + obsah);
}
}
}
//
Zadej stranu a:3 Zadej stranu b:4 Zadej stranu c:5
//
O = 6.0
Poznámka:
Ternární výraz: promenna = podminka ? vyraz1 : vyraz2;
(
int
a = 2, b = 4;
int
vetsi = (a>b) ? a : b;
Při používání příkazu if (ve všech modifikacích) dochází velmi často k chybám (i v logice).
Příklad chybného použití
Zadání
Máme dvě celočíselné proměnné x a y. Pokud bude x=0, zvětšíme x o 1. Pokud bude y=0, zvětšíme y o 1. Pokud budou hodnoty x a y zároveň nula, obě snížíme o 1.
(Pro x=0 a y=0 nebude příklad vlevo fungovat!)
int
x = 0;
// CHYBNE !!!
int
y = 0;
if
(x == 0){
x++;
// x = 1
System.out.println("x="
+ x);
}
if
(y == 0){
y++;
//
y = 1
System.out.println("y="
+ y);
}
if
(x == 0 && y == 0){ //
nezabere
x--;
y--;
System.out.print
("x=" + x);
System.out.println
(", y=" + y);
}
int
x = 0; //
SPRAVNE
int
y = 0;
if
(x == 0 && y == 0){
x--;
y--;
System.out.print("x="
+ x);
System.out.println(",
y=" + y);
}
else
if
(x == 0){
x++;
System.out.println("x="
+ x);
}
else
if
(y == 0){
y++;
System.out.println("y="
+ y);
}
//
vyreseno pouzitim ELSE IF a
//
prehozenim poradi podminek
Více informací a příkladů v Záznamech přednášek!
Cykly - příkazy while, for, do-while
realizuje opakování sekvence kódu
problém nekonečného cyklu
Pojmy
hlavička a tělo cyklu
proměnná cyklu
podmínka ukončení cyklu
Příklady použití cyklů a vzniků nekonečných cyklů
final
int
KONST = 5;
int
sum = 0;
int
a = 0;
while(a
< KONST) { //
a se musi v cyklu menit!
a++;
//
vypusteni predchozi radky = nekonecny cyklus
System.out.println("
" + a);
}
for
(int
i = 1; i < KONST; i++) { //
nerovnost plati stale
//
i-- zpusobi nekonecny cyklus
a--;
System.out.println("
" + a);
}
//
a = 0; zpusobi nekonecny cyklus
do
{
System.out.println("sum="
+ sum);
sum
+= a;
}
while
(sum < KONST); //
sum se nemění
Dostupnost proměnné cyklu for
int
i;
for
(i = 0; i < 3; i++) {
System.out.println
("i
= "
+ i);
}
System.out.println
("i
= "
+ i); //
vne cyklu
Vnořené cykly
Více proměnných cyklu
Příklad: postupné sčítání zadávaných čísel
1. varianta
//
postupne scitani,
//
dokud soucet <
zadana suma
System.out.print("Zadej
sumu: ");
int
zadanaSuma = sc.nextInt();
int
postupnySoucet = 0;
while(postupnySoucet
< zadanaSuma) {
System.out.print("Zadej
cislo: ");
postupnySoucet
+= sc.nextInt();
System.out.println("soucet
= " + postupnySoucet);
}
//
Zadej sumu: 5 Zadej cislo:3 Zadej cislo:4 soucet = 7
2. varianta
//
postupne scitani, dokud je zadavano cislo
int
postupnySoucet = 0;
System.out.print("Zadej
cislo: ");
while(sc.hasNextInt())
{ //
testuje, je-li na vstupu cislo
postupnySoucet
+= sc.nextInt();
System.out.println("soucet
= " + postupnySoucet);
System.out.print("Zadej
cislo: ");
}
//
Zadej
cislo:2 Zadej cislo:4 Zadej cislo: x soucet = 6
Praktický příklad 1: NSD
Klempíř má rozstříhat pás plechu o rozměrech x [cm] a y [cm] na co největší čtverce tak, aby nevznikl žádný odpad. Vypočítejte velikost strany jednoho čtverce.
Řešením je výpočet největšího společného dělitele
Př.: x = 380 = 2 . 190 = 2 . 2 . 5 . 19
y = 60 = 2 . 2 . 3 . 5
NSD ( 380; 60 ) = 2 . 2 . 5 = 20
Praktický příklad 2: Fibonacciho posloupnost
Fibonacci
množení bakterií, ...
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
FIB(0) = 0, FIB(1) = 1, FIB(2) = 1, ...
FIB(3) = FIB(1) + FIB(2)
FIB(i) = FIB(i-2) + FIB(i-1) pro i = 2, 3, 4, ....
Praktický příklad 3: Výpočet třetí odmocniny
Spočteme reálny kořen binomické rovnice x3- a = 0, kde a je číslo, jehož třetí odmocninu hledáme. Použijeme vzorec Newtonovy metody:
x[i+1]=x[i]-f(x[i])/f'(x[i]) pro i=1,2,... , kde f(x)=x^3-a.
Iterační vzorec je pak:
x2 = x1 + (a/(x1)2 - x1)/3
Výpočet končí, když abs(x2-x1) < eps
import
java.util.*;
public
class TretiOdmocnina
{
public
static void
main (String []arg) {
final
double
EPS = 1e-5; // 0.00001
Scanner
sc = new
Scanner(System.in);
sc.useLocale(Locale.US);
System.out.print("Zadej
cislo: ");
double
zadaneCislo = sc.nextDouble();
double
x1, x2 = zadaneCislo;
do
{
x1
= x2;
x2
= x1 + (zadaneCislo/(Math.pow(x1,2)) - x1)/3;
}
while
(Math.abs(x2-x1)>EPS);
System.out.println("Spocteno("
+
zadaneCislo
+ ") = " + x2);
System.out.println
("Java-fce("
+ zadaneCislo + ") = " + Math.cbrt(zadaneCislo));
}
}
//
Zadej cislo: 27
Spocteno(27.0)
= 3.0
Java-fce(27.0)
= 3.0
Příkazy break a continue
break – předčasné ukončení cyklu
continue – předčasné ukončení iterace
int
suma = 0;
int
cislo = 0;
do
{
cislo
++;
suma
+= cislo;
if
(suma >= 6) {
break;
}
}
while
(cislo < 5);
System.out.println("suma
= " + suma);
//
suma = 6
int
suma = 0;
int
cislo = 0;
do
{
cislo++;
if
(cislo == 2) {
continue;
}
suma
+= cislo;
}
while
(cislo < 5);
System.out.println("suma
= " + suma);
//
suma = 13
Ladění programů, příkaz Assert
Jak přehledně zapisovat kód?
vhodná volba názvů identifikátorů
odsazení pomocí Tab
vkládaní mezer a volných řádek
neopakování sekvencí kódu
Jak programy testovat a ladit?
žádný nástroj za nás nevymyslí, JAK máme své programy testovat
kontrolní tisky
řádkový debugger
(např. Eclipse - místa přerušení, krokování, zobrazení hodnot proměnných)
ověřování podmínek za běhu - assert
(pro kontrolu spustit: java –ea Jmeno)
System.out.print(
"Zadejte cislo mezi 0 and 10: " );
int
cislo = sc.nextInt();
//
pozadavek: cislo musi byt >= 0 a <= 10
assert
( cislo >= 0 && cislo <= 10 ) : "Chybne cislo: "
+ cislo;
System.out.printf(
"Zadali jste %d\n", cislo );
Problém
Nyní máme všechny potřebné znalosti k vyřešení.
Doplníme cyklus pro počet testovaných případů.
Problém je možno automaticky validovat na:
Co je nutno udělat?
registrace
přečíst zadání (11547 Automatic Response)
napsat zdrojový kód
odevzdat zdrojový kód - pozor třída i soubor se musejí jmenovat Main!
kontrola validace , obdržíte i validační e-mail
Přednášky KIV/PPA1, A. Netrvalová, 2010 3. přednáška
A NÁVOD K OBSLUZE OBSAH 1 ÚVOD 1 2
„ŽLUTÉ STRÁNKY“ KAPITOLA 2 ODBITÍ OBOURUČ VRCHEM OBSAH
ÚZEMNÍ STUDIE BRNÁ NAD LABEM TEXTOVÁ ČÁST OBSAH
Tags: obsah 3., double obsah, přednášky, obsah, řídicí, větvení, struktury