EVALUATE

Pemilihan banyak cabang dengan WHEN, WHEN OTHER, dan bentuk EVALUATE TRUE.

Daftar isi

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.

cobol evaluate-nilai.cbl
       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.
text Keluaran
Nilai 87 -> grade A
Nilai 72 -> grade B
Nilai 64 -> grade C
Nilai 40 -> grade D
Grade D berarti perlu bimbingan

Simpan berkasnya di direktori kerja, kompilasi dengan perintah berikut, lalu jalankan ./evaluate-nilai.

bash
# kompilasi program EVALUATE klasifikasi nilai
cobc -x evaluate-nilai.cbl

Empat 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.

cobol evaluate-also.cbl
       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.
text Keluaran
Nilai 88 kehadiran 092 -> lulus
Nilai 88 kehadiran 060 -> tidak lulus, kehadiran kurang
Nilai 45 kehadiran 095 -> tidak lulus

Kompilasi programnya dengan perintah berikut, lalu jalankan ./evaluate-also.

bash
# kompilasi program EVALUATE TRUE ALSO TRUE
cobc -x evaluate-also.cbl

Keluarannya 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.

cobol Padanan IF bersarang untuk klasifikasi grade
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-IF

Kedua 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 >= 55 yang 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#