Selamat datang di blogs UNYDeveloperNetwork. Saya akan melanjutkan senang – senang kita dengan tutorial lagi untuk bahasa pemrograman Java. Kali ini kita akan membuat program generator bilangan prima sederhana. Program ini mampu mencetak bilangan prima dalam rentang tertentu dengan menggunakan console. Bagaimanakaha cara membuatnya? mari kita simak.
Bilangan prima, Kita sudah mengenal jenis bilangan ini sejak dari tingkat Sekolah Dasar. Untuk mengingat kembali, bilangan prima adalah bilangan yang hanya dapat habis dibagi oleh angka 1 dan bilangan itu sendiri. Bilangan prima juga tidak boleh 0 atau 1. Sehingga otomatis bilangan prima itu sendiri dimulai dari angka 2 dan seterusnya hingga tak terhingga (hanya tipe data yang membatasinya).
Contohnya adalah sebagai berikut.
- Angka 2; prima; karena hanya dapat dibagi dengan angka 1 dan 2.
- Angka 3; prima; karena hanya dapat dibagi dengan angka 1 dan 3.
- Angka 4; bukan prima; karena dapat dibagi dengan angka 1, 2, dan 4.
- Angka 5; prima; karena hanya dapat dibagi dengan angka 1 dan 5.
- Angka 6; bukan prima; karena dapat dibagi dengan angka 1, 2, 3, dan 6 …. dst
Tentu akan sangat lama sekali bukan jika kita melakukannya dengan manual, maka dalam artikel ini kita akan membuat dua program sekaligus. Program pertama adalah program yang dapat men-generate deret bilangan prima dalam rentang tertentu dan program kedua adalah program yang dapat melakukan pengecekan terhadap suatu bilangan apakah termasuk bilangan prima atau bukan. Baik, tanpa basi-basi lagi, mari langsung kita eksekusi
PROGRAM PERTAMA: GENERATOR BILANGAN PRIMA
Program pertama yang akan kita buat adalah generator bilangan prima. Program ini dapat menghasilkan deretan bilangan prima dalam rentang tertentu. Untuk memulainya, buatlah sebuah class dan main methodnya.
public class JavaPrime {
public static void main(String[] args){
}
}
Selanjutnya, import dua library yang dibutuhkan di program ini. Library pertama untuk menghandle inputan dari user dan library kedua untuk menghandle kesalahan input yang dilakukan oleh user.
import java.util.InputMismatchException;
import java.util.Scanner;
Karena kita akan melakukan banyak interaksi dengan user berupa input dengan menggunakan keyboard, maka kita akan membuat Scanner sebagai return value method yang memiliki kembalian berupa object Scanner sehingga dapat dipakai berulang ulang.
private static Scanner initInput() {
return new Scanner(System.in);
}
Selanjutnya kita membuat method untuk menghandle inputan user secara dinamis. Maksud dinamis di sini adalah, method ini dapat digunakan berulang – ulang untuk tujuan input yang berbeda. Nah, kali ini, method yang dinamis ini akan saya gunakan untuk menghandle inputan dari user untuk nilai minimum dari range dan nilai maksimum dari range. Berikut adalah methodnya.
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("Masukan harus berupa bilangan bulat!. Silakan ulangi lagi!\n");
}
}
return alpha;
}
Dari method di atas, pasti Anda bertanya – tanya mengapa Saya menggunakan satu parameter berupa String? Ya, seperti yang sudah saya sebutkan sebelumnya, karena method getInput() ini dinamis, maka message caption untuk meminta user memberikan inputan juga harus dinamis. Oleh karenanya, saya gunakan satu parameter berupa String untuk menghandle message caption yang dinamis itu.
Selanjutnya, pada method tersebut, dapat kita juga lihat, Saya menggunakan try and catch untuk menghandle kesalahan input dari user. Saya ingin user memberikan inputan sesuai dengan format yang diminta; yakni bilangan bulat, berbentuk integer. Apabila user memaksa memberikan input yang tidak sesuai dengan format, maka program akan memberikan pesan error dan kembali meminta user untuk memberikan input sesuai dengan format. Berikut cara kerja method ini dalam menghandle kesalahan dari user.
Dapat kita perhatikan dari tangkapan layar di atas, ketika user memberikan input yang tidak sesuai dengan format, maka program akan memberikan pesan kesalahan dan meminta user untuk memberikan input kembali. Hal ini akan terus diulangi sampai user memberikan input yang sesuai dengan format.
Selanjutnya kita akan menyesuaikan program kita sesuai dengan teori bilangan prima yakni bukan 0 dan 1. Serta selain itu, karena program kita menggunakan range, maka kita harus memastikan nilai maksimum untuk range tidak boleh lebih kecil dari nilai minimalnya. Oleh karena itu, kita buat dua method validasi untuk menghandle kondisi ini.
private static boolean minValidation(int min) {
if(min < 2) {
System.out.println("Kesalahan: Nilai minimal harus lebih dari 1!\n");
return true;
}
else {
return false;
}
}
private static boolean maxValidation(int min, int max) {
if(max < min) {
System.out.println("Kesalahan: Nilai maksimal tidak boleh lebih kecil dari nilai minimal!\n");
return true;
}
else {
return false;
}
}
ketika method ini dijalankan, maka akan menghasilkan seperti tangkapan layar di bawah ini.
Program akan melakukan validasi terhadap input yang diberikan oleh user. Apabila terdeteksi user melakukan kesalahan input (dalam contoh adalah nilai minimum adalah 0 atau 1 dan nilai maksimum lebih kecil daripada nilai minimum) maka program akan mengeluarkan pesan kesalahan dan meminta user untuk memberikan input kembali sesuai dengan format. Program akan terus – menerus mengulangi hal ini sampai user memberikan input yang benar ke dalam program.
Apabila proses validasi telah selesai, maka saatnya program men-generate deret bilangan prima sesuai range yang telah divalidasi oleh dua method sebelumnya. Untuk itulah, kita memerlukan method di bawah ini.
private static void generatePrime(int min, int max) {
int status = 0;
for(int i = min; i <= max; i++) {
for(int a = 1; a <= i; a++) {
int result = i%a;
if(result == 0) {
status++;
}
}
if(status < 3) {
System.out.print(i + " ");
}
status = 0;
}
}
Method generatePrime() ini sejatinya adalah method yang hanya menghitung total hasil modulus dari suatu bilangan yang bernilai 0. Untuk memastikan bahwa suatu bilangan prima itu atau bukan, maka suatu bilangan tersebut harus terlebih dahulu dicari nilai sisa pembagiannya dengan bilangan yang lebih kecil dari bilangan tersebut dan dengan bilangan itu sendiri. Contoh aplikasinya dapat diperhatikan pada tabel berikut ini. Kasus yang digunakan adalah bilangan 9.
Iterasi ke- | n | a | n%a | hasil |
1 | 9 | 1 | 0 | V |
2 | 9 | 2 | 1 | X |
3 | 9 | 3 | 0 | V |
4 | 9 | 4 | 1 | X |
5 | 9 | 5 | 4 | X |
6 | 9 | 6 | 3 | X |
7 | 9 | 7 | 2 | X |
8 | 9 | 8 | 1 | X |
9 | 9 | 9 | 0 | V |
Dapat kita lihat, untuk bilangan 9 terdapat lebih dari 2 hasil modulus yang hasilnya 0, tepatnya adalah 3 buah. Namun sekarang mari kita perhatikan untuk bilangan 7.
Iterasi ke- | n | a | n%a | hasil |
1 | 7 | 1 | 0 | V |
2 | 7 | 2 | 1 | X |
3 | 7 | 3 | 1 | X |
4 | 7 | 4 | 3 | X |
5 | 7 | 5 | 2 | X |
6 | 7 | 6 | 1 | X |
7 | 7 | 7 | 0 | V |
Untuk bilangan 7 dapat kita lihat hanya ada terdapat dua hasil modulus yang bernilai 0. Yakni modulus dengan 1 dan modulus dengan bilangan itu sendiri 7. Oleh karena itu, dapat dipastikan bilangan 7 merupakan bilangan prima. Dengan demikianlah alur kerja dari program ini dalam method generatePrime() untuk memastikan bilangan yang sedang di run merupakan bilangan prima atau bukan.
Selanjutnya, tapi bukan terakhir, kita membuat dua method lagi. Yakni method begin() dan end(). Fungsi method begin() adalah untuk menghandle nama/judul/identitas program, sedangkan method end() adalah method yang berfungsi untuk menghandle action dari user untuk menentukan apakah user ingin tetap melanjutkan menggunakan program atau tidak (terminate). Berikut adalah method begin() dan end() tersebut.
private static void begin() {
System.out.println("Java Prime");
System.out.println("Coded by Muhammad Irfan Luthfi");
System.out.println("github.com/milstrike\n");
}
private static boolean end() {
boolean status = true;
boolean appStatus = true;
String alpha = "";
while(status) {
System.out.print("Lanjutkan? (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("Masukan yang diterima hanya Y/N!");
}
}
return appStatus;
}
Dapat kita lihat kembali, pada method end(), saya kembali menggunakan try and catch untuk menghandle inputan dari user dan memastikan inputan dari user hanya salah satu dari dua karakter “Y” untuk Yes dan “N” untuk No. Method end() ini akan menentukan apakah program tetap akan terus dieksekusi atau berakhir (terminate).
Terakhir, lengkapi method main yang sudah dibuat sebelumnya dengan baris kode berikut.
boolean appLoop = true, minLoop = true, maxLoop = true;
int min = 0, max = 0;
begin();
while(appLoop) {
while(minLoop || maxLoop) {
min = getInput("Masukkan nilai awal");
max = getInput("Masukkan nilai akhir");
minLoop = minValidation(min);
maxLoop = maxValidation(min, max);
}
minLoop = true; maxLoop = true;
generatePrime(min, max);
System.out.println();
appLoop = end();
}
Penjelasan mengenai isi dari method main() adalah sebagai berikut. Saya menggunakan 3 variable boolean untuk mengendalikan program ini. variable pertama (appLoop) berfungsi untuk menghandle eksekusi program yang terus dilakukan hingga adanya permintaan termination dari user melalui method end(). Sedangkan variable minLoop() dan maxLoop() saya gunakan untuk mengontrol kevalidan input yang dilakukan oleh user. Saya menggunakan operator OR untuk mengontrol kevalidan ini. Sehingga, jika ada salah satu saja yang masih bernilai TRUE looping akan terus dilakukan, karena terindikasi salah satu diantara proses minValidation ataupun maxValidation gagal dilakukan. Proses baru akan berhenti setelah kedua variable (minLoop dan maxLoop) bernilai FALSE, karena dengan demikian FALSE OR FALSE pasti bernilai FALSE. Sehingga mau tidak mau, proses input dan validasi inputan dari user selesai dan dilanjutkan ke proses selanjutnya.
Setelah proses input dan validasi selesai, value variable minLoop dan maxLoop di reset kembali menjadi TRUE. Sehingga, ketika program ini diulang kembali karena user tidak menginginkan termination, proses input dan validasi inputan user dapat dilakukan kembali.
Proses selanjutnya adalah men-generate deret bilangan prima dan diakhiri dengan pemanggilan method end() untuk mendapatkan keputusan dari user untuk tetap menggunakan program atau mengakhirinya.
Dan berikut adalah hasil dari program ini ketika di RUN.
Dapat Anda lihat dari RUN di atas, bagaimana proses validasi minValidation dan maxValidation bekerja, proses generatePrime bekerja, dan proses end() bekerja. Lebih lengkapnya, berikut adalah kode dari program pertama kita ini.
package javaPrime;
import java.util.InputMismatchException;
import java.util.Scanner;
public class JavaPrime {
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("Masukan harus berupa bilangan bulat!. Silakan ulangi lagi!\n");
}
}
return alpha;
}
private static boolean minValidation(int min) {
if(min < 2) {
System.out.println("Kesalahan: Nilai minimal harus lebih dari 1!\n");
return true;
}
else {
return false;
}
}
private static boolean maxValidation(int min, int max) {
if(max < min) {
System.out.println("Kesalahan: Nilai maksimal tidak boleh lebih kecil dari nilai minimal!\n");
return true;
}
else {
return false;
}
}
private static void generatePrime(int min, int max) {
int status = 0;
for(int i = min; i <= max; i++) {
for(int a = 1; a <= i; a++) {
int result = i%a;
if(result == 0) {
status++;
}
}
if(status < 3) {
System.out.print(i + " ");
}
status = 0;
}
}
private static void begin() {
System.out.println("Java Prime");
System.out.println("Coded by Muhammad Irfan Luthfi");
System.out.println("github.com/milstrike\n");
}
private static boolean end() {
boolean status = true;
boolean appStatus = true;
String alpha = "";
while(status) {
System.out.print("Lanjutkan? (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("Masukan yang diterima hanya Y/N!");
}
}
return appStatus;
}
public static void main(String[] args) {
boolean appLoop = true, minLoop = true, maxLoop = true;
int min = 0, max = 0;
begin();
while(appLoop) {
while(minLoop || maxLoop) {
min = getInput("Masukkan nilai awal");
max = getInput("Masukkan nilai akhir");
minLoop = minValidation(min);
maxLoop = maxValidation(min, max);
}
minLoop = true; maxLoop = true;
generatePrime(min, max);
System.out.println();
appLoop = end();
}
}
}
Sampai di sini, apakah ada pertanyaan? Jika ada, Anda dapat segera meinggalkannya di kolom komentar dari artikel ini.
Kita akan melanjutkan ke program kedua yang lebih sederhana, yakni Program Cek Bilangan Prima.
PROGRAM KEDUA: PROGRAM CEK BILANGAN PRIMA
Untuk program kedua ini, sebenarnya hampir sama dengan program pertama yang kita buat sebelumnya. Hanya saja, proses iterasinya diubah. Oleh karena itu, langsung saja, kita buat terlebih dahulu class dan main methodnya.
public class JavaPrime2 {
public static void main(String[] args){
}
}
Selanjutnya jangan lupa import kedua library untuk menghandle inputan dari user seperti halnya pada program pertama. Berikutnya, Anda mulai dapat mulai menyalin method – method berikut ini ke dalam class JavaPrime2 ini.
- method initInput()
- method getInput()
- method minValidation()
- method generatePrime() —> diubah menjadi –> checkPrime()
- method begin()
- method end(), dan
- method main
Untuk method initInput(), getInput(), minValidation(), begin(), dan end() tidak ada perubahan sama sekali. Perubahan method hanya terjadi di method generatePrime() dan isi dari method main(). Mari kita perhatikan perubahannya.
Method generatePrime() – Sebelum
private static void generatePrime(int min, int max) {
int status = 0;
for(int i = min; i <= max; i++) {
for(int a = 1; a <= i; a++) {
int result = i%a;
if(result == 0) {
status++;
}
}
if(status < 3) {
System.out.print(i + " ");
}
status = 0;
}
}
Method generatePrime() – Sesudah (diubah menjadi checkPrime() )
private static void checkPrime(int input) {
int status = 0;
for(int a = 1; a <= input; a++) {
int result = input%a;
if(result == 0) {
status++;
}
}
if(status < 3) System.out.print(input + " adalah Bilangan Prima");
else System.out.print(input + " bukan Bilangan Prima");
}
Sudah tampak kan perubahannya? kita hanya membuang iterasi bagian terluarnya saja sehingga hanya dilakukan pengecekan hasil modulus suatu bilangan. Selain itu parameter method juga dikurangkan hanya menjadi satu saja karena method ini tidak bersifat range lagi. Oleh karenanya, nama method juga kita ubah menjadi checkPrime().
Selanjutnya mari kita perhatikan perubahan pada method main()
Method main() – Sebelum
public static void main(String[] args) {
boolean appLoop = true, minLoop = true, maxLoop = true;
int min = 0, max = 0;
begin();
while(appLoop) {
while(minLoop || maxLoop) {
min = getInput("Masukkan nilai awal");
max = getInput("Masukkan nilai akhir");
minLoop = minValidation(min);
maxLoop = maxValidation(min, max);
}
minLoop = true; maxLoop = true;
generatePrime(min, max);
System.out.println();
appLoop = end();
}
}
Method main() – Sesudah
public static void main(String[] args) {
boolean appLoop = true, valLoop = true;
int input = 0;
begin();
while(appLoop) {
while(valLoop) {
input = getInput("Masukkan bilangan yang ingin dicek");
valLoop = minValidation(input);
}
valLoop = true;
checkPrime(input);
System.out.println();
appLoop = end();
}
}
Tidak banyak perubahan yang terjadi pada method main. Yang ada hanyalah penghapusan beberapa variable, dan penggantian nama variabel saja sehingga lebih sesuai dengan program yang dibuat.
Akhirnya, setelah kita compile dan RUN, berikut ini adalah hasilnya:
Yap! benar, program ini mampu memeriksa per bilangan yang dimasukkan oleh user apakah termasuk bilangan Prima atau bukan. Seluruh behavior program kedua ini juga masih sama dengan program pertama, berbagai perubahan juga telah disampaikan di atas, hanya menghapuskan iterasi terluar untuk menjalankan range dan penyesuaian nama method dan variable. Namun, jika Anda masih bingung juga, berikut adalah kode program kedua ini secara lengkapnya.
package javaPrime;
import java.util.InputMismatchException;
import java.util.Scanner;
public class JavaPrime2 {
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("Masukan harus berupa bilangan bulat!. Silakan ulangi lagi!\n");
}
}
return alpha;
}
private static boolean minValidation(int min) {
if(min < 2) {
System.out.println("Kesalahan: Bilangan harus lebih dari 1!\n");
return true;
}
else {
return false;
}
}
private static void checkPrime(int input) {
int status = 0;
for(int a = 1; a <= input; a++) {
int result = input%a;
if(result == 0) {
status++;
}
}
if(status < 3) System.out.print(input + " adalah Bilangan Prima");
else System.out.print(input + " bukan Bilangan Prima");
}
private static void begin() {
System.out.println("Java Prime 2");
System.out.println("Coded by Muhammad Irfan Luthfi");
System.out.println("github.com/milstrike\n");
}
private static boolean end() {
boolean status = true;
boolean appStatus = true;
String alpha = "";
while(status) {
System.out.print("Lanjutkan? (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("Masukan yang diterima hanya Y/N!");
}
}
return appStatus;
}
public static void main(String[] args) {
boolean appLoop = true, valLoop = true;
int input = 0;
begin();
while(appLoop) {
while(valLoop) {
input = getInput("Masukkan bilangan yang ingin dicek");
valLoop = minValidation(input);
}
valLoop = true;
checkPrime(input);
System.out.println();
appLoop = end();
}
}
}
Anda masih bingung juga? Jangan khawatir, silakan sampaikan kebingungan Anda pada kolom komentar di bawah artikel ini. Saya juga telah menyertakan link project pada artikel ini di bagian akhir artikel ini.
Demikianlah artikel fun & tutorial kali ini. Semoga bermanfaat untuk kita semua. Jika Anda memiliki pertanyaan atau sanggahan, Saya persilakan betul untuk menuliskannya pada kolom komentar di bawah artikel ini. Saya juga mengingatkan kembali, Jika Anda mencuplik artikel ini, jangan lupa untuk menyertakan URL nya.
Terima kasih… ^_^
UNDUH PROJECT