Week-02 (IO, conditional, loop,script, and function)

Kembali ke Persamaan Diferensial Numerik

IO

Dalam pemrograman, seringkali pengguna diminta memberi suatu input, entah suatu nilai, string, dll., ke program, lalu program tersebut akan menggunakan input tersebut sebagai nilai dari suatu variabel. Hal ini juga dapat dilakukan pada Octave. Untuk membuat Octave meminta input dari user, gunakan syntax input(prompt), dengan prompt adalah string yang berisi pesan dalam input.

    A = input("Masukkan suatu angka:")

Jika tidak ingin membuat pesan input, cukup isi “” sebagai prompt

    A = input("")

Perlu diketahui bahwa input yang diberikan pengguna akan dievaluasi sebagai ekspresi. Jadi, bisa saja input yang diberikan akan dievaluasi sebagai kode Octave. Sebagai contoh, jika kita memasukkan operasi bilangan pada inpu ….

B = input("Operasi bilangan: ")

… , maka operasi tersebut akan dievaluasi dan memberikan hasil operasinya. Jika kita memasukkan kode Octave, seperti meng-assign suatu variabel …

C = input("Assign variabel: ")

…, maka nilai dari variabel yagn di-assign akan masuk ke variabel input …

x

sekaligus variabel yang di-assign di dalam input. Jika kalian ingin agar input yang dimasukkan tidak dievaluasi, input tersebut dapat diubah terlebih dahulu menjadi string.

 D = input("Masukkan suatu string: ")
typeinfo(D) % untuk menentukan tipe data variabel

Bisa juga dengan menambah argumen pada input() menjadi input(prompt, “s”). Jika menambahkan argumen, maka apapun input yang kalian masukkan akan menjadi string tanpa perlu menggunakan tanda petik.

E = input("Masukkan suatu string: ", "s")
typeinfo(E)

Selain menggunakan input(), kita juga bisa menggunakan syntax menu(title, op1, op2, …). Syntax tersebut akan memunculkan kotak dialog dengan judul title dan pilihan op1, op2, dst. (sesuai yang dimasukkan). Syntax ini sangat berguna untuk program-program interaktif karena mempunyai GUI sendiri.

F = menu("Pilih salah satu", "Pilihan 1", "Pilihan 2", "Pilihan 3")

Tergantung pilihan kalian, variabel yang mengandung menu() akan diisi bilangan dari 1 hingga n tergantung banyaknya pilihan.

Untuk output, mungkin cukup untuk memanggil variabel itu sendiri, seperti…

C

…, namun kalian juga bisa hanya memunculkan nilai dari variabelnya tanpa sekaligus memunculkan variabel tersebut dengan menggunakan syntax disp(). Syntax ini digunakan jika yang di-output hanya suatu variabel atau string simpel, dll.

disp(C)
disp("Ini adalah string")

Jika yang ingin dimunculkan adalah pesan yang membutuhkan banyak formatting, kalian bisa menggunakan syntax printf(). Syntax tersebut dapat melakukan formatting pesan agar dapat menerima variabel selain string.

x=input("masukkan nilai x: ")
printf("Ini adalah string %d", x)

Pada contoh di atas, kita ingin agar variabel x dapat di-output bersama dengan pesan string. Kita menggunakan %d agar nilai x dapat di-print sebagai bilangan desimal. Jika variabelnya berisi string, maka gunakan %s. Jika variabelnya berisi float, gunakan %f untuk print dalam bentuk desimal, atau %.nf untuk sekaligus mengatur angka di belakang koma sebanyak n.

printf("pi = %.3f", pi)

Jika float tersebut ingin di-print dalam notasi saintifik, gunakan %e atau %E. Keduanya hanya berbeda di hasil output yang berupa E (besar) ataupun e (kecil).

printf("pi = %.3e", pi)

Jika ingin print karakter persen itu sendiri (%), gunakan %%.

Jika ada lebih dari satu formatting di satu printf(), maka variabelnya juga harus dimasukkan secara berurutan.

printf("pi = %.3f dan e = %.3e", pi, e)

Conditional

Seperti halnya bahas pemrograman, Octave pun juga memiliki conditional statements. Secara umum, conditional statement pada Octave berbentuk:

cond
  body
endcond

Pada potongan kode di atas, cond adalah jenis conditional statement yagn digunakan, bisa berupa if, for, dan lainnya, body berisi kode yang dijalankan ketika cond terpenuhi, dan endcond adalah bagian penutup dari conditional statement, bisa berupa endif, endfor, dan lainnya tergantung cond apa yang digunakan.

Operasi dasar yang digunakan pada conditional statements adalah operasi perbandingan, dimana pada dasarnya, dua atau lebih nilai dibandingkan dengan operator dan dicek apakah memenuhi atau tidak. Jika memenuhi, maka nilainya 1, dan jika tidak, maka nilainya 0. Ada 6 operator dasar untuk perbandingan:

- sama dengan (==)
- lebih dari (>)
- kurang dari (<)
- lebih dari atau sama dengan (>=)
- kurang dari atau sama dengan (<=)
- tidak sama dengan (!= atau ~=)
2<3
4==5

Selain operator di atas, ada juga syntax untuk perbandingan:

- isequal(a, b, c, ...) mengecek apakah a, b, dan c semuanya sama.
- strcmp(s1, s2) mengecek apakah s1 dan s2 adalah string yang sama.
- strncmp(s1, s2, n) mengecek apakah n karakter pertama pada s1 dan s2 sama.
- strcmpi(s1, s2) mirip strcmp(), namun tidak case-sensitive.
- strncmpi(s1, s2, n) mirip strncmp(), namun tidak case-sensitive.
isequal(1, 3, 5)
strcmp("ayam", "Ayam")
strcmpi("ayam", "Ayam")
strncmp("sayamakan", "saya makan", 4)

Berikut beberapa jenis conditional statement pada Octave. Kode-kode ini akan ditulis di editor.

If adalah conditional statement dasar dalam decision-making melalui perbandingan nilai. If memiliki 3 bentuk. Bentuk pertama:

if (cond)
  body;
endif

Bentuk ini adalah bentuk paling simpel dalam menggunakan if. Jika cond bernilai 1, maka body dieksekusi, dan sebaliknya. Contoh:

x = input( "Masukkan nilai x: ")
if x > 0
    printf("%d adalah bilangan positif.\n", x);
endif

Bukanlah if jika tidak ada else. Untuk menggunakannya, cukup menyelipkan bagian else layaknya if sehingga menjadi:

if (cond)
  body1;
else
  body2;
endif

Contoh:

x = input("Masukkan x: ");
if mod(x, 2) == 0
  printf("x genap.\n");
else
  printf("x ganjil.\n");
endif

Kita pun juga dapat membuat lebih dari 2 condition selain if dan else. Cukup tambahkan bagian elseif. Kita dapat menambahkan berapapun banyaknya elseif sesuka hati (dan komputer), selama bagian akhirnya adalah else.

if (cond1)
  body1;
elseif (cond2)
  body2;
else
  body3;
endif

Untuk beberapa kasus, lebih jelas jika kita menggunakan model kode seperti di atas. Namun, terkadang kita ingin membuat program berjalan sesuai input, dan jika menggunakan if-else, kodenya akan terlihat jelek. Maka, kita juga bisa menggantinya dengan kode switch. Bentuk umum dari switch adalah:

switch (var)
  case lab1
    body1;
  case lab2
    body2;
  otherwise
    body3;
endswitch

Pada kode di atas, var akan dicocokkan dengan lab1, lab2, dst. yang sesuai. Jika tidak ada yang sesuai, kode akan masuk ke bagian otherwise. Layaknya elseif, kita juga dapat menambahkan berapapun banyaknya case sesuka hati, selama terdapat paling tidak satu case (bahkan bagian otherwise opsional).

Contoh:

mnu = input("Masukkan metode: ");
switch (mnu)
  case 1
    printf("Bisection.\n")
  case 2
    printf("Regula Falsi.\n")
  otherwise
    printf("Input tidak valid.\n")
endswitch

Jika case berisi array, kode akan masuk case tersebut jika var sesuai dengan salah satu elemen di array tersebut.

A = 7;
switch (A)
  case {6, 7}
    printf("A adalah 6 atau 7");
  otherwise
    printf("A bukanlah 6 ataupun 7");
endswitch

Bentuk umum dari for adalah:

Loops

Loops: For loop

for var = expr
  body;
endfor

Biasanya isi dari expr adalah a:b, yang menyebabkan var diiterasi dari a hingga b. Secara umum, for akan meng-assign tiap kolom pada expr ke var (bentuk range a:b secara umum adalah vektor baris, sehingga iterasi kolom pada a:b adalah dari a hingga b). Contoh:

fib = ones(1, 10); % ones(1, 10) = matriks 1x10 berisi 1.
for i = 3: 10
  fib(i) = fib(i-1) + fib(i-2);
endfor
disp(fib)

Karena iterasinya antar kolom, maka jika expr adalah suatu matriks, maka var akan diiterasi sebagai vektor kolom. Contoh:

for i = [1, 2, 3; 4, 5, 6; 7, 8, 9]
  i
endfor

Bentuk umum dari while adalah:

Loops: while

while (cond)
  body;
endwhile

Serupa dengan if, while akan menjalankan body jika cond bernilai taknol. Namun, akan diulang terus hingga cond bernilai nol, baru berhenti.

fib = ones(1, 10);
i = 3;
while i <= 10
  fib(i) = fib(i-1) + fib(i-2);
  i++;
endwhile
disp(fib)

Pada contoh di atas, penting untuk memasukkan bagian i++ agar suatu saat nilai i akan lebih dari 10. Hati-hati menggunakan while, karena dapat mengakibatkan infinite loop.

Loops: Do

Bentuk umum dari do adalah:

do
  body
until (cond)

Sekilas, do terlihat serupa dengan while. Yang membedakannya adalah do akan terus menjalankan body ketika cond bernilai 0 dan berhenti ketika cond bernilai taknol. Kondisi cond pada do juga berada di akhir, sehingga body pasti akan dijalankan paling tidak sekali. Perbedaan kecil selanjutnya adalah do tidak memakai enddo seperti layaknya endif, endwhile, dan sejenisnya.

fib = ones(1, 10);
i = 2;
do
  i++;
  fib(i) = fib(i-1) + fib(i-2);
until i == 10
disp(fib)

Loops: Break dan Continue

break dan continue adalah dua statement yang digunakan dan hanya digunakan dalam loop. Statement break akan langsung mengeluarkan program dari loop, sedangkan continue akan langsung menuju iterasi selanjutnya tanpa menyelesaikan sisa kode pada badan loop.

Contoh perbedaan break dan continue:

a = [];
for i = 1:10
  if mod(i, 5) == 0
    break;
  endif
  a = [a, i];
endfor
disp(a)
a = [];
for i = 1:10
  if mod(i, 5) == 0
    continue;
  endif
  a = [a, i];
endfor
disp(a)

Function dan Script File

Sebelum kita lanjutkan, kita harus terlebih dahulu mengetahui tentang function file dan script file.

Function file adalah file yang dapat digunakan oleh Octave untuk memanggil fungsi yang telah didefinisikan di dalamnya. Function file ini berguna jika kalian ingin menggunakan fungsi tersebut secara berkala.

Script file adalah file yang berisi kumpulan perintah Octave, layaknya script pemrograman. Script file berguna untuk pemrograman dan menjalankan/menyimpan suatu urutan perintah, sehingga bisa dijalankan kembali nantinya. Untuk selanjutnya, script file akan disebut “program”.

Permasalahannya, kedua jenis file tersebut mempunyai ekstensi yang serupa (.m), namun function file tidak dapat dijalankan layaknya program.

Misal kita mempunyai fungsi yang ingin disimpan dalam program bernama testfile.m (untuk sekarang kita akan abaikan dulu maksud dari tiap bagian dari fungsi ini. Intinya fungsi ini akan menampilkan variabel message yang kita masukkan.

function test(message)
  printf("%s\n", message);
endfunction

test("AyatoBoba");

Jika program tersebut dijalankan, akan muncul pesan peringatan…

warning: function name 'test' does not agree with function filename...

…dan mungkin saja akan diikuti error lain. Jika kalian ingin membuat program, jangan gunakan function di line pertama yang dieksekusi.

Sekarang kita modifikasi testfile.m di atas.

1;
function test(message)
  printf("%s\n", message);
endfunction

test("AyatoBoba");

Di sini, kita menambahkan line yang tidak berpengaruh apa-apa dalam program kita sebelum line pendefinisian fungsi. Untuk membedakan function file dengan program, Octave mengecek perintah pertama yang dieksekusi. Jika perintah tersebut adalah pendefinisian fungsi, maka file tersebut akan dianggap sebagai function file, dan jika bukan, maka file tersebut akan dianggap sebagai program.

Sekarang kita masuk ke fungsi, pendefinisian, dan embel-embelnya. Fungsi adalah suatu bagian dari program yang nantinya akan dipanggil. Fungsi sangat berguna jika bagian program

tersebut nantinya akan digunakan berkali-kali. Fungsi juga berguna agar pengorganisasian kode program lebih bagus. Syntax untuk pendefinisian fungsi adalah:

function name
  body
endfunction
 ```


Potongan kode di atas akan membuat fungsi name dengan body adalah isi dari fungsi tersebut. Untuk memanggil fungsi tersebut, cukup dengan memanggil name. Contoh:


```{python}
function bangun
  printf("BANGUN!!!!!\n");
endfunction

bangun;

Pada kedua contoh di atas, fungsinya tidak benar-benar memberikan suatu value, melainkan hanya sekedar output. Dalam kebanyakan kasus, kita menggunakan fungsi agar bisa mendapatkan suatu nilai yang dapat di-assign ke suatu variabel. Agar kita bisa mendapatkan value, maka kita harus meng-assign variabel untuk return. Strukturnya menjadi:

function retval = name (args)
  body
endfunction

retval adalah variabel lokal (namanya tidak harus retval) yang akan digunakan sebagai return value sehingga dapat di-assign. retval bisa berupa variabel, jika kita ingin me-return satu value, ataupun bisa berupa list dari variabel jika ingin me-return lebih dari satu value. Contoh return satu nilai:

function x = quadratic(a)
  x = a^2;
endfunction

y = quadratic(2);
disp(y);

contoh return lebih dari satu nilai:

function [am, gm] = AMGM(v)
  am = sum(v) / length(v);
  gm = nthroot(prod(v), length(v));
endfunction


V = [1, 2, 3, 4, 5, 6, 7, 8, 9];
[amean, gmean] = AMGM(V);
printf("Arithmetic mean of %s is %g\n", mat2str(V), amean);
printf("Geometric mean of %s is %g\n", mat2str(V), gmean);

Octave juga mempunyai syntax return sendiri. Namun, return pada Octave tidak digunakan untuk me-return suatu value, melainkan untuk keluar dari fungsi (serupa dengan break pada loop).

Acknowledgement

Kak ojan: untuk module tahun lalu-nya :D.