BAB IV MATERI UNIT KOMPETENSI MEMBUAT ALGORITMA PEMROGRAMAN DASAR 4.1 Tujuan Instruksional Umum o Siswa mampu mengerti tentang apa itu Algoritma Pemrograman. o Siswa mampu mengerti dasar – dasar Algoritma Pemrograman. o Siswa mampu berpikir secara logis dalam menyelesaikan masalah. o Siswa mampu menganalisa masalah dan menciptakan solusti untuk menyelesaikan sebuah masalah 4.2 Tujuan Instruksional Khusus o Siswa dapat mengetahui seberapa pentingnya Algoritma Pemrograman sebagai dasar untuk mempelajari pemrograman lanjut. o Siswa dapat mengerti dasar – dasar pemikiran dalam menyelesaikan masalah dalam pemrograman. o Siswa dapat mengerti tentang logika dasar pemrograman. o Siswa dapat mengerti tentang tipe – tipe data dasar dalam pemrograman. o Siswa dapat memahami tentang alur program meliputi sekuensial, percabangan dan perulangan. o Siswa dapat mengerti tentang dasar – dasar struktur data. o Siswa dapat memahami pengelolaannya. mengenai dasar – dasar file beserta Dasar – Dasar Pemrograman 4.1 Apa itu Algoritma Pemrograman ? Algoritma adalah urutan langkah – langkah logis penyelesaian masalah yang disusun secara sistematis. Berdasarkan defisini algoritma diatas maka dapat diartikan sebuah Algoritma Pemrograman adalah suatu urutan yang logis dan sistematis yang digunakan untuk menyelesaikan sebuah penyususan program komputer. Dasar – dasar dari algoritma pemrograman dibagi menjadi 3 bagian, yaitu 1 Proses 2 Instruksi 3 Aksi Pada dasarnya sebuah algoritma adalah deskripsi pelaksanaan suatu proses yang disusu berdasarkan sederetan langkah instruksi yang logis. Tiap langkah instruksi tersebut melakukan suatu tindakan (aksi) yang akan menghasilkan sejumlah operasi yang bersesuaian dengan aksi tersebut. Hasil yang diperoleh dari pengerjaan suatu aksi tersebut dapat dibandingkan berdasarkan keadaan sebelum aksi dimulai dan keadaan pada saat aksi selesai dikerjakan. (Lihat contoh dibawah) . Contoh kasus : Terdapat 2 Gelas A dan B, gelas A berisi warna merah dan gelas B berisi warna biru. Bagaimana memindahkan isi dari gelas A ke B dan gelas B ke A ? Deskripisi : Keadaan awal : Gelas A berisi warna merah dan gelas B berisi warna biru. Aksi : - - Pindahkan isi dari gelas A ke dalam gelas C - Pindahkan isi gelas B ke dalam gelas A - Pindahkan isi gelas C ke dalam gelas A. Keadaan akhir : Gelas A berisi warna biru dan gelas B berisi warna merah. Contoh diatas memperlihatkan urutan yang logis dalam menyelesaikan suatu masalah / memperoleh hasil yang diinginkan. Struktur Dasar Algortima 1. Runtunan (Sequence) 2. Pemilihan (Selection) 3. Pengulangan (Repetition) Runtunan Runtunan (Sequence) terdiri dari satu atau lebih instruksi yang akan dikerjakan secara berurutan sesuai dengan urutan penulisannya. Urutan instruksi menentukan keadaan akhir algoritma, bila urutannya diubah akan memberikan hasil yang berbeda. Contoh : Instruksi 1 Instruksi 2 Instruksi 3 Pemilihan Pemilihan (Selection) adalah suatu kondisi dimana sebuah instruksi dijalankan apabila kondisi tertentu dipenuhi. Ini akan mengakibatkan tidak semua instruksi akan dijalankan sesuai urutan dan tidak semua instruksi akan dijalankan. Contoh : Jika nilai a lebih kecil dari 10 maka Cetak nilai a sebanyak 10 kali ke layar monitor Pengulangan Salah satu kelebihan komputer adalah kemampuan untuk mengerjakan proses yang sama berulang kali tanpa mengenal lelah. Ini akan mengakibatkan sebuah instruksi mungkin dijalankan beberapa kali sebelum menjalankan instruksi yang lain. Contoh : Tuliskan angka dari 1 sampai 100 Angka = 0 Repeat Tuliskan angka Tambahkan nilai angka dengan 1 Until angka = 100 Pada praktenya, ketiga elemen itu dapat dikombinasikan menjadi sekumpulan instruksi yang membangun sebuah program komputer. Namun pemahaman tentang dasar dari masing – masing elemen sangatlah penting. 4.2 Tipe data, Variabel dan Konstanta Dalam pembahasan mengenai pengertian dan dasar – dasar dari algoritma pemrograman telah dijelaskan mengenai urutan kerja dari sekumpulan instruksi yang digunakan untuk memecahkan sebuah permasalahan. Pada pembahasan ini kita akan mempelajari beberapa hal, antara lain : 4.2.1 Tipe Data Pada dasarnya sebuah program komputer bekerja dengan memanipulasi obyek (data) di dalam memori. Obyek yang akan diprogram bermacam – macam jenis dan tipenya, misalnya nilai numerik, karakter, string dan rekaman (record). Tipe data terbagi menjadi beberapa bagian, antara lain : 4.2.1.1 Tipe Data Dasar A. Tipe Logika / Bilangan Logika Tipe data ini hanya memiliki 2 nilai saja, benar atau salah atau 0 atau 1. Nilai 0 ini akan melambangkan salah dan 1 akan melambangkan benar. Tipe data ini biasanya digunakan untuk operasi – operasi logika (logical operation). Operasi logika ini akan menghasilkan nilai dalam ranah tipe boolean, yaitu betul atau salah. Operasi yang dapat digunakan untuk operasi logika adalah : not, and, or dan xor. Dibawah ini akan diberikan contoh pemakaiannya : Jika a dan b adalah peubah (variabel) yang bertipe boolean / logika maka hasil variabel a dan b dengan operator boolean tersebut diberikan berdasarkan tabel kebenaran berikut : A B A and B A or B A xor B True True True true False True False false True True False True false True True False False False False False B. Tipe Bilangan Bulat Tipe ini adalah tipe yang sudah kita kenal dengan baik dalam kehidupan sehari – hari. Tipe data ini mempunyai nilai yang tidak mengandung pecahan desimal, misalnya : 34, 8, 1200, 10 dan seterusnya. Nama tipe dari bilangan bulat adalah integer. Secara teori, tipe bilangan bulat memiliki ranah nilai yang tidak terbatas dimulai dari minus tidak terhingga sampai plus tidak terhingga. Namum dalam penerapan algoritma kita dapat mendefinisikan tipe bilangan bulat dalam suatu rentang nilai tertentu. Penetapan rentang nilai ini dimaksudkan untuk menyatakan bahwa nilai dari suatu obyek hanya boleh pada ranah nilai tersebut. Contoh : Misalkan sebuah obyek jumlah murid 1 kelas yang berisi 100 orang, hendaknya didefinisikan pada tipe bilangan bulat yang memiliki rentang nilai dari 1 .. 100. Apabila sebuah obyek tidak didefinisikan rentang nilainya, maka dianggap obyek tersebut memiliki rentang nilai dari minus tidak terhingga sampai plus tidak terhingga. Pada implementasinya, tipe integer memulai rentang nilai yang terbatas dan tergantung dari setiap kompiler dimana kita membuat program aplikasinya. Berikut saya berikan contoh pada kompiler Turbo Pascal. Tipe Rentang Nilai Format Byte 0 ... 255 Unsigned 8 – bit Shortlist - 128 ... 127 Signed 8 – bit Word 0 ... 65535 Unsigned 16 – bit Integer - 32768 ... 32767 Signed 16 bit Longint -2147483648 ... 2147483647 Signed 32 bit Rentang nilai dari tipe data ini sangat bervariatif dan bergantung pada jenis program kompilernya. Contoh diatas tidak berlaku bagi semua jenis kompiler. Operasi Operasi yang dapat dilakukan pada tipe data ini ada 2 macam, yaitu : Operasi artimatika dan Operasi perbandingan. - Operasi Aritmatika Operasi aritmatika pada bilangan bulat akan menghasilkan bilangan bulat juga. Operator aritmatika yang digunakan antara lain : + (penjumlahan) - (Pengurangan) * (Perkalian) Div (Pembagian) Mod (sisa hasil bagi) - Operasi Perbandingan Operasi perbandingan terhadap bilangan bulat dengan menggunakan operator relasional akan menghasilkan nilai booelan (true atau false). Operator perbandingan digunakan antara lain : < (lebih kecil) < (lebih kecil atau sama dengan) > (lebih besar atau sama dengan) == (sama dengan) ≠ (tidak sama dengan) yang Contoh operasi perbandingan : 3<8 (true) 9≤9 (true) ( 24 div 3) ≠ 8 (false) C. Tipe Bilangan Riil Tipe bilangan riil adalah bilangan yang mengandung nilai pecahan / desimal misalnya 3.65, 0.0003, 29.0 dan lain lain. Karakter yang identik dengan bilangan desimal adalah harus selalu mengandung “.” (titik). Jadi apabila terdapat nilai 20 maka akan dianggap sebagai bilangan bulat, sedangkan nilai 20.0 akan dianggap sebagai bilangan riil. Selain itu bilangan riil juga dapat dituliskan dengan notasi eksponential (E) yang artinya perpangkatan sepuluh. Nama tipe dari bilangan riil ini lebih sering dikenal dengan nama real. Secara teoritis, tipe data ini memiliki ranah nilai yang tidak terbatas dimulai dari minus tak terhingga hingga plus tak terhingga. Namun pada implementasinya, tipe bilangan riil juga memiliki batas nilai yang tergantung pada masing – masing kompiler. Berikut akan diberikan contoh pada kompiler Turbo Pascal. Tipe Rentang Nilai Format Real 2.9 X 10 6 byte Single 4 byte Double 8 byte Extended 10 byte Operasi Operasi yang dapat dilakukan pada tipe data ini ada 2 macam, yaitu : Operasi artimatika dan Operasi perbandingan. - Operasi Aritmatika Operasi aritmatika pada bilangan riil akan menghasilkan bilangan riil juga. Operator aritmatika yang digunakan antara lain : + (penjumlahan) - (Pengurangan) * (Perkalian) Div (Pembagian) Mod (sisa hasil bagi) - Operasi Perbandingan Operasi perbandingan terhadap bilangan riil dengan menggunakan operator relasional akan menghasilkan nilai booelan (true atau false). Operator perbandingan yang digunakan antara lain : < (lebih kecil) < (lebih kecil atau sama dengan) > (lebih besar atau sama dengan) == (sama dengan) ≠ (tidak sama dengan) Contoh operasi perbandingan : 0.003 < 0. 3 (true) 8.0 ≥ 5 (false) 3.0 ≠ 3.5 (true) D. Tipe Karakter Tipe data yang termasuk karakter ini adalah huruf – huruf alfabet, tanda baca, angka ‘0’, ‘1’, ‘2’, .... dan karakter – karakter khusus seperti ‘<’, ‘?’, dan sebagainya. Tipe data ini biasa dikenal sebagi char. Rentang nilai dari tipe data ini adalah karakter – karakter yang telah disebutkan diatas, untuk lebih detilnya dapat melihat pada buku – buku yang memuat daftar tabel ASCII. Karakteristik yang identik dengan tipe data ini adalah setiap karakter harus diapit dengan tanda petik tunggal. Contoh : ‘a’, ‘1’, ‘ ‘, ‘+’, ‘?’, ‘&’. Satu hal yang perlu diperhatikan adalah : bilangan 1 adalah integer dan ‘1’ adalah karakter. Operasi Satu – satunya operasi yang digunakan untuk tipe data ini adalah operasi perbandingan. Operasi perbandingan - Operasi perbandingan terhadap tipe data karakter dengan menggunakan operator relasional akan menghasilkan nilai boolean (true atau false). Operator perbandingan digunakan antara lain : < (lebih kecil) < (lebih kecil atau sama dengan) > (lebih besar atau sama dengan) == (sama dengan) ≠ (tidak sama dengan) Contoh : ‘a’ == ‘a’ (true) ‘m’ < ‘z’ (true) ‘y’ ≠ ‘Y’ yang Hal yang harus diperhatikan dalam operasi perbandingan pada tipe data karakter adalah operasi ini membandingkan kode ASCII diantara 2 obyek yang dibandingkan. Jadi bisa dilihat pada contoh diatas bahwa ‘y’ tidak sama dengan ‘Y’, ini dikarenakan kode ASCII dari 2 karakter tersebut memang berbeda. 4.2.1.2 Tipe Data Bentukan A. String / Kalimat String adalah sebuah kalimat atau dapat dikatakan merupakan kumpulan dari karakter. Tipe data ini dikenal juga dengan nama string. Rentang nilai dari string adalah sesuai dengan rentang nilai dari karakter (lihat pembahasan diatas). String adalah bentukan dari sederetan karakter yang dikombinasikan menjadi satu untuk membentuk sebuah arti tertentu. Contoh : “Bandung”, “Jakarta”, “ABCDE”, “12345” hal yang perlu diperhatikan adalah string “123” berbeda dengan 123. Operasi Operasi yang dapat dilakukan pada tipe data string ada 2 macam, yaitu : - Operasi Penyambungan (Concatenation) Operasi penyambungan ini berfungsi untuk menggabungkan 2 string atau lebih. Operator yang digunakan adalah “+” dan “&” (Tergantung dari jenis kompilernya) Contoh Concatenation : “TEKNIK “ + “INFORMATIKA” = “TEKNIK INFORMATIKA” “1” + “2” = “12” Hal yang perlu diperhatkan adalah operator “+” ini bukanlah operator penjumlahan / operator artimatika. - Operasi Perbandingan Operasi perbandingan terhadap tipe data string dengan menggunakan operator relasional akan menghasilkan nilai booelan (true atau false). Operator perbandingan yang digunakan antara lain : < (lebih kecil) < (lebih kecil atau sama dengan) > (lebih besar atau sama dengan) == (sama dengan) ≠ (tidak sama dengan) Contoh : “abcde” == “abc” (false) “aku” < “AKU” (true) Hal yang perlu diperhatikan dalam operasi perbandingan pada tipe data string adalah kompiler akan membandingkan berdasarkan kode ASCII dari tiap – tiap karakter terhadap kode ASCII dari obyek lainnya. Prinsip ini sebenarnya sama dengan prinisp operasi perbandingan pada tipe data karakter yang telah dijelaskan di atas. B. Tipe data dasar yang diberi nama tipe baru Pemrogram dapat memberi sebuah nama baru dati tipe data dasar yang ada, dengan menambahkan kata kunci type. Pengubahan nama ini biasanya digunakan bagi para programmer untuk memudahkan dalam penamaan pada variabel pada penulisan program. Contoh : Type bilBulat : integer Penulisan diatas berarti bilBulat memiliki tipe yang sama dengan integer dan dapat digunakan untuk mendeklarasikan sebuah obyek integer. C. Record / Rekaman Tipe data rekaman atau bisa disebut record. Record ini merupakan dasar daripada pemrograman basis data. Pada dasarnya record adalah sekumpulan baris data yang tersusun dari beberapa field. Contoh : Nama Alamat Telp NO_Ktp Budi Gelong Baru 72 713.26.905 123/456/789 Pada contoh diatas akan menjelaskan mengenai dasar dari field dan record sendiri. Field adalah setiap kolom (nama, alamat, telp dan no ktp). Field ini adalah data tunggal yang berdiri sendiri dan belum memiliki arti yang sempurna sebelum disusun menjadi 1 kesatuan. Record adalah 1 baris data (Budi, Gelong Beru 72, 713.26.905,123/456/789). Record adalah sekumpulan baris data yang disusun dari field – field. Pendefinisian Tipe Data Record Pendefinisian tipe data record sangat tergantung dari bahasa pemrograman yang digunakan, disini akan diberikan contoh menggunakan bahasa pemrograman Turbo Pascal. Contoh : Record DataMhs adalah record yang menyimpan nilai ujian mahasiswa beserta kode mata kuliah yang diambil. Type DataMhs : record < NIM : string, Nama : string, KdMtk : string, nilai : real > Pendefinisian tipe data record menggunakan kata kunci type kemudian dilanjutkan dengan menuliskan nama Record dan menuliskan field – field yang ingin ditampung dalam 1 record. Penulisan dan pembacaan dari Record Sebelum mempelajar tentang bagaimana menulis dan membaca dari record, ada baiknya kita pelajari dahulu bagaimana mendefinisikan obyek dari sebuah tipe data record yang telah didefinisikan. Contoh : Misalkan anda mempunyai sebuah struktur record yang bernama DataMhs, dan saat ini hendak memberi nilai dari masing – masing field yang ada di dalam struktur tersebut. Buatlah obyek yang merujuk ke struktur record. DataMhs rudy Mendefinisikan obyek rudy sebagai obyek nyata dari DataMhs Memasukkan nilai ke dalam setiap field dalam struktur record Rudy.Nama = “Rudy Haryanto” Rudy.NIM = “0600671590” Rudy.KdMtk = “MTK001” Rudy.Nilai = 98 Menampilkan nilai dari struktur record ke standar output Cetak Rudy.NIM + Rudy.Nama + Rudy.KdMtk + Rudy.Nilai Akan memberikan hasil sama seperti contoh tabel diatas. Hal yang harus diperhatikan pada operator ‘+’ tersebut bukanlah operator artimatika dan berupa operator penggabungan string ( lihat pembahasan tipe data string ). 4.2.2 Variabel Setiap mempelajari sebuah bahasa pemrograman anda pasti akan dihadapkan dengan yang namanya variabel. Variabel merupakan sebuah obyek yang digunakan untuk menyimpan data tertentu berdasarkan tipe data dasar tertentu. Setiap obyek yang ada di dunia pasti memiliki nama, begitu pula dalam bahasa pemrograman. Seluruh variabel yang dideklarasikan harus memiliki nama dan tipe dasarnya. Ini dimaksudkan untuk memudahkan kompiler dalam mengidentifikasi variabel – variabel yang digunakan dalam proses perhitungan. Variabel memiliki aturan dalam penamaan yang biasanya berlaku bagi hampir seluruh bahasa pemrograman. - Nama harus dimulai dengan huruf alfabet, tidak boleh dimulai dengan angka , spasi atau karakter khusus lainnya - Bagi bahasa pemrograman tertentu huruf besar dan kecil tidak berpengaruh, tapi bagi bahasa pemrograman tertentu akan dibedakan. - Tidak boleh mengandung operator aritmatika, tanda baca dan karakter khusus lainnya. - Tidak boleh dipisahkan menggunakan spasi, apabila ingin memisahkan harus menggunakan karakter “_”. - Panjang nama tidak dibatasi, tetapi hendaknya tidak terlalu panjang sehingga tidak menimbuikan kebingungan saat menulis program. - Penamaan hendaknya disesuaikan dengan kegunaan dari variabel tersebut. Contoh : Integer nilai_ujian (variabel bernama nilai_ujian dengan tipe integer) Integer nilai ujian (salah, mengandung spasi) String nama-murid (salah, mengandung karakter ‘-‘) String nama_murid (benar, menggunakan karakter “_”) Pemberian nilai pada variabel Setelah mempelajari bagaimana cara mendeklarasikan sebuah variabel, kita akan mempelajari bagaimana cara memberi nilai kedalam sebuah variabel berdasarkan tipe data dasarnya. A. Secara Langsung Pemberian nilai secara langsung ini berarti memberikan sebuah nilai ke dalam variabel secara langsung di dalam teks algortma program. Nilai yang diberikan dapat berupaq konstanta, tetapan atau nama variabel lain. Tipe yang diberikan harus sesuai dengan tipe data dari variabel penerima. Contoh : Integer nilai Nilai = 10 (benar) Integer nilai_2 Nilai2 = nilai (benar, memasukkan nilai dari variabel lain) Nilai2 = “alo” (salah, tipe dasarnya tidak sama) B. Melalui Piranti Masukan (Standart Input) Metode untuk memberikan nilai ke dalam sebuah variabel tidak hanya dilakukan secara langsung, namun juga dapat dilakukan melalui sebuah piranti masukan (keyboard, file ataupun database). Setiap bahasa pemrograman menggunakan function yang berbeda – beda dalam menangani proses inputan nilai dari piranti masukan. Contoih dibawah ini menggunakan bahasa Turbo Pascal. Contoh : Integer nilai Read (nilai) Function read() ini digunakan untuk menerima inputan dary keyboard. Jadi ketika anda mengetikkan angka 10 dan menekan ENTER, maka nilai akan berisikan angka 10. Apabila anda mengetikkan nilai yang memiliki tipe yang berbeda dari pada tipe data dari variabel penampungnya, respon yang akan diberikan oleh kompiler berbeda – beda dan tergantung dari masing – masing kompiler. Ada yang langsung memberikan pesar error namun ada pula yang tetap dapat menjalankan instruksi selanjutnya baru kemudian menampilkan nilai yang salah ketika hendak mengakses isi dari variabel tersebut. 4.2.3 Konstanta Konstanta adalah sebuah variabel yang memiliki nilai yang tetap selama program berlangsung dan tidak dapat dirubah nilainya. Konstanta dibagi menjadi 2 bagian, yaitu : A. Konstanta yang telah ditetapkan Konstanta ini biasanya telah ada bersamaan dengan satu paket dari bahasa pemrograman yang digunakan, dan nilainya tidak dapat dirubah. Biasanya digunakan untuk mendukung function – function yang disediakan pada masing – masing bahasa pemrograman. B. Konstanta yang kita tetapkan sendiri Konstanta yang kita ciptakan sendiri, nama ataupun isi dari konstanta ini terserah pada kita. Kata kunci yang digunakan biasanya adalah const. Contoh : Const PHI = 3.14 Const keyWords = “rahasia” Const nMaks = 100 4.3 Alur Logika Program Algoritma Pemrograman terdiri dari sekumpulan instruksi yang disusun berdasarkan urutan logis tertentu untuk memecahkan suatu permasalahan. Alur logika program dibagi menjadi 3 bagian besar, antara lain : 4.3.1 Proses sekuensial Proses sekuensial berarti kompiler program akan menjalankan instruksi yang ada satu persatu hingga ditemukan dari akhir sebuah instruksi. Karakteristik dari proses sekuensial adalah : - Setiap instruksi dikerjakan satu per satu - Setiap instruksi dijalankan hanya sekali saja, tidak ada perulangan. - Setiap instruksi dijalankan tepat sesuai dengan urutan sebagaimana ditulis di dalam teks algoritma - Kompiler akan berhenti menjalankan instruksi setelah bertemu dengan instruksi terakhir. Contoh : Penulisan contoh ini menggunakan bahasa pseudocode dan bahasa pemgoraman Turbo C. Pseudocode String nama Integer nilai Read nama Read nilai Nilai = nilai * 1.4 Print “Nama anda : “ + nama + “ Nilai anda : “ + nilai Bahasa C #include <stdio.h> void main(){ // deklarasi variabel berdasarkan tipe data dasarnya. char *nama; int nilai; // instruksi secara sekuensial mulai dilaksanakan. scanf(“%s”,nama); scanf(“%d”,&nilai); nilai = nilai * 1.4; printf(“Nama anda : %s Nilai anda : %d“,nama,&nilai); // akhir dari instruksi dilaksanakan. } Kedua contoh diatas sama – sama menggunakan konsep sekuensial meskipun menggunakan 2 jenis bahasa pemrograman yang berbeda. Program akan menjalankan instruksi pertama dengan mendeklarasikan variabel kemudian menjalankan proses input data, mengalikan isi dari variabel nilai sebanyak 1.4 dan instruksi terakhir adalah menuliskan hasilnya ke stardar output (biasanya monitor), setelah itu program akan sslesai karena tidak instruksi lagi yang dijalankan. Hal yang perlu diperhatikan adalah : Urutan sebuah instruksi sangat memgang peranan yang dominan, apabila instruksi diatas posisinya ditukar antara : Scanf(“%d”, &nilai); dan Nilai = nilai * 1.4; Maka dapat dipastikan akan memberikan hasil yang sangat berbeda dari yang kita inginkan, karena kompiler hanya menjalankan sesuai dengan peletakan urutan instruksi saja. 4.3.2 Proses percabangan Percabangan adalah suatu kondisi dimana sebuah instruksi tidak dijalankan secara sekuensial, tetapi lebih berdasarkan pada kondisi – kondisi tertentu yang ditetapkan oleh pembuat program. Pada inti pemrograman, percabangan memegang peranan yang sangat penting dalam penyusunan program. Contoh : Sebuah sistem menginginkan adanya otorisasi kepada pengguna. - Sehingga pengguna yang namanya terdaftar di data perusahaan yang bisa menggunakan sistem tersebut. Sebuah program menginginkan pencatatan data hanya dapat - dilakukan pada pukul 09.00 – 10.00. Dan lain sebagainya. - Proses percabangan memiliki 3 jenis, antara lain : 4.3.2.1 Percabangan Tunggal Percabangan tunggal bekerja apabila hanya ada 1 alternatif instruksi saja yang dijalankan. Logika ini memungkinkan kompiler untuk menjalankan sebuah Notasi algortimik yang dgunakan adalah : If (kondisi) { Instruksi yang hendak dijalankan ...... } Notasi algoritmik yang digunakan ini masing – masing berbeda tergantung dari bahasa pemrograman yang dipakai. Pada pembahasan ini kami menggunakan contoh menggunakan bahasa pemrograman Turbo C. Contoh : 1. Program membaca inputan dari keyboard dan apabila diinput oleh karakter vokal maka program akan menuliskan “Huruf Hidup” dan apabila bukan maka program tidak akan menjalankan apapun. #include <stdio.h> void main(){ char huruf; scanf(“%c”,&huruf); if (huruf == ‘a’ || huruf = ‘i’ || huruf = ‘u’ || huruf ==’e’ || huruf == ‘o’) printf (“Huruf Hidup”); } 2. Program membaca apakah bilangan yang diinput habis dibagi 2 atau tidak, apabila habis dibagi 2 maka program akan menuliskan “Bilangan genap” dan bukan maka program tidak akan menjalankan apapun. #include <stdio.h> void main(){ int angka; scanf(“%d”,&angka); if (angka % 2 == 0) printf (“Bilangan Genap”);} 4.3.2.2 Percabangan Ganda Percabangan ganda apabila terdapat 2 alternatif instruksi yang dijalankan. Logika ini memungkinkan kompiler menjalankan salah satu dari 2 alternatif instruksi yang ada, dan salah satu instruksi pasti dijalankan. Notasi algoritmik yang digunkanan : If (kondisi) { Instruksi pertama }else{ Instruksi kedua } Contoh : 1. Program memeriksa inputan apakah bilangan ganjil atau genap. Apabila diperiksa bilangan genap maka tulis “Bilangan genap” dan kalau bukan maka tulis “Bilangan ganjil”. #include <stdio.h> void main(){ int angka; scanf(“%d”,&angka); if (angka % 2 == 0) printf (“Bilangan Genap”); else printf(“Bilangan Ganjil”); } Program memeriksa bilangan yang lebih besar dari 2 inputan bilangan. #include <stdio.h> void main(){ int angka1, angka2; scanf(“%d”,&angka1); scanf(“%d”,&angka2); if (angka1 > angka2) printf (“Bilangan pertama lebih besar dari Bilangan kedua”); elseprintf (“Bilangan kedua lebih besar dari Bilangan pertama”); } 4.3.2.3 Percabangan Lebih dari 2 Pada dasarnya hanya terdapat 2 jenis seleksi dalam struktur algoritma pemrograman, namun bukan berarti hanya bisa dikembangkan pada 2 jenis tersebut saja. Struktur seleksi dapat dikembangkan menjadi bentuk yang tidak terbatas dan dapat dikombinasikan kedalam bentuk perulangan selama notasi penulisannya tidak terdapat kesalahan. Kemampuan logika seseorang dalam merancang program dan mengamati dari permasalahan yang ada menjadi bagian yang paling penting dalam melakukan pengembangan dari bentuk seleksi ini. Dibawah ini akan diberikan contoh seleksi menggunakan kondisi lebih dari 2. Contoh : Program untuk menentukan grade dari sebuah nilai ujian, dengan aturan grade A untuk rentang nilai 80 – 100, grade B untuk nilai 70 – 80 dan grade C untuk nilai 50 – 70 dan grade D untuk nilai dibawah itu. #include <stdio.h> void main(){ int nilai; scanf(“%d”,&nilai); if (nilai >= 80 && nilai <= 100) print(“Grade A”); else if (nilai >= 70 && nilai <= 80) printf(“Grade B”); else if (nilai >= 50 && nilai <= 70) printf(“Grade C”); else printf(“Grade D”); } 4.3.2.4 Struktur Case Struktur case sebenarnya memiliki fungsi yang sama dengan struktur if yang telah kita pelajari diatas. Struktur case ini dapat meringkaskan alur logika yang terjadi apabila diaplikasikan pada pada alur seleksi yang memiliki lebih dari 2 kondisi. Berikut adalah notasi algoritmiknya : switch (kondisi){ case kondisi_1 : break; case kondisi2 : break; default : } Struktur logika seleksi menggunakan struktur case ini jauh lebih ringkas apabila diaplikasikan pada struktur seleksi yang memiliki kondisi lebih dari 2. Kompiler program akan menjalankan instruksi dari struktur case dan memeriksa setiap kondisi yang ada, apabila belum ada kondisi yang bernilai benar maka kompiler akan terus menjalankan instruksi dibawahnya sampai ditemukan kondisi yang bernilai benar. Namun apabila hingga kondisi terakhir diperiksa dan tidak ditemukan kondisi yang bernilai benar maka kondisi default yang akan dijalankan. Contoh : Program untuk menentukan apakah karakter ‘%’, spasi, ‘&’ atau ‘$’ yang ditekan oleh pengguna melalui keyboard. #include <stdio.h> void main(){ int tombol; scanf(“%d”,&tombol); swicth(tombol){ case ‘32’: printf(“Anda menekan tombol spasi”); break; case ’36: printf(“Anda menekan tombol $”); break; case ‘37’ : printf(“Anda menekan tombol %”); break; case ‘38’: printf(“Anda menekan tombol &”); break; default : printf(“Anda tidak mematahui aturan.”); }} Perbedaan yang paling jelas antara stukrut if dengan struktur case adalah : - Struktur if dapat menerima kondisi yang berupa operasi logika. Sedangkan stuktur case tidak. - Struktur case lebih efektif apabila digunakan untuk logika seleksi lebih dari 2 kondisi. - Struktur case dan sktuktur if dapat dikombinasikan kedalam satu bagian, dengan catatan tata cara penulisan notasi tidak terdapat kesalahan. - Struktur case tidak dapat melakukan pengecekan terhadap tipe data string / kalimat. 4.3.3 Proses perulangan Salah satu bagian yang paling membedakan antara manusia dengan komputer adalah : Komputer mampu mengerjakan instruksi dalam hitungan ribuan bahkan jutaan kali tanpa mengenal lelah. Dalam mempelajari algoritma pemrograman, struktur perulangan menjadi bagian yang sangat penting untuk dipelajari. Struktur Perulangan Struktur perulangan terdiri dari 2 bagian, yaitu : 1. Kondisi perulangan, yaitu ekspresi yang dilakukan sebelum pengulangan dilakukan pertama kali. 2. Body atau tubuh pengulangan, yaitu satu atau lebih instruksi yang diulang. Selain itu biasanya di perulangan juga terdapat 2 hal dibawah ini, antara lain : 1. Inisialisasi : aksi yang dilakukan sebelum pengulangan dilakukan pertama kali. 2. Terminasi : aksi yang dilakukan untuk membuat perulangan berakhir. Biasanya berupa sebuah kondisi. Dalam setiap bahasa pemrograman pada umumnya biasanya terdapat 3 jenis perulangan, antara lain : 1. Struktur WHILE – DO 2. Struktur Do – WHILE / REPEAT – UNTIL 3. Struktur FOR. Ketiga jenis diatas hanyalah sebuah metode dan pada implementasinya, notasi penulisannya (sintaks) sangat tergantung dari setiap bahasa pemrograman yang digunakan. 4.3.3.1 Struktur WHILE – DO Ciri khas dari struktur ini adalah : - Dilakukan pengencekan di awal pada kondisi sebelum menjalankan instruksi di tubuh perulangan. - Ada kemungkinan tubuh perulangan tidak dijalankan sama sekali. - Setiap kali hendak melakukan perulangan berikutnya, selalu memeriksa kondisi perulangan. Apabila kondisi perulangan telah - memberikan nilai false / salah. Maka perulangan akan dihentikan. Notasi algoritmiknya adalah : while (KONDISI){ tubuh perulangan yang berisi instruksi untuk dijalankan. } Contoh : Progam membuat tulisan di angka 1 .. 100. # include <stdio.h> void main(){ int nilai_awal = 1; // inisialisasi awal. Sangat penting. While (nilai_awal <= 100){ Printf(“/n%d”,nilai_awal); Nilai_awal ++; // memanipulasi variabel awal agar tercapai kondisi terminasi. }} Dalam struktur perulangan ini, ada 2 hal yang harus diperhatikan untuk menghindari terjadinya kesalahan logika pada program. - Inisialisasi variabel awal. Ini dimaksudkan agar ketika kompiler program melakukan pemeriksaan terhadap kondisi awal, ditemukan kondisi yang benar. Pada beberapa bahasa pemrograman tertentu, apabila sebuah variabel tidak diinisialisasikan maka nilainya bisa berupa random ataupun nol. (lihat contoh dibawah) - Manipulasi variabel awal. Banyak terjadi kesalahan pada programmer ketika mereka membuat program perulangan, memanipulasi variabel kondisi sangat penting untuk menjaga program tetap sesuai dengan yang diinginkan. Ketika kita lupa memanipulasi variabel awal, ada kemungkinan program mengulang terus menerus (looping forever) karena kondisi yang diinginkan tercapat terus tanpa ada perubahan. (lihat contoh dbawah) Contoh 1 : Program menulis angka dari 1 .. 100. # include <stdio.h> void main(){ int nilai_awal ; // tidak dilakukan inisialisasi awal. While (nilai_awal <= 100){ printf(“/n%d”,nilai_awal); Nilai_awal ++; // memanipulasi variabel awal agar tercapai kondisi terminasi. }} Program diatas tidak melakukan inisialisasi awal terhadap variabel nilai_awal, sehingga ada kemungkinan nilai_awal berisni nilai random. Misalkan nilai_awal berisi -1200, dan secara logika -1200 memang kurang dari 100. Maka program bukan mencetak 1 – 100, melainkan mencetak -1200 – 100. Contoh 2 : Program menulis angka dari 1 .. 100. # include <stdio.h> void main(){ int nilai_awal = 1; // inisialisasi awal dilakukan While (nilai_awal <= 100){ Printf(“/n%d”,nilai_awal); }} Program diatas tidak melakukan manipulasi terhadap nilai_awal , sehingga nilainya selalu 1. Program bukannya mencetak 1 – 100, melainkan mencetak angka 1 terus menerus dan tidak pernah berhenti karena kondisi perulangan selalu benar. 4.3.3.2 Struktur Do – WHILE / REPEAT – UNTIL Struktur Do = WHILE / REPEAT – UNTIL hampir mirip dengan struktur WHILE – DO. Berikut adalah ciri khas dari struktur perulangan ini. - Tidak dilakukan pengecekan kondisi perulangan di awal eksekusi program. - Minimal perulangan yang terjadi di tubuh program sebanyak 1 kali (Kerena tidak ada pengecekan kondisi perulanga di awal). - Setiap kali hendak melakukan perulangan berikutnya, selalu memeriksa kondisi perulangan. Apabila kondisi perulangan telah memberikan nilai false / salah. Maka perulangan akan dihentikan. Perbedaan paling mendasar sebenarnya terletak pada pengecekan kondisi perulangan, struktur ini melakukan pengecekan kondisi perulangan di akhir tubuh perulangan (bukan di awal seperti struktur WHILE – DO) sehingga mengakibatkan instruksi dijalankan minimal 1 kali. Notasi algoritmiknya adalah : do { repeat Tubuh perulangan atau }while (KONDISI); until KONDISI Pada impelemntasinya notasi penulisan struktur perulangan ini juga bergantung pada bahasa pemgoraman yang digunakan. Pembahasan ini menggunakan bahasa pemrograman Turbo C dan leih ditekankan kepada konsep – konsep perulangannya. Contoh : Program menulis angka dari 1 .. 100. # include <stdio.h> void main(){ int nilai_awal = 1; // inisialisasi awal dilakukan do{ Printf(“/n%d”,nilai_awal); Nilai_awal += 1;// tambahkan nilai_awal sebanyak 1. }while(nilai_awal <= 100); } Program untuk meminta inputan dari keyboard, apabila pengguna menekan tombol esc maka program akan berhenti. #include <stdio.h> #include <conio.h> void main(){ char tombol; do{ tombol = getch(); // peminta penekanan tombol dari keyboard. // selama tombol yang ditekan tidak memiliki ASCII = 27 (tombol esc) maka //program akan tetap berjalan. }while (tombol != 27); // program berhenti, karena pengguna telah menekan tombol escape. } Kapan menggunakan WHILE – DO atau Do – WHILE ? Pemilihan antara kedua struktur ini sangat tergantung pada permasalahan yang dihadapi. Apabila sebuah program memerlukan instruksi dijalankan dahulu dan baru diperiksa kondisinya maka strukltur DO – WHILE harus digunakan namun apabila sebuha program harus memeriksa kondisi perulangan terlebih dahulu dan baru menjalankan tubuh perulangan, maka kondisi WHILE – DO harus digunakan. 4.3.3.3 Struktur FOR Struktur perulangan for ini digunakan untuk perulangan yang tidak perlu memeriksa kondisi apapun dan hanya melaksanakan perulangan sejumlah kali tertentu. Struktur perulangan ini paling cocok untuk proses perulangan yang telah diketahui batas akhirnya, karena kompiler akan mengeksekusi lebih cepat daripada 2 jenis struktur perulangan diatas. Notasi algoritmiknya : For (variabel awal = nilai awal; kondisi ; faktor penaik){ Tubuh perulangan } Contoh : Program menulis bilangan genap dari 2 – 100. #include <stdio.h> void main(){ int nilai_genap = 2; // inisialisasi awal. for (nilai_genap =2; nilai_genap <= 100; nilai_genap+=2) printf(“%d”,&nilai_genap);} Program diatas akan melakukan inisialisasi nilai_genap sebanyak 2, dan setelah itu akan dilakukan pemeriksaan apakan kondisi terpenuhi / memberikan nilai benar. Apabila kondisi terpenuhi maka tubuh perulangna akan dijalankan ( mencetak nilai dari nilai_genap) dan kemudian menaikkan nilai_genap sebanyak 2. Setlah itu akan dilakukan pemeriksaan kondisi sekali lagi, dan apabila kondisi tersebut terpenuhi maka tubuh perulangan akan dijalankan lagi sedangkan apabila kondisi perulangan tidak terpenuhi maka struktur perulangan akan berakhir. Inti dari struktur perulangan ini adalah : - Lebih cocok untuk jenis perulangan yang memiliki batas akhir yang sudah jelas. - Pemeriksaan kondisi awal akan dilakukan di awal. Apabila kondisi terpenuhi, maka tubuh perulangan akan dilakukan. Apabila tidak, maka tubuh perulangan tidak akan pernah dilakukan. - Ada kemungkinan tubuh perulangan tidak dijalankan sama sekali. - Memiliki proses yang lebih cepat dibandingkan bentuk DO – WHILE atau WHLE – DO dalam proses perhitungan matematika. 4.4 Menerapkan Pengelolaan Array 4.4.1 Pengenalan Array. Sebuah variabel hanya mampu menyimpan sebuah nilai berdasarkan tipe data tertentu, variabel tidak mampu menyimpan beberapa buah data dengan tipe yang sejenis. Seringkali dalam pemrograman kita harus mengolah sekumpulan data dengan tipe data yang sama. Misalnya nilau ujian 50 orang, no telp dari seluruh karyawan, dan sebagainya. Apabila kita mengacu pada penggunaan variabel, maka dapat dibayangkan berapa banyak nama variabel yang akan diperlukan dan betapa sukarnya untuk mengorganisasi variabel sebanyak itu. Array mampu memberikan solusi atas permasalah tersebut, karena dengan penggunaan array tidak diperlukan lagi perulangan variabel yang memilikit tipe data dasar sama dengan nama berbeda. Array adalah struktur data yang mampu menyimpan sekumpulan data dengan tipe yang sama, setiap elemen data dipisahkan menggunakan indeks. Pada bahasa pemrograman pada umumnya, indeks dari sebuah array selalu diawali dari 0 hingga n -1 (n = jumlah elemen maksimum). Contoh : Terdapat struktur data array bertipe integer, dengan 5 buah elemen didalamnya. Indeks = 0 Indeks = 1 Indeks = 2 Indeks = 3 Indeks = 4 Nilai = 10 Nilai = 20 Nilai = 30 Nilai = 40 Nilai = 50 Pada tabel diatas terdapat 2 buah penamaan, indeks dan nilai. Indeks adalah sebuah nilai yang menjadi identitas dari masing – masing elemen data dari sebuah struktur array. Nilai adalah nilai nyata yang tersimpan pada setiap elemen pada indeks tertentu dari sebuah struktur array. Hal yang harus diperhatikan dalam menyimpan data pada elemen array adalah kesamaan tipe data, karena tidak mungkin menyimpan data yang berbeda – beda kedalam sebuah struktur array. Pendeklarasian Array Pendeklarasian array tidak bedanya dengan pendeklarasian variabel biasa, terdapat aturan – aturan penamaan yang sama persis dengan aturan penamaan variabel. Perbedaannya terletak pada : - Saat pendeklarasian array, hendaknya menentukan tipe dari array tersebut. - Saat pendeklarasian array, hendaknya menentukan jumlah dari elemen yang terkandung di dalam struktur array tersebut. Dalam menentukan jumlah elemen dari array hendaknya diperhatikan dengan baik, karena banyaknya elemen array berarti memesan sejumlah tempat di memori komputer. Tipe data array dapat berupa tipe sederhana (integer, char, double, boolean) ataupun tipe terstruktur (record). Contoh : int nilai[10]; Perintah diatas akan memberikan instruksi untuk memesan 10 tempat di memori komputer bertipe integer. Variabel array nilai memiliki indeks mulai dari 0 hingga 9. Contoh lain : char nama[100], double nilai_ujian[100]; Mengakses Elemen Array Setelah struktut array dideklarasikan, tiba saatnya untuk mengakses masing – masing elemen dari struktur array tersebut. Cara pengaksesannya sangat mudah dan hampir sama dengan proses pemberian nilai kepada sebuah variabel. Hanya disini yang harus diperhatikan adalah indeks setiap elemen array, karena kesalahan yang timbul akibat kesalahan pemberian indeks pada array akan mengakibatkan data dikirim pada tempat yang salah. Contoh : Int nilai[5]; // Pendeklarasian Array. // memberi nilai pada indeks ke 0. nilai[0] = 10; nilai[1] = 20; nilai[2] = 30; nilai[3] = 40; nilai[4] = 50; Perintah diatas akan mengisi kelima elemen yang dimiliki oleh array nilai, pemetaan di memory akan menjadi seperti dibawah ini. Indeks = 0 Indeks = 1 Indeks = 2 Indeks = 3 Indeks = 4 Nilai = 10 Nilai = 20 Nilai = 30 Nilai = 40 Nilai = 50 Cara menampilkan array juga sangat mudah, tinggal memilih data pada elemen ke berapa yang ingin ditampilkan. Contoh : Cetak nilai[2] // maka akan menampilkan array pada indeks ke 2. Harap diperhatikan indeks ke 2 berbeda dengan array ke 2. Pada contoh diatas indeks ke 2 berarti nilai = 30, sedangkan array ke 2 berarti nilai = 20. Berikut akan diberikan contoh program untuk mengisi array dan menampilkan array menggunakan logika perulangan. Contoh : Program untuk menginput nilai dari keyboard dan menyimpan ke dalam array kemudian menampilkan hanya apabila nilainya ganjil. #include <stdio.h> void main(){ int nilai[100]; int inputan_nilai; // ini untuk proses meminta input dari keyboard sebanyak 100 kali dan //menyimpan ke dalam array nilai. for (int i = 0; i < 100; i++){ scanf(“%d”,& inputan_nilai); nilai[i] = inputan_nilai; } // ini proses untuk membaca dari array nilai dan melakukan proses seleksi //apakah bilangan ganjil atau bukan. Kalau ganjil, maka ditampilkan ke layar. for (int i = 0 ; i < 100; i++){ if (nilai[i] % 2 == 1) printf(“%d”,&nilai[i]); }} Mengakses Elemen Array Melalui Piranti Masukan Untuk mengakses eleman dari strukut array selain dapat dilakukan dengan menggunakan pemberian nilai melalui sebuah variabel, juga dapat dilakukan dengan menerima inputan langsung dari piranti masukan (keyboard, file ataupun database). Konsep dasar proses pemberian nilai tetap sama dengan apa yang telah dijelaskan pada pembahasan diatas. Notasi / sintaks yang digunakan tiap – tiap bahasa pemrograman tidak sama, dan tergantung dari bahasa pemrograman yang digunakan. Contoh : Program untuk menerima inputan dari keyboard dan langsug disimpan ke dalam struktur array. #include <stdio.h> void main(){ int nilai [10]; for (int i = 0; i < 10; i++){ scanf(“%d”, &nilai[i]); // menginput nilai dari keyboard dan disimpan pada elemn ke i dari array nilai. }} Pada contoh program diatas hanya menunjukkan bahwa array dapat lansung dirujuk dari piranti masukan, pembahasan detil metode yang digunakan diharapkan dapat mempelajari sesuai dengan bahasa pemrograman yang akan digunakan. Melakukan Inisialisasi Array Inisialisasi array berarti mendeklarasikan array sekaligus memberi nilai ke tiap – tiap elemennya. Seperti halnya variabel biasa, struktr array juga dapat melakukannya. Sekali lagi, sintaks / notasi yang digunakan tergantung dari bahasa pemrograman yang digunakan. Dibawah ini akan diberikan contoh melakukan inisialisasi array dalam bahasa Turbo C. Contoh : Program melakjukan inisialisasi array sebanyak 5 elemen dan langsung memberikan nilai ke dalamnya. #include <stdio.h> void main(){ int nilai[] = {10,20,30,40,50}; // melakukan inisialisasi 5 elemen array sekaligus memberi nilai didalamnya. for (int i = 0; i < 5; i++) printf(“%d”,nilai[i]); // mencetak tiap elemen array ke layar. } 4.4.2 Array N Dimensi. Kelebihan struktur data array dibandingkan variabel biasa adalah kemampuan array untuk menyimpan elemen data lebih dari 1 dimensi. Secara teori tidak ada batas maksimum dari jumlah dimensi sebuah struktur array, namun pada impelementasinya sangat jarang sekali ditemukan penggunaan array lebih dari 3 dimensi. Jumlah dimensi pada array menentukan berapa banyak data yang dapat disimpan di dalam array tersebut, semakin banyak jumlah dimensi yang dimiliki maka semakin banyak jumlah data yang dapat disimpan di dalam array tersebut. Pada pembahasan sebelumnya telah kita bahas mengenai pemakaian array 1 dimensi / array tunggal, saat ini akan dijelaskan mengenai array 2 dimensi secara detil. Definisi Array 2 Dimensi Array 2 dimensi memungkinkan tiap elemen dari array untuk menyimpan data juga. Secara fisik memiliki bentuk seperti tabel. Berikut akan diberikan contoh kasus untuk menjelaskan mengenai pemakaian array 2 dimensi. Contoh : Data keseluruhan kelulusan dari jurusan Teknik Informatika, Sistem informasi dan Komputer Akuntansi pada sekolah tinggi komputer dari tahun 1995 – 1998 dirangkum pada tabel dibawah ini. Jurusan 1995 1996 1997 1998 T. Informatika 300 345 279 336 S. Informasi 167 156 180 187 K. Akuntansi 467 465 435 398 Permasalahan diatas tidak dapat diselesaikan menggunakan pendekatan struktur array 1 dimensi, dikarenakan terdapat 2 dimensi penilaian yang digunakan yaitu : Tahun kelulusan dan Jurusan. Kedua elemen data ini harus disimpan terpisan hamun masih tetap terjaga konsistensinya (Tidak menampilkan data yang salah). Menggunakan array 2 dimensi, bentuknya menjadi : Int jumlah_kelulusan[3][4] Pada pendefinisian diatas menyatakan : 3 menyatakan jumlah baris (mewakili Jurusan) 4 menyatakan jumlah kolom (tahun kelulusan) Jurusan 1995 1996 1997 1998 T. Informatika Baris 0 Baris 0 Baris 0 Baris o Kolom 0 Kolom 1 Kolom 2 Kolom 3 Contoh : Jumlah_kelulusan[0][0] = 300 Jumlah_kelulusan[0[[1] = 345 Hal diatas berarti, jumlah kelulusan jurusan Teknik Informatika pada tahun 1995 sebesar 300 dan pada tahun 1996 sebesar 345. Hal lain yang harus diperhatikan adalah indeks awal array bagi sebagian besar bahasa pemrograman selalu berawal dari 0 dan ini berlaku bagi array dengan dimensi tunggal ataupun ganda. Metode untuk memasukkan nilai ke dalam struktur array dimensi 2 sama persis dengan struktur array 1 dimensi. Contoh : Program menginput jumlah kelulusan untuk setiap tahunnya, mulai dari tahun 1995 – 1998 untuk jurusa n Teknik Informatika. #include <stdio.h> void main(){ int jumlah_lulusan[1][4]; // karena hanya satu jurusan dan tahun 1995 – 1998. for (int baris = 0; baris <1;baris++){ for(int kolom = 0; kolom < 4; kolom++){ scanf(“%d”, &jumlah_lulusan[baris][kolom]); }}} Pada contoh program diatas penggunaan 2 logika for (nested looping), saat kita menggunakan struktur array 2 dimensi maka anda harus menggunakan logika perulangan bersarang (perulangan di dalam perulangan). Tabel di bawah ini akan menjelaskan alur logika tersebut. Jurusan 1995 1996 1997 1998 T. Informatika Baris 0 Baris 0 Baris 0 Baris 0 Kolom 0 Kolom 1 Kolom 2 Kolom 3 Baris 1 Baris 1 Baris 1 Baris 1 Kolom 0 Kolom 1 Kolom 2 Kolom 3 S. Informasi for (int baris = 0; baris <1;baris++){ for(int kolom = 0; kolom < 4; kolom++){ scanf(“%d”, &jumlah_lulusan[baris][kolom]); }} Alur logika program dimulai dari perulangan pertama yang akan memeriksa kondisi baris, apakah telah mencapai akhir dari baris (dalam hal ini jurusan). Apabila belum, maka alur logika progam akan masuk kedalam perulangan kedua yang akan memeriksa kondisi kolom apakah telah mencapai akhir kolom (dalam hal ini tahun kelulusan). Apabila belum maka program akan dijalankan, ketiga akhir kolom telah tercapai maka program akan keluar dari perulangan kedua dan kembali memerika perulangan pertama, apabila masih belum mencapai akhir baris (jurusan) maka program akan berjalan terus. 4.4.3 Algoritma Pengurutan Data (Sorting Data) Pengertian dari pengurutan data (sorting) adalah penyusunan urutan data sehingga tersusun berdasarkan kata kunci tertentu dari nilai terkecil ke nilai terbesar (ascending) atau dari nilai terbesar ke nilai terkecil (descending). Pada dasarnya algoritma sorting dibagi menjadi 2 bagian, yaitu : - Algortima Sorting Internal Algoritma sorting internal akan memuat seluruh data ke dalam memori komputer. Penggunaan cara ini apabila seluruh data masih memungkinkan untuk di muat ke dalam memori komputer. - Algoritma Sorting Eksternal Algoritma sorting eksternal tidak memuat seluruh data ke dalam memori komputer, data yang akan diurutkan akan di pecah menjadi beberapa bagian dan akan diurutkan secara terpisah. Setelah pecahan data tadi terurut, barulah data digabung menjadi satu. Data yang akan diurutkan biasanya berbentu record dengan salah satu field yang berfungsi sebagai kata kunci yang nilainya sebagai pembanding dalam mengurutkan data. Pada pembahasan ini kita akan menggunakan nilai dari kunci pengurutan daya dan akan menggunakan metode bubble sort, yang sangat terkenal kesederhanaannya meskipun hanya bisa digunakan untuk pengurutan data yang tidak terlalu besar (internal sorting). Algortima Bubble Sort Algoritma Bubble Sort menggunakan metode membandingkan dua data yang berdekatan. Pertukaran data akan terjadi apabila data ke i lebih besar dari pada data ke i + 1. Algoritma ini akan melakukan beberapa kali putaran sampai data terurut secara keseluruhan. Contoh : Simulasi pengurutan data menggunakan algortima bubble sort dengan tipe menaik (ascending) terhadap 6 buah data dibawah ini b : [0] [1] [2] [3] [4] [5] 70 60 30 50 40 20 Algoritma akan melakukan beberapa putaran dan pada setiap putarannya akan membandingkan data yang ke i dengan data yang ke i + 1, apabila ada data data ke [i] lebih besar makan akan terjadi pertukaran. Berikut simulasi sederhana nya : Putaran Elemen yang dibandingkan Ke 1 [5] vs [4], [4] vs [3], [3] vs [2], [2] vs [1], [1] vs [0] Ke 2 [5] vs [4], [4] vs [3], [3] vs [2], [2] vs [1] Ke 3 [5] vs [4], [4] vs [3], [3] vs [2] Ke 4 [5] vs [4], [4] vs [3] Ke 5 [5] vs [4] Pada putaran tersebut terlihat bahwa putaran dimulai data terakhir / data indeks ke 5, dan perulangan dilakukan dilakukan hingga putaran terakhir dimana data telah terurut secara keseluruhan. Banyaknya putaran yang dilakukan tergantung dari berapa banyak data yang akan diurutkan. Penggunaan operator pembanding tergantung dari jenis pengurutan apa yang diinginkan (menaik atau menurun). Berikut algortima lain yang dapat dilakukan dalam melakukan pengurutan data / sorting : - Algoritma Selection Sort - Algoritma Insertion Sort - Algortima Quick Sort - Algoritma Merge Sort - Algortima Radix Sort dan Heap Sort. 4.4.4 Algoritma Pencarian Data (Searching Data) - Pada suatu data seringkali dibutuhkan pembacaan kembali informasi (retrieval information) dengan cara searching. - Searching adalah pencarian data dengan menelusuri tempat pencarian data tersebut. - Tempat pencarian data tersebut dapat berupa array dalam memori, bias juga pada file pada penyimpanan eskternal. Teknik-teknik Searching 1. Sequential Search Adalah suatu teknik pencarian data dalam array ( 1 dimensi ) yang - akan menelusuri semua elemen-elemen array dari awal sampai akhir, dimana data-data tidak perlu diurutkan terlebih dahulu. - Kemungkinan terbaik (best case) adalah jika data yang dicari terletak di indeks array terdepan (elemen array pertama) sehingga waktu yang dibutuhkan untuk pencarian data sangat sebentar (minimal). - Kemungkinan terburuk (worst case) adalah jika data yang dicari terletak di indeks array terakhir (elemen array terakhir) sehingga waktu yang dibutuhkan untuk pencarian data sangat lama (maksimal). Contoh : Misalkan ada sekumupulan data pada array 1 dimensi seperti dibawah ini : Indeks 0 Indeks 1 Indeks 2 Indeks 3 Indeks 4 Indeks 5 Indeks 6 Indeks 7 8 10 6 -2 11 7 1 100 Program akan mencari data bernilai 6, apabila diketumkan maka akan menuliskan kalimat “ADA” dan kalau tidak maka akan menuliskan kalimat “TIDAK ADA”. # include <stdio.h> # include <conio.h> void main(){ clrscr(); int data[8] = {8,10,6,-2,11,7,1,100}; int cari; int flag=0; printf("masukkan data yang ingin dicari = ");scanf("%d",&cari); for(int i=0;i<8;i++){ if(data[i] == cari) flag=1; } if(flag==1) printf("Data ada!\n"); else printf("Data tidak ada!\n"); } Keterangan / simulasi program diatas adalah : - Program melakukan perulangan untuk megakses satu persatu data pada elemen array. - Program menggunakan sebuah variabel flag yang berguna untuk menadai ada atau tidaknya data yang dicari dalam array data. Hanya bernilai 0 atau 1. Nilai variable flag akan diinisialisasi pada nilai 0. - Apabila data ketemu, maka nilai variable flag akan diberi nilai 1, sedangkan apabila tidak ketemu nilai flag tetap 0. - Program akan mencari seluruh data pada elemen array dengan membandingkan satu persatu. Algortima sequential search merupakan algortima yang paling sederhana dan mudah. Kelemahan algoritma ini terletak pada jumlah data yang terbatas, ketika pencarian data melibatkan data yang sangar besar akan sangat tidak efisien. Karena ada 2 kemungkinan, yaitu : - Data terletak pada indeks paling akhir. Program akan mengulang sampai akhir secara berurutan. - Data yang dicari telah ketemu sejak awal, dan program terus mengulang hingga akhir perulangan. Sebenarnya ini dapat di pecahkan dengan menghentikan program ketika data telah ketemu. 2. Binary Search Teknik pencarian yang akan membagi data menjadi dua pada setiap pengurutan data. Data yang ada harus diurutkan terlebih dahulu berdasarkan urutan tertentu yang dijadikan kunci pencarian. Prinsip pencarian biner adalah : - Data diambil dari posisi 1 sampai posisi akhir N - Kemudian cari posisi data tengah dengan rumus (posisi awal + posisi akhir) / 2 - Kemudian data yang dicari dibandingkan dengan data yang di tengah, apakah sama atau lebih kecil, atau lebih besar. - Jika lebih besar, maka proses pencarian dicari dengan posisi awal adalah posisi tengah + 1 - Jika lebih kecil, maka proses pencarian dicari dengan posisi akhir adalah posisi tengah – 1 - Jika data sama, maka pencarian berakhir. Data ketemu. Contoh : Misalkan program akan mencari data 17 dari sekumpulan data dibawah ini. Idx 0 Idx 1 Idx 2 Idx 3 Idx 4 Idx 5 Idx 6 Idx 7 Idx 8 3 9 11 12 15 17 23 21 35 A B C Karena 17 > 15, maka awal = tengah + 1 Idx 0 Idx 1 Idx 2 Idx 3 Idx 4 Idx 5 Idx 6 Idx 7 Idx 8 3 9 11 12 15 17 23 21 35 A B C Karena 17 < 23 (data tengah), maka: akhir = tengah – 1 Idx 0 Idx 1 Idx 2 Idx 3 Idx 4 Idx 5 Idx 6 Idx 7 Idx 8 3 9 11 12 15 17 23 21 35 A=B=C Karena 17 = 17 (data tengah), maka KETEMU! 3. Interpolation Search Teknik ini dilakukan pada data yang telah terurut berdasarkan kata kunci tertentu. Metode ini menggunakan perkiraan letak data. Misalkan : Apabila kita hendak mencari nama dalam buku telepon yang berinisial T, maka kita tidak akan mencari pada awal dayta melainkan akan langsung mecari dengan membuka pada 2/3 atau ¾ dari buku tersebut. Bisa dikatakan metode ini mencari data relatifd terhadap jumlah data. Rumus relative yang digunakan adalah : Posisi = kunci – data[low] / data[high] – data[low] X (high – low) + low Contoh : Kode Judul Buku Pengarang 025 C++ Programnming Abdul Kadir 063 Java Programming Ben Stiller 088 Visual Basic Programming Kaka Kunci Pencarian ? 088 Low ? 0 High ? 7 Posisi = (088 - 025) / (096 - 025) * (7 - 0) + 0 = [6] Kunci[6] = kunci pencarian, data ditemukan : Visual Basic 2005 Kunci Pencarian ? 060 Low ? 0 High ? 7 Posisi = (060 – 025) / (096 – 025) * (7 – 0) + 0 = [3] Kunci[3] < kunci pencarian, maka teruskan Low = 3 + 1 = 4 High = 7 Ternyata Kunci[4] adalah 063 yang lebih besar daripada 060. Berarti tidak ada kunci 060. Contoh programnya : int interpolationsearch(int key,int n){ int low,high,pos,i; low=0; high=n-1; do{ pos = (key – data[low]) * (high – low) / data[high] – data[low] + low; if (data[pos] == key] return pos; if (data[pos] > key) high = pos-1; else if (data[pos] < key) low = pos + 1; } while(key >= data[low] && key <= data[high]); return -1 } 4.5 Pengelolaan File File digunakan sebagai media penyimpanan data eksternal selain memori, media penyimpanan ini bersifat non – volatile dan biasanya memiliki ukuran besar untuk dapat dibaca kembali. Operasi yang biasa dilakukan terhadap sebuah file adalah : menulis, membaca, memeriksa keberadaan file, mengetahui status file, ukuran file dan lain sebagainya. Setiap operasi untuk mengolah file pasti memerlukan buffer untuk menampung sementara informasi dari file tersebut. File Stream Stream adalah kumpulan karakter yang disusun dalam baris-baris yang berpindah dari satu media ke media lain pada sistem komputer. Semua data masukan dan keluaran pasti berupa stream. Pada bahasa pemrograman C memperlakukan file sebagai stream, berikut terdapat 3 jenis stream yang otomatis dijalankan dan masing – masing berasosiasi dengan sebuah file. - Standar input stream, yang mengatur aliran masukan data melalui keyboard. - Standard output stream, yang mengatur aliran data keluaran ke layar monitor - Standard error stream, yang mengatur tampilan kesalahan ke layer monitor Jenis File File dibedakan menjadi 2 bagian berdasarka jenisnya, antara lain : 1. File Teks File teks adalah file yang berisi data – data ASCII sehingga dapat ditampilkan dilayar apa adanya. Satu karakter ASCII dalam teks berukuran 2 bytes. 2. File Biner File biner adalah file yang berisi data – data biner dan berupa byte stream sehingga tidak dapat ditampilkan apa adanya di layar. Satu karakter akan berukuran 1 byte, sedangkan nilai yang bukan karakter akan disimpan sesuai dengan ukuran microprocessor. Ukuran tergantung pada microprocessor dan bukan tergantung pada jumlah digit bilangan. ketentuan Operasi dasar yang biasa dilakukan dalam manajemen file ada 3 bentuk, antara lain : 4.5.1 Membuka File Membuka file merupakan operasi yang paling dasar dalam manajemen file, karena sebuah file harus dalam kondisi terbuka terlebih dahulu agar dapat diakses. Notasi yang digunakan adalah : FILE * fopen(const char *filename, const char *mode) Apabila proses pembukaan file gagal, maka pointer akan mengembalikan nilai null. Parameter yang harus diperhatikan saat membuka file adalah : Modus r Membuka untuk dibaca. Modus w Membuka untuk menulis ( File tidak harus eksis dahulu) Modus a Membuka untuk menambahkan data. Modus r+ Membuka untuk membaca dan menulis. Modus w+ Membuka untuk membaca dan menulis (akan menimpa file) Modus a+ Membuka untuk membaca dan menulis (menambahjan apabila file sudah ada sebelumnya) File dapat dibuka sebagai file teks ataupun biner, aturan yang harus diperhatikan adalah : File teks menggunakan parameter tambahan menjadi rt. Wt, at, r+t, w+t dan a+t. File biner menggunakan parameter tambahan menjadi rb. Wb, ab, r+b, w+b dan a+b. Secara default kompiler akan mengenali sebagai odus teks (t). Notasi algoritmik yang digunakan pada setiap bahasa pemrograman berbeda – beda, dalam pembahasan ini kita akan menggunakan bahasa pemrograman Tubro C untuk membahas manajemen file lebih lanjut. Contoh : FILE *fp; fp=fopen("c:\\test.txt", "r"); if (fp==NULL) printf(“Error, file tidak dapat dibuka!”); Program diatas akan membuka file bernama test.txt dengan modus operasi pembacaan, dan apabila file tidak ditemukan maka akan memberikan nilai kembalian NULL. 4.5.2 Memanipulasi File Berikut adalah beberapa cara / fungsi yang digunakan untuk melakukan manipulasi file (baca atau tulis). Sekali lagi ditekankan bahwa pada setiap bahasa pemrograman memiliki ketentuang yang berbeda – beda. Untuk menulis ke file dalam format tertentu: int fprintf(fp, "Testing...\n"); jika berhasil akan dikembalikan jumlah byte yang dituliskan sedangkan jika gagal dikembalikan EOF Untuk membaca dari file dalam format field tertentu: int fscanf(fp, "Testing...\n"); jika berhasil akan dikembalikan jumlah field yang dibaca sedangkan jika gagal dikembalikan EOF Untuk menulis karakter ke file teks: int fputc( int c, FILE *fp ); jika berhasil akan dikembalikan EOF dikembalikan karakter c sedangkan jika gagal Untuk membaca file teks perkarakter: int fgetc (FILE *fp); jika berhasil akan dikembalikan karakter c sedangkan jika gagal integer w sedangkan jika gagal integer w sedangkan jika gagal dikembalikan EOF Untuk meletakkan nilai integer ke file: int putw(int w, FILE *fp); jika berhasil akan dikembalikan dikembalikan EOF Untuk membaca nilai integer: int getw(FILE *fp); jika berhasil akan dikembalikan dikembalikan EOF Untuk menulis string ke file tanpa ada karakter NULL dan newline: int fputs(const char *s,FILE *fp); jika berhasil akan dikembalikan string s sedangkan jika gagal dikembalikan EOF Untuk membaca string dari file sebanyak n karakter atau bertemu karakter ‘\n’: char *fgets(const char *s,int n,FILE *fp); jika berhasil akan dikembalikan string s sedangkan jika gagal dikembalikan EOF Untuk mengetahui akhir sebuah file stream: int feof(FILE *fp); jika berhasil akan dikembalikan nilai integer selain 0. 4.5.3 Menutup File Operasi file tidak berakhir hanya pada bagaimana memanipulasi file yang telah dibuka, menutup hubungan dengan file yang telah dibuka sebelumnya merupakan hal yang harus diperhatikan. Pada bahasa Turbo C, notasi algoritmik yang digunakan adalah : int fclose(FILE *a_filename); int fcloseall(void); Pada fungsi pertama akan menutup pada file tertentu saja, sedangkan pada fungsi kedua akan menutup seluruh hubungan dengan file yang ada saat itu juga ( kecuali stdin, stdout, stdprn, stdaux ). Apabila proses penutupan file ini berhasil maka akan mengembalikan nilai 0 dan apabila gagal maka akan mengembalikan nilai -1 (EOF). Contoh : FILE *fp; fp=fopen("c:\\test.txt", "r"); if (fp==NULL) printf(“Error, file tidak dapat dibuka!”); fclose(fp); Program diatas akan membuka file bernama test.txt dengan modus operasi membaca dan kemudian langsung menutup hubungan dengan file tersebut. Contoh : Program untuk menulis ke dalam file yang disimpan di hardisk. #include <stdio.h> #include <stdlib.h> void main(){ FILE *fp; if((fp=fopen("C:\\test.txt","w"))==NULL){ // bikin file test.txt di drive C. printf("error!"); exit(1); } fputs("ABCDE\n",fp); // menulis ke dalam file test.txt printf("alamat file : %p\n",fp->buffer); // tampilkan alamat file. printf("ukuran file : %d byte \n",fp->bsize); // ukuran file. printf("posisi file : %p\n",fp->curp); // printf("isi file :"); for(int i=0;i<=4;i++){ printf("%c",*(fp->buffer+i)); // membaca dari buffer sampai habis. } printf("\n") // turun 1 baris.; printf("no pengenal file : %d\n",fp->fd); // identifier file. printf("status file :\n"); if((fp->flags & 1)==1) printf("readonly\n"); if((fp->flags & 2)==2) printf("writeonly\n"); if((fp->flags & 3)==3) printf("read/write\n"); if((fp->flags & 8)==8) printf("file line\n"); if((fp->flags & 16)==16) printf("error\n"); if((fp->flags & 32)==32) printf("akhir file\n"); if((fp->flags & 64)==64) printf("file biner\n"); else printf("file teks\n"); if((fp->flags & 128)==128) printf("data dari file\n"); if((fp->flags & 256)==256) printf("data ke file\n"); if((fp->flags & 512)==512) printf("file ada diterminal\n"); else printf("file di disk"); fclose(fp);} // tutup hubungan ke dalam file DAFTAR PUSTAKA Algoritma dan Pemrograman Dasar. Rinaldi Munir. Buku 1. Penerbit Informatika Bandung. Website: http://www.ilmukomputer.com http://www.ibii.ac.id/pdfs/bubble-sort.pdf http://www.ilkom.unsri.ac.id/dosen/sri/materi http://id.wikipedia.org