Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Qestin
Člen
Avatar
Qestin:12.3.2017 22:07

Dobrý den,

mohl by mi někdo vysvětlit tento kód, např. mi ho okomentovat? Děkuji.

package Roman;

import java.util.*;

/**
 *
 * @author Martin Zeman
 */

public class Roman {
final static char symbol[] = {'M','D','C','L','X','V','I'};
final static int   value[] = {1000,500,100,50,10,5,1};

    static class Dvojice {

        int arab;
        String roman;

        Dvojice(int arab, String roman) {
            this.arab = arab;
            this.roman = roman;
        }
    }

    static Dvojice tabulka[] = {
        new Dvojice(1000, "M"),
        new Dvojice(900, "CM"),
        new Dvojice(500, "D"),
        new Dvojice(400, "CD"),
        new Dvojice(100, "C"),
        new Dvojice(90, "XC"),
        new Dvojice(50, "L"),
        new Dvojice(40, "XL"),
        new Dvojice(10, "X"),
        new Dvojice(9, "IX"),
        new Dvojice(5, "V"),
        new Dvojice(4, "IV"),
        new Dvojice(1, "I")
    };

    public static int fromRoman (String romanInput) throws NumberFormatException {
        if (romanInput == null || romanInput.isEmpty()) {
            throw new NumberFormatException("římské číslo musí obsahovat aspoň jeden znak");
        }
        int [] pole = najdiCisla(romanInput);
        int vysl = 0;
        for (int i = 0; i < pole.length; i++) {
            if (pole[i] == 0) {
                break;
            }
            if (i > 0) {
                if (pole[i] > pole[i-1]) {
                    throw new NumberFormatException("římské číslice jsou ve špatném pořadí");
                }
                if (pole[i] == pole[i-1]) {
                    if (pole[i] != 1000 && pole[i] != 100 && pole[i] != 10 && pole[i] != 1) {
                        throw new NumberFormatException("opakovat se mohou pouze čísla M, C, D a I");
                    }
                    if (i >= 3) {
                        if (pole[i] == pole[i-1]
                            && pole[i] == pole[i-2]
                            && pole[i] == pole[i-3]) {
                                throw new NumberFormatException("čísl M, C, D a I se mohou opakovat maximálně 3x");
                        }
                    }
                }
                if ((pole[i] == 900 || pole[i] == 500 || pole[i] == 400) && pole[i-1] < 1000) {
                    throw new NumberFormatException("v čísle může být pouze jedna z číslic CM, D či CD");
                }
                if ((pole[i] == 90 || pole[i] == 50 || pole[i] == 40) && pole[i-1] < 100) {
                    throw new NumberFormatException("v čísle může být pouze jedna z číslic XC, L či XL");
                }
                if ((pole[i] == 9 || pole[i] == 5 || pole[i] == 4) && pole[i-1] < 10) {
                    throw new NumberFormatException("v čísle může být pouze jedna z číslic IX, V či IV");
                }
                if (pole[i] == 100 && (pole[i-1] == 400 || pole[i-1] == 900)) {
                    throw new NumberFormatException("číslo C nemůže být po CD či po CM");
                }
                if (pole[i] == 10 && (pole[i-1] == 40 || pole[i-1] == 90)) {
                    throw new NumberFormatException("číslo X nemůže být po XL či po XC");
                }
                if (pole[i] == 1 && (pole[i-1] == 4 || pole[i-1] == 9)) {
                    throw new NumberFormatException("číslo I nemůže být po IV či po IX");
                }

            }
            vysl = vysl + pole[i];
        }
        return vysl;
    }

    private static int[] najdiCisla(String romanInput) throws NumberFormatException {
        int [] pole = new int [20];
        int poradiCisla = 0;
        int pozice = 0;
        while (pozice < romanInput.length()) {
            int cislo = 0;
            for (Dvojice tabulka1 : tabulka) {
                int romanLength = tabulka1.roman.length();
                if (pozice + romanLength <= romanInput.length()) {
                    if (romanInput.substring(pozice, pozice + romanLength).equals(tabulka1.roman)) {
                        cislo = tabulka1.arab;
                        pozice += tabulka1.roman.length();
                        break;
                    }
                }
            }
            if (cislo == 0) {
                throw new NumberFormatException("nepřípustný znak \'" + romanInput.charAt(pozice) + "\' v římském čísle");
            }
            else {
                pole[poradiCisla] = cislo;
                poradiCisla++;
            }
        }
        return  pole;
    }

@SuppressWarnings("empty-statement")
    public static String toRoman (int arabInput) throws IllegalArgumentException {
        if ((arabInput > 3999)||(arabInput<= 0)) {
            throw new IllegalArgumentException("Přípustná jsou čísla z intervalu 1-3999");
        }
        int cislo = arabInput;
        String vysl="";
        while (cislo > 0) {
            for (Dvojice tabulka1 : tabulka) {
                if (cislo >= tabulka1.arab) {
                    vysl = vysl + tabulka1.roman;
                    cislo = cislo - tabulka1.arab;
                    break;
                }
            }
        }
        return vysl;
    }

    public static void main(String[] args) {
        System.out.println("3999 římsky = " + toRoman(3999));
        System.out.println("1005 římsky = " + toRoman(1005));
        System.out.println("MMMCMXCIX arabsky = " + fromRoman("MMMCMXCIX"));
        System.out.println("LX arabsky = " + fromRoman("LXXX"));
    }

}
 
Odpovědět
12.3.2017 22:07
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Qestin
vajkuba1234:13.3.2017 14:17

Ty nevis co to dela, kdyz jsi to napsal? :)

Nahoru Odpovědět
13.3.2017 14:17
No hope, no future, JUST WAR!
Avatar
Qestin
Člen
Avatar
Odpovídá na vajkuba1234
Qestin:13.3.2017 17:55

Děkuji za odpověď, ale otázka směřovala na něco jiného :)

 
Nahoru Odpovědět
13.3.2017 17:55
Avatar
Odpovídá na vajkuba1234
Neaktivní uživatel:17.3.2017 20:06

Koneckonců, to je u programátorů normální, ne?

Nahoru Odpovědět
17.3.2017 20:06
Neaktivní uživatelský účet
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Qestin
Ondřej Štorc:17.3.2017 20:46

Jednoduše... Tento kód převádí římské číslice na arabské a naopak...

Nahoru Odpovědět
17.3.2017 20:46
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Neaktivní uživatel
vajkuba1234:17.3.2017 21:01

Jako, ze napisu program a nevim jak funguje?

Nahoru Odpovědět
17.3.2017 21:01
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Neaktivní uživatel:17.3.2017 21:04

To je úžasně stupidní odpověď ... copak někde napsal, že ho psal on?

Nahoru Odpovědět
17.3.2017 21:04
Neaktivní uživatelský účet
Avatar
Erik Báča
Člen
Avatar
Odpovídá na Neaktivní uživatel
Erik Báča:17.3.2017 21:59

Jeho jméno na itn je Martin Zeman, v popisu kódu má:

* @author Martin Zeman

z toho asi usoudil, že je autor.

Nahoru Odpovědět
17.3.2017 21:59
Když mi dáš mínus, napiš proč!
Avatar
vajkuba1234
Člen
Avatar
Nahoru Odpovědět
18.3.2017 2:39
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Neaktivní uživatel:18.3.2017 12:07

Umím, ale vzhledem k tomu, že to s největší pravděpodobností vygenerovalo IDE, tak jsem tomu nedával žádnou váhu. I tak to nemění vůbec nic na kvalitě tvojí odpovědi.

Nahoru Odpovědět
18.3.2017 12:07
Neaktivní uživatelský účet
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Neaktivní uživatel
vajkuba1234:18.3.2017 12:13

Nemam mu to snad ja okomentovat, aby dostal dobrou znamku ze sveho ukolu?

Ja se pouze ptal a na tom nevidim rozhodne nic stupidniho... Mozna by ses mohl zamyslet ty sam nad svou hysterickou reakci.

Nahoru Odpovědět
18.3.2017 12:13
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Neaktivní uživatel:18.3.2017 22:00

Jo, můžeš to komentovat jak chceš, ale jemu by asi nejvíc pomohla smysluplná odpověď na jeho otázku. A ta reakce nebyla ani trochu hysterická.

Nahoru Odpovědět
18.3.2017 22:00
Neaktivní uživatelský účet
Avatar
Qestin
Člen
Avatar
Odpovídá na Neaktivní uživatel
Qestin:18.3.2017 23:23

Děkuji, že jsou zde i lidé, kteří trochu přemýšlí. Nevidím velký význam v tom, že když jsem si tam dopsal jméno , bude takový problém. Kód nějakým způsobem chápu, ale potřeboval jsem od někoho slyšet jak to vidí on a jednotlivý části dovysvětlit.

 
Nahoru Odpovědět
18.3.2017 23:23
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Qestin
Ondřej Štorc:19.3.2017 11:31

Upřímně právě podle mně jde o to že jsi si tam dopsal to jméno. Když ten kód není tvůj a nenapsal jsi původního autora tak mi připadá drzé si tam napsat svoje jméno a vydávat to za svůj kód.

Nahoru Odpovědět
19.3.2017 11:31
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Odpovídá na Qestin
Neaktivní uživatel:19.3.2017 11:52

Vis, pravdepodobne jsi zacatecnik a zelezo se ma kout dokud je horke. Takze - ta informace o autorovi neni v programovani pro srandu, neni to informace o tom, kdo vlastni pocitac, na kterem se tenhle kod poskladal. Je to pravni a moralni koncept, autorstvi. Pokud nekde na netu objevim kousky kodu, prepisu si je pro vlastni potrebu, nevidim problem v tom, se vydavat za autora kodu. Pokud ale odnekud prenesu celou tridu, pak v tom vidim velky problem, jak pravni, tak moralni. Pravni ted vynechme, on te za tohle (konkretne) nikdo zalovat nebude.
O co mi jde predevsim, je fakt, ze by sis mel budovat dobre navyky uz od zacatku, zkus si tedy z tohohle vzit ponauceni, ze tohle se nedela, jednoduse proto, ze az budes delat na necem v tymu lidi, nebo na necem verejnem (treba open source) bude tahle direktiva urcitou znamkou, bude urcitou zarukou, bude neco jako tvuj emblem. Nikdo by si ve stredoveku nedovolil vzit erb cizi rodiny a vydavat ho za svuj, nikdo si nekoupi bavoraka, nerozebere ho na sroubek, neslozi zpet a nebude tvrdit, ze to auto vyrobil. Nechci abys to vnimal jako vytku, je to pratelska rada, upozorneni, ze ve svete vyvojaru, ta direktiva neco znamena a ze jsou lide, kteri jsou na to opravdu haklivi, protoze mnohdy opravdu o neco jde, jen diky zaruce autorstvi muzou napriklad zarucit kvalitu urciteho projektu. Takze at tak, ci onak, neni dobre podepisovat cizi kod, ktery jsi neupravil dostatecne na to, aby se stal tvym dilem a neni dobre psat, ze je autorem nekdo jiny, pokud jsi napriklad jen implementoval jeho popis (tohle neni tvuj pripad).

Normalne bych tohle vlakno, urcene zjevne k necemu jinemu nespamoval, timto, byt dulezitym a zasadnim tvrzenim, ale kvalita toho postu je velmi nizka, uz jen proto, ze se neptas na nic konkretniho. To je tady celkem zasadni navyk, poloz otazku, napriklad na to, proc se ta, ci ona metoda chova tak, ci jinak. Nekdo ti odpovi, tezko se tu ale najde clovek natolik znudeny, ze pujde a cely ten kod okomentuje radek po radku.

Nahoru Odpovědět
19.3.2017 11:52
Neaktivní uživatelský účet
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Neaktivní uživatel
vajkuba1234:19.3.2017 12:01

Ta reakce byla hystericka, to je zrejme uz z ni samotne. Avsak, muj dotaz, nikoliv odpoved (doopravdy umis cist?), smeroval na to, ze autor nechape kod, ktery napsal. Kdyby napsal, ze to ma odnekud a neni autorem, coz by byla odpoved na muj dotaz, je to o necem jinem.

Nahoru Odpovědět
19.3.2017 12:01
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Neaktivní uživatel:19.3.2017 14:55

Doopravdy umím číst. Neříkám totiž, že jsi napsal odpověď, ale že by mu pomohla. A vzhledem k tvý argumentaci odmítám pokračovat v rozhovoru.

Nahoru Odpovědět
19.3.2017 14:55
Neaktivní uživatelský účet
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Neaktivní uživatel
vajkuba1234:19.3.2017 15:31

Miluji, kdyz nekdo neumi uznat svou chybu a jeste lze. lol

Nahoru Odpovědět
19.3.2017 15:31
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Neaktivní uživatel:20.3.2017 2:07

Jo aha, tak v tom prvním komentáři jsem to fakt napsal, to jsem přehlíd :D

Nahoru Odpovědět
20.3.2017 2:07
Neaktivní uživatelský účet
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 19 zpráv z 19.