Segitiga Pascal Java

Reading Time: 9 minutes

Selamat datang di blogs UNYDeveloperNetwork. Pernahkah Anda mendengar “Segitiga Pascal?” Pastinya pernah, ya? Yap, dalam artikel kali ini Saya ingin berbagi tutorial membuat program generator Segitiga Pascal dengan menggunakan bahasa pemrograman Java. Tertarik? mari simak artikel ini sampai akhir.

Baik, sebelum meluncur lebih jauh lagi, apakah itu “Segitiga Pascal?”. Dari kutipan (wikipedia) diperoleh informasi bahwa, “segitiga pascal adalah aturan geometri pada koefisien binomial dalam sebuah segitiga.” Nah, segitiga ini sendiri dinamai berdasarkan ahli matematika yang bernama Blaise Pascal.

Sumber: wikipedia

Gambar di atas menunjukkan 5 barisan awal dari Segitiga Pascal. Mirip dengan array, di mana index pada Segitiga Pascal (paling atas) dimulai dari 0. Sehingga, jika diminta untuk menampilkan 5 baris dari segitiga ini, akan menjadi terhitung 6 baris (baris 0 s.d. baris 5);

Sumber: wikipedia

Selanjutnya, gambar di atas menunjukkan bagaimana kita dapat membangun anggota – anggota dari barisan dalam Segitiga Pascal. Hampir mirip dengan anggota – anggota bilangan Fibonacci, anggota – anggota dalam Segitiga Pascal ini juga disusun berdasarkan pada dua anggota bilangan sebelumnya (perhatikan gambar).

Bagaimana? tertarik untuk mencoba membuat programnya? Jika tertarik mari kita lanjutkan.

Program yang akan kita buat ini akan kita berikan nama SegitigaPascal.java. Sebenarnya program ini hanyalah program porting dari program yang sebelumnya juga pernah Saya buat dengan bahasa pemrograman Pascal (kode dalam bahasa pascal dapat diperoleh di sini). Jadi, output program dari ini pada akhirnya nanti akan seperti tangkapan layar di bawah ini.

Program akan mampu mencetak anggota – anggota dari Segitiga Pascal ini dengan rapi, dengan teratur, hingga membentuk segitiga. Namun, kelemahan dari program ini adalah, kerapian dan keteraturan dari pembentukan segitiganya hanya optimal sampai pada baris ke 12 saja.

Cukup basa – basi nya, sekarang kita langsung meluncur ke kodingannya. Untuk pertama kali, buatlah class Java dengan nama SegitigaPascal.java. Buat juga main methodnya.

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

Selanjutnya, kita import library – library yang dibutuhkan untuk program ini. Program ini setidaknya membutuhkan dua library. Pertama untuk menghandle inputan dari user, dan yang kedua adalah untuk menghandle kesalahan input dari User. Berikut adalah dua library yang diimport.

import java.util.InputMismatchException;
import java.util.Scanner;

Setelah mengimport kedua library yang dibutuhkan, Saatnya kita menggunakannya dalam program. Pertama Saya membuat return value method yang memiliki kembalian berupa object Scanner. Tujuan Saya membuat method ini adalah agar object Scanner ini dapat dipakai berulangkali dan dengan tipe data apapun.

private static Scanner initInput() {
    return new Scanner(System.in);
}

Kedua, Saya membuat method getInput() dengan kembalian berupa nilai yang diperoleh dari inputan User. method ini juga memiliki satu parameter String yang berfungsi untuk caption message kepada user ketika memberikan perintah kepada user memberi inputan kepada program. Di dalam method ini, kedua library digunakan. Keduanya terimplementasi ke dalam try and catch yang Saya gunakan. Dengan menggunakan try and catch ini, Saya dapat menghandle inputan dari user dan benar – benar memastikan bahwa inputan dari user benar sesuai dengan format.

private static int getInput(String message) {
    int alpha = 0;
    boolean status = true;
    while(status) {
        try {
            System.out.print(message + ": ");
            alpha = initInput().nextInt();
            status = false;
        }
        catch(InputMismatchException e) {
            status = true;
            System.out.println("Input must be a integer. Please try again!!\n");
        }
    }
    return alpha;
}

Dan, ketiga dua method ini dieksekusi, maka hasilnya adalah seperti tangkapan layar di bawah ini

Jadi benar – benar ketika user memberikan inputan yang salah, program akan terus menerus memberikan pesan kesalahan yang sama kepada user dan meminta user untuk memberikan inputan yang benar.

Berikutnya kita akan membuat method utama. Yakni method yang berfungsi untuk menghitung elemen – elemen anggota dalam Segitiga Pascal tersebut. Method ini Saya beri nama calculateElements(). Berikut adalah methodnya.

private static int calculateElements(int n, int k) {
    int res = 1;
    if(k > (n - k)) {
        k = n - k;
    }

    for(int i = 0; i < k; i++) {
        res = res * (n - i);
        res = res / (i + 1);
    }

    return res;
}

Dapat kita lihat, method di atas merupakan return value method dan memiliki dua parameter integer yang harus dipenuhi supaya method ini berjalan. Parameter pertama merupakan nomor baris sedangkan parameter kedua merupakan nomor kolom. Dua value untuk dua parameter dalam method ini diperoleh dari method lain yang akan kita bahas selanjutnya. Bagaimana cara kerja method ini? Berikut adalah cara kerja method calculateElements() dengan baris 5 (akan ditampilkan 6 baris, dimulai dari 0).

Tabel perubahan variabel eksekusi method calculateElements()

Dari tabel di atas dapat kita lihat, dari dua parameter n dan k dapat digunakan untuk menghasilkan anggota – anggota dari elemen segitiga pascal. Perhatikan tabel di atas, Anda akan melihat terdapat angka yang di cetak tegak dan ada pula angka yang dicetak miring. Untuk yang dicetak tegak, berarti tidak terjadi iterasi lebih dari satu kali pada blok kode:

    for(int i = 0; i < k; i++) {
        res = res * (n - i);
        res = res / (i + 1);
    }

Sebaliknya, untuk angka yang dicetak miring, menandakan bahwa terjadi proses iterasi pada blok kode di atas. Perhatikan juga pada kolom res final. Anda akan melihat bahwa value res pada tiap – tiap akhir eksekusi method menunjukkan sama persis dengan anggota – anggota dari elemen segitiga pascal 5 baris pertama.

sumber: wikipedia

Dengan ini dapat dipastikan bahwa method yang dibuat dapat bekerja dengan baik. Sekarang timbul pertanyaan, apakah masukan untuk parameter n dan k itu dilakukan secara manual? Jawabannya adalah tidak. Masukan untuk parameter n dan k adalah otomatis. Oleh karena itu, kita buat method berikutnya.

private static void printPascal(int a) {
    for(int b = 0; b < a+1; b++) {
        printSpace(2*a, b);
        for(int c = 0; c <= b; c++) {
            System.out.print(calculateElements(b, c));
            if(calculateElements(b, c) < 10) {
                System.out.print("   ");
            }
            else if(calculateElements(b, c) >= 10 && calculateElements(b,c) < 100) {
                System.out.print("  ");
            }
            else {
                System.out.print(" ");
            }
        }
        System.out.println(" ");
    }
}

method di atas adalah method generator untuk n dan k secara otomatis berdasarkan pada satu masukan parameter int. Masukan parameter int di dalam method ini diperoleh dari inputan user. Jika user memasukkan value 3, maka akan ditampilkan 4 baris. Jika user memasukkan value 5, maka akan ditampilkan 6 baris, dan begitu seterusnya. Sekarang mari kita perhatikan pada blok kode berikut ini.

if(calculateElements(b, c) < 10) {
     System.out.print("   ");
}
else if(calculateElements(b, c) >= 10 && calculateElements(b,c) < 100) {
     System.out.print("  ");
}
else {
     System.out.print(" ");
}

Apakah guna dari blok kode di atas? Sekarang perhatikan hasil eksekusi program pada tangkapan layar di bawah ini.

Paham? jika tidak paham kita perbesar kembali.

Ya!, perbedaan spasi antar angka. blok kode di atas adalah berfungsi untuk mengatur spasi antar anggota – anggota elemen segitiga. Tujuannya adalah supaya antar angka tidak terjadi tumbukan dan bentuk segitiga tetap terjaga simetris. Lantas, bagaimana cara mengatur spasi yang berada di sisi tepi kiri segitiga? Oleh karenanya kita memerlukan satu method lagi.

private static void printSpace(int a, int b) {
    a = a / 2;
    for(int i = b; i <= a; i++) {
        System.out.print("  ");
    }
}

Method yang bernama printSpace() dengan dua parameter ini berfungsi untuk mengatur spasi yang berada di sisi kiri segitiga. Apakah kedua parameter ini harus diisi secara manual? Tentu tidak, sekarang Anda perhatikan kembali pada method printPascal(). Anda akan melihat satu baris kode berikut:

printSpace(2*a, b);

Ya, benar. Baris kode itulah yang memanggil method printSpace tepat sebelum method printPascal() mengeksekusi method calculateElements() dengan tujuan untuk mencetak spasi pada sisi kiri segitiga.

Demikianlah method method inti yang krusian dalam program ini. Untuk berikutnya adalah method yang tidak terlalu berpengaruh dengan program ini (karena cukup dengan method – method diatas, program sudah dapat berjalan). Namun, karena interasi UX dengan user diperlukan, maka atas dasar alasan itulah Saya menambahkan dua method lagi.

Method yang pertama adalah method begin(), yang berfungsi untuk menampilkan identitas program ketika program pertama kali di jalankan, dan yang kedua adalah method end() yang menghandle program setelah selesai mengeksekusi method utama. Berikut ini adalah contoh dari method begin().

public static void begin() {
    System.out.println("Pascal Triangle App Generator");
    System.out.println("Program written in Java Language");
    System.out.println("Program Owner: Muhammad Irfan Luthfi (github.com/milstrike)");
    System.out.println("===========================================================");
}

Dan berikut adalah contoh dari method end().

private static boolean end() {
    boolean status = true;
    boolean appStatus = true;
    String alpha = "";
    while(status) {
        System.out.print("Continue? (Y/N): ");
        alpha = initInput().next();
        if(alpha.equalsIgnoreCase("Y") || alpha.equalsIgnoreCase("N")) {
            status = false;
            if(alpha.equalsIgnoreCase("Y")) appStatus = true;
            else appStatus = false;
        }
        else {
            status = true;
            System.out.println("Only accept Y/N!");
        }
    }
    return appStatus;
}

Setelah semua method dimasukkan kini saatnya kita mengubah isi dari method main() kita. Karena kita perlu mengeksekusi program ini kan? Jika tidak ada sesuatu di method main(), maka program tidak akan menampilkan apa – apa.

*Untuk yang tidak menambahkan method begin() dan end() cukup menambahkan baris kode berikut ke dalam method main():

public static void main(String[] args) {
    printPascal(getInput("Enter number of the lines"));
}

*untuk yang menambahkan method begin() dan end(), tambahkan baris kode berikut ke dalam method main():

public static void main(String[] args) {
    boolean appLoop = true;
    begin();
    while(appLoop) {
        printPascal(getInput("Enter number of the lines"));
        System.out.println();
        appLoop = end();
    }
}

Setelah semua selesai, jangan lupa disimpan dan mari kita RUN.

*Untuk yang tidak menggunakan method begin() dan end(), maka tampilan program ketika dieksekusi hanya seperti tangkapan layar di bawah ini.

Sedangkan bagi Anda yang menambahkan method begin() dan end(), maka tampilan program ketika dieksekusi seperti tangkapan layar di bawah ini.

Jadi perbedaannya adalah, pada program tanpa method begin() dan end(), eksekusi programnya hanya sekali saja. Namun, pada program yang menggunakan method begin() dan end(), eksekusi programnya dapat dilakukan berulang – ulang.

Bagaimana? sudah dapat berjalan dengan baik? belum? Silakan periksa kembali kodingan Anda dengan mencocokkan kode full dari program ini

*Tanpa begin() dan end()

package segitigaPascal;

import java.util.InputMismatchException;
import java.util.Scanner;

public class SegitigaPascal2 {
	
	private static Scanner initInput() {
		return new Scanner(System.in);
	}
	
	private static int getInput(String message) {
		int alpha = 0;
		boolean status = true;
		while(status) {
			try {
				System.out.print(message + ": ");
				alpha = initInput().nextInt();
				status = false;
			}	
			catch(InputMismatchException e) {
				status = true;
				System.out.println("Input must be a integer. Please try again!!\n");
			}
		}
		return alpha;
	}
	
	private static int calculateElements(int n, int k) {
		int res = 1;
		if(k > (n - k)) {
			k = n - k;
		}
		
		for(int i = 0; i < k; i++) {
			res = res * (n - i);
			res = res / (i + 1);
		}
		
		return res;
	}
	
	private static void printSpace(int a, int b) {
		a = a / 2;
		for(int i = b; i <= a; i++) {
			System.out.print("  ");
		}
	}
	
	private static void printPascal(int a) {
		for(int b = 0; b < a+1; b++) {
			printSpace(2*a, b);
			for(int c = 0; c <= b; c++) {
				System.out.print(calculateElements(b, c));
				if(calculateElements(b, c) < 10) {
					System.out.print("   ");
				}
				else if(calculateElements(b, c) >= 10 && calculateElements(b,c) < 100) {
					System.out.print("  ");
				}
				else {
					System.out.print(" ");
				}
			}
			System.out.println(" ");
		}
	}
	
	public static void main(String[] args) {
		printPascal(getInput("Enter number of the lines"));
	}
}

*Dengan begin() dan end()

package segitigaPascal;

import java.util.InputMismatchException;
import java.util.Scanner;

public class SegitigaPascal {
	
	private static Scanner initInput() {
		return new Scanner(System.in);
	}
	
	private static int getInput(String message) {
		int alpha = 0;
		boolean status = true;
		while(status) {
			try {
				System.out.print(message + ": ");
				alpha = initInput().nextInt();
				status = false;
			}	
			catch(InputMismatchException e) {
				status = true;
				System.out.println("Input must be a integer. Please try again!!\n");
			}
		}
		return alpha;
	}
	
	private static int calculateElements(int n, int k) {
		int res = 1;
		if(k > (n - k)) {
			k = n - k;
		}
		
		for(int i = 0; i < k; i++) {
			res = res * (n - i);
			res = res / (i + 1);
		}
		
		return res;
	}
	
	private static void printSpace(int a, int b) {
		a = a / 2;
		for(int i = b; i <= a; i++) {
			System.out.print("  ");
		}
	}
	
	private static void printPascal(int a) {
		for(int b = 0; b < a+1; b++) {
			printSpace(2*a, b);
			for(int c = 0; c <= b; c++) {
				System.out.print(calculateElements(b, c));
				if(calculateElements(b, c) < 10) {
					System.out.print("   ");
				}
				else if(calculateElements(b, c) >= 10 && calculateElements(b,c) < 100) {
					System.out.print("  ");
				}
				else {
					System.out.print(" ");
				}
			}
			System.out.println(" ");
		}
	}
	
	public static void begin() {
		System.out.println("Pascal Triangle App Generator");
		System.out.println("Program written in Java Language");
		System.out.println("Program Owner: Muhammad Irfan Luthfi (github.com/milstrike)");
		System.out.println("===========================================================");
	}
	
	private static boolean end() {
		boolean status = true;
		boolean appStatus = true;
		String alpha = "";
		while(status) {
			System.out.print("Continue? (Y/N): ");
			alpha = initInput().next();
			if(alpha.equalsIgnoreCase("Y") || alpha.equalsIgnoreCase("N")) {
				status = false;
				if(alpha.equalsIgnoreCase("Y")) appStatus = true;
				else appStatus = false;
			}
			else {
				status = true;
				System.out.println("Only accept Y/N!");
			}
		}
		return appStatus;
	}
	
	public static void main(String[] args) {
		boolean appLoop = true;
		begin();
		while(appLoop) {
			printPascal(getInput("Enter number of the lines"));
			System.out.println();
			appLoop = end();
		}
	}
}

Baiklah, demikian artikel Saya tentang program generator segitiga pascal ini. Seperti yang sudah di jelaskan di bagian awal artikel bahwa program ini hanya optimal sampai 12 baris saja. Kini tantangan untuk Anda dapat membuatnya dinamis sehingga dapat digunakan untuk berapapun baris yang ingin ditampilkan. Anggap saja artikel ini sebagai bahan awal untuk percobaan Anda, jika Anda sudah berhasil membuatnya, jangan lupa berbagi, bagikan kepada semuanya.

Demikianlah, jika Anda memiliki pertanyaan tentang artikel ini Anda dapat meninggalkannya pada kolom komentar. Jangan ragu! Saya akan berusaha menjawab pertanyaan Anda. Jika Anda ingin mencuplik artikel ini, jangan lupa sertakan pula URLnya. Marilah kita belajar untuk menghindari plagiasi.

Terakhir, Terima kasih banyak untuk Anda yang telah menyempatkan diri untuk membaca artikel ini.

^_^

UNDUH PROJECT

Please follow and like us:
Advertisements

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *