Topik ini membahas pernyataan EVALUATE untuk pemilihan banyak cabang, yaitu bentuk subjek tunggal dengan pencocokan nilai, bentuk EVALUATE TRUE yang menguji kondisi rentang, bentuk TRUE ALSO TRUE untuk dua subjek sekaligus, serta peran WHEN OTHER sebagai cabang baku. Setelah topik ini, pemilihan di antara banyak alternatif dapat ditulis tanpa rantai IF bersarang yang semakin dalam. Setiap bentuk didemonstrasikan dengan program yang dikompilasi dan dijalankan pada GnuCOBOL 3.2.
Bentuk subjek tunggal dengan WHEN#
EVALUATE membandingkan satu subjek terhadap serangkaian nilai pada klausa WHEN, dan pernyataan pada WHEN pertama yang cocok dieksekusi hingga WHEN berikutnya atau END-EVALUATE. Setelah satu cabang cocok, cabang lainnya dilewati seluruhnya, sehingga urutan WHEN tidak berpengaruh apabila nilai yang dicocokkan tidak saling tumpang-tindih. Klausa WHEN OTHER menampung semua kasus yang tidak tercantum, dan keberadaannya mencegah kombinasi tak terduga berlalu tanpa penanganan apa pun.
Program berikut mengklasifikasikan empat nilai ujian dengan EVALUATE TRUE, kemudian menampilkan keterangan setiap grade dengan bentuk subjek tunggal.
IDENTIFICATION DIVISION.
PROGRAM-ID. EVAL-NILAI.
*--------------------------------------------------------------
* EVALUATE TRUE untuk rentang nilai dan EVALUATE subjek untuk
* pencocokan nilai pasti.
*--------------------------------------------------------------
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NILAI-UJIAN PIC 9(2).
01 GRADE PIC X.
PROCEDURE DIVISION.
UTAMA.
MOVE 87 TO NILAI-UJIAN
PERFORM KLASIFIKASI-NILAI
MOVE 72 TO NILAI-UJIAN
PERFORM KLASIFIKASI-NILAI
MOVE 64 TO NILAI-UJIAN
PERFORM KLASIFIKASI-NILAI
MOVE 40 TO NILAI-UJIAN
PERFORM KLASIFIKASI-NILAI
PERFORM KETERANGAN-GRADE
STOP RUN.
KLASIFIKASI-NILAI.
EVALUATE TRUE
WHEN NILAI-UJIAN >= 85
MOVE "A" TO GRADE
WHEN NILAI-UJIAN >= 70
MOVE "B" TO GRADE
WHEN NILAI-UJIAN >= 55
MOVE "C" TO GRADE
WHEN OTHER
MOVE "D" TO GRADE
END-EVALUATE
DISPLAY "Nilai " NILAI-UJIAN " -> grade " GRADE.
KETERANGAN-GRADE.
EVALUATE GRADE
WHEN "A"
DISPLAY "Grade A berarti sangat baik"
WHEN "B"
DISPLAY "Grade B berarti baik"
WHEN "C"
DISPLAY "Grade C berarti cukup"
WHEN OTHER
DISPLAY "Grade " GRADE " berarti perlu bimbingan"
END-EVALUATE.Nilai 87 -> grade A
Nilai 72 -> grade B
Nilai 64 -> grade C
Nilai 40 -> grade D
Grade D berarti perlu bimbinganSimpan berkasnya di direktori kerja, kompilasi dengan perintah berikut, lalu
jalankan ./evaluate-nilai.
# kompilasi program EVALUATE klasifikasi nilai
cobc -x evaluate-nilai.cblEmpat baris pertama keluaran berasal dari paragraf KLASIFIKASI-NILAI yang
menggunakan bentuk EVALUATE TRUE, sedangkan baris terakhir berasal dari
paragraf KETERANGAN-GRADE yang menggunakan bentuk subjek tunggal. Karena
klasifikasi terakhir menghasilkan grade D, baris terakhir menampilkan
keterangan cabang WHEN OTHER, yaitu Grade D berarti perlu bimbingan.
Cabang WHEN "A", WHEN "B", dan WHEN "C" pada paragraf yang sama
menunjukkan pencocokan nilai pasti terhadap satu subjek bernama GRADE. Klausa
WHEN OTHER wajib diletakkan paling akhir karena menjadi penampung sisa
kasus, dan apabila WHEN OTHER tidak ditulis, subjek yang tidak cocok dengan
satu pun WHEN membuat seluruh EVALUATE dilewati tanpa eksekusi apa pun.
Bentuk EVALUATE TRUE untuk rentang#
Bentuk EVALUATE TRUE menggantikan subjek dengan serangkaian kondisi pada
setiap WHEN, sehingga rentang dan gabungan perbandingan dapat diuji tanpa
subjek eksplisit. Kondisi-kondisi tersebut diuji dari atas ke bawah, dan
hanya cabang pertama yang bernilai benar yang dieksekusi, sehingga urutan
WHEN menjadi bagian dari logika program. Rentang yang lebih sempit harus diuji lebih dahulu, karena
WHEN NILAI-UJIAN >= 55 yang diletakkan sebelum WHEN NILAI-UJIAN >= 85
akan menelan seluruh nilai 85 ke atas.
Paragraf KLASIFIKASI-NILAI pada program evaluate-nilai menerapkan pola ini.
Batas 85 diuji terlebih dahulu, disusul 70 dan 55, dan WHEN OTHER menampung
nilai di bawah 55 sebagai grade D. Keluarannya menunjukkan 87 jatuh ke
grade A, 72 ke grade B, 64 ke grade C, dan 40 ke grade D. Pola ini paling
lazim dalam praktik COBOL karena keputusan bisnis memang sering dinyatakan
sebagai rentang, misalnya tarif bertingkat atau diskon berdasarkan jumlah
pembelian.
Dua subjek dengan TRUE ALSO TRUE#
EVALUATE TRUE ALSO TRUE menguji dua subjek sekaligus, dan setiap WHEN wajib menyediakan kondisi untuk setiap subjek dengan pemisah ALSO. Pasangan kondisi pada satu WHEN dianggap cocok hanya bila keduanya benar, sehingga kombinasi keputusan dinyatakan secara eksplisit satu per satu. Klausa WHEN OTHER tetap menampung kombinasi yang tidak tercantum. Bentuk ini dapat diperluas dengan ALSO tambahan untuk tiga subjek atau lebih, meskipun jumlah kombinasinya bertambah cepat.
Program berikut menentukan status kelulusan dari nilai ujian dan persentase kehadiran sekaligus.
IDENTIFICATION DIVISION.
PROGRAM-ID. EVAL-JUGA.
*--------------------------------------------------------------
* EVALUATE TRUE ALSO TRUE: keputusan berganda dengan dua
* subjek dalam satu pernyataan.
*--------------------------------------------------------------
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NILAI-UJIAN PIC 9(2).
01 KEHADIRAN PIC 9(3).
PROCEDURE DIVISION.
UTAMA.
MOVE 88 TO NILAI-UJIAN
MOVE 92 TO KEHADIRAN
PERFORM STATUS-KELULUSAN
MOVE 88 TO NILAI-UJIAN
MOVE 60 TO KEHADIRAN
PERFORM STATUS-KELULUSAN
MOVE 45 TO NILAI-UJIAN
MOVE 95 TO KEHADIRAN
PERFORM STATUS-KELULUSAN
STOP RUN.
STATUS-KELULUSAN.
EVALUATE TRUE ALSO TRUE
WHEN NILAI-UJIAN >= 70 ALSO KEHADIRAN >= 75
DISPLAY "Nilai " NILAI-UJIAN " kehadiran " KEHADIRAN
" -> lulus"
WHEN NILAI-UJIAN >= 70 ALSO KEHADIRAN < 75
DISPLAY "Nilai " NILAI-UJIAN " kehadiran " KEHADIRAN
" -> tidak lulus, kehadiran kurang"
WHEN OTHER
DISPLAY "Nilai " NILAI-UJIAN " kehadiran " KEHADIRAN
" -> tidak lulus"
END-EVALUATE.Nilai 88 kehadiran 092 -> lulus
Nilai 88 kehadiran 060 -> tidak lulus, kehadiran kurang
Nilai 45 kehadiran 095 -> tidak lulusKompilasi programnya dengan perintah berikut, lalu jalankan
./evaluate-also.
# kompilasi program EVALUATE TRUE ALSO TRUE
cobc -x evaluate-also.cblKeluarannya memperlihatkan tiga kombinasi berbeda. Nilai 88 dengan kehadiran 92 memenuhi kedua syarat cabang pertama sehingga berstatus lulus. Nilai 88 dengan kehadiran 60 memenuhi cabang kedua sehingga berstatus tidak lulus karena kehadirannya kurang. Nilai 45 dengan kehadiran 95 tidak memenuhi syarat kedua WHEN sebelumnya dan jatuh ke WHEN OTHER.
Perbandingan dengan IF bersarang#
Logika yang sama dapat ditulis dengan IF bersarang, tetapi kedalaman bersarangnya bertambah satu tingkat untuk setiap alternatif, dan setiap ELSE menampung seluruh sisa kasus pada tingkatnya. Padanan IF bersarang untuk klasifikasi grade adalah seperti berikut.
IF NILAI-UJIAN >= 85
MOVE "A" TO GRADE
ELSE
IF NILAI-UJIAN >= 70
MOVE "B" TO GRADE
ELSE
IF NILAI-UJIAN >= 55
MOVE "C" TO GRADE
ELSE
MOVE "D" TO GRADE
END-IF
END-IF
END-IFKedua bentuk menghasilkan keputusan yang sama, tetapi EVALUATE menyusun seluruh cabang sejajar pada satu tingkat sehingga urutan prioritasnya terbaca dari atas ke bawah. Menambah alternatif baru pun hanya berupa satu baris WHEN yang disisipkan pada posisi prioritasnya, tanpa menambah tingkat bersarang maupun menggeser ELSE milik tingkat lain. Untuk lebih dari dua alternatif, bentuk sejajar semacam ini lebih mudah diperiksa dan dimodifikasi dibandingkan rantai IF yang dalam.
Kesalahan umum#
- Mengurutkan WHEN rentang dari batas terendah. Kondisi
>= 55yang diuji lebih dahulu menelan nilai 85 ke atas dan grade A tidak pernah tercapai. Susun WHEN dari syarat yang paling ketat, misalnya batas tertinggi pada perbandingan >=, disusul rentang yang lebih luas. - Membiarkan EVALUATE tanpa WHEN OTHER. Kombinasi yang tidak tercantum berlalu tanpa penanganan apa pun. Tambahkan WHEN OTHER sebagai cabang baku yang menandai kasus tak terduga.
- Melupakan pemisah ALSO pada bentuk TRUE ALSO TRUE. Setiap WHEN wajib mengikuti jumlah subjek, dan kondisi yang kurang menyebabkan error sintaks pada waktu kompilasi.
Ringkasan#
- EVALUATE subjek tunggal mencocokkan satu nilai terhadap setiap WHEN dan menjalankan cabang pertama yang cocok saja.
- Bentuk EVALUATE TRUE menguji kondisi dari atas ke bawah sehingga urutan WHEN menetapkan prioritas rentangnya.
- TRUE ALSO TRUE menguji beberapa subjek sekaligus dengan pasangan kondisi pada setiap WHEN, dan WHEN OTHER menampung kombinasi yang tersisa.
- Untuk banyak alternatif, EVALUATE menjaga cabang tetap sejajar, sedangkan IF bersarang bertumbuh ke dalam.
Referensi#
- GnuCOBOL — Free Software Foundation — Situs proyek GnuCOBOL 3.2 yang digunakan untuk mengompilasi dan menjalankan seluruh contoh pada topik ini.
- IBM Enterprise COBOL for z/OS documentation — IBM — Dokumentasi resmi yang memuat bentuk EVALUATE, klausa WHEN dan WHEN OTHER, serta bentuk EVALUATE TRUE ALSO TRUE.