Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 10. diel - Cyklus for v Jave

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
gcx11
Tvůrce
Avatar
Odpovedá 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.

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

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

Avatar
Odpovedá 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. ;-)

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.

Editované
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;
}

Avatar
Rasinsky
Člen
Avatar
Odpovedá 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();
                }
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í.

Avatar
Feri Laky
Člen
Avatar
Odpovedá na Josef Pospíšil
Feri Laky:17.1.2019 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 :-)))

Avatar
Marcel Mares
Člen
Avatar
Marcel Mares:19.8.2019 17:28

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

Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 153.