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 – 14. diel - Textové reťazce v Jave - Práca s jednotlivými znakmi

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
Odpovedá na Zdeněk Svoboda
Libor Šimo (libcosenior):23.1.2017 16:05

Vytvoris prazdny retazec, aby si donho mohol pridavat v cykle jednotlive posunute znaky.

Odpovedať
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Filip Gajdos
Člen
Avatar
Filip Gajdos:4.2.2017 15:14

/*

  • To change this license header, choose License Headers in Project Properties.
  • To change this template file, choose Tools | Templates
  • and open the template in the editor.

*/
package znaky;
import java.util.Arrays;

/**
*

  • @author filip212

*/
public class Znaky {

/**

  • @param args the command line arguments

*/
public static void main(String[] args) {
// TODO code application logic here

// retazec ktory chcem analyzovat
String ss = "Programátor sa zasekne v sprche, pretože inštrukcie na šampónu boli: Namydliť, umyť, opakovať.";
System.out.prin­tln(ss);
ss = ss.toLowerCase();

//Inicializacia pocitadiel
int pocetSamohlasok = 0;
int pocetSpoluhlasok = 0;

// definicia pola samohlasok a spoluhlasok
String[] samohlasky = {"a", "e", "i", "o", "u", "ä", "á", "é", "í", "ó", "ú", "ia", "ie", "iu", "ô"};
String[] spoluhlasky = {"d", "t", "n", "l", "h", "ch", "g", "h", "k", "ď", "ť", "ň", "ľ", "c", "č", "ž", "š", "dz", "ďz", "m", "b", "p", "v", "z", "s", "f", "r"};

// Hlavny cyklus
for (char c : ss.toCharArray())
{
for (int i = 0; i<15; i++)
{
if (samohlasky[i]­.contains(Strin­g.valueOf(c)))
pocetSamohlasok++;
}

for (int i = 0; i <27; i++)
{
if (spoluhlasky[i]­.contains(Strin­g.valueOf(c)))
pocetSpoluhlasok++;
}
}

//Vypis na konci
System.out.prin­tf("Pocet samohlasok = %d\n", pocetSamohlasok);
System.out.prin­tf("Pocet spoluhlasok = %d\n", pocetSpoluhlasok);
System.out.prin­tf("Pocet nepismennych znakov = %d", ss.length() - (pocetSamohlasok + pocetSpoluhlasok));
}

}

Tento kod mi normalne funguje pokial to mam v cestine vetu aj samohlasky a spoluhlasky dostavam rovnake vysledky ako v clanku pokial to ale prehodim do SVK jayzka dostavam
run:
Programátor sa zasekne v sprche, pretože inštrukcie na šampónu boli: Namydliť, umyť, opakovať.
Pocet samohlasok = 58
Pocet spoluhlasok = 53
Pocet nepismennych znakov = -17BUILD SUCCESSFUL (total time: 0 seconds)

Avatar
Michal813
Člen
Avatar
Michal813:10.3.2017 13:36

toto >>> "ie", "iu", "dz", "ďz" <<<< nie sú samohlásky a ni spoluhlásky, ale dvojhlásky - a tie ASCII nepozná ....

Avatar
Matěj Prášek:13.6.2017 17:22

Moje řešení Caesara s českou diakritikou :-)

package caesar;

import java.util.Scanner;

public class Caesar {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in, "Windows-1250");

        //abeceda jako pole charů
        char[] alphabet = "aábcčdďeéěfghiíjklmnňoópqrřsštťuúůvwxyýzž".toCharArray();

        System.out.println("Zadejte text pro šifrování:");
        String text = sc.nextLine().toLowerCase();

        System.out.println("Zadejte číslo pro šifrování:");
        int number = Integer.parseInt(sc.nextLine());

        boolean found;

        for(char c : text.toCharArray())
        {
            found = false;
            for(int i = 0; i < alphabet.length; i++)
            {
                if (c == alphabet[i])
                {
                    found = true;
                    System.out.print(alphabet[(i+number)%alphabet.length]);
                    break;
                }
            }
            if(!found)
                System.out.print(c);
        }
        System.out.println();
    }

}
Avatar
Michal Athanasios Devecka:21.6.2017 18:32

všetkému rozumiem v tvojom príklade, len tomu výstupnému výrazu akosi nie. vysvetlil by si tu [(i+number)%al­phabet.length]); ? nerozumime tomu %alphabet.lenght

dik.

Avatar
gcx11
Tvůrce
Avatar
Odpovedá na Michal Athanasios Devecka
gcx11:22.6.2017 9:33

Tomu se říká modulo a vrací zbytek po dělení tím číslem, v tomto případě velikost toho pole alphabet.

Pole má velikost 41 znaků, chceš například dělat posun o jeden znak z písmene 'ž'. Jeho pozice v pozice v poli je 40, takže:

(40+1)%41=41%41=0

dává pozici znaku po posunu, což je znak 'a'.

Taky by to šlo kontrolovat ifem, jestli jsi nejsi s indexem už mimo pole, ale toto je jednodušší.

Avatar
Michal Athanasios Devecka:26.6.2017 10:42

Všecko jasné, gcx. Opäť som o niečo múdrejší. ešte raz dik.

Avatar
Michal Stisek:7.8.2017 9:58

Docela by mě zajímalo řešení, jak odstranit ze vstupu uživatele mezery, otazníky, vykřičníky, apod a až potom to zakódovat. Zkouším to dlouhou chvíli, ale na to mám asi malej skill, kdyby jste někdo věděl, budu rád.

např. vstup: Ahoj to jsem já, jak se daří?
pro zašifrování by z toho bylo: ahojtojsemjajak­sedari

Asi bych si nepovolené znaky uložil do pole a s nimi dál pracoval, jako že by se při výskytu ve vstupu nahradily, ale fakt nevím jak... :-/

Odpovedať
Jít pořád dál má smysl
Avatar
Michal Stisek:7.8.2017 10:08

Jediné co jsem dokázal je odstranění mezer v textu, takovým primitivním způsobem, ale chce to nějak ty povolené nebo zakázané znaky:

public class CaesarovaSifra {

    public static void main(String[] args) {
        // TODO inicializace promennych
        Scanner sc = new Scanner(System.in, "UTF-8");
        System.out.println("Zadej větu k zakódování...");
        String vstup = sc.nextLine();
        String zakazane = " ";
        String povolene = "";
        String veta = vstup.toLowerCase().trim().replace(zakazane, povolene);
        System.out.printf("Text k zakódování: %s\n", veta);
        String zprava = "";
        System.out.println("Zadej klíč o kolik dojde k posunu...");
        int posun = Integer.parseInt(sc.nextLine());

        // cyklus procházející jednotlivé znaky
        for (char c : veta.toCharArray()){
            int i = (int)c;
            i += posun;
            // kontrola přetečení
            if (i > (int)'z'){
                i -= 26;
            }
            char znak = (char)i;
            zprava = zprava + znak;
        }

        // výpis
        System.out.printf("Zašifrovaná zpráva: %s\n", zprava);
    }

}
Odpovedať
Jít pořád dál má smysl
Avatar
pocitac770
Tvůrce
Avatar
Odpovedá na Michal Stisek
pocitac770:7.8.2017 21:51

Tip: vzhledem k tomu, že všemožných znaků jsou stovky, ba tisíce, tak je k ničemu vpisovat seznam nepovolených znaků... jednoduše si uděláš pole s povolenými znaky, poté projedeš string znak po znaku, jestli se onen znak nenachází v poli povolených znaků, tak ho odstraníš... (zde narazíš na další problém, ale to až později... Uvidíš)

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