Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Cvičení k 8. lekci Javy

Java Základní konstrukce Cvičení k 8. lekci Javy American English version English version

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

Následující 3 cvičení vám pomohou procvičit znalosti programování v Javě z minulé lekce. Ve vlastním zájmu se je pokuste vyřešit sami. Pod článkem máte pro kontrolu řešení ke stažení. Ale pozor, jakmile se na něj podíváte bez vyřešení příkladů, ztrácí pro vás cvičení smysl a nic se nenaučíte :)

Pokud si opravdu nebudete vědět rady, podívejte se raději znovu do minulého tutoriálu a pokuste se na to přijít.

Ohlasy studentů

Jednoduchý příklad

V minulém tutoriálu jsme si říkali o existenci ASCII tabulky. Ta obsahuje vždy ASCII kód a příslušný znak, který se k němu váže. Vypište tuto tabulku do konzole pro kódy 33 až 255.

Ukázka obrazovky programu:

ASCIITabulka
ASCII tabulka
=============
33:!
34:"
35:#
36:$
37:%
38:&
39:'
40:(
41:)
42:*
43:+
44:,
45:-
46:.
47:/
48:0
49:1

Středně pokročilý příklad

Naprogramujte aplikaci, které zadáte na vstupu textový řetězec a ona zjistí, zda je to palindrom. Palindrom je slovo, které se čte stejně zleva i zprava. Jsou to tedy např. slova: oko, anna, level, radar.

Ukázka obrazovky programu:

Palindromy
Zadej palindrom:
rotor
Ano, toto je palindrom.

Na případ, že se o palindrom nejedná, reagujte vypsáním následující hlášky:

Palindromy
Zadej palindrom:
motor
Toto není palindrom.

Řešení je více, ale určitě nic nezkazíte tím, že začnete s vypsáním slova pozpátku.

Pokročilý příklad

Naprogramujte šifraci textu pomocí Vigenerovy šifry. Program si na vstupu vyžádá šifrované slovo a heslo. Předpokládejme zadání slova "moribundus" a hesla "ahoj". Program posune jednotlivá písmena v šifrovaném slovu o určitý počet znaků v abecedě dopředu. Tento počet závisí na písmenech v heslu. V našem případě program posune první znak ve slovu o 1 ('a'), druhý o 8('h'), třetí o 15('o'), čtvrtý o 10 ('j'), pátý zas o 1 ('a') a tak dále.

Pro úplnost si graficky znázorněme, jak celá šifrace probíhá:

N O R I B U N D U S
N W R I B U N D U S
N W G I B U N D U S
N W G S B U N D U S
N W G S C U N D U S
N W G S C C N D U S
N W G S C C C D U S
N W G S C C C N U S
N W G S C C C N V S
N W G S C C C N V A

Ve zjednodušené verzi nemusíte řešit, že heslo může být kratší než šifrované slovo a zadat ho jako ahojahojah. Nezapomeňte, že pokud je v heslu např. písmeno S a posun je 8, výsledný znak je opět A. Toto přetečení abecedy musíte ošetřit, jinak získáte výsledek podobný tomuto: "nw sc}}nv}", ale i ten značí, že jste na správné cestě.

Algoritmus je blíže popsaný v článku Algoritmus Vigenerovy šifry , ale naleznete tam i podstatnou nápovědu jak ho napsat.

Jakmile zvládnete první část, ve které musí heslo zopakovat sám uživatel a půjdete na opakování hesla programem, máte v zásadě dvě možnosti. Buď si heslo cyklem zopakujete do nějakého pomocného Stringu nebo se zamyslíte nad tím, zda by k tomu nešel použít zbytek po celočíselném dělení, který se v Javě zapisuje operátorem %. Následující kód vrátí hodnotu 1:

System.out.println(5 % 2);

Ukázka obrazovky programu:

VigenerovaSifra
Zadejte text k zašifrování:
moribundus
Zadejte heslo:
ahoj
nwgscccnva


 

Stáhnout

Staženo 535x (52.83 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?
9 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.
Aktivity (10)

 

 

Komentáře
Zobrazit starší komentáře (35)

Avatar
Mate
Člen
Avatar
Mate:13. ledna 17:33

Ahoj, myslím že by jsi neměl odečítat od písmene v "heslu" číslo 97 ale číslo 96. Protože pokud máš písmeno "a" tak přičteš k písmenu ve "zprávě" hodnotu 1. Tedy a: 97-96=1, ty za písmeno "a" přičítáš nulu, za "b" místo hodnoty 2 číslo 1 atd.

while ((text.length()) > (heslo.length()))
{
heslo = heslo + heslo;
}
Tohle není moc dobré. Může se ti stát, že heslo-1 hodnot v poli "heslo" nebude vyplněných tím čím chceš, ale něčím náhodným, Tedy není to moc šetrné na paměť,

Těm dvěma vnořený cyklům moc nerozumím. Ty každé písmeno C z textu přičteš ke všem písmenům J z hesla.. to asi není to co chceš aby se dělalo. Zkus se na jednoduchém příkladu podívat, co dělají dva vnořené cykly. :)

 
Odpovědět 13. ledna 17:33
Avatar
Lukáš Sauer:14. ledna 16:49

Prikladám moje riešenie šifry :-)

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

        System.out.println("Zadaj text k zašifrovaniu"); //moribundus
        String text = sc.nextLine().trim().toLowerCase();
        System.out.println("Zadaj heslo:"); //ahoj
        String heslo = sc.nextLine().trim().toLowerCase();

        String text2 = "";
        int posun = 0;
        int znak_text = 0;
        char znak;

        //Hlavný cyklus
        for (int i = 0, j = 0; i < text.length(); i++, j++)
        {
          if (j < heslo.length())          //Určenie veľkosti posunu písmena v texte na základe hesla
          {
              posun = heslo.charAt(j) - 96;
          }
          else                            //Návrat na index 0 v hesle, pokiaľ je heslo kratšie ako text
          {
              j = 0;
              posun = heslo.charAt(j) - 96;
          }

          znak_text = text.charAt(i) + posun;

          if (znak_text > 'z')           //Ochrana pretečenia na znaky za písmenami v ASCII
          {
              znak_text -= 26;
          }


          znak = (char)znak_text;      //priradenie zašifrovaných znakov
          text2 += znak;
        }

        System.out.println(text2);
    }
 
Odpovědět 14. ledna 16:49
Avatar
dommynyk
Člen
Avatar
dommynyk:13. května 12:07

Scanner sc = new Scanner(System.in);
System.out.prin­tln("Zadaj slovo: ");
String slv = sc.nextLine();
slv.toLowerCase();
String opak = "";
for(int i = slv.length()-1; i >= 0; i--) {
opak += slv.charAt(i);
}
if(slv.equals(o­pak)) {
System.out.prin­tln("je palindrom");
}
if(!slv.equal­s(opak)) {
System.out.prin­tln("nieje palindrom");
}

Odpovědět 13. května 12:07
_________________________
Avatar
Peter Kahan
Člen
Avatar
Peter Kahan:25. května 12:56

Posielam riešenie Vigener. šifry pomocou cyklu for, pre tých ako som ja, čo nepoužili modulo :)

package priklad3_cv_8;
import java.util.Scanner;
public class Priklad3_cv_8 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Zadaj slovo na zašifrovanie:");
        String text = sc.nextLine();
        System.out.println("Zadaj šifrovacie slovo:");
        String heslo = sc.nextLine();
        String sifrat="";
        int a = (int)'a';
        int z = (int)'z';
        int j = 0;
        for(char c:text.toCharArray()){
            int i = (int)c;
            i=i+heslo.charAt(j)-96;
            j++;
            if(i>z)
                i -= (z-a)+1;
            if(i<a)
                i += (z-a)+1;
            if(j==heslo.length())
                j=j-heslo.length();
            sifrat = sifrat+(char)i;
        }
        System.out.println("Zašifrované: "+sifrat);
    }
}
 
Odpovědět 25. května 12:56
Avatar
Jozef Bouda
Člen
Avatar
Jozef Bouda:1. srpna 9:43

Dotaz k druhé úloze, postupoval jsem trochu jinak. Převedel jsem si vstup na pole znaků a vytvořil si pole znaků naruby. V podstatě jsem přepsal vstup pozpátku, ale použil jsem k tomu pole. V ten moment jsem narazil na problém, že jsem nebyl schopný vytvořit podmínku if pro pole se rovná pole, respektive pole [i] = pole2 [i].

Může někdo poradit, jak by taková podmínka měla vypadat?
Díky

 
Odpovědět 1. srpna 9:43
Avatar
Libor Šimo (libcosenior):25. září 18:45

if (pole[i].equal­s(pole2[i]) // porovnanie reťazca(pole[i] a pole2[i]
Výsledok je true alebo false.

Odpovědět 25. září 18:45
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Jozef Bouda
Libor Šimo (libcosenior):26. září 6:53

Prvý krát som špatne prečítal tvoj príspevok.
Ak tam máš 2 polia znakov, porovnávaš jednotlivé znaky klasicky:
if (pole[i] == pole2[i])
Výsledok je true alebo false.

Odpovědět 26. září 6:53
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):26. září 6:55

Môj zdroják na palindrom:

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in, "UTF-8");
        System.out.println("Zadej palindrom:");
        String s1 = sc.nextLine();
        int j = s1.length() - 1;
        int pocet = 0;
        String s = s1.toLowerCase();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) != s.charAt(j--)) {
                System.out.println("Toto neni palindrom.");
                break;
            }
            pocet++;
        }
        if (pocet == s.length())
        System.out.println("Ano, toto je palindrom.");
    }
}
Odpovědět 26. září 6:55
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
zitekv
Člen
Avatar
zitekv:15. října 19:43

Nemohu přijít na chybu pro úspěšné odevzdání řešení:
Poradíte?

Celkové hodnocení: Selhalo (75 %)
Počet testů: 4, Prošlo: 3, Selhalo: 1
Doba běhu: 1347 ms

Scanner sc = new Scanner(System.in, "Windows-1250");
    System.out.println("Zadej palindrom:");
    String slovo=sc.nextLine().toLowerCase().trim();
    String obraceneSlovo="";
    for (int i=slovo.length();i>0;i--)
    obraceneSlovo+=slovo.charAt(i-1);
    if (slovo.equals(obraceneSlovo)) System.out.println("Ano, toto je palindrom.");
 
Odpovědět 15. října 19:43
Avatar
zitekv
Člen
Avatar
Odpovídá na zitekv
zitekv:15. října 19:48

Už to mám, v zadání není uvedeno znění pro else větev:

"Toto není palindrom."
 
Odpovědět  +1 15. října 19:48
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 10 zpráv z 45. Zobrazit vše