Oleh
Nama : Marta Yulianti
NIM : 215314154
B. DASAR TEORI
Subprogram
10.1 Pengantar
Program yang kita buat bisa jadi akan sangat panjang dan rumit memuat sampai ribuan
baris perintah atau pernyataan. Supaya program yang panjang tersebut dapat kita kelola dengan
baik maka digunakan apa yang disebut subprogram atau subroutine. Pada dasarnya subprogram
adalah bagian dari program seperti halnya kita memahami subbagian atau sparepart dari sebuah
kendaraan. Subprogram ini kemudian dapat diberi nama tertentu dan program kita dapat disusun
sedemikian rupa terdiri atas rangkaian nama-nama subprogram ini.
Sebagai contoh, program untuk mencari akar persamaan kuadrat dapat diwujudkan
dengan membayangkan adanya 3 subprogram yakni subprogram untuk membaca data koefisien
a, b, dan c, kemudian subprogram untuk menghitung diskriminan D = b 2 – 4 * a * c dan akhirnya
subprogram untuk menampilkan akar-akar persamaan kuadrat tersebut. Cara pandang ini dapat
digambarkan memakai diagram berjenjang berikut:
Akar Persamaan Kuadrat
Memakai cara pandang ini maka program untuk mencari akar persamaan kuadrat
berdasar nilai koefisien a, b, dan c dapat berupa program berikut di mana bacaData(), hitungD(),
dan cetakAkar() masing-masing adalah nama subprogram sesuai dengan kepentingan di atas.
Diagram berjenjang untuk mencari akar permasamaan kuadrat seperti di atas dapat
diperluas untuk berbagai persoalan dengan mengembangkannya menjadi diagram berjenjang
yang mungkin akan lebih besar dan memiliki lebih dari 2 tingkat sesuai dengan kompleksitas
masalah yang diselesaikan. Artinya, sebuah subprogram dapat saja dipecah-pecah lagi menjadi
beberapa subprogram dan seterusnya subsubprogram ini dapat dipecah lagi menjadi beberapa
subprogram berikutnya. Demikian seterusnya. Nama lain dari strategi penyusunan program
seperti ini adalah divide and conquer atau pecah dan taklukkan. Sampai kapan pemecahan
menjadi subprogram ini berhenti ? Tergatung selera pemrogram tetapi sebagai pedoman adalah
ketika sudah cukup mudah untuk diimplementasikan.
Dalam praktek pembuatan program yang sesungguhnya, kita akan banyak menggunakan
berbagai jenis subprogram yang bahkan telah tersedia secara gratis. Banyak pihak menyediakan
subprogram ini di internet dan NetBin Java juga telah menyediakan banyak subprogram tersebut.
Beberapa subprogram sebenarnya telah kita pakai misalnya Math.sqrt(), Math.sqr(), dan
System.out.println().
Dalam memakai subprogram tersebut, kita tidak perlu memikirkan apa yang
sesungguhnya dilakukan oleh subprogram tetapi kita hanya fokus kepada input dan output dari
subprogram tersebut. Oleh karena itu, subprogram paling mudah kita bayangkan sebagai kotak
hitam dan kita sebut dengan ‘hitam’ karena kita tidak perlu tahu apa yang terjadi di dalamnya.
Akan tetapi supaya kotak hitam ini dapat digunakan dengan baik dan tepat maka harus jelas dan
mudah dipahami tentang inputnya, fungsinya, dan outputnya. Dengan kata lain sebuah
subprogram atau kotak hitam harus mempunyai interface atau antar-muka (rincian input dan
output) yang mudah dipahami serta semantik atau fungsi/manfaat dari subprogram tersebut.
Bayangkan subprogram seperti sebuah TV yang jelas cara menggunkannya dan jelas pula apa
fungsinya.
Tugas kita di dalam bab ini tentu bukan pertama-tama memakai subprogram yang ada
tetapi justru bagaimana membuat subprogram atau kotak hitam tersebut. Untuk itu, selain
menyangkut kejelasan interface, pengembangan subprogram juga harus berpedoman kepada
kenyataan bahwa pembuat subprogram tidak perlu memikirkan sistem kerja di mana subprogram
tersebut akan digunakan.
Khusus di Java, subprogram disebut dengan metode atau method. Metode ini akan selalu
berada di sebuah class tertentu. Nanti ketika kita belajar Pemrograman Berorientasi Obyek maka
metode ini menduduki posisi yang sangat penting. Untuk sementara, metode yang akan kita buat
akan manjadi bagian dari class yang memuat metode main(String[] args).
<pernyataan>
}
Untuk sementara <modifier> cukup diisi dengan perintah public static. Ada banyak
kemungkinan untuk pengisian <modifier> ini sejalan dengan berbagai kekhususan yang kita
kehendaki terhadap tingkah laku metode/subprogram.
Ada dua kemungkinan untuk mengisi bagian <tipe-balikan> atau <return-type> yakni
void atau tipe data yang lain seperti int, String, char, dll. Memang sebenarnya ada 2
kepentingan pokok dalam pembuatan subprogram. Pertama adalah demi penyusunan/penulisan
program yang efektif dalam arti mudah dimengerti dan bersifat moduler. Untuk itu subprogram
yang dibuat tidak lain dan tidak bukan hanyalah pengalihan/penempatan teksprogram ke bagian
lain seperti contoh pencarian akar persamaan kuadrat di atas.
Kedua, subprogram kita buat demi meningkatnya efisiensi penulisan program karena
dimungkinkan membuat sebuah subprogram yang dapat dipanggil berkali-kali untuk melakukan
perhitungan yang sama tetapi dengan input yang berbeda-beda. Sebagai contoh, bila kita
membuat program untuk menghitung nilai dari C(n,r) = n ! / [ (n-r) ! r !] yakni menghitung
jumlah kombinasi berbeda dari r buah elemen yang diambil dari n buah elemen di mana n ≥
r. Memakai rumus
tersebut maka program akan menghitung 3 kali nilai dari n !, (n-r) ! dan r !. Pembuatan program
akan sangat efisien bila kita buat sebuah subprogram yang dapat menghitung besarnya m ! ( m
faktorial yakni 1 x 2 x 3 x… m dan 0 ! = 1) untuk sebarang m ≥ 0. Teks program kita akan
pendek karena tidak perlu memuat 3 kali perhitungan faktorial dengan teks program yang
berbeda-beda. Oleh karena itu dapat dibayangkan sebuah metode yang seperti fungsi untuk
menghitung m !. Metode seperti ini akan memberikan nilai (balikan) berupa bilangan bulat yang
besarnya m! dan metode ini mempunyai input bilangan bulat m ≥ 0. Nilai balikan ini paling
mudah dipahami sebagai salah satu bentuk output metode ini yang berupa sebuah nilai dari tipe
data tertentu.
Misalkan metode untuk menghitung m ! tersebut kita beri nama faktorial maka metode
ini harus mempunyai nilai balikan int dan input bilangan bulat m ≥ 0. Bila metode faktorial
sudah kita buat maka untuk menghitung C(n,r) dapat dilakukan dengan perintah
Bagian terakhir dari struktur metode ini adalah <pernyataan> yang tidak lain dan tidak
bukan adalah implementasi dari metode tersebut. Pada dasarnya implementasi ini berupa
program. Oleh karena itu, di dalamnya dapat memuat berbagai perintah seperti dalam program
utuh mulai dari deklarasi variabel, penugasan, kendali, maupun perulangan.
10.4 Contoh-contoh.
Berikut adalah dua contoh penggunaan metode. Contoh yang pertama merupakan
program lengkap untuk menemukan akar persamaan kuadrat yang telah kita bahas secara umum
di awal bab ini. Di teks program berikut implementasi setiap metode yang digunakan dituliskan
secara lengkap. Silakan membaca komentar yang diberikan di teks program untuk
mempermudah memahami struktur dan penggunaan metode dalam contoh ini. Sedang contoh
kedua menunjukkan bagiamana metode faktorial yang mempunyai nilai balikan digunakan demi
penulisan program yang efisien.
Contoh 1:
1
2 package persamaankuadrat;
3
4 import java.util.Scanner;
5
6 public class KuadratModuler {
7
8 static double a, b, c, x1, x2, D;
9
10 public static void main(String[] args) {
11 bacaData(); // sampai di perintah ke 11, compiler menuju ke perintah baris 16 sampai 25
dan kembali ke 12
12 hitungD(); // sampai di sini compiler mengerjakan perintah baris 27 sampai 29 dan lalu kembali
ke 13
13 hitungAkar();// sampai di sini compiler menuju ke baris 31 sampai 45 dankemudian kembali ke 14
14 }
15 // Secara logika program berakhir di baris perintah ini karena meode main berakhir di sini
16 static void bacaData(){ // baca data a, b, dan c
17
18 Scanner tombol = new Scanner(System.in);
19 System.out.print("Masukkan koefisien x2 (a) : ");
20 a = tombol.nextDouble();
21 System.out.print("Masukkan koefisien x (b) : ");
22 b = tombol.nextDouble();
23 System.out.print("Masukkan konstanta (c) : ");
24 c = tombol.nextDouble();
25 }
26
27 static void hitungD(){//hitung diskriminan
28 D = b*b - 4 * a * c;
29 }
30
31 static void hitungAkar(){//hitung akar dan tampilkan
32
33 System.out.println("Akar dari "+a+" X2 + "+b+" X + "+c+ " = 0 adalah");
34 if (D < 0) System.out.println("Tidak mempunyai akar real");
35 else if (D == 0) {
36 x1 = -b/(2*a);
37 System.out.println("Akarnya tunggal yakni x1 = x2 = "+x1);
38 }
39 else {
40 x1 = (-b + Math.sqrt(D))/(2*a);
41 x2 = (-b - Math.sqrt(D))/(2*a);
42 System.out.println("Akar pertama x1 = "+x1);
43 System.out.println("Akar pertama x2 = "+x2);
44 }
45 }
46 }
Contoh 2.
import java.util.Scanner;
public class Metode {
public static void main(String[] args) {
int n,r, kombinasiNr;
Scanner tombol = new Scanner(System.in);
System.out.print("Masukkan nilai n : ");
n = tombol.nextInt();
System.out.print("Masukkan nilai r : ");
r = tombol.nextInt();
static int faktorial(int m) {// metode faktorial dimulai dari baris ini
int hasFak=1;
if (m == 0) return 1; // karena 0 ! = 1
else for(int i =1; i<=m; i++) hasFak = hasFak*i; // m! = 1 x 2 x … x m
return hasFak;
}// metode faktorial berakhir di sini
}
Dalam contoh kedua di atas, metode faktorial (int m) hanya mempunyai sebuah
parameter yakni m yang bertipe int. Parameter ini dapat diperlakukan seperti variabel tetapi nilai
awalnya baru tersedia ketika metode tersebut dipanggil. Misalnya, ada program di main() yang
memanggil faktorial(5) dengan perintah fak5 = faktorial(5); maka bilangan bulat 5 ini mengisi
variabel m atau m akan bernilai 5 ketika compiler mengesekusi perintah-perintah di dalam
metode faktorial tersebut dan akhirnya fak5 akan bernilai sama dengan 120 sebab 1 x 2 x 3 x 4 x
5 = 120. ia
Sebenarnya kata ‘parameter’ merujuk ke dua hal yang berbeda yakni ke daftar variabel
yang ada di dalam kurung dari sebuah metode dan juga merujuk ke nilai atau pernyataan yang
ada di dalam tanda kurung ketika metode tersebut dipanggil. Dengan kata lain baik int m dalam
faktorial (int m) maupun 5 dalam faktorial(5) akan sama-sama dirujuk sebagai parameter. Akan
tetapi int m akan disebut sebagai parameter formal dan 5 disebut dengan parameter aktual.
Disebut dengan parameter formal karena int m hanyalah variabel yang baru ada nilainya ketika
metode tersebut dipanggil.
Parameter aktual adalah sebuah nilai yang sesungguhnya dipakai ketika sebuah metode
dipanggil/digunakan. Karena parameter aktual mengisi nilai dari parameter formal maka tipe
data darai kedua parameter harus sama. Selain itu, karena sebuah metode dapat memiliki lebih
dari satu parameter maka pemanggilan sebuah metode harus menggunakan parameter aktual
yang tipenya sama dengan parameter formal untuk parameter yang bersesuain. Kesesuaian ini
dikenali oleh compiler hanya berdasar letak urutannya. Jika ada metode myMethod ( int x,
double y, boolean z) maka pemanggilan metode myMethod(10, ab, sikapku) akan diterima bila
tipe data secara berurutan sesuai dari kiiri ke kanan yakni bahwa 10 bertipe bulat, ab variabel
yang berisi dan bertipe double, serta sikapku berupa variabel yang sudah terisi dan bertipe
boolean.
Parameter aktual tidak harus berupa nilai atau variabel tetapi dapat pula berupa ekspresi
atau pernyataan asalkan tipenya sama dengan parameter formal yang sesuai. Sebagai contoh, dari
metode
C. ANALISIS
1. Soal_No1
a. Uraian soal
Modifikasilah program latihan nomor 2 di atas sehingga program Anda dapat menghitung
besarnya C(n,r) = n ! / [ (n – r) ! r ! ] di mana besarnya n dan r dimasukkan lewat keyboard
serta memakai syarat bahwa r ≤ n.
b. Rancangan program
Output
Masukkan Nilai n : 8
Masukkan Nilai r : 3
Combinasi dari 8C3 adalah 56
Proses
Input
Scanner input
static int faktorial(int n){ Membuat method untuk menghitung faktorial yang
bertipe int dan parameternya n yang bertipe int juga.
int hasFak = 1; Memesan tempat untuk bilangan bulat dengan nama
hasFak dan menyimpan bilangan bulat 1 ke variabel
hasFak.
for(int i = 1; i <= n; i++){ int i Memesan tempat untuk bilangan bulat dengan
nama i
2. Soal_No2
a. Uraian soal
Segitiga Pascal adalah daftar bilangan bulat yang disusun berdasarkan jumlah dua bilangan
sebelah kiri dan kanan dari deret sebelumnya seperti dalam gambar di bawah
Angka-angka tersebut di atas juga dapat dihitung memakai rumus Kombinasi ( C(n,r) )
seperti dalam diagram berikut
Ini adalah soal praktikum IX no 5. Modifikasilah program Anda memakai pendekatan
moduler sedemikian rupa program Anda memakai 2 buah metode yakni metode untuk
menghitung n ! dan metode untuk menghitung C(n,r).
b. Rancangan program
Output
Segitiga Pascal
Masukkan nilai n untuk Segitiga Pascal : 5
Masukkan
1 Nilai n : 8
Masukkan
1 1 Nilai r : 3
Nilai1n!2 : 140320
Nilai
1 r!
3 3: 61
Nilai Combinasi
14 6 4 1 : 56
1 5 10 10 5 1
Proses
Cetak ("")
Cetak "Segitiga Pascal"
Input
Perintah Arti
import java.util.Scanner; Scanner merupakan kelas yang menyediakan fungsi-
fungsi untuk mengambil input dari keyboard. Agar
kita dapat menggunakan Scanner, kita perlu
mengimpornya ke dalam code import
java.util.Scanner
public class Soal_No2 { Deklarasi class Soal_No2
public static void main(String [] args) { Deklarasi metode main
static int combinasi(int n, int r){ Membuat methode untuk menghitung combinasi
yang bertipe int dan parameternya n, r yang bertipe
int juga.
int c = faktorial(n) / (faktorial(n - r) * Memesan tempat untuk bilangan bulat dengan nama
faktorial(r); c
Hitung c dengan memanggil factorial faktorial(n) /
(faktorial(n - r) * faktorial(r)
return c; Method akan mengembalikan nilai dengan
tipe int dari variabel c
} End metode combinasi
static int faktorial(int n){ Membuat methode untuk menghitung faktorial yang
bertipe int dan parameternya yang bertipe int juga.
int hasFak = 1; Memesan tempat untuk bilangan bulat dengan nama
hasFak dan menyimpan bilangan bulat 1 ke variabel
hasFak.
for(int i = 1; i <= n; i++){ int i Memesan tempat untuk bilangan bulat dengan
nama i
3. Soal_No3
a. Uraian soal
Buat program untuk menghitung luas segitiga berdasarkan koordinat 3 titik sudutnya yang
dimasukkan lewat keyboard. Program Anda harus memakai beberapa metode berikut
a. bacaTitik() // membaca absis dan ordinat suatu titik dan tanpa nilai balikan
b. hitungJarak(int x1, int y1, int x2, int y2) // menghitung jarak antara 2 titik (x1,y1) dan
(x2,y2) dengan nilai balikan (return) jarak dua titik
c. hitungKeliling(double sisiA, double sisiB, double sisiC) //dengan nilai balikan keliling
segitiga atau jumlah sisiA, sisiB dan sisiC.
d. hitungLuas() // menghitung dan menampilkan luas segitiga memakai rumus yang sudah
pernah diajarkan
b. Rancangan program
Output
Jarak AB : 7.615773105863909
Jarak BC : 4.123105625617661
Jarak AC : 10.63014581273465
Keliling
Proses Segitiga : 22.36902454421622
Luas Segitiga ABC : 12.500000000000007
static double sisiA, sisiB, sisiC, keliling;
println()
Input
Perintah Arti
import java.util.Scanner; Scanner merupakan kelas yang menyediakan fungsi-
fungsi untuk mengambil input dari keyboard. Agar
kita dapat menggunakan Scanner, kita perlu
mengimpornya ke dalam code import
java.util.Scanner
public class Soal_No3 { Deklarasi class Soal_No3
static double sisiA, sisiB, sisiC, keliling; Membuat variabel global untuk 3 titik sudut segitiga
dengan nama sisiA, sisiB, sisiC, keliling. Variabel
global ini berfungsi agar variabel nya dapat
digunakan oleh berbagai method (sehingga tidak
perlu membuat variabel sendiri-sendiri lagi di setiap
method).
public static void main(String [] args) { Deklarasi metode main
bacaTitik(); Memanggil method bacaTitik. Method ini nanti
digunakan untuk menginput nilai absis dan ordinat
ketiga titik.
hitungLuas(); Memanggil method hitungLuas. Method ini nanti
digunakan untuk menampilkan nilai sisiABC,
keliling sisiABC, luas.
} End metode main
System.out.print("Absis (x) Titik A : "); Menampilkan tulisan "Absis (x) Titik A : " pada
output tanpa menambahkan baris baru.
x1 = input.nextInt(); Perintah untuk membaca angka/nilai (dalam bilangan
bulat) yang diinput sendiri oleh user
System.out.print("Ordinat (y) Titik A : "); Menampilkan tulisan “Ordinat (y) Titik A : " pada
output tanpa menambahkan baris baru.
y1 = input.nextInt(); Perintah untuk membaca angka/nilai (dalam bilangan
bulat) yang diinput sendiri oleh user
System.out.print("Absis (x) Titik B : "); Menampilkan tulisan “Absis (x) Titik B : " pada
output tanpa menambahkan baris baru.
x2 = input.nextInt(); Perintah untuk membaca angka/nilai (dalam bilangan
bulat) yang diinput sendiri oleh user
System.out.print("Ordinat (y) Titik B : "); Menampilkan tulisan “Ordinat (y) Titik B : " pada
output tanpa menambahkan baris baru.
y2 = input.nextInt(); Perintah untuk membaca angka/nilai (dalam bilangan
bulat) yang diinput sendiri oleh user
System.out.print("Absis (x) Titik C : "); Menampilkan tulisan “Absis (x) Titik C : " pada
output tanpa menambahkan baris baru.
x3 = input.nextInt(); Perintah untuk membaca angka/nilai (dalam bilangan
bulat) yang diinput sendiri oleh user
System.out.print("Ordinat (y) Titik C : "); Menampilkan tulisan “Ordinat (y) Titik C : " pada
output tanpa menambahkan baris baru.
y3 = input.nextInt(); Perintah untuk membaca angka/nilai (dalam bilangan
bulat) yang diinput sendiri oleh user
System.out.println(); Perintah untuk memindahkan cursor ke baris baru
sisiA = hitungJarak(x1, y1, x2, y2); sisiA adalah nilai dari pemanggilan method : sisiA =
hitungJarak(x1, y1, x2, y2)
sisiB = hitungJarak(x2, y2, x3, y3); sisiB adalah nilai dari pemanggilan method : sisiB =
hitungJarak(x2, y2, x3, y3)
sisiC = hitungJarak(x3, y3, x1, y1); sisiC adalah nilai dari pemanggilan method : sisiC =
hitungJarak(x3, y3, x1, y1)
} End metode bacaTitik
static double hitungJarak(int x1, int y1, int x2, Membuat method hitungJarak yang bertipe double
int y2){ dan parameternya x1, y1, x2, y2 yang bertipe double
juga.
return Math.sqrt(Math.pow(x2 - x1, 2) + Method memiliki nilai balikan untuk menghitung
Math.pow(y2 - y1, 2)); jarak yaitu akar dari kuadrat (x2 – x1) + kuadrat (y2
– y1)
} End metode hitungJarak
static double hitungKeliling(double sisiA, Membuat method hitungKeliling yang bertipe double
double sisiB, double sisiC){ dan parameternya sisiA, sisiB, sisiC yang bertipe
double juga
keliling = sisiA + sisiB + sisiC; Method memiliki nilai balikan untuk menghitung
keliling yaitu sisiA + sisiB + sisiC
return keliling; Method akan mengembalikan nilai dari variabel
keliling
} End hitungKeliling
4. Soal_No4
a. Uraian soal
Fungsi densitas/kepadatan normal baku yang berbentuk lonceng atau bel dapat dirumuskan
memakai fungsi berikut ini.
2
1 − 12 Z
f (Z )= e , dimana−∞<Z <+ ∞
√ 2 π
Di mana e adaah bilangan alam yang besarnya sama dengan 2,71828
Kalau digambar maka fungsi f(z) di atas akan seperti ini
f(Z
)
Z
- - - - - - 0 1 2 3 4 5 6
6 5 4 3z 2 1 z2
1
f(Z)
4
-
3
-
z
1
2
-
1 0 1 2
-
3
z
2
4
5
6
Z
b. Rancangan program
Output
Masukkan nilai n : 15
*
**
****
*****
******
*****
****
**
*
Proses
do {
Menampilkan tulisan “Masukkan nilai n : " dan input
angka/nilai yang akan diinput sendiri oleh user
}
while(n < 10 || n > 20)
for(z = -4; z <= 4; z = z + 0.5){
jBintang = normal(n, z)
bintang(jBintang)
}
}
Perintah Arti
import java.util.Scanner; Scanner merupakan kelas yang menyediakan fungsi-
fungsi untuk mengambil input dari keyboard. Agar
kita dapat menggunakan Scanner, kita perlu
mengimpornya ke dalam code import
java.util.Scanner
public class Soal_No4 { Deklarasi class Soal_No4
public static void main(String [] args) { Deklarasi metode main
while(n < 10 || n > 20); while dijalankan jika kondisi (n < 10 || n > 20) masih
memenuhi.
for(z = -4; z <= 4; z = z + 0.5){ Variable z tugasnya untuk menyimpan z
pengulangan.
D. DAFTAR PUSTAKA
Modul XII “Pengenalan Subprogram/Metode”
Muhardian, Ahmad., 2021, Belajar Java: Menggunakan Prosedur dan Fungsi untuk Membuat
Sub-program, https://www.petanikode.com/java-prosedur-dan-fungsi/, diakses pada 19
November 2021 07 : 35 WIB.