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.
