Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

Cvičení k 9. lekci Javy

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

ONEbit hosting Unicorn College 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

Naprogramujte aplikaci, která vypočítá průměr ze zadaných známek. Vstup uživatel zadá jako jeden textový řetězec, kde jsou jednotlivé známky oddělené čárkou. Průměr by měl být desetinné číslo.

Ukázka obrazovky programu:

Znamky
Výpočet průměru známek
Zadejte známky oddělené čárkou:
1,2,5,3,3,2
Průměr: 2.6666666666666665

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

Naprogramujte převaděč zadaného textu do morzeovy abecedy, tedy opačný příklad k tomu, který byl v článku. Speciální znaky a diakritiku zanedbejte (vynechte je - ve výpisu se nezobrazí místo nich nic).

Ukázka obrazovky programu:

Morzeovka
Zadejte zprávu k zakódování:
Tento program jsem vytvoril sam, podivejte, co dovede.
Zakódovaná zpráva: - . -. - --- .--. .-. --- --. .-. .- -- .--- ... . -- ...- -.-- - ...- --- .-. .. .-.. ... .- -- .--. --- -.. .. ...- . .--- - . -.-. --- -.. --- ...- . -.. .

Na úlohu by se více hodila speciální kolekce slovník, tu však zatím neznáme, až se k němu v místním seriálu dostanete, můžete si to zkusit.


Pokročilý příklad

Naprogramujte rozveselovač textu. Aplikace funguje tak, že ji zadáte několik vět v jednom řetězci a ona za každou větu přidá smajlík. Věta může končit buď tečkou, otazníkem nebo vykřičníkem. Pokud končí tečkou, bude smajlík umístěn místo ní. Pokud ! nebo ?, bude umístěn za toto znaménko.

Smajlíci jsou postupně dosazovány v tomto pořadí:

:) :D :P

Čtvrtý smajlík v textu bude opět usměvaný, další vyplazený a tak stále dokola.

Ukázka obrazovky programu:

Rozveselovac
Zadej text k rozveselení:
Dnes jsem zaspal. Také jsem naboural auto! A spolkl mouchu!! Nemám já den blbec?
Rozveselený text: Dnes jsem zaspal :) Také jsem naboural auto! :D A spolkl mouchu! :P! :) Nemám já den blbec? :D

Do textu budete během jeho čtení přidávat další znaky nebo je dokonce mazat a s tím měnit aktuální pozici v textu. Protože není dobrý návyk měnit řídící proměnnou for cyklu, použijte while. Pokud se váš program zacyklí, zapauzujte si jej pomocí tlačítka pauzy a najeďte myší na jakoukoli proměnnou, uvidíte její aktuální hodnotu, což vám pomůže zjistit co je špatně.

K úloze by se lépe hodily tzv. regulární výrazy, které slouží k pokročilejší práci s textovými řetězci. Jelikož se jedná o pokročilejší problematiku, zkuste si to teď bez nich, je to dobré cvičení a někdy se podobnému ručnímu parsování stejně nevyhnete.


 

Stáhnout

Staženo 412x (53.46 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?
5 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 (18)

Avatar
Michal Plecity:27. května 22:38

Ahoj já jsem rozveselovač pojal takto:

Scanner sc= new Scanner(System.in,"Windows-1250");
        String vstup= sc.nextLine();
        String [] smajlici={":)",":D",":P"};
        String []vstup1=vstup.split("");
        String text="";
        int x=0;
        for(String znak:vstup1){
            text+=znak;
            if(znak.equals(".")){
               text=text.replace(".",smajlici[x]);
               x+=1;
                }
            else if (znak.equals("?")||znak.equals("!")){
                text+=smajlici[x];
                x+=1;
            }

            if(x>2){
                x=0;
            }


        }

        System.out.print(text);
 
Odpovědět 27. května 22:38
Avatar
Jozef Bouda
Člen
Avatar
Jozef Bouda:7. srpna 21:15

Mám problém a upřímně nevím, jak ho řešit. Vymyslel jsem řešení 2. úlohy, které podle mě funguje, ale při odevzdání ke kontrole mi moje řešení neprojde ani jednou. Má někdo návrh, proč by to nemělo fungovat?

Scanner sc = new Scanner (System.in, "Windows-1250");
System.out.prin­tln("Zadejte zprávu k zakódování");
String vstup = sc.nextLine()­.toLowerCase()­.trim();
vstup = vstup.replace(" ", "");
vstup = vstup.replace(",", "");
String abeceda = "abcdefghijklmnop­qrstuvwxyz";
String[] morseovka = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};
String [] sifra = new String [vstup.length()];
int poradi;
char znak;
for (int i = 0; i < vstup.length();i++){
if (-1<(((int)vstup­.charAt(i))-97) && (((int)vstup.cha­rAt(i))-97)<123){
poradi = ((int)vstup.cha­rAt(i))-97;
sifra [i] = morseovka [poradi];
}
else
sifra [i] = "";
}
System.out.prin­t("Zakodovaná zpráva:");
for (String i : sifra){
System.out.print(" " + i);
}
System.out.prin­tln();

 
Odpovědět 7. srpna 21:15
Avatar
LeenaNap
Člen
Avatar
LeenaNap:5. října 11:37

Ahoj, mám problém s jednoduchým příkladem. Kód níže mi funguje, výsledek mi vyjde 2,666667 a neprojde testováním. Můžete mi poradit, kde dělám chybu? Díky moc :)

Scanner sc = new Scanner(System.in, "Windows-1250");
    System.out.println("Výpočet průměru známek");
    System.out.println("Zadejte známky oddělené čárkou:");
    String zadaneZnamky = sc.nextLine().trim();

    // rozlozeni textu na jednotlive znamky
    String[] z = zadaneZnamky.split(",");

    int soucet = 0;

    // prevod znamek z textu na cisla a secteni hodnot
    int[] znamky = new int[z.length];

    for (int i = 0; i < z.length; i++)  {
        znamky[i] = Integer.parseInt(z[i]);
        soucet += znamky[i];
        }
    // vypocet prumeru
    float prumer = soucet / (float)znamky.length;

    System.out.printf("Průměr: %f", prumer);
Editováno 5. října 11:55
 
Odpovědět 5. října 11:37
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na LeenaNap
David Jančík:5. října 11:54

Příště prosím používej formátování kódu, díky.
Testování zatím neumí validovat oba desetinné separátory. V cvičení se očekává tečka - viz ukázka. Tedy "2.666". Stačí použít k výpisu System.out.println("Průměr: " + prumer); Brzy to opravíme. Díky za feedback.

Odpovědět  +1 5. října 11:54
Čím více času dostaneš, tím méně ho máš.
Avatar
LeenaNap
Člen
Avatar
Odpovídá na David Jančík
LeenaNap:5. října 11:56

Jasně, a díky moc.

 
Odpovědět 5. října 11:56
Avatar
Odpovídá na Jozef Bouda
Jiří Svoboda:5. října 13:44

Asi by bylo lepší kdyby jsi svůj kod sdílel v blocích

. A taky ho trochu učesal. Nedá se v něm moc vyznat a myslím, že ti tam chybí i nějaké složené závorky. Pokud je to ještě aktuální tak to prosím nasdílej znovu. Díky.

 
Odpovědět 5. října 13:44
Avatar
Michal Navrátil:26. října 13:54

Zasílám své 2 varianty řešení (třeba to někomu pomůže)

V úloze "Rozveselení textu" jsem použil FOR, IF/ELSE, metodu SUBSTRING a celočíselné dělení:

System.out.println("Zadej text k rozveselení:");
        String veta = sc.nextLine();
        String[] smajlik = {" :)", " :D", " :P"};
        int n = 0;
        String interpunkce = ".!?";

        for ( int i = 0; i < veta.length(); i++ )
            {
                if ( interpunkce.contains(String.valueOf(veta.charAt(i))) )
                    {
                    if ( veta.charAt(i) == '.')
                        veta = veta.substring(0, i ) + smajlik[ n%3 ] + veta.substring( i+1 );
                    else
                        veta = veta.substring(0, i +1 ) + smajlik[ n%3 ] + veta.substring( i+1 );
                    n++;
                    }
            }
        System.out.println("Rozveselený text: " + veta);

Má předchozí snaha byla s využitím FOREACH, IF/ELSE a metodu REPLACE:

System.out.println("Zadej text k rozveselení:");
        String[] veta = sc.nextLine().split("");
        String novaVeta = "";
        String[] smajlik = {" :)", " :D", " :P"};
        int n = 0;

        for ( String s : veta )
            {
                if ( s.contains(".") )
                    {
                    s = s.replace(".", smajlik[n%3]);
                    n++;
                    }
                else if ( s.contains("!") )
                    {
                    s = s.replace("!", "!" + smajlik[n%3]);
                    n++;
                    }
                else if ( s.contains("?") )
                    {
                    s = s.replace("?", "?" + smajlik[n%3]);
                    n++;
                    }

            novaVeta += s;

            }
        System.out.println("Rozveselený text: " + novaVeta);
 
Odpovědět 26. října 13:54
Avatar
neveril
Člen
Avatar
neveril:5. listopadu 12:31

Ahoj, vkládal jsem tam druhý příklad snad padesátkrát (různé verze), nakonec jsem vytvořil tuto mini a stále to nechce zvalidovat. Dokonce píše chybu serveru. Jak ten příklad mám řešit, aby prošel?

import java.util.Scanner;

public class Morzeovka
{
    public static void main(String[] args) {

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

        System.out.println("Zadejte zprávu k zakódování:");
        String t = sc.nextLine().toLowerCase();

        String[] morseovyZnaky = {".-", "-...", "-.-.", "-..", ".", "..-.",
            "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---",
            ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-",
            "-.--", "--.."};

        System.out.print("Zakódovaná zpráva");

        for (int i = 0; i < t.length(); i++) {
            if ((int) t.charAt(i) >= 97 && ((int) t.charAt(i) <= 122)) {
                System.out.print(" " + morseovyZnaky[(int) t.charAt(i) - 97]);
            }
        }
    }
}
 
Odpovědět 5. listopadu 12:31
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na neveril
David Jančík:5. listopadu 12:57

Díky za feedback. Chybí ti tam dvojtečka "Zakódovaná zpráva:". Momentálně službu ještě ladíme, již brzy budou smysluplnější chybové výstupy a porovnávání výstupů nebude tak striktní. Díky za pochopení.

Odpovědět 5. listopadu 12:57
Čím více času dostaneš, tím méně ho máš.
Avatar
neveril
Člen
Avatar
 
Odpovědět 5. listopadu 13:00
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 28. Zobrazit vše