November Black Friday C/C++ week
Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
Pouze tento týden sleva až 80 % na e-learning týkající se C/C++

Lekce 6 - Cykly v Javě

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Podmínky (větvení), jsme si vysvětlili podmínky. Nyní přejdeme k cyklům, po dnešním tutoriálu již budeme mít téměř kompletní výbavu základních konstrukcí a budeme schopni programovat rozumné aplikace v Javě.

Cykly

Jak již slovo cyklus napoví, něco se bude opakovat. Když chceme v programu něco udělat 100x, jistě nebudeme psát pod sebe 100x ten samý kód, ale vložíme ho do cyklu. Cyklů máme několik druhů, vysvětlíme si, kdy který použít. Samozřejmě si ukážeme praktické příklady.

FOR cyklus

Tento cyklus má stanovený pevný počet opakování a hlavně obsahuje tzv. řídící proměnnou (celočíselnou), ve které se postupně během běhu cyklu mění hodnoty. Syntaxe (zápis) cyklu for je následující:

for (promenna; podminka; prikaz)
  • promenna je řídící proměnná cyklu, které nastavíme počáteční hodnotu (nejčastěji 0, protože v programování vše začíná od nuly, nikoli od jedničky). Např. tedy int i = 0. Samozřejmě si můžeme proměnnou i vytvořit někde nad tím a už nemusíme psát slovíčko int, bývá ale zvykem používat právě int i.
  • podminka je podmínka vykonání dalšího kroku cyklu. Jakmile nebude platit, cyklus se ukončí. Podmínka může být např (i < 10).
  • prikaz nám říká, co se má v každém kroku s řídící proměnnou stát. Tedy zda se má zvýšit nebo snížit. K tomu využijeme speciálních operátorů ++ a --, ty samozřejmě můžete používat i úplně běžně mimo cyklus, slouží ke zvýšení nebo snížení proměnné o 1.

Pojďme si udělat jednoduchý příklad, většina z nás jistě zná Sheldona z The Big Bang Theory. Pro ty co ne, budeme simulovat situaci, kdy klepe na dveře své sousedky. Vždy 3x zaklepe a poté zavolá: "Penny!". Náš kód by bez cyklů vypadal takto:

System.out.println("Knock");
System.out.println("Knock");
System.out.println("Knock");
System.out.println("Penny!");

My ale už nic nemusíme otrocky opisovat:

for (int i=0; i < 3; i++)
{
    System.out.println("Knock");
}
System.out.println("Penny!");

Konzolová aplikace
Knock
Knock
Knock
Penny!

Cyklus proběhne 3x, zpočátku je v proměnné i nula, cyklus vypíše "Knock" a zvýší proměnnou i o jedna. Poté běží stejně s jedničkou a dvojkou. Jakmile je v i trojka, již nesouhlasí podmínka i < 3 a cyklus končí. O vynechávání složených závorek platí to samé, co u podmínek. V tomto případě tam nemusí být, protože cyklus spouští pouze jediný příkaz. Nyní můžeme místo trojky napsat do deklarace cyklu desítku. Příkaz se spustí 10x aniž bychom psali něco navíc. Určitě vidíte, že cykly jsou mocným nástrojem.

Zkusme si nyní využít toho, že se nám proměnná inkrementuje. Vypišme si čísla od jedné do deseti a za každým mezeru.

for (int i = 1; i <= 10; i++)
{
    System.out.printf("%d ", i);
}
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Vidíme, že řídící proměnná má opravdu v každé iteraci (průběhu) jinou hodnotu.

Pokud vás zmátlo použití Printf(), můžeme místo ní použít pouze Print(), která na rozdíl od Println() po vypsání neodřádkuje:

for (int i = 1; i <= 10; i++)
{
    System.out.print(i + " ");
}

Nyní si vypíšeme malou násobilku (násobky čísel 110, vždy do deseti). Stačí nám udělat cyklus od 1 do 10 a proměnnou vždy násobit daným číslem. Mohlo by to vypadat asi takto:

for (int i = 1; i <= 10; i++)
{
    System.out.print(i + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 2) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 3) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 4) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 5) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 6) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 7) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 8) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 9) + " ");
}
System.out.println();
for (int i = 1; i <= 10; i++)
{
    System.out.print((i * 10) + " ");
}

Konzolová aplikace
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100

Program funguje hezky, ale pořád jsme toho dost napsali. Pokud vás napadlo, že v podstatě děláme 10x to samé a pouze zvyšujeme číslo, kterým násobíme, máte pravdu. Nic nám nebrání vložit 2 cykly do sebe:

System.out.println("Malá násobilka pomocí dvou cyklů:");
for (int j = 1; j <= 10; j++)
{
    for (int i = 1; i <= 10; i++)
    {
        System.out.print((i * j) + " ");
    }
    System.out.println();
}

Poměrně zásadní rozdíl, že? Pochopitelně nemůžeme použít u obou cyklů i, protože jsou vložené do sebe. Proměnná j nabývá ve vnějším cyklu hodnoty 110. V každé iteraci (rozumějte průběhu) cyklu je poté spuštěn další cyklus s proměnnou i. Ten je nám již známý, vypíše násobky, v tomto případě násobíme proměnnou j. Po každém běhu vnitřního cyklu je třeba odřádkovat, to vykoná System.out.println().

Udělejme si ještě jeden program, na kterém si ukážeme práci s vnější proměnnou. Aplikace bude umět spočítat libovolnou mocninu libovolného čísla:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Mocninátor");
System.out.println("==========");
System.out.println("Zadejte základ mocniny: ");
int a = Integer.parseInt(sc.nextLine());
System.out.println("Zadejte exponent: ");
int n = Integer.parseInt(sc.nextLine());

int vysledek = a;
for (int i = 0; i < (n - 1); i++)
{
    vysledek = vysledek * a;
}

System.out.println("Výsledek: " + vysledek);
System.out.println("Děkuji za použití mocninátoru");

Asi všichni tušíme, jak funguje mocnina. Pro jistotu připomenu, že například 2^3 = 2 * 2 * 2. Tedy a^n spočítáme tak, že n-1 krát vynásobíme číslo a číslem a. Výsledek si samozřejmě musíme ukládat do proměnné. Zpočátku bude mít hodnotu a a postupně se bude v cyklu pronásobovat. Pokud jste to nestihli, máme tu samozřejmě článek s algoritmem výpočtu libovolné mocniny . Vidíme, že naše proměnná vysledek je v těle cyklu normálně přístupná. Pokud si však nějakou proměnnou založíme v těle cyklu, po skončení cyklu zanikne a již nebude přístupná.

Konzolová aplikace
Mocninátor
==========
Zadejte základ mocniny:
2
Zadejte exponent:
3
Výsledek: 8
Děkuji za použití mocninátoru

Už tušíme, k čemu se for cyklus využívá. Zapamatujme si, že je počet opakování pevně daný. Do proměnné cyklu bychom neměli nijak zasahovat ani dosazovat, program by se mohl tzv. zacyklit, zkusme si ještě poslední, odstrašující příklad:

// tento kód je špatně
for (int i = 1; i <= 10; i++)
{
    i = 1;
}

Au, vidíme, že program se zasekl. Cyklus stále inkrementuje proměnnou i, ale ta se vždy sníží na 1. Nikdy tedy nedosáhne hodnoty > 10, cyklus nikdy neskončí. Program zastavíme tlačítkem Stop u okna konzole.

While cyklus

While cyklus funguje jinak, jednoduše opakuje příkazy v bloku dokud platí podmínka. Syntaxe cyklu je následující:

while (podminka)
{
    // příkazy
}

Pokud vás napadá, že lze přes while cyklus udělat i FOR cyklus, máte pravdu :) FOR je vlastně speciální případ while cyklu. While se ale používá na trochu jiné věci, často máme v jeho podmínce např. metodu vracející logickou hodnotu true/false. Původní příklad z for cyklu bychom udělali následovně pomocí while:

int i = 1;
while (i <= 10)
{
    System.out.print(i + " ");
    i++;
}

To ale není ideální použití while cyklu. Vezmeme si naši kalkulačku z minulých lekcí a opět ji trochu vylepšíme, konkrétně o možnost zadat více příkladů. Program tedy hned neskončí, ale zeptá se uživatele, zda si přeje spočítat další příklad. Připomeňme si původní verzi kódu (je to ta verze se switchem, ale klidně použijte i tu bez něj, záleží na vás):

System.out.println("Vítejte v kalkulačce");
System.out.println("Zadejte první číslo:");
float a = Float.parseFloat(sc.nextLine());
System.out.println("Zadejte druhé číslo:");
float b = Float.parseFloat(sc.nextLine());
System.out.println("Zvolte si operaci:");
System.out.println("1 - sčítání");
System.out.println("2 - odčítání");
System.out.println("3 - násobení");
System.out.println("4 - dělení");
int volba = Integer.parseInt(sc.nextLine());
float vysledek = 0;
switch (volba)
{
    case 1:
        vysledek = a + b;
    break;
    case 2:
        vysledek = a - b;
    break;
    case 3:
        vysledek = a * b;
    break;
    case 4:
        vysledek = a / b;
    break;
}
if ((volba > 0) && (volba < 5))
{
        System.out.println("Výsledek: " + vysledek);
}
else
{
        System.out.println("Neplatná volba");
}
System.out.println("Děkuji za použití kalkulačky.");

Nyní vložíme téměř celý kód do while cyklu. Naší podmínkou bude, že uživatel zadá "ano", budeme tedy kontrolovat obsah proměnné pokracovat. Zpočátku bude tato proměnná nastavena na "ano", aby se program vůbec spustil, poté do ní necháme načíst volbu uživatele:

Scanner sc = new Scanner(System.in, "Windows-1250");

System.out.println("Vítejte v kalkulačce");
String pokracovat = "ano";
while (pokracovat.equals("ano"))
{
    System.out.println("Zadejte první číslo:");
    float a = Float.parseFloat(sc.nextLine());
    System.out.println("Zadejte druhé číslo:");
    float b = Float.parseFloat(sc.nextLine());
    System.out.println("Zvolte si operaci:");
    System.out.println("1 - sčítání");
    System.out.println("2 - odčítání");
    System.out.println("3 - násobení");
    System.out.println("4 - dělení");
    int volba = Integer.parseInt(sc.nextLine());
    float vysledek = 0;
    switch (volba)
    {
        case 1:
                vysledek = a + b;
        break;
        case 2:
                vysledek = a - b;
        break;
        case 3:
                vysledek = a * b;
        break;
        case 4:
                vysledek = a / b;
        break;
    }
    if ((volba > 0) && (volba < 5))
    {
        System.out.println("Výsledek: " + vysledek);
    }
    else
    {
        System.out.println("Neplatná volba");
    }
    System.out.println("Přejete si zadat další příklad? [ano/ne]");
    pokracovat = sc.nextLine();
}
System.out.println("Děkuji za použití kalkulačky.");

Všimněte si, že Stringy porovnáváme pomocí metody equals(), nikoli pomocí operátoru ==!** Je to dáno tím, že String je referenční datový typ. Podmínka ("Text" == "Text") je špatně, musíme psát ("Text".equals("Text")). V kapitole o objektově orientovaném programování pochopíme proč.

Konzolová aplikace
Vítejte v kalkulačce
Zadejte první číslo:
12
Zadejte druhé číslo:
128
Zvolte si operaci:
1 - sčítání
2 - odčítání
3 - násobení
4 - dělení
1
Výsledek: 140
Přejete si zadat další příklad? [ano/ne]
ano
Zadejte první číslo:
-10.5
Zadejte druhé číslo:

Naši aplikaci lze nyní používat vícekrát a je již téměř hotová. V příští lekci, Pole v Javě, si ukážeme práci s poli.

Již toho umíme docela dost, začíná to být zábava, že? :)


 

Stáhnout

Staženo 740x (52.04 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
57 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Předchozí článek
Podmínky (větvení)
Všechny články v sekci
Základní konstrukce jazyka Java
Miniatura
Následující článek
Cvičení k 6. lekci Javy
Aktivity (13)

 

 

Komentáře

Avatar
xxxvodnikxxx
Člen
Avatar
xxxvodnikxxx:17.3.2013 9:26

Ještě by to chtělo doplnit o
do-while cyklus, jinak celkem pěkný :)

A zmínil bych, že pokud chceme z nějakýho důvodu nekončnej cyklus, kterej se ukončí na tvrdo return(em), pak se dá udělat např
for(;;){..}

případně
while(true){...}

nebo zmiňovaný do-while :
do{...}while(tru­e)

Editováno 17.3.2013 9:26
Odpovědět
17.3.2013 9:26
Unix- svět, kde chcete být nulou :) (UID)
Avatar
Vojtěch Bargl:2.4.2013 15:36

Hele mužů se zeptat co znamená to %d a z minulý kapitoly %f (tak nějak mi došlo že to bude odkaz na tu funkci nebo něco takového), a jak poznám že zrovna to %d a ne to %f

 
Odpovědět
2.4.2013 15:36
Avatar
Kit
Redaktor
Avatar
Kit:2.4.2013 15:47

2 Vojtěch Bargl : %d je formát pro decimal, %f formát pro float. Prostuduj si metodu printf(), je převzata z jazyka C.

Editováno 2.4.2013 15:49
Odpovědět
2.4.2013 15:47
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
xxxvodnikxxx
Člen
Avatar
Odpovídá na Vojtěch Bargl
xxxvodnikxxx:2.4.2013 17:13

ono se dá použít i System.out.prin­tln("text" + promenna);
tohle je "céčkovskej výpis" :)

Editováno 2.4.2013 17:14
Odpovědět
2.4.2013 17:13
Unix- svět, kde chcete být nulou :) (UID)
Avatar
Kit
Redaktor
Avatar
Odpovídá na xxxvodnikxxx
Kit:2.4.2013 17:30

Používají se metody print(), println(), printf() i format(). V principu je jedno, kterou metodu použiješ, každá má své výhody i nevýhody. Céčkaři si zvykli na printf().

Metoda format() má výhodu v tom, že se dá použít ve třídě String a zřejmě i jinde. Měla by se jí dávat přednost.

Odpovědět
2.4.2013 17:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Benjibs
Člen
Avatar
Benjibs:23.6.2013 7:59

Je zlé, keď som v zmienenej kalkulačke použil do/while ?
Zdalo sa mi to lepším riešením, kedže podmienka sa tak testuje o 1x menej.
Má tento typ cyklu nejaké skryté nevýhody oproti normálnemu while?

Odpovědět
23.6.2013 7:59
1 + 1 = 2
Avatar
Kit
Redaktor
Avatar
Odpovídá na Benjibs
Kit:23.6.2013 8:57

Řekl bych že do-while v daném případě dokonce ještě vhodnější. Jen není tak oblíbený, protože není tak přehledný.

Jdeš na to správně.

Odpovědět
23.6.2013 8:57
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Mr. Forstak
Člen
Avatar
Mr. Forstak:11.7.2013 10:48

ERROR - Penny není Sheldonova spolubydlící (tj. Leonard), ale sousedka

 
Odpovědět
11.7.2013 10:48
Avatar

Člen
Avatar
:15.6.2014 21:09

Učím se, a proto jen taková poznámka; např. u mocninátoru se mi zdá zbytečné u Scanneru predikovat typ písma, když ho vůbec nepoužiji. Dále bych se chtěl zeptat, zda by byl nějaký problém, kdyby se u toho "Mocninátoru" místo příkazu: for (int i = 0; i < (n - 1); i++), použil: for (int i = 1; i < n ; i++).

 
Odpovědět
15.6.2014 21:09
Avatar

Člen
Avatar
:15.6.2014 21:28

Mno,asi si dokáži již odpovědět sám. Program chce pracovat jako správný kalkulátor v základu s 0.

 
Odpovědět
15.6.2014 21:28
Avatar
adamjil
Člen
Avatar
adamjil:11.10.2014 10:58

Ahoj, mám problém u toho cyklu while. U kalkulačky se switchem mi to fungovalo, ale pak jsem si udělal jednoduchou kalkulačku na sčítání a tam mi to nejde. Zobrazí se mi jenom: "Vítejte v kalkulačce". Nevíte co s tím? Posílám kód:
package sčítání;
import java.util.Scanner;

/**
*
* @author Adam
*/
public class Sčítání {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.prin­tln("Vítejte v kalkulačce!");
String pokracovat = "ano";
while (pokracovat.e­quals("ano"));
{
System.out.prin­tln("Zadej první číslo:");
int a = Integer.parse­Int(sc.nextLi­ne());
System.out.prin­tln("Zadej druhé číslo:");
int b = Integer.parse­Int(sc.nextLi­ne());
int vysledek = a + b;
System.out.prin­tln("Výsledek je: " + vysledek);
System.out.prin­tln("Chceš spočítat další příklad? ano/ne");
pokracovat = sc.nextLine();
}
System.out.prin­tln("Měj se");
}

}

 
Odpovědět
11.10.2014 10:58
Avatar
werty
Člen
Avatar
Odpovídá na adamjil
werty:11.10.2014 11:13

Za while nesmí být středník.

 
Odpovědět
11.10.2014 11:13
Avatar
Jan Lupčík
Šéfredaktor
Avatar
Odpovídá na adamjil
Jan Lupčík:11.10.2014 11:16

Jinak pro příště: použij tlačítko code :)

Editováno 11.10.2014 11:16
Odpovědět
11.10.2014 11:16
TruckersMP vývojář
Avatar
Odpovídá na adamjil
Neaktivní uživatel:11.10.2014 11:22
  1. Za while podmienkou sa nepíše ";"
  2. Do názvu triedy, premenných, hocičoho (možno okrem komentárov a reťazcov) sa nikdy nepíšu mäkčene, dĺžne atď. Ideálne je nepísať vôbec programy v češtine/slovenčine ale iba v angličtine.
  3. Používaj tlačítko "Vložiť zdrojový kód"
import java.util.Scanner;
public class Kalkulacka {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in, "Windows-1250");
        System.out.println("Vítejte v kalkulačce!");
        String pokracovat = "ano";
        while (pokracovat.equals("ano")) {
            System.out.println("Zadej první číslo:");
            int a = Integer.parseInt(sc.nextLine());
            System.out.println("Zadej druhé číslo:");
            int b = Integer.parseInt(sc.nextLine());
            int vysledek = a + b;
            System.out.println("Výsledek je: " + vysledek);
            System.out.println("Chceš spočítat další příklad? ano/ne");
            pokracovat = sc.nextLine();
        }
        System.out.println("Měj se");
    }
}
Odpovědět
11.10.2014 11:22
Neaktivní uživatelský účet
Avatar
adamjil
Člen
Avatar
 
Odpovědět
11.10.2014 11:30
Avatar
populosek201
Člen
Avatar
populosek201:25.1.2015 14:27

Zdravím lidi, tohle ke konci článku mi vrtá hlavou.

"String je referenční datový typ. Podmínka ("Text" == "Text") je špatně, musíme psát ("Text".equal­s("Text"))."

Nemělo by to spíše být

Podmínka (promenna == "Text") je špatně, musíme psát (promenna.equ­als("Text")).

Či něco špatně chápu? Děkuju :)

 
Odpovědět
25.1.2015 14:27
Avatar
szymsza
Redaktor
Avatar
Odpovídá na populosek201
szymsza:30.1.2015 21:07

Je to úplně jedno. Může to být

promenna.equals("Text")

nebo

"Text".equals("Text")

nebo

promenna.equals(promenna)
:)
 
Odpovědět
30.1.2015 21:07
Avatar
anciksfg
Člen
Avatar
Odpovídá na
anciksfg:6.2.2015 22:37

S tím 0 a (n-1) nebo 1 a n je to úplně jedno, ale asi je běžnější začínat od nuly ;) potom z toho hned vidíš, kolikrát jsi ten příkaz zopakoval: (n-1)krát.

 
Odpovědět
6.2.2015 22:37
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na anciksfg
Jan Vargovský:6.2.2015 23:00

Od nuly se začíná, protože nejčastěji iteruješ skrz nějakou kolekci (pole) a to se indexuje od 0.

 
Odpovědět
6.2.2015 23:00
Avatar
anciksfg
Člen
Avatar
Odpovídá na Jan Vargovský
anciksfg:6.2.2015 23:05

no... snaha byla :D díky ;)

 
Odpovědět
6.2.2015 23:05
Avatar
brevnovak
Člen
Avatar
brevnovak:7.3.2015 20:43

ahoj, muzete mi pls poradit, proc 'i' po konci cyklu o jednu vyssi nez kolikrat cyklus probehl?

for (int i=0;3>i;i++)
        {
           pole[i] = sc.nextInt();
           System.out.println("i je: "+i);

        }
        System.out.println("i po for cyklu je: "+i);

vypise

i je: 0
i je: 1
i je: 2
i po for cyklu je: 3

diky :)

 
Odpovědět
7.3.2015 20:43
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na brevnovak
Jan Vargovský:7.3.2015 20:46

Protože se inkrementuje, pak se testuje podmínka a pak vyskočí ven z cyklu.

 
Odpovědět
7.3.2015 20:46
Avatar
Erik Báča
Člen
Avatar
Erik Báča:31.10.2015 22:22

S programováním sice teprve začínám, ale neměl by ten "mocninátor" být takhle?

System.out.println("Zadejte číslo, které chcete umocnit");
            int mocnina = Integer.parseInt(sc.nextLine());
            System.out.println("Zadejte exponent");
            int mocnina2 = Integer.parseInt(sc.nextLine());

            int vysledek2 = mocnina;
            for (int i = 0; i <(mocnina2 - 1); i++)
                vysledek2 = vysledek2 * mocnina;
            if (mocnina2 != 0)
                System.out.printf("Výsledek: %d", vysledek2);
            else
                System.out.println("Výsledek: 1");

Protože pokud se nepletu tak každé číslo na nultou je jedna

Odpovědět
31.10.2015 22:22
Když mi dáš mínus, napiš proč!
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Erik Báča
pocitac770:3.11.2015 20:28

Samozřejmě, zdejší programy jsou pouze "základy", téměř u všech je ponecháno nějaké to místečko na vylepšování, přeci jen o to jde, aby programátor neustále svůj program obohacoval o užitečná vylepšení :)
Prakticky program vypíše vždy nesmysl, když tam zadáme něco, co neumí vypočítat, tak se snaž tyto případy odchytit... Např. tu tvoji nulu, dále třeba záporná čísla a klidně i desetinná, jestli si na to troufneš :D

 
Odpovědět
3.11.2015 20:28
Avatar
Neaktivní uživatel:30.11.2015 10:41

Je nějaká možnost, jak sečíst všechny hodnoty, které mi vypíše cyklus?

Odpovědět
30.11.2015 10:41
Neaktivní uživatelský účet
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
pocitac770:30.11.2015 10:55

Můžeš si je ukládat někam mimo cyklus, např.

//sečtení prvních 5 přirozených sudých čísel
int soucet = 0;
for (int i = 1; i <=5; i++){
    soucet += i*2;
    //+= ... přičtení něčeho k již existující proměnné
    Systrm.out.println(i*2);
}
System.out.println(soucet);
Editováno 30.11.2015 10:56
 
Odpovědět
30.11.2015 10:55
Avatar
Erik Báča
Člen
Avatar
Erik Báča:7.12.2015 20:33

Dá se nějak udělat aby to chtělo zápor toho .equals? Chtěl bych aby mi program vypsal neplatná volba, když uživatel nezadá ani ano, ani ne, takhle to nefunguje (vím proč) a potřeboval bych zápor .equals

pokracovat = sc.nextLine();
            if ((pokracovat != "ano") && (pokracovat != "ne")){
                System.out.println("Neplatná volba");

            }
Odpovědět
7.12.2015 20:33
Když mi dáš mínus, napiš proč!
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Erik Báča
Tomáš Brůna:7.12.2015 20:34

zkusil bych

if (!neco.equals(neco))
Odpovědět
7.12.2015 20:34
Vi veri universum vivus vici
Avatar
Odpovídá na Erik Báča
Tyler Hardstone:24.12.2015 22:55

Bud tak, ako pise Tomas, alebo cez else.

if ((pokracovat.equals("ano")) || (pokracovat.equals("ne")))
{ ... }
else System.out.println("Neplatna volba.")
Odpovědět
24.12.2015 22:55
Give me liberty, or give me death
Avatar
Jiří Kindl
Člen
Avatar
Jiří Kindl:29.2.2016 2:23

U Cyklu for mě ještě napadl tenhle způsob:

for(int i=1;i<=10;i++)
            {
                System.out.print(i*1+" ");
                System.out.print(i*2+" ");
                System.out.print(i*3+" ");
                System.out.print(i*4+" ");
                System.out.print(i*5+" ");
                System.out.print(i*6+" ");
                System.out.print(i*7+" ");
                System.out.print(i*8+" ");
                System.out.print(i*9+" ");
                System.out.print(i*10+" ");
                System.out.println();

            }
 
Odpovědět
29.2.2016 2:23
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Jiří Kindl
pocitac770:29.2.2016 7:11

Právě tady ale nejde o to, jakými všemi možnými zdouhavými cestami to jde vyřešit, tady se snažíme to co nejvíc zkrátit :D
Obecně když vidíš, že tam máš několik stejných příkazů po sobě, kde se akorát mění hodnota..

System.out.print(i*1+" ");
System.out.print(i*2+" ");
System.out.print(i*3+" ");
System.out.print(i*4+" ");
System.out.print(i*5+" ");
System.out.print(i*6+" ");
System.out.print(i*7+" ");
System.out.print(i*8+" ");
System.out.print(i*9+" ");
System.out.print(i*10+" ");

... tak by ses měl naučit automatickou myšlenku "Ha! Tady bych mohl udělat cyklus!".

Editováno 29.2.2016 7:13
 
Odpovědět
29.2.2016 7:11
Avatar
filiptartott
Člen
Avatar
filiptartott:7.4.2016 15:04

čo znamená %d

 
Odpovědět
7.4.2016 15:04
Avatar
Odpovídá na filiptartott
Libor Šimo (libcosenior):7.4.2016 15:24

Parameter výstupu. Výstup bude typu int.

Odpovědět
7.4.2016 15:24
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Michal Pipal
Člen
Avatar
Odpovídá na filiptartott
Michal Pipal:7.4.2016 15:24

Zastupny znak, ktery ocekava, ze mu posles integer, ktery zobrazi jako desitkove cislo (decimal, proto d).
Tudiz zapis

System.out.printf("%d ", i * j);

rika, "Budu tisknout retezec, v kterem zobrazim cele cislo, ktere dostanu v 'parametru' (resp. napsane za retezcem a carkou)"

 
Odpovědět
7.4.2016 15:24
Avatar
Pavel Kollin
Člen
Avatar
Pavel Kollin:15.4.2016 17:01

Může "mocninátor" být i takto?

System.out.println("Zadej zaklad:");
int x = Integer.parseInt(sc.nextLine());
System.out.println("Zadej mocninu:");
int n = Integer.parseInt(sc.nextLine());
int vysledek = 1;
for (int i = 0; i < n; i++)
    vysledek = vysledek * x;
System.out.printf("Vysledek je %d ", vysledek);
 
Odpovědět
15.4.2016 17:01
Avatar
Odpovídá na Pavel Kollin
Filip Oborník:15.4.2016 18:54

Určitě může. Ono se většinou najde více řešení.

Třeba ten zápis:

vysledek = vysledek * x;

se dá zapsat zkráceně (a podle mě i přehledněji) takto:

vysledek *= x;
Odpovědět
15.4.2016 18:54
"Good judgment comes from experience, and a lot of that comes from bad judgment." Will Rogers
Avatar
Martin Žilinský:20.4.2016 20:12

Pokud za exponent dosadíte 0, mocnina se spočítá špatně. Tohle řešení mě napadlo jako první:

int vysledek = a;
if (n == 0)
{
        vysledek = 1;
        System.out.printf("Výsledek: %d", vysledek);
}
else
for (int i = 0; i < (n - 1); i++)
{
        vysledek = vysledek * a;
        System.out.printf("Výsledek: %d", vysledek);
}
 
Odpovědět
20.4.2016 20:12
Avatar
Odpovídá na Martin Žilinský
Filip Oborník:20.4.2016 21:17

No vidíš, vůbec jsem si to neuvědomil :-D Samozřejmě že by se to muselo ošetřit podmínkou.
Dík moc za opravení

Odpovědět
20.4.2016 21:17
"Good judgment comes from experience, and a lot of that comes from bad judgment." Will Rogers
Avatar
tomisoka
Redaktor
Avatar
Odpovídá na Martin Žilinský
tomisoka:20.4.2016 21:45

Tohle je trochu lepší(proč tam dávat tu podmínku navíc)

int vysledek = 1;
for (int i = 0; i < n; i++) {
        vysledek *= a;
}
System.out.printf("Výsledek: %d", vysledek);

Teď už to zkolabuje jen při záporných a necelých číslech. :)

 
Odpovědět
20.4.2016 21:45
Avatar
@[email protected]:24.9.2016 21:10

Je nějaký příkaz příkaz pro vymazání textu v okně, kde běží program ? Něco jako cls, clear. Za odpověď děkuju

Odpovědět
24.9.2016 21:10
Věřím, že když je člověk zapálen pro svou práci a snaží se, tak ho úspěch nemine.
Avatar
Miroslav Melzer:2.10.2016 11:54

Snažim si procvičovat co jsem se dosud naučil, ale tohle svoje cvičení nějak nemůžu dotáhnout. Potřeboval bych poradit jestli to s dosavadníma znalostma( tj. 6 lekce) můžu dokončit. Nechci poradit jak to vyřešit, baví mě se s tím trápit, ale zase abych u toho nezůstal do smrti....Jde o jednoduchou kalkulačku pro sázkaře tedy s jedinou funkcí, pronásobit zadané kursy a opakovat to dle libosti uživatele.Cílem je získat výsledný kurs pro třeba deset událostí (čísel).
Došel jsem sem :

Scanner sc= new Scanner(System.in, "Windows-1250");
String dalsi = "a";
while(dalsi.equals("a"))
{

System.out.println("zadej kurs");
float kurs = Float.parseFloat(sc.nextLine());

  float vysledek = kurs;

 System.out.printf("Celkový kurs je zatím %.2f ", vysledek);
 System.out.println("další ? a/n");
 dalsi = sc.nextLine();
 dalsi= dalsi.toLowerCase();

\---

což funguje dobře až na to že to nepronásobuje ty kursy.....:)
Jdu na to zbytečně složitě ? Nebo mi zatim ještě nějaká znalost chybí k úspěchu?

 
Odpovědět
2.10.2016 11:54
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Miroslav Melzer
pocitac770:2.10.2016 12:51

Jestli dobře chápu, tak to má nějak zpracovávat více čísel, které se navzájem ovlivňují, když jich je více (promiň, že to říkám tak složitě, ale snažím se být obecný,když si nedokážu zaboha představit, jak s tím souvisí přímé dosazování, jestli to tam máš schválně nebo... no, to je jedno). Tak jako tak, ano, umíš to řešit, akorát jsi zapomněl na jednu drobnost, napovím: "Lokálnost" proměnných ;)

 
Odpovědět
2.10.2016 12:51
Avatar
Odpovídá na pocitac770
Miroslav Melzer:2.10.2016 16:49

Děkuju za snahu pomoct, ale zatim mě to moc nenakoplo...

 
Odpovědět
2.10.2016 16:49
Avatar
Odpovídá na Miroslav Melzer
Miroslav Melzer:3.10.2016 15:24

Mělo by to fungovat takhle:

System.out.println("zadej kurs");
     float a =Float.parseFloat(sc.nextLine());

     System.out.printf("celkový kurs je zatím %.2f ",a);
     System.out.println("zadej další");

      float b =Float.parseFloat(sc.nextLine());
      System.out.printf("celkový kurs je zatím %.2f ",a*b);
      System.out.println("zadej další");

      float c =Float.parseFloat(sc.nextLine());
      System.out.printf("celkový kurs je zatím %.2f ",a*b*c);
      System.out.println("zadej další");
         }
run:
zadej kurs
1.58
celkový kurs je zatím 1,58 zadej další
1.26
celkový kurs je zatím 1,99 zadej další
1.8
celkový kurs je zatím 3,58 zadej další
BUILD SUCCESSFUL (total time: 18 seconds)

Těch případů (kursů) by tam mělo jít vložit kolik bude uživatel chtít.
Ale nedokážu to napasovat do nějakýho toho cyklu.
 
Odpovědět
3.10.2016 15:24
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Miroslav Melzer
pocitac770:3.10.2016 16:30

Otázka. Potřebuješ na každou hodnotu novou proměnnou? Vždyť ji použiješ jen jednou, pokaždé použiješ její hodnotu vynásobenou nějakým číslem, potom výsledek vynásobený dalším číslem, atd atd. A k tvému původnímu problému, proměnné, které jsou uvnitř cyklu mají trvání pouze po dobu jednoho opakování, pak se načtou znovu, ale ty, co jsou mimo něj si poslední uloženou hodnotu pamatují, ať jsi cyklů udělal kolik chceš. Popřemýšlej nad tím ;)

 
Odpovědět
3.10.2016 16:30
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na pocitac770
Marian Benčat:3.10.2016 16:46

to by byla samozřejmě pravda, kdyby to byla pravda... :-) Java nerozlišuje z hlediska bytecodu jestli je proměnná uvnitř cyklu, nebo vně.. pořád generuje stejný bytecode.. Programátorská poučka však je, že by se proměnná měla definovat co nejblíže použití. Takže správně je naopak dávat proměnnou dovnitř cyklu.

" premature optimization is the root of all evil (or at least most of it) in programming." -Donal Knuth

Editováno 3.10.2016 16:48
Odpovědět
3.10.2016 16:46
Totalitní admini..
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Marian Benčat
pocitac770:3.10.2016 17:17

Ano, ale on se snaží najít způsob, jak něco udělat, a jestli sis toho nevšiml, tak já se mu snažím napovědět jak, sám řekl, že nechce přímé řešení

Editováno 3.10.2016 17:18
 
Odpovědět
3.10.2016 17:17
Avatar
Odpovídá na Marian Benčat
Miroslav Bejlek:3.10.2016 17:26

Pokud definuji proměnnou uvnitř cyklu, tak po opuštění cyklu ztratím údaje té hodnoty. Jak mohu tuto proměnnou použít o opuštění cyklu?

 
Odpovědět
3.10.2016 17:26
Avatar
Odpovídá na pocitac770
Miroslav Melzer:4.10.2016 19:17

Ne, nechápu to co s tim mam udělat....

String dalsi = "a";
   while(dalsi.equals("a"))
   {
    System.out.println("zadej kurs");
    float a = Float.parseFloat(sc.nextLine());
    System.out.println("Celkový kurs je zatím " + a);
    System.out.println("další ? a/n");

    dalsi = sc.nextLine();
    dalsi= dalsi.toLowerCase();
   }

Tyhle věci se mi tam musí opakovat :zadej kurs +celkovy je....+ další a/n
musí tam bejt i ten vstup uživatele, jestli teda cyklus s dalším během načte novou zadanou hodnotu....
Ale jak mam dát jinou proměnnou mimo cyklus, když musí pracovat s tou proměnnou "a" ?
A jak potom změnim ten -Celkový kurs je ..."a" ?

 
Odpovědět
4.10.2016 19:17
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Miroslav Melzer
pocitac770:4.10.2016 19:22

K proměnným vně cyklu můžeš přistupovat i zevnitř (ovšem ne naopak), vždyť jsi to i udělal s proměnnou "dalsi"

 
Odpovědět
4.10.2016 19:22
Avatar
Miroslav Melzer:4.10.2016 19:27

Teď mě napadlo, že ten první běh nemusí bejt v cyklu a trochu to napůl funguje:

System.out.println("zadej kurs");
   float a = Float.parseFloat(sc.nextLine());
   System.out.println("Celkový kurs je zatím " + a);

  String dalsi = "a";
  while(dalsi.equals("a"))
  {
   System.out.println("zadej kurs");
   float b = Float.parseFloat(sc.nextLine());
   System.out.println("Celkový kurs je zatím " + a*b);
   System.out.println("další ? a/n");

   dalsi = sc.nextLine();
   dalsi= dalsi.toLowerCase();
  }
run:
zadej kurs
1.5
Celkový kurs je zatím 1.5
zadej kurs
1.8
Celkový kurs je zatím 2.6999998
další ? a/n
a
zadej kurs
2
Celkový kurs je zatím 3.0
další ? a/n
n
BUILD SUCCESSFUL (total time: 30 seconds)

akorát tam zůstává těch 1.5 ze začátku......což je to o čem jsi mluvil...proměnná mimo cyklus......

 
Odpovědět
4.10.2016 19:27
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Miroslav Melzer
pocitac770:4.10.2016 19:32

Msg, už je toho dosti

 
Odpovědět
4.10.2016 19:32
Avatar
Misko X007X
Člen
Avatar
Misko X007X:6.1.2017 21:02

int mensi , cislo1 = 2, cislo2 = -5;
int vecsi = (cislo1 > cislo2) ? cislo1 : cislo2;
if (vecsi == cislo1) {
mensi = cislo2;
} else {
mensi = cislo1;
}
int sucet = 0;
for (int i = vecsi; i >= mensi; i--) {
sucet += i;
}
char vysledok = (sucet > 0) ? 'k' : 'z';

Poradíte mi prosím? lebo mi nechce spustiť program vôbec a neviem kde som pochybil .. Diki :)

 
Odpovědět
6.1.2017 21:02
Avatar
Moss
Člen
Avatar
Odpovídá na Miroslav Bejlek
Moss:30.1.2017 19:50

Premenna ktoru deklarujes v cykle, tak zanikne po opusteni cyklu, takze nijak :(

 
Odpovědět
30.1.2017 19:50
Avatar
Oskar Nový
Člen
Avatar
Odpovídá na @[email protected]
Oskar Nový:31.1.2017 14:18

Vygoogli si, nebo se podívej do dalších lekcích.

 
Odpovědět
31.1.2017 14:18
Avatar
Moss
Člen
Avatar
Moss:31.1.2017 17:24

Ahoj, vytvoril som si kalkulacku s pouzitim cykla while, ale po druhy krat sa nic nenacita do premennej
kod:

Scanner sc = new Scanner(System.in, "Windows-1250");
        boolean cyklus = true;
        while (cyklus) {
        System.out.println("KALKULACKA");
        System.out.println("Zadajte cislo1: ");
        float a = Float.parseFloat(sc.nextLine());
        sc.nextLine();
        System.out.println("Zadajte cislo2: ");
        float b = Float.parseFloat(sc.nextLine());
        System.out.println("Zadajte operaciu(+,-,*,/)");
        char c = sc.next(".").charAt(0);
        double vysledok = 0.0;
        switch (c) {
            case '+':
                vysledok = a + b;
                break;
            case '-':
                vysledok = a - b;
                break;
            case '*':
                vysledok = a * b;
                break;
            case '/':
                vysledok = a / b;
                break;
        }
            System.out.println("Vysledok: " + vysledok);
        System.out.println("Pokracovat?A/n: ");
        char d = sc.next(".").charAt(0);
        if (d == 'y') {
            cyklus = false;
        }
        else {
            cyklus = true;
        }
    }

po spusteni a naslednom vykonani vypoctu po 1. krat to napise:
Exception in thread "main" java.lang.Num­berFormatExcep­tion: empty String
at sun.misc.Floa­tingDecimal.re­adJavaFormatStrin­g(FloatingDeci­mal.java:1842)
at sun.misc.Floa­tingDecimal.par­seFloat(Floatin­gDecimal.java:122)
at java.lang.Flo­at.parseFloat(Flo­at.java:451)
at KalkulackaMat­ko.main(Kalku­lackaMatko.ja­va:10)
at sun.reflect.Na­tiveMethodAcces­sorImpl.invoke0(Na­tive Method)
at sun.reflect.Na­tiveMethodAcces­sorImpl.invoke(Na­tiveMethodAcces­sorImpl.java:62)
at sun.reflect.De­legatingMetho­dAccessorImpl­.invoke(Delega­tingMethodAcces­sorImpl.java:43)
at java.lang.reflec­t.Method.invo­ke(Method.java:498)
at com.intellij.rt­.execution.ap­plication.AppMa­in.main(AppMa­in.java:147)

Process finished with exit code 1

 
Odpovědět
31.1.2017 17:24
Avatar
Moss
Člen
Avatar
Odpovídá na Moss
Moss:31.1.2017 21:56

Riesenie som nasiel sam. Parsovanie pri sc.nextLine robilo neplechu. Riesenie:

public static void main(String[] argc) {
    Scanner sc = new Scanner(System.in);
    char d = 'a';
    while (d == 'a') {
        System.out.println("KALKULACKA");
        System.out.println("Zadajte cislo1: ");
        float a = sc.nextFloat();
        System.out.println("Zadajte cislo2: ");
        float b = sc.nextFloat();
        System.out.println("Zadajte operaciu(+,-,*,/)");
        char c = sc.next(".").charAt(0);
        double vysledok = 0.0;
        switch (c) {
            case '+':
                vysledok = a + b;
                break;
            case '-':
                vysledok = a - b;
                break;
            case '*':
                vysledok = a * b;
                break;
            case '/':
                vysledok = a / b;
                break;
        }
        System.out.println("Vysledok: " + vysledok);
        System.out.println("Pokracovat?A/n: ");
        d = sc.next(".").charAt(0);
    }}
 
Odpovědět
31.1.2017 21:56
Avatar
zitekv
Člen
Avatar
zitekv:31.1.2017 21:58

Ahoj, když si necháš přeložit následující text, pak by ti to mělo být jasný

Exception in thread "main" java.lang.NumberFormatException: empty String ... at KalkulackaMatko.main(KalkulackaMatko.java:10)

překlad Google: Výjimka ve vláknu "hlavní" java.lang.Num­berFormatExcep­tion: prázdný String ... na KalkulackaMat­ko.main (KalkulackaMat­ko.java:10)

Podle mne ti zůstanou prázdné znaky konce řádku po otázce na pokračování na konci. Uprav to na

...
char d = sc.next(".").charAt(0); sc.nextLine();
...

A mělo by to projít.

 
Odpovědět
31.1.2017 21:58
Avatar
Petr Vopalecký:6.2.2017 0:51

Ahoj, může mi někdo prosím nastínit proč se mi, viz níže, nevrací while? :)

public static void main(String[] args) {
    Scanner sc = new Scanner (System.in, "windows-1250");
    System.out.println("VÝPOČET BMI: ");

    String pokracovat = "jo";
    while (pokracovat.equals("jo")){

    System.out.println("Zadej váhu (KG): ");
    float vaha = sc.nextFloat();
    System.out.println("Zadej výšku (cm)!: ");
    float vyska = sc.nextFloat();
    //vzorec
    float vysledek = (vaha / (vyska*vyska/10000));

    //možnosti
    if (vysledek < 18.5){
        System.out.println("Tvoje BMI je: " + vysledek + " což znamená, že máš podváhu a zároveň vysoké zdravozní riziko");
    }
    else if (vysledek > 18.5 && vysledek < 24.9){
        System.out.println("Tvoje BMI je: " + vysledek + " což znamená, že jsi normální :) ");
    }
    else if (vysledek > 25 && vysledek < 29.9){
        System.out.println("Tvoje BMI je: " + vysledek + " což znamená, že máš nadváhu");
    }
    else if (vysledek > 30 && vysledek < 34.9){
        System.out.println("Tvoje BMI je: " + vysledek + " což znamená, že máš obezitu 1. stupně");
    }
    else if (vysledek > 34.9 && vysledek < 39.9){
        System.out.println("Tvoje BMI je: " + vysledek + " což znamená, že máš obezitu 2. stupně (závažná)");
    }
    else if (vysledek > 40){
        System.out.println("Tvoje BMI je: " + vysledek + " což znamená, že máš obezitu 3. stupně (těžná)");
    }

    //tohle nefunguje...
    System.out.println("Napiš 'jo' a zkus to znova");
    pokracovat = sc.nextLine();
    }
    System.out.println("Tak ne no...");
}
 
Odpovědět
6.2.2017 0:51
Avatar
Atrament
Člen
Avatar
Odpovídá na Petr Vopalecký
Atrament:6.2.2017 2:10

Zjednodušeně řečeno jde o to, že po provedení

float vyska = sc.nextFloat();

ti ve scanneru zůstane to závěrečné 'Enter', kterým uživatel ukončil zadávání své výšky. To se pak hned předá do

pokracovat = sc.nextLine();

nextLine() čte vstup do zadání Enter (konec řádku), jelikož ten už má jako zbytek po nextFloat(), tak to vypadá, jako bys nezadal nic jenom ten Enter. Proto bude podmínka ve while false a program skončí.

Mezi voláním nextFloat() a nextLine() je tedy třeba se zbavit toho přebytečného Enteru, nejjednodušeji tak, že zavoláš jedno extra nextLine():

float vyska = sc.nextFloat();
sc.nextLine() //tady se zbavíme přebytečného Enteru
... výpočet
System.out.println("Napiš 'jo' a zkus to znova");
pokracovat = sc.nextLine();

Stejný problém je i u použití nextInt()

 
Odpovědět
6.2.2017 2:10
Avatar
Odpovídá na Atrament
Petr Vopalecký:6.2.2017 10:55

Děkuji za jasné vysvětlení. :)
Tohle mi ale v javě příjde jako docela chytáček...

 
Odpovědět
6.2.2017 10:55
Avatar
Atrament
Člen
Avatar
Odpovídá na Petr Vopalecký
Atrament:6.2.2017 11:24

Je to taková malá záludnost :) Načítat vstup od uživatele mi přijde lepší dělat jenom pomocí nextLine() a případná čísla z toho pak parsovat podle potřeby

float vaha = Float.parseFloat(sc.nextLine());
 
Odpovědět
6.2.2017 11:24
Avatar
Vincent Jakl
Člen
Avatar
Vincent Jakl:18.3.2017 11:41
Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Vítejte v kalkulačce");
System.out.println("Zadejte prvni cislo");
float a = Float.parseFloat(sc.nextLine());
System.out.println("Zadejte druhou hodnotu");
float b = Float.parseFloat(sc.nextLine());
System.out.println("Vyberte si operaci");
System.out.println("1.Sčítání");
System.out.println("2.Násobení");
System.out.println("3.Odčítání");
System.out.println("4.Dělení");
int vyber= Integer.parseInt(sc.nextLine());
float vysledek = 0;
switch (vyber)
{
    case:1
            vysledek = a +b;
    break;
    case:2
            vysledek = a*b;
    break;
    case:3
            vysledek = a-b;
    break;
    case:4
            vysledek = a/b;
    break;
}

Mohl bych se zaptat proč mi nefunguje case?

Editováno 18.3.2017 11:42
 
Odpovědět
18.3.2017 11:41
Avatar
Vincent Jakl
Člen
Avatar
Odpovídá na Vincent Jakl
Vincent Jakl:18.3.2017 11:44

Tak jsem jenom blbej a neumim koukat :D

 
Odpovědět
18.3.2017 11:44
Avatar
Libor Sitek
Člen
Avatar
Libor Sitek:14.5.2017 14:25

Ahoj, mám za sebou základy Javy z tutoriálu. Docela často se zde používá načítání vstupu od uživatele pomocí metody .nextLine() a případné číslo z toho pak parsovat, např.

int a = Integer.parseInt(sc.nextLine());

Problém ale nastane, když se na vstupu zadá něco jiného než číslo, program poté spadne. Dá se nějak jednoduše ověřit, zda uživatel zadal číslo a popřípadě vypsat hlášku typu "Chybné zadání, opakujte znovu"?
Jediný způsob, na jaký jsem s mými omezenými znalostmi přišel, je obalit parsování do Try-Catch bloku:

int cislo;
boolean chyba;
do {
        System.out.println("Zadejte číslo: ");
        try {
                cislo = Integer.parseInt(sc.nextLine());
                chyba = false;
        }
        catch(Exception e) {
                System.out.println("Chybné zadání, opakujte znovu!");
                chyba = true;
        }
} while(chyba);
Odpovědět
14.5.2017 14:25
Když se chce, hledá se jak, když se nechce, hledá se proč
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Libor Sitek
gcx11:17.5.2017 13:46

Máš to téměř dobře, akorát bys neměl chytat přímo Exception. Můžeš v tom mít nějakou jinou chybu a pak by ses o ní nedozvěděl. Lepší je použít specializovanou výjimku NumberFormatEx­ception.
Anebo bez výjimek:

while (!sc.hasNextInt()){
     System.out.println("Please enter a valid number!");
     sc.next();
}
int result = sc.nextInt();
System.out.println("Number: " + result);
 
Odpovědět
17.5.2017 13:46
Avatar
David Švec
Člen
Avatar
David Švec:14.6.2017 20:12

Myslím, že je jednoduší použít funkci power na umocnění :D

Scanner sc = new Scanner(System.in, "Windows-1250");
        System.out.println("Napiš číslo, které chceš umocnit: ");
        float a = Float.parseFloat(sc.nextLine());
        System.out.println("Napiš exponent: ");
        float b = Float.parseFloat(sc.nextLine());
        System.out.println(Math.pow(a,b));
 
Odpovědět
14.6.2017 20:12
Avatar
Michal Athanasios Devecka:23.6.2017 19:41

programik ktory nacita cislo, overi ci sa nachadza toto cislo v prvkoch prvych 50 prvkov Fibonacciho postupnosti a ak ano, vypise vsetky predchadzajuce prvky

import java.util.Scanner;

// author Mishco

public class Matika {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.print ("Zadaj ľubovoľné číslo: ");
int cislo = Integer.parseInt (sc.nextLine () );

int[] fn = new int [50];
fn [0] = 0; fn [1] = 1;

switch (cislo) {
case 0: System.out.println ("Vami zadané číslo je prvým prvkom Fibonacciho postupnosti");
case 1: fn [2] = 1; System.out.println ("Vami zadané číslo je druhým prvkom Fibonacciho postupnosti. Postupnost je nasledovná: 0 + 1 = 1");

default:
for (int i = 2; i < 50; i++) {
fn [i] = fn [i-1] + fn [i-2];

if (cislo == fn [i]) {
System.out.printf ("Toto sú predchádzajúce čísla postupnosti od %d: ", cislo);
for (int j=0; j<i; j++) {
System.out.printf ( "%d +",fn [j]);

}
}
if (cislo < fn [i] ) {
System.out.prin­tln("Vami zadané číslo sa nenachádza v prvých 48 číslach Fibonacciho postupnosti");
break;
}
}
}

}}

 
Odpovědět
23.6.2017 19:41
Avatar
MiroslavP
Člen
Avatar
MiroslavP:17.11.2017 20:13

Java mne baví :-) , je to díky výbornému tutoriálu ITnetwork. M

 
Odpovědět
17.11.2017 20:13
Avatar
Michal Martinec:5.1.2018 20:28

mam jednu otazku, mozno debilnu tak dopredu pardon :)

co ten cyklus v mocninatore vlastne urobi?
nakolko nechapem ked je tam:
for(int i = 0; i < (n - 1); i++)
vysledok = vysledok * a;

nechapem co to realne urobi, kedze premennu "i" v zatvorkach nepouzivam...... Mozno je to tym ze sa dnes ucim od rana a je 20:30 :D ale neide mi to do hlavy. Prosim o vysvetlenie. Dakujem

Odpovědět
5.1.2018 20:28
Neporovnavaj sa s ostatnymi. Porovnavaj sa sam so sebou.
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Michal Martinec
gcx11:5.1.2018 21:14

V ní si počítáš, kolikrát se už provedlo

vysledok = vysledok * a;
 
Odpovědět
5.1.2018 21:14
Avatar
Odpovídá na gcx11
Michal Martinec:5.1.2018 21:17

To mi je jasne ale co sa v nom realne deje by som potreboval rozpisat. Lebo z toho co si mi odpisal stale nic nechapem. :D

Odpovědět
5.1.2018 21:17
Neporovnavaj sa s ostatnymi. Porovnavaj sa sam so sebou.
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Michal Martinec
gcx11:5.1.2018 21:48
  1. Na začátku se nastaví hodnota
int i = 0
  1. potom se provede kód, pokud platí podmínka:
i < (n - 1)
  1. A nakonec se upraví hodnota na
i++ // to samé jako i += 1

A poté se pořád opakují body 2 a 3, dokud platí podmínka ve 2

Editováno 5.1.2018 21:49
 
Odpovědět
5.1.2018 21:48
Avatar
Odpovídá na gcx11
Michal Martinec:5.1.2018 21:53

Tomu rozumiem. Klasicky cyklus to je. Ale nerozumiem telu cyklu.

Aky vplyv ma ten cyklus na
Vysledok = vysledok * a

V cykle je premenna “i”. Tato premenna nebola vobec pouzita v tele cyklu. Teda ako je mozne ze na telo cyklu ma nejaky vplyv cyklus samotny? Hlavne ma zaujima co sa deje priamo v tele cyklu teda v:
vysledok = vysledok * a

Dakujem za trpezlivost.

Odpovědět
5.1.2018 21:53
Neporovnavaj sa s ostatnymi. Porovnavaj sa sam so sebou.
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Michal Martinec
gcx11:5.1.2018 21:56

Původní hodnotu vynásobíš a a to provedeš n-1 krát

 
Odpovědět
5.1.2018 21:56
Avatar
Odpovídá na gcx11
Michal Martinec:5.1.2018 22:02

Nechajme to tak, lebo nerozumies co sa pytam :D ale aj tak dakujem za snahu. Skusim si to najst niekde na forach alebo vysvetlene na inom priklade.

Odpovědět
5.1.2018 22:02
Neporovnavaj sa s ostatnymi. Porovnavaj sa sam so sebou.
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Michal Martinec
gcx11:5.1.2018 22:42

Ok, příklad, pak to vzdávám :D Řeknemě, že a je 3 a n je 2, tj 3 na druhou = 9

int vysledek = a; // vysledek = 3
for (int i = 0; i < (n - 1); i++)
{
        vysledek = vysledek * a;
}
int vysledek = a;
for (int i = 0; i < (n - 1); i++)  // i = 0; i < 1
{
        vysledek = vysledek * a;
}
int vysledek = a;
for (int i = 0; i < (n - 1); i++)
{
        vysledek = vysledek * a; // vysledek = 3 * 3
}
int vysledek = a;
for (int i = 0; i < (n - 1); i++)  // i++ -> i = 1 (inkrementuje se i po provedení těla cyklu)
{
        vysledek = vysledek * a;
}
int vysledek = a;
for (int i = 0; i < (n - 1); i++) // i = 1; i < 1 (neplatí -> konec cyklu)
{
        vysledek = vysledek * a;
}
int vysledek = a;
for (int i = 0; i < (n - 1); i++)
{
        vysledek = vysledek * a;
}
// vysledek = 9
 
Odpovědět
5.1.2018 22:42
Avatar
Odpovídá na gcx11
Michal Martinec:5.1.2018 22:56

No vidis ze to ide :D takto rozpisane som to potreboval uz vtedy ked a bolo 2 a n 3 :D. Tomuto uz teda rozumiem dakujem :)

A to int i v cykle jednoducho je iba kvoli tomu, aby cyklus prebiehal a nemusi teda byt v tele cyklu pouzity ano?

Odpovědět
5.1.2018 22:56
Neporovnavaj sa s ostatnymi. Porovnavaj sa sam so sebou.
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Michal Martinec
gcx11:5.1.2018 23:08

Přesně tak

 
Odpovědět
5.1.2018 23:08
Avatar
Petr Zajac
Člen
Avatar
Odpovídá na gcx11
Petr Zajac:3.2.2018 14:31

V článku je uvedeno, že řídící proměná cyklu by měla začínat od 0,
je velký prohřešek začít počítat od 1 jak je ukázáno i v několika příkladech?
takže "mocninátor" by vypadal následovně
for (int i = 1; i < n ; i++)
{
vysledek = vysledek * a;
}
Díky

 
Odpovědět
3.2.2018 14:31
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Petr Zajac
gcx11:3.2.2018 19:40

Ahoj, nejčastější použití cyklů je procházení polí/kolekcí a ty se právě indexují od nuly.

for (int i = 0; i < n ; i++) {
    System.out.println(array[i]);
}

namísto

for (int i = 1; i <= n ; i++) {
    System.out.println(array[i-1]);
}

Taktéž opakování kódu se počítá zpravidla od nuly.

Ideálně bys měl ten kód psát tak, aby byl co nejjasnější a nejčitelnější. Takže ten kód, co jsi uvedl, mi přijde v pořádku, možná i krapet lepší, než původní.

Ale většinou ty cykly budeš stejně používat jenom k procházení nějakých polí/kolekcí, proto se hodí indexovat od nuly.

 
Odpovědět
3.2.2018 19:40
Avatar
Jiří Nežerný:18.3.2018 2:45

Krapet jsem násobilku vylepšil, aby výstup lépe vypadal - program před každé číslo přidá tolik mezer, aby byla čísla zarovnaná pod sebou. ;-)

public static void main(String[] args) {
for (int j = 1; j <= 10; j++)
{
for (int i = 1; i <= 10; i++)
{
String vysledek = String.valueOf(i * j);
int pocetMezer = 4 - vysledek.length();
String mezery = "";
for (int k = 0; k < pocetMezer; k++)
{
mezery = mezery + " ";
}
System.out.prin­t(mezery + vysledek);
}
System.out.prin­tln();
}
}

 
Odpovědět
18.3.2018 2:45
Avatar
Jiří Nežerný:18.3.2018 3:27

A ještě jsem vylepšil mocninátor: Jednak jsem do něj zabudoval i cyklus while, jednak jsem jej upravil tak, aby počítal celé mocniny (tj. aby exponent mohl být i 0 nebo záporné číslo), vše za použití doposud probrané látky. Snad to bude někomu jako cvičení k užitku. Budu rád i za diskusi, jak by se to dalo s dosud probranými prostředky udělat elegantněji nebo efektivněji - přiznám se, že jsem nad tím moc nepřemýšlel. ;-) (Vím, že přetypování ve funkci println je zbytečné, že by proběhlo implicitně, prostě si procvičuji konverzi řetězce na číslo. ;-) )

public static void main(String[] args) {
Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.prin­tln("Mocninátor");
System.out.prin­tln("==========");
System.out.prin­tln();
System.out.prin­tln("Počítá celé mocniny celých čísel");
System.out.prin­tln();
String znovu = "a";
while (znovu.equals("a"))
{
System.out.prin­tln("Zadejte základ mocniny: ");
int a = Integer.parse­Int(sc.nextLi­ne());
System.out.prin­tln("Zadejte exponent: ");
int n = Integer.parse­Int(sc.nextLi­ne());
if (n == 0)
{
System.out.prin­tln(String.va­lueOf(a) + "^0 = 1");
}
else
{
float vysledek = a;
int minus = 0;
if (n < 0)
{
minus = 1;
n = -n;
}
for (int i = 0; i < n - 1; i++)
{
vysledek = vysledek * a;
}
if (minus == 1)
{
vysledek = 1 / vysledek;
}
System.out.prin­tln("an = " + String.valueOf(vys­ledek));
}
System.out.prin­tln("Další výpočet (a/n)?");
znovu = sc.nextLine();
}
System.out.prin­tln();
System.out.prin­tln("Děkuji za použití mocninátoru.");
System.out.prin­tln();
}

 
Odpovědět
18.3.2018 3:27
Avatar
Odpovídá na Jiří Nežerný
Jiří Nežerný:18.3.2018 3:53

Ehm... Dá se už napsaný komentář smazat? :-/

Pokud ne, slibuji, že si příště nejprve pročtu diskusi (námět na sepsání kódu na výpočet mocniny se záporným, a dokonce i desetinným exponentem tam zazněl, a mé řešení je poměrně triviální), že si pořádně rozmyslím, jestli to má smysl, a že se naučím dávat delší kódy jinam. ;-)

 
Odpovědět
18.3.2018 3:53
Avatar
Josef Pospíšil:28.3.2018 14:58

Tohle byla výborná lekce, jen když jsem ji procházel poprvé, tak 2 cykly v sobě:

for (int j = 1; j <= 10; j++)
{
        for (int i = 1; i <= 10; i++)
        {
                System.out.print((i * j) + " ");
        }
        System.out.println();
}

byly dost těžké (z mého pohledu) na pochopení.
Tu by to možná chtělo trochu rozepsat, co se děje v jednotlivých krocích.
Já si tam pak přidal řádky abych to zjistil, ale než jsem to udělal, byl jsem z toho trochu zoufalý.
To detailnější rozepsání by to bylo lepší na pochopení (je to z pohledu úplného začátečníka), jinak to bylo dost fajn.

Editováno 28.3.2018 15:01
 
Odpovědět
28.3.2018 14:58
Avatar
Jiří Malý
Člen
Avatar
Jiří Malý:18.7.2018 10:39

Super! Ještě jsem si upravil kalkulačku abych mohl psát rovnou znaménka namísto čísel

if (volba.equals("+"))
{
vysledek = a + b;
}
else if (volba.equals("-"))
{
vysledek = a - b;
}
else if (volba.equals("*"))
{
vysledek = a * b;
}
else if (volba.equals("/"))
{
vysledek = a / b;
}

 
Odpovědět
18.7.2018 10:39
Avatar
Rasinsky
Člen
Avatar
Odpovídá na Josef Pospíšil
Rasinsky:26.7.2018 12:25
for (int j = 1; j <= 10; j++)
{
        for (int i = 1; i <= 10; i++)
        {
                System.out.print((i * j) + " ");
        }
        System.out.println();
}

Pre jednoduchsie pochopenie si to rozdel napr takto:
Vonkajsi / hlavny cyklus A (v tomto priklade s premennou j)
Vnutorny / vnoreny cyklus B (v tomto priklade s premennou i)

Cyklus A
{
//telo cyklu A ktory sa vykona podla podmienky
        Cyklus B
        {
        //telo cyklu B ktory sa vykona podla podmienky
        }
}

Takze ked zacne cyklus A, pokial podmienka plati (otestuje sa j <= 10) vykona sa telo cyklu, pre prvu hodnutu j.

V tomto priklade sa vykona dalsi cyklus B, kedze je v tele cyklu / je vnoreny do A.
Cyklus B sa bude vykonavat pokial podmienka plati (otestuje sa i <=10), pre vsetky hodnoty i sa vykona telo cyklu B. (i sa inkrementuje po kazdom vykonani tela cyklu, na to sluzi i++ )

Nasledne sa cyklus "vrati" na zaciatok A, kedze cele telo cyklu A bolo vykonane.
A znovu sa otestuje podmienka pre dalsiu hodnotu j (j sa inkrementuje po kazdom vykonani tela cyklu, na to sluzi j++ ), pokial podmienka plati ide sa znovu na telo cyklu A - cize opat sa vykonava cyklus B, a tak dookola pokial podmienka plati.

Dufam ze je to jasnejsie takto :)
alebo si to skus takto vypisat

for (int j = 1; j <= 10; j++)
                {
                        for (int i = 1; i <= 10; i++)
                        {
                                System.out.printf(" j= %d i= %d",j,i );
                        }
                        System.out.println();
                }
 
Odpovědět
26.7.2018 12:25
Avatar
Karel Klíč
Člen
Avatar
Karel Klíč:17.10.2018 16:59

Opět ta samá chyba v žebříkovém programování podmínky if a else kalkulačky zdrojového kódu vám chybí inicializace objektu Scanner na proměnnou sc. Divím se že ze stránek vám to jede. při okopírování ctrl + c a ctrl + v je program nefunkční.

 
Odpovědět
17.10.2018 16:59
Avatar
Feri Laky
Člen
Avatar
Odpovídá na Josef Pospíšil
Feri Laky:17. ledna 19:30

Ano, pre začiatok, ak človek len začína s prvým programovacím jazykom je ten algoritmus
skoro nepochopiterľný, teda aspoň ťažko.Akonáhle človek v minulosti načal nejaký jazyk,
hneď je na tom lepšie.Ja som asi pred 20-25 rokmi programoval v Pascale, a napriek dlhej dobe
mi teraz dva cykly nerobia problém na pochopenie.
Veľmi vychutnávam, ako vďaka dobrým príkladom lezú z hlavy staré znalosti.
Čo sa za mladi naučíš, na starosť akoby si našiel :-)))

 
Odpovědět
17. ledna 19:30
Avatar
Marcel Mares
Člen
Avatar
Marcel Mares:19. srpna 17:28

kde se mohu dovědět, jak se používá v javě cyklus do-while

 
Odpovědět
19. srpna 17:28
Avatar
flotoo
Člen
Avatar
Odpovídá na Marcel Mares
flotoo:19. srpna 21:51

Cyklus do-while je podobný jako cyklus while, jen s tím rozdílem, že podmínka je až na konci bloku s příkazy. To znamená, že se příkazy v cyklu vždy minimálně jednou provedou.

 
Odpovědět
19. srpna 21:51
Avatar
Víťa Š.
Člen
Avatar
Odpovídá na Jiří Malý
Víťa Š.:27. srpna 17:58

Funguje to s úpravou místo int volba = Integer.parse­Int(sc.nextLi­ne());
String volba = sc.nextLine(); /** switch (volba) */ , zprovoznit else. Pak to funguje, ale s tím, že když zadáš místo čísla text, vyhodí to chybu.

Odpovědět
27. srpna 17:58
Život by byl mnohem snazší, kdybychom k němu měli zdrojový kód.
Avatar
Víťa Š.
Člen
Avatar
Odpovídá na Jiří Malý
Víťa Š.:27. srpna 17:59
package vyukavse;
import java.util.Scanner;
public class VyukaVSE {
    public static void main(String[] args) {
Scanner sc = new Scanner(System.in, "UTF-8");

System.out.println("Vítejte v KALKULAČCE Víta Šoukala");
System.out.println("Desetinná čísla oddělte tečkou.");
String pokracovat = "a";
while (pokracovat.equals("a"))        /** porovna zdali uzivatel napsal a */
{
    System.out.println("Zadejte první číslo:");
    float a = Float.parseFloat(sc.nextLine());  /** float 32 bit desetina presnost cisla */
    System.out.println("Zadejte druhé číslo:");
    float b = Float.parseFloat(sc.nextLine());
    System.out.println("Zvolte si operaci:");
    System.out.println("+");
    System.out.println("-");
    System.out.println("*");
    System.out.println("/");
    /** int volba = Integer.parseInt(sc.nextLine());   funkcni jen s switch, case, if ((volba > 0) && (volba < 5))  */
   String volba = sc.nextLine();
   float vysledek = 0;     /** vysledek musi mit nejakou hodnotu, jinak vyhodi chybu  */
  /**   switch (volba)      /** switch je konstrukce, zjednodusi nam zapis vice podminek pod sebou */

if (volba.equals("+"))
{
vysledek = a + b;
}
else if (volba.equals("-"))
{
vysledek = a - b;
}
else if (volba.equals("*"))
{
vysledek = a * b;
}
else if (volba.equals("/"))
{
vysledek = a / b;
}
else       /** jinak */
{
        System.out.println("Neplatná volba");
}
{
        System.out.println("Výsledek: " + vysledek);

 }
System.out.println("Chcete vypočítat další příklad? » a/n «");
pokracovat = sc.nextLine();
}
   System.out.println("Děkuji za použití kalkulačky » Vít Šoukal «");
}
}
Odpovědět
27. srpna 17:59
Život by byl mnohem snazší, kdybychom k němu měli zdrojový kód.
Avatar
Tomáš Weiter:29. října 7:16

Opravdu velmi uzitecna lekce :)

 
Odpovědět
29. října 7:16
Avatar
Andy
Člen
Avatar
Andy :5. listopadu 16:14

Ahoj, mám otázku na "mocninator": Je důvod, proč je lepší to dělat takto složitě, nebylo by lepší použít Math.pow(a, b)? Děkuji za odpověď :)

 
Odpovědět
5. listopadu 16:14
Avatar
Odpovídá na Andy
Matúš Olejník:5. listopadu 16:29

Ahoj, prečítaj si názov lekcie "Cykly v Javě" ;)

Odpovědět
5. listopadu 16:29
/* I am not sure why this works but it fixes the problem */
Avatar
Zdeněk Kos
Člen
Avatar
Zdeněk Kos:8. listopadu 16:57

Ahoj, v když jsem v NetBeans opsal ten kód s while tak mi to nakonci píše chybu "reached end of file while parsing" program normálně spustit můžu funguje bez chyby akorát by mě zajímalo co to znamená :D

 
Odpovědět
8. listopadu 16:57
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 97 zpráv z 97.