• Tidak ada hasil yang ditemukan

Contoh Penulisan Algoritmik

KAMUS LOKAL ALGORITMA

depend on (x) x = '0' : → 0 x = '1' : → 1 x = '2' : → 2 x = '3' : → 3 x = '4' : → 4 x = '5' : → 5 x = '6' : → 6 x = '7' : → 7 x = '8' : → 8 x = '9' : → 9

Contoh 2: APAKAH HURUF 'A' Pemetaan karakter ke type boolean

Persoalan :

Tuliskanlah fungsi IsAnA yang mentest apakah sebuah karakter yang diberikan kepadanya adalah sebuah huruf 'A'. Harga yang dihasilkan adalah benar jika huruf itu 'A', salah jika huruf itu bukan 'A'.

Contoh : IsAnA('A') → true

IsAnA ('X' ) → false

IsAnA ('Y') → false

Spesifikasi :

Fungsi IsAnA : Domain : x (karakter)

function IsAnA (x : character) → boolean

{ Menghasilkan true jika x adalah ‘A’; dengan menuliskan ekspresi booelan }

KAMUS LOKAL

ALGORITMA

→ (x = 'A')

function IsAnA1 (x : character) → boolean

{ Mengetes apakah x adalah 'A': true jika x adalah ‘A’; dengan melakukan analisis kasus terhadap x }

KAMUS LOKAL ALGORITMA if (x = 'A') then → true else { x ≠ 'A' } → false

Contoh 3: HITUNG METER+CM Pemetaan type dasar ke type bentukan

Persoalan:

Tuliskanlah sebuah fungsi, yang jika diberikan sebuah angka Cm yang menyatakan panjang dalam cm, akan menghasilkan pasangan harga <x1, x2> sesuai dengan rumus ukuran metris (i m = 100 cm).sehingga x1*100+x2 = Cm

Contoh : F(100) = <1,0> F(355 ) = < 3, 55>

Spesifikasi :

Fungsi KonversiCm : Domain : Cm : integer

Range : pasangan harga integer

Proses : menghitung Meter dan SisaCm sehingga Cm = 100* Meter + SisaCm

function KonversiCm1 (Cm : integer) → < integer, integer> { Diberikan Cm, mengubahnya menjadi berapa meter dan cm }

KAMUS LOKAL

meter : integer { meter } sisaCm : integer { sisa cm }

ALGORITMA

meter ← Cm div 100

sisaCm ← Cm mod 100

function KonversiCm2 (Cm : integer) → < integer, integer> { Diberikan Cm, mengubahnya menjadi berapa meter dan cm }

KAMUS LOKAL

ALGORITMA

→ < Cm div 100, Cm mod 100>

Catatan:

1. Terjemahan teks fungsi pada contoh ini ke dalam beberapa bahasa pemrograman tidak “sederhana”, bahkan tidak mungkin dapat dilakukan secara langsung.

2. Cobalah menterjemahkan funsgi di atas ke dalam bahasa Pascal, C dan Ada. Akan terlihat perbedaan yang sangat besar di antara ketiganya.

Contoh 4: UBAHDANPERIKSAKAR

Persoalan:

Tuliskanlah algoritma yang membaca sebuah karakter dan mengubahnya menjadi integer yang sesuai dengan karakter itu jika karakter yang dibaca adalah antara '0' dan '9' dengan memanfaatkan funsgi KarakterToInteger yang pernah dibuat. . Jika bukan di dalam daerah harga nol dan sembilan, maka harus dituliskan pesan yang berbunyi : 'Bukan angka' .

Spesifikasi:

Input : CC karakter

Output : menuliskan integer [0..9] sesuai dengan karakter yang dibaca, jika karakter ['0'..'9'], atau “Bukan angka” jika CC bukan angka

Proses : Konversi dari karakter ke integer, jika CC ['0'..'9']

Dengan catatan fungsi konversi adalah seperti terdefinisi pada contoh 1.

Catatan:

Tes yang dilakukan sebelum pemanggilan fungsi KarakterToInteger membuat fungsi KarakterToInteger cukup mengembalikan nilai yang terdefinisi. Jika domain dari nilai masukan fungsi tidak hanya mencakup karakter angka, maka di dalam fungsi harus didefinisikan suatu nilai yang diluar definisi angka.

Program UbahdanPeriksaKar

{ Program membaca sebuah karakter, dan melakukan konversi ke nilai integer serta menuliskannya, jika karakter mewakili angka, bernilai ['0'..'9'. Pogram menulis “bukan angka”, jika yang diketik bukan bernilai ['0'..'9'] }

KAMUS

CC : character {data, karakter yang dibaca}

function KarakterToInteger (x : character['0'..'9']) → integer[0..9] { Diberikan x berupa karakter '0'..'9', menghasilkan harga integer yang sesuai dengan penulisan pada karakter }

ALGORITMA

input (cc)

depend on (CC)

Contoh 5: HITUNGFUNGSI Definisi dan pemanggilan fungsi

Persoalan:

Tuliskanlah algoritma yang membaca 3 bilangan bulat (a,b,c), dan menghitung: 6*( ax2 + bx +c) untuk x = 1

Spesifikasi:

Input : a, b, c bilangan bulat, koefisien persamaan kuadrat, x = 1 Output : Fx

Proses : menghitung Fx = 6*( ax2 + bx +c) menuliskan hasil

Program HITUNGFUNGSI

{ Program membaca tiga buah bilangan bulat a,b,c dan menghitung nilai fungsi F(x) = 6*(ax2 + bx +c) }

KAMUS

a, b, c : integer { data, koefisien persamaan kuadrat } Fx : integer { hasil perhitungan persamaan }

function FungsiKUADRAT (a, b, c, x : integer) → integer { Diberikan a, b, c, x menghitung f(x) = ax2 + bx +c }

ALGORITMA

input (a,b,c)

Fx ←6 * FungsiKUADRAT (a,b,c,1)

output (Fx)

function FungsiKUADRAT (a, b, c, x : integer) → integer { Diberikan a, b, c, x menghitung f(x) = ax2 + bx +c }

KAMUS LOKAL

ALGORITMA

→ (a * x * x + b * x +c)

Contoh 6: MAX2 dan MAX3

a. Tuliskanlah fungsi MAX2, yang menerima masukan dua buah bilangan real dan menghasilkan sebuah bilangan real, yaitu salah satu di antara nilai dua buah bilangan tersebut yang terbesar.

b. Kemudian dengan memakai fungsi MAX2, tuliskanlah sebuah fungsi lain MAX3 yang menghasilkan nilai terbesar dari tiga buah bilangan real.

Contoh : MAX2(1,2) ) → 2

MAX2(10,2 ) →10

MAX3(1,2,3) adalah MAX2(MAX2(1,2),3) → 3

function MAX2 (a, b : real) →real

{ Diberikan a dan b, menghasilkan a jika a ≥ b,

menghasilkan b jika b > a } KAMUS LOKAL ALGORITMA depend on (a,b) a ≥ b : →a b > a : →b

function MAX3 (a, b, c : real) → real

{ Diberikan a, b, dan c, menghasilkan a jika a ≤ b dan a ≤ c, menghasilkan b

jika b ≤ a dan b ≤ c, menghasilkan c jika c ≤ b dan c ≤ a }

KAMUS LOKAL

ALGORITMA

→MAX2 (MAX2(a,b),c)

function MAX3BIS (a, b, c : real) → real

{ Diberikan a, b, dan c, menghasilkan a jika a ≤ b dan a ≤ c, menghasilkan b

jika b ≤ a dan b ≤ c, menghasilkan c jika c ≤ b dan c ≤ a }

KAMUS LOKAL

ALGORITMA

→MAX2 (a,MAX2(b,c))

Catatan :

1. Bagi yang sudah mengikuti kuliah “Pemrograman Fungsional”, dapat dilihat bahwa teks program di atas sangat selaras dengan ekspresi fungsional yang pernah dipelajari.

2. Pemanggilan fungsi pada konteks prosedural adalah aplikasi fungsi pada konteks fungsional.

Contoh-7: PENANGGALAN DAN NEXTDAY Pemetaan type bentukan ke type bentukan

Didefinisikan type terstruktur untuk mewakili hari seperti dalam kalender yang kita pakai sehari-hari:

type DATE : < DD : Tanggal, MM : Bulan, YY : Tahun > Konstanta : <5,12,1990> { artinya 5 Desember 1990}

<25,2,2001> { artinya 25 Februari 2001}

- Menuliskan tanggal keesokan harinya sesuai dengan kode bahasa: Dalam bahasa Inggris , DATE ditulis dalam: Bulan, '/',Tanggal.'/',Tahun Dalam bahasa Indonesia, DATE ditulis dalam: Tanggal, '-',Bulan.'-',Tahun Dalam bahasa Perancis DATE ditulis dalam: Tanggal, '/',Bulan.'/',Tahun

- Proses menghitung hari esok dilakukan oleh sebuah fungsi NextDay yang

menerima masukan sebuah tanggal dan menghasilkan tanggal keesokan harinya. Contoh pemanggilan dan hasil fungsi diberikan sebagai berikut:

NextDay(<13,4,1990>,1) → 4 /14/1990 NextDay(<30,1,1990>,2) → 31-1-1990 NextDay(<31,12,1990>,3) → 1/1/1991

Program PENANGGALAN

KAMUS

type Tanggal : integer [1..31] type Bulan : integer [1..12] type Tahun : integer > 0

type DATE : < DD : Tanggal, MM : Bulan, YY : Tahun > HariIni, Esok : DATE

KodeBahasa : integer [1..3]

function NEXTDAY (Now : DATE) → DATE

{ Mengirimkan keesokan hari dari Now }

ALGORITMA

input (HariIni, KodeBahasa) { membaca <Tanggal,Bulan,Tahun> dan

Kodebahasa}

Esok ← NEXTDAY(HariIni)

depend on KodeBahasa

KodeBahasa = 1 : output (Esok.MM, ”/”, Esok.DD, ”/”, Esok.YY) KodeBahasa = 2 : output (Esok.DD, ”-”, Esok.MM, ”-”, Esok.YY) KodeBahasa = 3 : output (Esok.DD, ”/”, Esok.MM, ”/”, Esok.YY)

function NEXTDAY (Now : DATE) → DATE

{ Menerima Now dan menghasilkan tanggal keesokan hari dari Now }

KAMUS LOKAL

function Kabisat (yy : integer) → boolean

{ true jika yy adalah tahun kabisat }

ALGORITMA

depend on (Now.MM)

Now.MM = 2 : { bulan Februari, kasus kabisat dan bukan }

depend on Now.DD

Now.DD < 28 : → <Now.DD+1,Now.MM,Now.YY>

Now.DD = 28 :

depend on Now.YY

not Kabisat(Now.YY) : → <1,Now.MM+1,Now.YY>

Kabisat(Now.YY) : → <Now.DD+1,Now.MM,Now.YY>

Now.DD = 29 : → <1,Now.MM+1,Now.YY>

Now.MM = 12 : { mungkin pergantian tahun }

depend on Now.DD

Now.DD < 31 : → <Now.DD+1,Now.MM,Now.YY>

Now.DD = 31 : → <1,1,Now.YY + 1>

Now.Bulan ∈ [1,3,5,7,8,10] : { sebulan ada 31 hari }

depend on Now.DD

Now.DD < 31 : → <Now.DD+1,Now.MM,Now.YY>

Now.DD = 31 : → <1,Now.MM+1,Now.YY>

Now.Bulan ∈ [4,6,9,11] : { sebulan ada 30 hari }

depend on Now.DD

Now.DD < 30 : → <Now.DD+1,Now.MM,Now.YY>

Now.DD = 30 : → <1,Now.MM+1,Now.YY>

Soal untuk algoritma di atas:

- Tuliskanlah definisi fungsi KABISAT dan algoritmanya.

- Buat analisis kasus yang lain dari yang dituliskan pada fungsi NEXTDAY di atas, dengan mulai menganalisis tanggal dan bukan bulan.

- Buatlah kode program dari fungsi Nextday yang sama dengan hanya melakukan komputasi aritmatika, seperti halnya pada perhitungan Durasi yang dibahas pada kalkulasi Type terstruktur JAM (pada penjelasan sequence).

Latihan Soal

1. Domain dan range dari fungsi secara umum dapat dirumuskan sebagai berikut:

Dokumen terkait