OBSAH 3 PŘEDNÁŠKY ŘÍDICÍ STRUKTURY VĚTVENÍ

OBSAH ODSTAVEC TÝKÁ SE STRANA ČÁST 1 VŠEOBECNĚ
VNITŘNÍ KLASIFIKAČNÍ ŘÁD OBSAH I ZÁSADY KLASIFIKACE
1 ZÁKLADNÍ EKONOMICKÉ POJMY OBSAH POTŘEBY PROSTŘEDKY K USPOKOJOVÁNÍ

14 ELEKTRICKÝ PRÚD 141 14ELEKTRICKÝ PRÚD OBSAH KAPITOLY
19 DOPRAVA INFORMAČNÍ A KOMUNIKAČNÍ ČINNOSTI TATO KAPITOLA OBSAHUJE
2 TRH TRŽNÍ EKONOMIKA OBSAH TRH CHARAKTERISTIKA ČLENĚNÍ

Příklad problému:

Obsah 3. přednášky:


OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ

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

Zápis v jazyce JAVA

{

P1;

…….

Pn;

}


  1. Blok n příkazů

OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ

.


int sum = 0, cislo = 3;

sum += cislo++;





  1. V

    Zápis v jazyce JAVA


    if (PODMÍNKA) {

    BLOK PŘÍKAZŮ 1;

    }

    else {

    BLOK PŘÍKAZŮ 2;

    }

    ětvení programu


OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ






int cislo = 5;

boolean prirozene;

if (cislo > 0) {

prirozene = true;

cislo--;

}

else {

prirozene = false;

cislo++;

}

OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ






  1. POBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ říkaz výběru z více možností


      











OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ

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;

}
















  1. Cyklus se známým počtem opakování

Zápis v jazyce JAVA


for(int i = 1; i<=n; i++) {

BLOK PŘÍKAZŮ;

}

OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ

int[]mocnina = new int[10];

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

mocnina[i] = (int)Math.pow(i,2);

}







  1. C

    Zápis v jazyce JAVA


    while (PODMÍNKA) {

    BLOK PŘÍKAZŮ;

    }

    yklus s podmínkou na začátku

OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ


int n = 5;

double[ ] odmocnina = new double[n];

int i = 1;

while (i < n) {

odmocnina[i] = Math.sqrt(i++);

}









  1. C

    Zápis v jazyce JAVA


    do {

    BLOK PŘÍKAZŮ;

    } while (PODMÍNKA);

    yklus s podmínkou na konci

OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ

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)

if (x > 5){ // prikaz if

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;

používá se málo)

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

Pojmy

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

OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ









OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ





OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ



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

OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ

























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, ....

OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ

































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?

Jak programy testovat a ladit?

    (např. Eclipse - místa přerušení,  krokování, zobrazení     hodnot proměnných)

(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 );





















































OBSAH 3 PŘEDNÁŠKY  ŘÍDICÍ STRUKTURY  VĚTVENÍ

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:

http://uva.onlinejudge.org/

Co je nutno udělat?



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