Pascalův trojúhelník

Oblíbeným zadáním práce při studiu základů programování v Javě je mimo jiné Pascalův trojúhelník. Pro neznalce Javy (a programování všeobecně) bývá vytvoření takto jednoduchého úkolu problém (zejména z toho důvodu, že u Pascalova trojúhelníku dojde poměrně brzy k přetečení datového typu integer). Proto jsem se rozhodl podělit se s vámi o mé řešení.

Celé řešení se bude skládat pouze ze dvou metod. Ještě než začneme, budeme potřebovat několik proměnných:

    private static final int VELIKOST = 100;  // velikost trojúhelníku
    private static int[][] trojuhelnik = new int[VELIKOST][0]; // vytvoření pole pro trojúhelník
    private static int celkem = 0;  // proměnná pro zjištění konečného počtu řádků

První ze zmíněných metod je vyplnTrojuhelnik, která vrací dvoujrozměrné pole integer[][], které reprezentuje Pascalův trojúhelník:

    public static int[][] vyplnTrojuhelnik() {  // naplní trojúhelník čísly
        boolean ok = true;  // zjištění, zda nepřetekl integer

        for (int i = 0; i < trojuhelnik.length; i++) {  // pro každý řádek
            trojuhelnik[i] = new int[i + 1];  // vytvoř řádek o jeden prvek větší, než ten předchozí

            for (int o = 0; o < trojuhelnik[i].length; o++) {

                if (ok) { // pokud nepřetekl integer

                    if ((o == 0) || (o == i))  // pokud u prvního nebo posledního prvku
                        trojuhelnik[i][o] = 1;  // nastav výsledek na 1
                    else if (o < i) {  // jinak:
                        int prvek = (trojuhelnik[i - 1][o - 1] + trojuhelnik[i - 1][o]);  // prvek bude součtem dvou prvků nad ním ležících
                        if (prvek < 1) {  // pokud je prvek méně než 1 (přetekl integer)
                            celkem = i;  // nastavíme celkový počet řádků na i
                            ok = false; // indikujeme, že došlo k přetečení
                        }

                        trojuhelnik[i][o] = prvek;  // na pozici [i][o] vložíme prvek
                    }
                }
                else  // pokud přetekl integer
                    break; // konec 2. cyklu

            }
            if(!ok)  // pokud přetekl integer
                break; // konec 1. cyklu

        }

        return trojuhelnik;  // vrátit pole s trojúhelníkem
    }

Druhá metoda se bude nazývat vypisTrojuhelnik a jediné co bude mít na starosti, bude vypsání dvojrozměrného pole získaného z metody vyplnTrojuhelnik:

    public static void vypisTrojuhelnik() {
        for (int i = 0; i < celkem; i++) { // pro každý řádek trojúhelníku
            int[] radek = trojuhelnik[i];  // radek = pole prvků řádku

            System.out.print((i + 1) + "): ");  // vypsání aktuálního řádku (číselný seznam)

            if (i < 9) {  // pro čísla menší než 10 je potřeba přidat jednu mezeru kvůli formátování
                System.out.print(" ");
            }

            for (int o = 0; o < celkem - i; o++) {  // vypsání počtu mezer tak, aby vytvořili dojem trojúhelníku
                System.out.print(" ");
            }

            for (int prvek : radek) {  // pro každý prvek
                    System.out.print(prvek + " ");  // vypiš prvek a mezeru
            }

            System.out.println("\n");  // za každým řádkem odřádkuj
        }
    }

A to je vlastně vše. Pokud jste pořádně nepochopili, jak kontroluji přetečení, dělám to nejjednodušší možnou metodou a to tak, že zjišťuji, zda výsledek operace není menší než 0 (proč je číslo po přetečení zpravidla záporné se můžete dočíst např. zde).

 

Zde je kompletní funkční kód:

package Pascal;

public class PascaluvTrojuhelnik {

    private static final int VELIKOST = 100;  // velikost trojúhelníku
    private static int[][] trojuhelnik = new int[VELIKOST][0]; // vytvoření pole pro trojúhelník
    private static int celkem = 0;  // proměnná pro zjištění konečného počtu řádků

    public static void main(String[] args) {
        vyplnTrojuhelnik();
        vypisTrojuhelnik();
    }

    public static int[][] vyplnTrojuhelnik() {  // naplní trojúhelník čísly
        boolean ok = true;  // zjištění, zda nepřetekl integer

        for (int i = 0; i < trojuhelnik.length; i++) {  // pro každý řádek
            trojuhelnik[i] = new int[i + 1];  // vytvoř řádek o jeden prvek větší, než ten předchozí

            for (int o = 0; o < trojuhelnik[i].length; o++) {

                if (ok) { // pokud nepřetekl integer

                    if ((o == 0) || (o == i))  // pokud u prvního nebo posledního prvku
                        trojuhelnik[i][o] = 1;  // nastav výsledek na 1
                    else if (o < i) {  // jinak:
                        int prvek = (trojuhelnik[i - 1][o - 1] + trojuhelnik[i - 1][o]);  // prvek bude součtem dvou prvků nad ním ležících
                        if (prvek < 1) {  // pokud je prvek méně než 1 (přetekl integer)
                            celkem = i;  // nastavíme celkový počet řádků na i
                            ok = false; // indikujeme, že došlo k přetečení
                        }

                        trojuhelnik[i][o] = prvek;  // na pozici [i][o] vložíme prvek
                    }
                }
                else  // pokud přetekl integer
                    break; // konec 2. cyklu

            }
            if(!ok)  // pokud přetekl integer
                break; // konec 1. cyklu

        }

        return trojuhelnik;  // vrátit pole s trojúhelníkem
    }

    public static void vypisTrojuhelnik() {
        for (int i = 0; i < celkem; i++) { // pro každý řádek trojúhelníku
            int[] radek = trojuhelnik[i];  // radek = pole prvků řádku

            System.out.print((i + 1) + "): ");  // vypsání aktuálního řádku (číselný seznam)

            if (i < 9) {  // pro čísla menší než 10 je potřeba přidat jednu mezeru kvůli formátování
                System.out.print(" ");
            }

            for (int o = 0; o < celkem - i; o++) {  // vypsání počtu mezer tak, aby vytvořili dojem trojúhelníku
                System.out.print(" ");
            }

            for (int prvek : radek) {  // pro každý prvek
                    System.out.print(prvek + " ");  // vypiš prvek a mezeru
            }

            System.out.println("\n");  // za každým řádkem odřádkuj
        }
    }
}

Poznámka:
Pokud byste nahradili všechny výskyty int např. za long, “dopočítáte se” bez přetečení dál.

Zanechat komentář ke článku: "Pascalův trojúhelník"