BAB 6 KONTROL ALIRAN
Pendahuluan Ada delapan pernyataan kontrol kendali yang disediakan di dalam Matlab. Kedelapan pernyataan tersebut antara lain 1. if, termasuk di dalamnya pernyataan else dan elseif. Pernyataan ini menjalankan kelompok pernyataan berdasarkan pada syarat logika. 2. switch, termasuk di dalamnya adalah case dan otherwise. Statement ini mengeksekusi kelompok pernyataan berbeda bergantung pada harga syarat kondisi. 3. while, menjalankan group pernyataan dengan jumlah iterasi tak terbatas berdasarkan pada syarat logika. 4. for menjalankan group pernyataan dengan jumlah iterasi telah ditentukan. 5. continue melewatkan kendali ke iterasi berikutnya untuk loop for atau while. 6. break berfungsi menghentikan eksekusi looping for atau while. 7. try...catch mengubah kendali aliran apabila ditemukan kesalahan selama proses eksekusi. 8. return menyebabkan eksekusi kembali ke fungsi invoking. Semua aliran membangun pemnggunaan end untuk menunjukkan akhir dari blok kontrol aliran.
Pernyataan Bersyarat if, else, dan elseif 1
Pernyataan
if
digunakan
untuk
menyeleksi
suatu
kondisi
yang
memungkinkan dua atau lebih pilihan. Bila proses yang diseleksi terpenuhi atau bernilai benar, maka pernyataan yang ada di dalam blok if akan diproses dan dikerjakan. Sedangkan jika syarat tidak dipenuhi maka program akan diakhiri. Dalam bentuk diagram alir percabangan if dapat digambarkan seperti pada gambar 6.1
if (kondisi)
tidak
ya
Perintah
Gambar 6.1 Diagram alir percabangan if
Bentuk umum struktur kondisi if adalah :
if (syarat) pernyataan end Keterangan Apabila pernyataan logika berharga benar (true), maka seluruh pernyataan atau perintah yang berada diantara if dan end akan dijalankan.
2
Sebaliknya, jika pernyataan logika berharga salah (false), maka seluruh perintah/pernyataan yang berada diantara if dan end tidak akan dijalankan karena Matlab akan langsung menuju end. Syarat biasanya merupakan pernyataan logika, yakni pernyataan yang mengandung operator relational yang berharga benar atau salah. Dibawah ini disajikan operator relasi.
Operator relasi Arti <
Kurang dari
<=
Kurang dari atau sama dengan
>
Lebih dari
>=
Lebih dari atau sama dengan
==
Sama dengan
~=
Tidak sama dengan
Beberapa contoh untuk pernyataan logika yang menggunakan operator relasi beserta artinya. b^2-4*a*c<0
b2 −4 a c0
b^2>4*a*c
b 4 a c
b^2-4*a*c==0
b −4 a c =0
b~=4
b≠4
2
2
Contoh 6.1 a=2; if mod(a,2) == 0 disp('Pernyataan benar..!!') end Disamping operator relasi akan dibutuhkan pula operator logika yang
3
macamnya antara lain Operator
Lambang
Arti
And
&
Dan
Or
|
Atau
Not
~
Bukan
logika
Xor
Eksklusiv Or
Di bawah ini disajikan tabel harga dari pernyataan dengan operator logika
a
b
a&b
a|b
~a
~b
a xor b
TRUE
TRUE
TRUE
TRUE
FALSE
FALSE
FALSE
TRUE
FALSE
FALSE
TRUE
FALSE
TRUE
TRUE
FALSE
TRUE
FALSE
TRUE
TRUE
FALSE
TRUE
FALSE
FALSE
FALSE
FALSE
TRUE
TRUE
FALSE
Contoh Akan diberikan beberapa contoh berkaitan dengan penggunaan operator logika seperti di bawah ini
Pernyataan Bersyarat if-else Dalam pernyataan bersyarat if-else setidaknya terdapat dua pernyataan. Jika syarat yang diperiksa bernilai benar atau terpenuhi maka pernyataan pertamalah yang akan dijalankan, tetapi apabila syarat yang diperiksa tidak memenuhi atay bernilai salah maka pernyataan yang kedualah yang akan dijalankan.
4
Bentuk umumnya adalah sebagai berikut : if(syarat) pernyataan A else pernyataan B end
if (kondisi)
tidak
ya
Perintah
Perintah
Gambar 4.2 Diagram alir percabangan if…else
Contoh Program 6.2 x=input('Masukkan harga x:'); if (x>3) disp('Pernyataan benar.'); disp('Pernyataan benar sekali..'); else disp('Pernyataan salah.'); disp('Pernyataan salah sekali..'); end 5
Pernyataan Bersyarat elseif Penggunaan pernyataan bersyarat else if akan memberikan solusi kepada kita apabila terdapat lebih dari satu syarat yang ada untuk menjalankan masingmasing pernyataan apabila syarat yang diberikan terpenuhi. Pernyaan else if akan dieksekusi apabila syarat yang dberikan pada if sebelumnya (atau elseif sebelumnya) berharga salah (0). Pernyaaan ini selanjutnya akan mengeksekusi perintah/pernyataan di dalamnya apabila syarat logikanya berharga benar (1). Bentuk umum dari pernyataan bersyarat elseif maka adalah
Ya If
Perintah … Perintah ....
Tidak Ya elseif
Perintah … Perintah ....
Tidak Ya elseif
Perintah … Perintah ....
Tidak else
Perintah … Perintah ....
Gambar 6.3 Diagram alir pernyataan elseif Contoh Program 6.3
6
n=input('Masukkan harga n:') if n < 0
% jika n negatif, ada pesan salah. disp('Masukan harus bilangan positif');
elseif rem(n,2) == 0 % jika n posisif dan bulat, % kemudian bagi dengan 2 A = n/2; else A = (n+1)/2;
% jika n positif dan ganjil % tambahkan 1,kemudian bagi dengan 2.
end
Pernyataan bersyarat if bersarang Pernyataan ini sangat penting untuk masalah-masalah yang memiliki lebih dari dua cabang. Mengapa pernyataan ini disebut pernyataan bersarang, karena di dalam pernyataan if ada pernyataan if lagi. If yang kedua ini dapat berada di dalam if sendiri atau berada di dalam else. if (syarat) perintah/pernyataan if (syarat) perintah/pernyataan else perintah/pernyataan end else perintah/pernyataan if (syarat) perintah/pernyataan else perintah/pernyataan end end Contoh Program 6.4 a=input('Masukkan a:'); 7
if mod(a,2)==0 fprintf('%i adalah bilangan genap\n',a); if (a>5) fprintf('%i lebih besar 5',a); else fprintf('%i kurang dari 5',a); end else fprintf('%i adalah bilangan ganjil\n',a); if (a<5) fprintf('%i kurang dari 5',a); else fprintf('%i lebih besar dari 5',a); end end
if (kondisi)
tidak
ya
Perintah
Perintah
if (kondisi)
if (kondisi)
Perintah
Perintah
Perintah
Perintah
Perintah
Perintah
Gambar 6.4 Diagram Alir Pernyataan If Bersarang
8
Operator Logika Pernyataan logika yang lebih rumit dapat disusun dari tiga operator logika yaitu and (&), or (|) dan not (~). Sebagai contoh dalam penyelesaian persamaan kuadrat berbentuk ax 2bxc=0 akan memiliki akar yang berharga -b/(2a) apabila diskriminan b 2−4 a c=0 dan
a≠0 . Jika dinyatakan dalam Matlab if (b^2-4*a*c)==0 & (a~=0) x=-b/(2*a); end
Gambar 6.5 Grafik fungsi kuadrat dengan dua akar yang sama
switch-case Pernyataan switch akan mengeksekusi sekelompok perintah/ pernyataan berdasarkan pada harga variabel atau ekspresi. Pernyataan switch bekerja 9
dengan cara membandingkan masukan (input) ekspresi dengan harga pada tiaptiap peryataan case. Untuk ekspresi numerik, pernyataan case bernilai benar apabila (nilai=ekspresi). Untuk ekspresi string, pernyataan case bernilai benar apabila strcmp(nilai,ekspresi). Bentuk dasar dari switch adalah
switch ekspresi (skalar atau string) case nilai1 pernyataan % dieksekusi jika ekspresi adalah nilai1 case nilai2 pernyataan % dieksekusi jika ekspresi adalah nilai2 ..... . ...... otherwise pernyataan % dieksekusi jika ekspresi tidak cocok % dengan case manapun end Dibawah ini diberikan sebuah contoh penggunaan pernyataan switchcase. Pernyataan switch akan mengecek variabel masukan untuk nilai tertentu. Apabila variabel masukan adalah 1, 2 atau 3 , maka pernyataan case akan menampilkan luas masing-masing untuk kubus, persegi panjang dan lingkaran. Sedangkan, apabila variabel masukan bukan 1,2 atau 3, maka switch akan langsung menuju ke otherwise. % Contoh Program 6.5 disp('Pilih salah satu program..\n'); disp('1: menghitung luas bujur sangkar: \n'); disp('2: menghitung luas persegi panjang: \n'); disp('3: menghitung luas lingkaran: '); no=input('\n Anda ingin menghitung luas 1,2 atau 3 \n');
10
switch no case 1 a=input('masukkan panjang sisi bujur sangkar:'); luas=a^2; fprintf('Luas bujur sangkar adalah %f \n',luas); case 2 a=input('masukkan panjang persegi panjang: '); b=input('masukkan lebar persegi panjang: '); luas=a*b; fprintf('Luas persegi panjang adalah %f',luas); case 3 a=input('masukkan jari-jari lingkaran :'); luas=pi*r^2; fprintf('Luas lingkaran adalah %f ',luas); otherwise fprintf('Ulangi pilihan yang ada...!!') end
while Pernyataan while akan menjalankan pernyataan atau sekelompok pernyataan secara berulang-ulang selama kontrol perulangan berharga benar (1). Secara umum, bentuk dari perulangan while adalah while (syarat) pernyataan end
Contoh Program 6.7
11
Program di bawah ini akan mencari n bilangan pertama perjumlahan bilangan interger yang berharga <100. Algoritma untuk membuat program ini adalah
inisialiasi untuk jum
inisialisai untuk n
ulang hingga syarat sum(1:n)< jum terpenuhi
cetak n
gantikan n dengan n+1
akhiri perulangan
%program mencetak bilangan jum=100; n = 1; while sum(1:n) < jum disp(n) n = n + 1; end Jika dijalankan hasilnya adalah 1 2 3 4 5 Contoh Program 6.8 Sekarang kita akan mencetak pola-pola bilangan dengan yang hasilnya seperti gambar di bawah ini 1 12
1
2
1
2
3
1
2
3
4
1
2
3
4
5
1
2
3
4
5
6
Penyelesaian Marilah kita membuat algortima untuk mencetak pola bilangan tersebut
inisialiasasi I
perulangan pertama hingga i<=6
inisialisasi x
perulangan kedua hingga x<=i
cetak x
gantikan x dengan x+1
akhiri perulangan kedua
lompat ke baris berikutnya
gantikan i dengan i+1
akhiri perulangan pertama
%Program mencetak pola bilangan i=1; while(i<=6) x=1; while(x<=i) fprintf('%i',x); x=x+1; end
13
fprintf('\n'); i=i+1; end
Gerak Peluru Gerak perluru adalah bahasan yang sudah sangat familiar baik dalam sains maupun teknik. Gerak peluru merupakan perpaduan antara gerak lurus beratura (GLB) dan gerak lurus berubah beraturan (GLBB). Komponen GLB berada pada sumbu x dan komponen GLBB berada pada sumbu y.
Jarak yang ditempuh oleh peluru selama t detik pada arah sumbu x adalah x=v ox t
Sedangkan tinggi peluru setelah t detik dapat digambarkan dengan 1 y=v oy t− g t 2 2 Nah, sekarang kita ingin mengetahui seberapa lama peluru terbang di
udara beserta lintasannya. Algoritma dari program yang akan kita jalankan
inisialisasi untuk step waktu dt
inisialisasi untuk percepatan grafitasi g
inisialisasi kecepatan awal vo
Masukan untuk sudut tembakan
Menentukan kecepatan awal ke arah x dan y masing-masing vox dan voy
inisialisasi untuk jarak x, tinggi y dan waktu tempuh t.
memberikan nama file data yang akan disimpan
selama y>=0 ➔
menampilkan data
➔
menyimpan data dalam hardisk
➔
menggantikan t dengan t+dt
➔
menentukan jarak tempuh kearah sumbu x dan y 14
mengambil data dari hardisk (load)
menampilkan dalam grafik
Jika dibuat program Matlab maka hasilnya adalah sebagai berikut dt=0.01; g=9.8; vo=10; sudut=input('Masukkan sudut tembakan :'); sudut=sudut*pi/180; vox=vo*cos(sudut); voy=vo*sin(sudut); x=0;y=0;t=0; fid=fopen('peluru.txt','w'); while (y>=0) disp([x' y' t']) fprintf(fid,'%f %f
%f\n',x,y,t);
t=t+dt; x=vox*t; y=voy*t-1/2*g*t^2; end fclose(fid); load peluru.txt; x=peluru(:,1); y=peluru(:,2); t=peluru(:,3); plot(x,y) grid on
15
Gambar. Lintasan peluru yang ditembakkan
Perulangan for Struktur perulangan for biasa digunakan untuk mengulang suatu proses yang telah diketahui jumlah perulangannya. Dari segi penulisannya, struktur perulangan for tampaknya lebih efisien karena susunannya lebih simpel dan sederhana. Secara default, penambahan indeks adalah 1, tetapi kita dapat mengeset sendiri misalnya penambahannya 2, 3 atau berapapun bahkan dapat pula negatif. Untuk penambahan positif, perulangan akan berakhir manakala
16
indeks sudah lebih dari yang tentukan. Sedangkan untuk penambahan negatif, perulangan berakhir saat indeks lebih kecil dari yang ditentukan. Secara umum, sintaks for adalah sebagai berikut
for indeks =i:k pernyataan/perintah end
atau for indeks =i:m:k pernyataan/perintah end
Keterangan ✔ ✔
i:k merupakan vektor dengan elemen-elemen i ,i1,i2,⋯, k
i :m: k adalah vektor dengan elemen-elemen
i ,im ,i2 m ,⋯ hingga
elemen terakhir tidak lebih dari k jika m>0 dan elemen terakhir tidak kurang dari k jika m<0. ✔
Indeks merupakan bentu variabel.
Contoh program di bawah ini akan mencetak sebuah kalimat berbunyi “Aku mahasiswa semester 5” sebanyak lima kali dengan mengunakan pernyataan perulangan for.
%Contoh Program 6.9 %contoh perulangan for
17
N=5; for i=1:N fprintf('%i. Aku mahasiswa semester 5 \n',i); end LATIHAN Buatlah sebuah program dengan koefisien berselang seling tanda seperti di bawah ini 1 1 1 1 1− − −⋯ 2 3 4 5 Penyelesaian Untuk menyelesaikan bentuk jumlah yang bersaling seling ini kita perlu sedikit pintar. Dalam contoh ini, kita akan menghitung hingga suku yang ke 999. inilah programnya
N=999; sum=1; koef=-1; for n=1:N if (koef==-1) koef=1; end sum=sum+1/n; end disp(sum)
Kesalahan yang Sering Dilakukan Kesalahan yang sering muncul adalah penghilangan kata for pada perulangan for. Sebagai contoh, jika kita bermaksud untuk menghitung hasil 18
akar dari suatu bilangan dengan menggunakan metode Newton a=7; x=a/2; disp(['Menghitung pendekatan sqrt(a) jika a=',num2str(a)]); i=1:5
% disini tidak ada for
x=(x+a/x)/2; disp(x); end
Pernyataan continue Pernyataan continue berfungsi melewatkan kendali ke iterasi berikutnya di dalam perulangan for maupun while. Apabila pernyataan continue berada di dalam loop bersarang, maka pernyataan continue akan melewatkan kendali ke iterasi berikutnya. Sebagai contoh, perhatikan di bawah ini
N=20; for i=1:N if (i<5) continue; end fprintf('%i. Aku mahasiswa semester 5 \n',i); end
Apabila skrip program di atas dieksekusi, maka yang keluar adalah tampilan tulisan “Aku mahasiswa semester 5” sebanyak 16 buah mulai dari nomor 5 hingga nomor 20. Dengan kata lain, kalimat dari nomot 1 hingga 4 tidak
19
ditampilkan. Hal ini disebabkan perintah continue yang berada di dalam loop for.
Pernyataan break Pernyataan break berfungsi untuk menghentikan eksekusi loop for maupun loop while. Apabila break ditemukan di dalam kalang for maupun while, maka eksekusi akan dihentikan apabila syarat yang diberikan terpenuhi. Untuk lebih jelasnya perhatikan contoh berikut ini
N=20; for i=1:N if (i>5) break; end fprintf('%i. Aku mahasiswa semester 5 \n',i); end Program di atas akan ditampilkan lima buah kalimat “Aku mahasiswa semester 5” mulai dari nomor 1 hingga 5. Setelah iterasi ke 5, program akan dihentikan karena pernyataan break di dalam pernyataan bersyarat dimana syaratnya telah terpenuhi. Dengan kata lain, kalimat pada nomor 6 hingga nomor 20 tidak akan dicetak. Contoh Program Contoh Program ... Buatlah sebuah program Matlab untuk menghitung jumlahan berikut ini
1−1/31 /5−1/71/9−⋯ hingga suku terkahir kurang dari 10−4 Penyelesaian
20
Sebelum kita membuat progra Matlab, kita perlu membuat algoritmanya terlebih dahulu
inisialisasi jum=0
inisialisai tol=10−4
inisialisasi sign=-1
inisialisasi suku=1
inisialisai N=100000000
ulang hingga N kali perulangan dimulai dari k=1 ➔
sign=-sign
➔
suku=1/(2*k-1)
➔
➔
jika suku
➔
hentikan pencarian
jum=jum+sign*suku
Cetak hasilnya
Selesai
Hasil programya adalah jum=0; tol=1e-4; sign=-1; N=100000000 suku=1; for k=1:N sign=-sign; suku=1/(2*k-1); if (suku
21
end jum=jum+sign*suku; end disp(jum)
22