BAHAN AJAR ALGORITMA DAN STRUKTUR DATA I (MIK 1251) Oleh : Drs. Janoe Hendarto,M.Kom. Anifuddin Azis, S.Si., M.Kom. Program Studi S1 Ilmu Komputer Jurusan Ilmu Komputer dan Elektronika Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Gadjah Mada 2012 1 BAB I PENGANTAR Pendahuluan Program komputer dibuat berdasarkan langkah-langkah logis untuk menyelesaikan masalah. Lagkah-langkah tersebut ditulis dalam suatu instruksi yang bisa dipahami oleh komputer, kemudian komputer akan menerjemahkan ke dalam bahasa mesin dan mengerjakan langkah-langkah tersebut. Penyajian 1.1 Latar Belakang Pada saat ini kebutuhan data semakin kompleks. Bayangkan: indeks dari 8 milyar halaman ! (Google). Semua program komputer berkaitan dengan data : Sistem Informasi menyimpan data laporan, user, informasi, dsb Game menyimpan data pemain, posisi, skor, dsb Search engine menyimpan data URL, hyperlink, bobot, dsb dsb Pemilihan algoritma juga mempengaruhi waktu eksekusi oleh komputer, sebagai contoh : Contoh kasus sederhana : Dimisalkan ada 3.000 file teks dengan rata-rata 20 baris tiap file teks-nya. Dimana tiap baris mengandung 10 kata. Jadi akan ada 600.000 kata. Tentukan jumlah kata “bandung”. Jika dimisalkan dibutuhkan waktu 1 detik untuk mencek sebuah kata sama dengan “bandung”. Solusi 1: menggunakan sequential matching, membutuhkan waktu 1 detik x 600.000 kata = 166 jam Solusi 2 : Binary searching : log 2 600000 = 19 detik vs 166 jam! 1.2 Algoritma dan Struktur Data Algoritma adalah urutan logis pengambilan putusan untuk pemecahan masalah. Algoritma memiliki lima ciri penting : 1. Algoritma harus berhenti setelah mengerjakan sejumlah langkah terbatas. 2 2. Setiap langkah harus didefinisikan dengan tepat dan tidak berarti – dua (ambigu). 3. Algoritma memiliki nol atau lebih masukan. 4. Algoritma memiliki satu atau lebih keluaran. 5. Algoritma harus efektif. Struktur data: cara merepresentasikan data agar efisien dalam penyimpanan dan pengolahannya. Struktur data seharusnya diterapkan pada algoritma yang didesain secara efisien Jadi mata kuliah Algoritma & Struktur Data adalah suatu disiplin ilmu yang mempelajari bagaimana merepresentasikan data secara efisien dan desain pengolahannya secara efisien. Roadmap belajar algoritma dan pemrograman seperti pada Gambar 1.1 berikut. Gambar 1.1 Roadmap belajar pemrograman 1.3 Komponen Komputer Komputer merupakan suatu alat untuk membaca, memanipulasi, dan menyajikan data. Pada masa lalu, penggunaan komputer masih sangat terbatas, yaitu pada masa 3 instansi pemerintah maupun perusahaan yang relatif besar. Dengan dikenalkannya komputer personal memberikan dampak makin mudahnya orang dalam mendapatkan dan memanfaatkan komputer, bahkan untuk keperluan di rumah. Terdapat berbagai macam komputer dilihat dari ukuran fisik maupun kemampuan. Kemampuan komputer umumnya bergantung pada jumlah pekerjaan yang dapat ditangani dalam satu satuan waktu. Komputer yang berkemampuan besar – umumnya dengan harga yang relatif mahal, mampu melakukan banyak operasi secara simultan. Pada dasarnya, suatu komputer terdiri atas komponen-komponen sebagaimana diperlihatkan pada Gambar 1.2 berikut: Unit pemroses pusat Unit kontrol Peralatan masukan Internal storage atau Memory Peralatan keluaran Arithmetic Logical Unit (ALU) Aliran data atau program Fungsi kontrol Gambar 1.2 Komponen dasar komputer Semua data dan program yang akan diproses oleh komputer, pertama kali dimasukkan ke dalam memory komputer melalui peralatan masukan (Input Devices). Unit kontrok (Control Unit) akan menterjemahkan program yang ada di memory dan digunakan untuk mengontrol atau mengkoordinasikan operasi dari semua komponen komputer. Data dalam memory dimanipulasi dengan menggunakan Arithmetic Logic Unit (ALU), dan hasilnya disimpan kembali ke dalam media penyimpanan dengan menggunakan peralatan keluaran (Output Devices). 4 1.4 Program dan Bahasa Pemrograman Komputer merupakan alat yang mempunyai keunggulan dalam kecepatan proses dan melakukan perhitungan yang komplek. Komputer mampu menyimpan data dalam ukuran besar, melakukan manipulasi dan menghasilkan informasi sebagai hasil keluarannya. Masalahnya ialah bahwa komputer tidaklah dapat melaksanakan itu semua tanpa mendapatkan instruksi atau perintah mengenai apa yang harus dikerjakan, yaitu yang disebut dengan program. Program ditulis secara terinci, sistematis, logis, dapat dimengerti / dipahami dan dapat dilaksanakan oleh komputer. Baris program disebut dengan pernyataan (statement), dan masing-masing pernyataan mengerjakan tugas tertentu. Dengan program akan dapat dilakukan kontrol langkah-langkah yang harus dikerjakan komputer. Proses pembuatan program komputer sampai diperolehnya hasil yang dikehendaki disebut dengan pemrograman komputer, dan dilaksanakan oleh pemrogram (programmer). Bahasa yang digunakan sebagai komunikasi diantara orang dengan komputer (untuk penulisan program) disebut bahasa pemrograman. Bahasa pemrograman mencakup notasi, simbol, pernyataan, tata bahasa, dan lain-lain aspek bahasa. Penulisan program harus memenuhi aturan sintak (syntatic rule) dari bahasa pemrograman. Perbedaan mendasar diantara bahasa pemrograman dengan bahasa seharihari yang digunakan manusia ialah bahwa bahasa pemrograman digunakan sangat tepat dan tidak ada pengecualian atau arti ganda (ambiguities). Masalahnya ialah karena komputer tidaklah dapat berfikir dan menimbang-nimbang sebagaimana dapat dilakukan oleh manusia. Komputer hanya akan mengikuti perintah persis sebagaimana yang diberikan. Komputer tidak dapat menafsirkan perintah untuk memehami apa yang diinginkan oleh pembuat program. Sehingga kesalahan dalam penulisan akan mengubah maksud dari suatu program dan menyebabkan komputer mengerjakan aksi yang salah. Dilihat kedekatannya kepada “bahasa manusia”, maka bahasa pemrograman dikelompokkan menjadi dua, yaitu: 1. Bahasa pemrograman tingkat rendah 5 Bahasa pemrograman tingkat rendah merupakan “bahasa ibu” dari komputer, yaitu bahasa yang tidak memerlukan penterjemah untuk dapat dipahami dan dimengerti oleh komputer. Atau dengan kata lain untuk berkomunikasi secara langsung dengan komputer orang perlu menggunakan bahasa tingkat rendah. Contoh dari bahasa pemrograman tingkat rendah ialah bahasa mesin (machine language). Setiap perintah dalam bahasa mesin berupa kode numerik (menggunakan angka 0 dan 1). Demikian juga data disajikan dengan menggunakan kode numerik. Bentuk pengkodean numerik tersebut berbeda antara satu kmputer dengan komputer yang lain. Hal ini menyebabkan penggunaan bahasa mesin kurang praktis dan susah untuk digunakan atau diingat karena tidak sesuai dengan bahasa sehari-hari. 2. Bahasa pemrograman tingkat tinggi Dengan kekurangan dari bahasa tingkat rendah sebagaimana telah dijelaskan, kemudian dikembangkan bahasa pemrograman yang lain dan diantaranya ialah bahasa pemrograman tingkat tinggi. Bahasa pemrograman tingkat tinggi mempunyai ciri-ciri sebagai berikut: a. Penulisannya mirip dengan bahasa sehari-hari (bahasa Inggris) b. Tergantugn pada mesin komputer yang digunakan c. Bahasa pemrograman tingkat tinggi disebut juga dengan bahasa generasi ketiga. Program yang ditulis dengan bahasa pemrograman tingkat tinggi tidak dapat langsung dimengerti oleh komputer, dan harus diterjemahkan dahulu oleh sebuah “penerjemah” ke dalam bahasa mesin untuk dapat dilaksanakan atau dieksekusi oleh Unit Pemroses Pusat. Terdapat banyak sekali bahasa pemrograman tingkat tinggi yang telah dikembangkan. Diantaranya bahasa pemrograman tersebut yang banyak digunakan antara lain: 1. BASIC (Beginer All-purpose Symbolic Instruction Code) Mudah dipelajari, khususnya untuk pemula Cukup popular pada awal pemakaian komputer personal 2. Cobol (Common Business Oriented Language) Untuk aplikasi bisnis / administrasi Banyak digunakan di bidang pebankan Dapat digunakan untuk aplikasi ilmiah tapi dengan kemampuan terbatas 3. FORTRAN (Formula Translator) 6 Untuk komputasi ilmiah Populer dan banyak digunakan 4. Pascal Merupakan pemrograman terstruktur / sistematik Digunakan untuk aplikasi ilmiah maupun bisnis / administrasi 5. C Merupakan bahasa modular, sehingga efisien Kode dari bahasa ini padat, sehingga mengurangi waktu kompilasi Dilihat dari terapannya, Cobol dan Fortran merupakan bahasa pemrograman bertujuan khusus. Cobol untuk terapan di bidang bisnis dan administrasi sedangkan Fortran untuk terapan ilmiah. Pascal dan C merupakan bahasa pemrograman bertujuan umum, karena dapat digunakan untuk berbagai apliaksi. Dalam kenyataannya pengelompokkan tersebut tidak terlalu ketat digunakan. Bahasa pemrograman terus digunakan, mengikuti perkembangan perangkat keras dan kebutuhan aplikasi. Sebagai contoh untuk bahasa generasi kelima digunakan untuk super komputer, dan digunakan antara lain untuk bidang kecerdasan buatan dan sistem pakar. Bahasa pemrograman yang termasuk generasi kelima menghasilkan programprogram yang bersifat bahasa alamiah (natural language) dan menggunakan pengetahuan (knowledge) sebagai basis pengolahan. 1.5 Penerjemah Bahasa Pemrograman Sebagaimana telah dijelaskan sebelumnya, instruksi atau program yang telah ditulis dengan bahasa pemrograman tingkat tinggi perlu diterjemahkan dahulu ke dalam bahasa mesin untuk dapat dieksekusi oleh komputer. Kompiler (compiler), merupakan program yang menerjemahkan program yang ditulis di dalam bahasa pemrograman tingkat tinggi me suatu himpunan instruksi mesin spesifik yang disimpan dalam bentuk file. Selain kompiler terdapat program penterjemah yang lain ialah interpreter. Interpreter digunakan untuk menerjemahkan program yang ditulis dalam bahasa tingkat tinggi ke dalam bahasa mesin, dan menjalankannya baris demi baris. Perbedaan antara kompiler dan interpreter antara lain adalah seperti pada Tabel 1.1 berikut : 7 Tabel 1.1 Perbedaan kompiler dan interpreter. Kompiler Interpreter - Menerjemahkan program sebelum - Menerjemahkan program pada dijalankan dijalankan - Penerjemahan bersifat tetap - Penerjemahan bersifat sementara - Kesalahan penulisan diketahui setelah - Kesalahan proses kompilasi penulisan langsung diberitahukan - Perbaikan program dilakukan dengan - Perbaikan kembali ke pengedit teks program program dapat langsung dilaksanakan Sehubungan dengan perbedaan di atas, maka pelaksanaan program dengan menggunakan interpreter maupun dengan kompiler dapat digambarkan pada Gambar 1.3 berikut: Program sumber Baca satu pernyataan Terjemahkan ke bahasa mesin Laksanakan pernyataan a) Dengan interpreter Program sumber saat Terjemahkan seluruhnya Program dalam bahasa mesin lengkap Laksanakan program lengkap b) Dengan kompiler Gambar 1.2 Tahapan pelaksanaan program. 1.6 Pemrograman Terstruktur Ide pemrograman terstruktur pertama kali disampaikan oleh Profesor Edsger Djikstra dari Universitas Eidenhower sekitar tahun 1965. Djikstra mengusulkan tidak dipergunakannya pernyataan GOTO yang dapat menyebabkan timbulnya “spaghetti logic”, yang akan menjadikan sulitnya dilakukan perbaikan ataupun pengembangan 8 program. Kemudian HD Millis menanggapi dengan mengemukakan bahwa pemrograman terstruktur tidak hanya dihubungkan dengan tidak digunakannya pernyataan GOTO, akan tetapi juga dengan struktur dari program. Struktur program yang akan menentukan program yang terstruktur menggunakan pernyataan GOTO atau tidak. Prinsip utama dari pemrograman terstruktur ialah bahwa jika suatu proses telah sampai pada suatu titik tertentu, maka proses selanjutnya tidak boleh melompat ke baris sebelumnya, kecuali untuk proses berulang. Pemrograman terstruktur dimaksud untuk mendapatkan program yang didefinikan dengan baik, jelas, mudah dipahami, mudah ditelusuri, dan mudah dimodifikasi. 1.7 Tahapan Penyelesaian Masalah dengan Pemrograman Komputer Langkah-langkah penyelesaian masalah dengan algoritma dan pemrograman adalah sebagai berikut : 1. Identifikasi masalah Contoh : Apa tugas-tugas yang harus dilaksanakan?, misalnya : o Hitung nilai rata-rata mahasiswa yang ditentukan. o Terjemahkan naskah pidato dari bahasa inggris menjadi bahasa indonesia Apa persyaratan performansinya (ketepatan waktu/ruang/ kecepatan ) ? 2. Desain algoritma, meliputi : Deskripsi (cara penulisan): o natural language o pseudo-code o diagram (seperti flowchart) Kriteria algoritma: o Input: nol atau lebih o Output: satu atau lebih o Definisi/terjemahan/interprestasi: jelas, tepat untuk tiap instruksi o Batasan: sebuah algoritma harus berhenti setelah sejumlah langkah, walaupun jumlah langkah boleh banyak tapi harus terbatas Efektifitas: tiap instruksi harus berupa perintah dasar bukan merupakan bentukan dari beberapa perintah 9 3. Analisis Algoritma Space complexity o Berapa banyak space yang dibutuhkan Time complexity o Berapa lama waktu running algoritma 4. Implementasi Pemutusan bahasa pemrograman yang akan digunakan o C, C++, Lisp, Java, Perl, Prolog, assembly, dll. Penulisan koding harus terdokumentasi dengan baik dan jelas. 5. Ujicoba Mengintegrasikan feedback dari user, perbaiki bug, penjaminan kompatibelitas pada berbagai platform 6. Pemeliharaan 10 BAB II NOTASI ALGORITMA DAN CONTOH PENGGUNAANNYA PADA DATA TUNGGAL Pendahuluan Pada bab ini akan dijelaskan 3 notasi algoritma dan contoh penggunaannya pada beberapa algoritma sederhana. Diharapkan mahasiswa dapat menuliskan algoritma untuk suatu penyelesaian masalah. Penyajian 2.1 Notasi Algoritma Notasi algoritma bukan notasi bahasa pemrograman. Ada beberapa notasi yang digunakan dalam penulisan algoritma. 1. Notasi I : menyatakan langkah-langkah algoritma dengan kalimat deskriptif. Algoritma Euclidean Diberikan dua buah bilangan bulat tak negatif m dan n (m>=n). Carilah FPB dari kedua bilangan tersebut. Deskripsi 1. Jika n = 0, maka m adalah jawabannya; stop.Tetapi jika n<>0, lanjutkan ke langkah 2. 2. Bagilah m dengan n, misalkan r adalah sisanya. 3. Ganti nilai m dengan n, dan nilai n dengan r. Ulang kembali ke langkah 1 2.Notasi II :menggunakan diagram alir (flowchart) Flowchart adalah serangkaian bagan-bagan yang menggambarkan alir program. Flowchart atau diagram alir memiliki bagan-bagan yang melambangkan fungsi tertentu. Bagan, nama dan fungsinya seperti yang disajikan pada tabel berikut : Tabel 2.1 Bagan Flowchart BAGAN NAMA FUNGSI TERMINATOR Awal atau akhir program 11 FLOW Arah aliran program PREPARATION inisialisasi/pemberian nilai awal PROCES Proses/pengolahan data INPUT/OUTPUT DATA input/output data SUB PROGRAM sub program DECISION Seleksi atau kondisi ON PAGE Penghubung bagian-bagian CONNECTOR flowchart pada halaman yang sama OFF PAGE Penghubung bagian-bagian CONNECTOR flowchart pada halaman yang berbeda COMMENT Tempat komentar tentang suatu proses Flowchart selalu diawali dan diakhiri oleh bagan terminator. Aliran selalu dari atas ke bawah, satu demi satu langkah. Tidak ada proses yang dikerjakan bersamaan, semua dikerjakan satu persatu. Proses yang dilakukan komputer sebenarnya hanya ada 3 proses: input, proses data dan output. Misal Masalah 1: bagaimana menentukan bahwa suatu bilangan itu adalah bilangan genap atau ganjil? Input : bilangan bulat. 12 Proses : menentukan bilangan ganjil atau genap dengan melakukan pembagian bilangan dengan bilangan 2. Jika sisa pembagian NOL maka bilangan tersebut genap, sebaliknya ganjil. Output : Bilangan Ganjil atau Bilangan Genap Gambaran penyelesaian dengan Flowchart : mulai Masukkan Bilangan Bulat Bilangan dibagi 2 dengan operasi sisa bagi YA Sisa bagi=0 ? Tulis “GENAP” Tidak Tulis “GANJIL” Selesai 13 3. Notasi III : menggunakan pseudo-code Pseudo-code adalah notasi yang menyerupai notasi bahasa pemrograman tingkat tinggi, khususnya Bahasa Pascal dan C. Algoritma Euclidean {Dibaca dua buah bilangan bulat tak negatif m dan n (m>=n). Carilah FPB dari kedua bilangan tersebut.} Deklarasi m,n,r : integer Deskripsi read(m,n) while n<> 0 do r m mod n m n n r endwhile write(m) Contoh algoritma yang lain, misalnya : 1. Menghitung Luas Lingkaran Algoritma LuasLingkaran deklarasi jari2, Luas : real deskripsi read(jari2) Luas314*jari2*jari2 write(Luas) 2. Menghitung selisih waktu Algoritma SelisihWaktu {menghitung selisih waktu antara jam1 : menit 1: detik1 dengan jam2: menit2 : detik2} deklarasi jam1,menit1, detik1,jam2, menit2,detik2 : integer; sisa, tdetik2, tdetik1, selisih,sjam, smenit,sdetik : integer; deskripsi read(jam1,menit1,detik1) read(jam2,menit2,detik2) 14 tdetik1 3600*jam1+60*menit1*detik1 tdetik2 3600*jam2+60*menit2*detik2 selisihtdeti2-tdetik1 sjamselisih div 3600 sisa selisih mod 3600 smenitselisih div 60 sdetikselisih mod 60 write(sjam,smenit,sdetik) Penutup Latihan soal : 1. Tulislah algoritma menentukan bilangan terbesar dari 3 bilangan bulat A, B, C menggunakan notasi bahasa alami. 2. Tulislah algoritma mengurutkan dari kecil ke besar 3 bilangan bulat A, B, C menggunakan notasi diagram alir. 3. Tulislah algoritma menghitung luas segi tiga menggunakan pseudocode. 15 BAB III Pengenalan Tipe Data dan Bahasa Pemrograman C/C++ Pendahuluan Pada bab ini dileaskan tipe data dan operasi baca tulis data, juga dijelaskan struktur pemrograman pada bahasa C/C++. Penyajian 3.1 Tipe Data Tipe data ada dua macam, yaitu : tipe dasar dan tipe bentukan. Tipe dasar adalah tipe data yang dapat langsung dipakai. Tipe bentukan dibentuk oleh tipe dasar atau tipe bentukan lain yang sudah didefinisikan. 3.1.1 Tipe Dasar Yang termasuk dalam tipe dasar adalah : bilangan bulat (integer), logika (boolean), karakter, bilangan riil (float) dan string. Tiga tipe dasar yang pertama disebut tipe ordinal karena setiap nilai konstantanya bisa diubah ke nilai integer. 1. Bilangan Bulat (Integer) Jenis data ini terdiri atas integer positif, integer negatif dan nol. Pada C++ jenis data ini di bagi atas beberapa bagian, seperti pada Tabel 3.1. Tabel 3.1 Tipe data integer Tipe Ukuran format Jangkauan nilai memori (dalam byte) char 1 %d/%i -128..127 unsigned char 1 %u 0..255 INTEGER (int) 2 %d/%i -32768..32767 unsigned int 2 %u 0..65535 LONGINT (long) 4 %ld/%li -2147483648..2147483647 unsigned long 4 %lu 0..4294967295 Operator Integer terdiri atas : + (penjumlahan), 16 - (pengurangan) , * (perkalian), / (pembagian bilangan bulat), % (sisa hasil bagi atau modulo) 2. Logika (Boolean) Tipe data ini mempunyai nilai TRUE atau FALSE. Operator untuk jenis data ini adalah operator logika, yaitu : NOT (!), AND (&&), OR (||) dan XOR (^). 3. Karakter (Char) Yang dimaksud dengan jenis data ini adalah karakter tunggal atau sebuah karakter yang ditulis diantara tanda petik tunggal, seperti misalnya ‘A’,’a’,’!’,’5’ dsb. Dasarnya adalah ASCII CHARACTER SET. Misalnya : 032 pada tabel ASCII CHARACTER SET menunjukkan karakter Blank. 033 ! 048 0 076 L dst Operasi yang dilakukan terhadap tipe karakter adalah operasi perbandingan =, <>, <, >, <=, >=. 4. Bilangan Riil (float) Penulisan untuk jenis data ini selalu menggunakan titik desimal. Nilai konstanta numerik real berkisar dari 1E-38 sampai dengan 1E+38 dengan mantissa yang signifikan sampai dengan 11 digit. E menunjukkan nilai 10 pangkat. Nilai konstanta numerik real menempati memori sebesar 6 byte. Contoh : 123.45 12345. salah, titik desimal tidak boleh dibelakang 12E5 12E+5 17 -12.34 .1234 salah, titik desimal tidak boleh dimuka Pada C++, jenis data ini dibedakan atas beberapa tipe, seperti pada Tabel 3.2. Tabel 3.2 Tipe data float Tipe Ukuran memori Jangkauan nilai Format (dalam byte) FLOAT 4 3.4*(10^-38) … 3.4*(10^+38) %f DOUBLE 8 1.7*(10^-308) – 1.7*(10^+308) %f LONG DOUBLE 10 3.4*(10^-4932) – 1.1*(10^+4932) %lf Operator untuk jenis data ini terdiri atas : + (penjumlahan) , - (pengurangan) , * (perkalian) dan / (pembagian). 5. Tipe String Nilai data string merupakan urut-urutan dari karakter yang terletak di antara tanda petik tunggal. Nilai data string akan menenpati memori sebesar banyaknya karakter stringnya ditambah dengan 1 byte. Contoh : ’Belajar’, ’Pemrograman’, merupakan nilai konstanta string. Operasi terhadap tipe string terdiri dari : a. Operasi Penyambungan Operatornya : +. Digunakan untuk menyambung 2 nilai string. Contoh : ’Belajar’ + ’Pemrograman’ menjadi ’BelajarPemrograman’ b. Operasi Perbandingan 3.1.2 Tipe Bentukan Tipe bentukan adalah tipe yang didefinisikan sendiri oleh pemrogram. Ada dua macam tipe bentukan, yaitu : 1. Tipe dasar yang diberi nama baru Contoh : typedef int bilangan 2. Rekaman (struct) 18 3.2 Nama Nama diberikan kepada peubah (variabel), konstanta, tipe bentukan, nama fungsi, dan nama prosedur. Aturan penamaan : 1. Diawali dengan huruf alfabet. 2. Huruf besar atau kecil dibedakan. 3. Nama tidak boleh mengandung operator aritmatika, operator relasional, tanda baca, spasi. 3.2.1 Variabel. Variabel adalah suatu identifier non-standar yang nilainya tidak tetap atau nilainya merupakan hasil dari suatu proses. (variabel yang dimaksudkan disini sama seperti halnya arti variabel pada aljabar). Bentuk umum deklarasinya adalah : 1. Jika hanya 1 (satu) variabel yang dideklarasikan : Tipe_data identifier; 2. Jika lebih dari 1 (satu) variabel dan masing-masing memiliki tipe data yang sama : Tipe_data id-1, id-2, …., id-3; 3. Jika beberapa variabel yang berbeda tipe datanya : Tipe_data_1 identifier-1; Tipe_data_2 identifier-2; . . . Tipe_data_n identifier-n; Contoh : 1. Int x; 2. Float p,q,r; 3. Char a,b; 4. Boolean m,n; 19 3.3 Nilai Nilai adalah besaran dari tipe data yang sudah didefinisikan. Nilai dapat berupa nilai peubah atau konstanta. 3.3.1 Pengisian Nilai ke Nama Peubah 1. Pengisian nilai secara langsung Pengisian nilai secara langsung adalah memasukkan nilai ke dalam nama peubah langsung di teks program. peubah = konstanta Contoh : N = 10; Atau peubah1=peubah2 Contoh : N=M; 2. Pembacaan Nilai dari Piranti Masukan Dalam bahasa C++ untuk keperluan input (membaca nilai) digunakan identifier standar cin atau scanf. Bentuk umum penulisannya : Cin>>variabel input; Atau scanf(”%kode_tipe_data ”, &variabel_input); Contoh : cin>>A>>B>>C; atau scanf(“%d %d %d”, &A,&B,&C); 3.3.2 Ekspresi Sebuah ekspresi merupakan kumpulan dari operand-operand (seperti : bilangan, konstanta, variabel dll) yang bersama-sama dengan operator membentuk suatu bentuk aljabar dan menyatakan suatu nilai. 20 Ada 2 (dua) jenis ekspresi dalam bahasa C++, yaitu : 1. Ekspresi numerik / aritmatika, yaitu suatu ekspresi yang menghasilkan nilai numerik / aritmatika. 2. Ekspresi Boolean atau ekspresi logika, yaitu suatu ekspresi yang menghasilkan nilai boolean / logika (true/false). Contoh : 1. (b * b – 4 * a * c) / (2*a) / (2 * a) ekspresi numerik, jika a,b dan c adalah bilangan (variabel bernilai numerik). 2. Upah < 1000.0 ekspresi boolean (“upah” adalah suatu variabel bernilai real). 3.3.3 Menuliskan Nilai ke Piranti Keluaran Untuk keperluan keluaran (mencetak keluaran) digunakan identifier standar COUT atau PRINTF. Pada setiap keluaran ada fungsi untuk pindah ke baris baru (new line). Pada COUT ada ENDL, pada PRINTF ada /n Bentuk umum penulisannya : Cout<<variabel_output atau cout<<variabel_output<<endl; Printf(“%kode_tipe_data ”, variabel_output) atau printf(“%d \n”, variabel_output); Contoh: Cout<<”luas lingkaran adalah”<<luas<<endl; Printf(“luas lingkaran adalah %d\n”, luas); 3.4 Struktur program C/C++ Struktur program C++ dapat dikelompokkan menjadi tiga bagian,yaitu : 1. Kepala Program (header) 2. Bagian Deklarasi (pada C++ bisa dimana saja) 3. Bagian Pernyataan 21 //Program LuasLingkaran; #include<iostream> Using namespace std; float jari2, Luas ; int main(){ cout<<”Masukkan jari-jari : ”; cin>>jari2; Luas = 314*jari2*jari2; cout<<”Luas = ”<<Luas<<endl; return 0; } Pada program di atas Program LuasLingkaran merupakan judul program. float jari2, Luas ; merupakan deklarasi, dan selebihnya bagian pernyatan. 3.4.1 Kepala Program (Header) Kepala program pada C++ berisi library yang akan digunakan pada program untuk membangkitkan kata-kata tercadang (reserved word) atau perintah-perintah khusus. Contoh: - #include<stdio.h> o Membangkitkan perintah/kata tercadang seperti scanf, printf, gets, getchar, dll - #include<iostream> o Membangkitkan perintah seperti cin, cout dll - #include<algorithm> o Berfungsi agar kita bisa menggunakan perintas seperti min, max, sort, dsb 3.4.2 Bagian Deklarasi Pada bagian ini dideklarasikan : tipe, variabel, konstanta, prosedur, dan fungsi. 1. Deklarasi tipe Digunakan untuk membuat tipe bentukan atau tipe khusus yang nantinya digunakan dalam deklarasi variabel. Bentuk deklarasi : Typedef pengenal = tipe data; Contoh Typedef bilangan = int; 2. Deklarasi variabel Digunakan untuk mendeklarasikan semua variabel yang dipakai dalam program. Bentuk umum deklarasi : 22 Bentuk umum deklarasinya adalah : 1. Jika hanya 1 (satu) variabel yang dideklarasikan : Tipe_data identifier; 2. Jika lebih dari 1 (satu) variabel dan masing-masing memiliki tipe data yang sama : Tipe_data id-1, id-2, …., id-3; 3. Jika beberapa variabel yang berbeda tipe datanya : Tipe_data_1 identifier-1; Tipe_data_2 identifier-2; . . . Tipe_data_n identifier-n; Contoh : 1. Int x; 2. Float p,q,r; 3. Char a,b; 4. Boolean m,n; 3. Deklarasi konstanta Deklarasi ini untuk mendefinisikan nama yang memiliki nilai tetap. Bagian umum deklarasinya adalah : CONST identifier = nilai; Contoh : CONST phi = 3.14; x= 2; y = ‘S’; 3.4.3 Bagian Pernyataan Bagian pernyataan dalam C++ diawali oleh karakter ”{” dan diakhiri dengan karakter ”}”.Untuk pembuka pada program utama ”int main()” dahulu baru diikuti tanda ”{”. 23 Penutup Latihan soal : 1. Tulislah rumus berikut dalam bahasa C++ : 4 a. V r 3 3 b. m ab b (1 ) 3ac cd 2. Tulislah pernyataan dalam C++ untuk : a. Menampilkan tulisan : ‘Belajar Pemrograman’. b. Meminta pengguna memasukkan namanya. 3. Buatlah program dalam Bahasa C++ untuk menghitung luas dan keliling persegi panjang. 4. Buatlah program dalam Bahasa C++ untuk menghitung jarak 2 titik A( x1, y1) dan B ( x 2, y 2) dengan rumus jarak = d x1 x22 y1 y22 24 BAB IV STRUKTUR RUNTUNAN DAN PERCABANGAN Pendahuluan Pada bab ini dijelaskan struktur pada algoritma/pemrograman. Pada bab ini dijelaskan 2 dari 3 struktur tersebut, yaitu struktur runtunan dan struktur percabangan. Penyajian 4.1 Struktur Runtunan Sebuah runtunan (sequence) terdiri dari satu atau lebih instruksi. Tiap instruksi dikerjakan sesuai dengan urutan penulisannya, yakni sebuah instruksi dilaksanakan setelah instruksi sebelumnya selesai dilaksanakan. Urutan instruksi menentukan keadaan akhir program. Bila urutannya diubah, maka hasil akhirnya mungkin juga berubah. Contoh berikut adalah program menukar dua buah nilai integer A dan B. Misal sebelum penukaran nilai A = 5, nilai B=3. Setelah penukaran, nilai A=3, nilai B=5. //Program Tukar; #include<iostream> Using namespace std; Int A,B, temp; Int main() { Cout<<”Masukkan nilai A : ”; cin>>A; Cout<<”Masukkan nilai B : ”; cin>>B; temp=A; A=B; B= temp; Cout<<”Nilai A sekarang = “<< A; Cout<<”Nilai B sekarang = “<< B; } 25 END. Jika urutan instruksi di atas diubah, maka hasilnya juga berubah. Misal : temp=A; A=B; B= temp; diubah menjadi : temp=A; B= temp; A=B; Silakan dicek sendiri. 4.2 Struktur Percabangan Pada umumnya, masalah yang akan diselesaikan memiliki beberapa alternatif pelaksanaan aksi. Suatu aksi akan dilaksanakan jika persyaratan atau kondisi dipenuhi. Kondisi adalah sesuatu yang bernilai true atau false, disebut kondisi boolean. Contoh kondisi : x>y m == n k mod 4 == 0 !(true) Penentuan kondisi bolean dan aksi yang dilakukan bergantung pada jumlah kasus yang terdapat pada masalah tersebut : satu kasus, dua kasus, atau lebih dari dua kasus. 4.2.1 Satu Kasus Bentuk umum untuk kasus satu kasus : if(kondisi) aksi ; Contoh program dengan satu kasus : 26 //Program BilanganGenap; #include<iostream> Using namespace std; int Bil; int main(){ cout<<”Masukkan bilangan”; cin>>Bil; if(bil mod 2 == 0) Cout<<Bil<<” adalah bilangan genap”; } 4.2.2 Dua Kasus Bentuk umum untuk kasus dua kasus : If(kondisi) aksi1; else aksi 2; Contoh program dengan dua kasus : //Program BilanganGenapGanjil; #include<iostream> Using namespace std; Int Bil; Int main(){ Cout<<”Masukkan bilangan : “; cin>>Bil; if(bil mod 2 == 0) Cout<<Bil<<” adalah bilangan genap”; else Cout<<Bil<<” adalah bilangan ganjil”; } 27 4.2.3 Tiga Kasus atau Lebih Bentuk umum untuk kasus dua kasus : if(kondisi1) aksi1; else if(kondisi2) aksi2 if kondisi3 aksi3 .... else aksiN; Contoh program dengan tiga kasus atau lebih: //Program KonversiNilai; /*Program untuk merubah nilai angka menjadi nilai huruf*/ #include<iostream> Using namespace std; Int Nilai; Int main(){ Cout<<”Masukkan bilangan”; cin>>Nilai>>; If(Nilai>= 80) Cout<<”Nilai =A”<<endl; else {if(Nilai>= 65) Cout<<”Nilai = B”<<endl; else {if(Nilai>= 50) Cout<<”Nilai = C”<<endl; else {if(Nilai>= 35) Cout<<”Nilai = D”<<endl; else Cout<<”Nilai = E”<<endl; } } } } 28 4.2.4 Struktur Switch Untuk masalah dengan tiga kasus atau lebih, struktur Switch dapat menyederhanakan penulisan If--Else yang bertingkat-tingkat seperti contoh di atas. Struktur Switch sebagai berikut : Switch (nama_variabel) { nilai1 : aksi1; break; nilai2 : aksi2; break; ... nilaiN : aksiN; break; default: aksiN1; } Contoh program KonversiNilai menggunakan struktur Switch : //Program KonversiNilai; //Program untuk merubah nilai angka menjadi nilai huruf #include<iostream> Using namespace std; Int NilaiAngka; Int main() { Cin<<” Masukkan bilangan”; cin>>NilaiAngka; switch (NilaiAngka/10){ case 10 : case 9 : cout<<“Nilai = A”; break; case 8 : case 7 : cout<<“Nilai = B”; break; case 6 : case 5 : cout<<“Nilai = C”; break; case 4 : case 3 : cout<<“Nilai = D”; break; 29 case 2 : case 1 : case 0 : cout<<“Nilai = E”; break; Default: Cout<<” Masukkan nilai salah”;} } Nilai bisa berupa nilai tunggal atau beberapa nilai yang disebutkan satu per satu. Penutup Latihan soal : 1. Buatlah program yang membaca waktu tempuh dalam jam-menit-detik, kemudian mengubahnya dalam detik. 2. Buatlah program yang mebaca waktu dalam detik, kemudian mengubahnya dalam jam-menit-detik. 3. Dibaca dua buah waktu J1 (jam1-menit1-detik1) dan J2 (jam2-menit2-detik2). Buatlah program menghitung selisih waktu dari dari J1 ke J2 (selisih jam-selisih menit-selisih detik). 4. Buatlah program menukar dua nilai A dan B tanpa menggunakan variabel bantu temp. 5. Buatlah program menampilkan jumlah hari dalam satu bulan. Masukan program ini adalah nomor bulan dan tahun. Misalkan bulan 3 tahun 2010, maka program akan menampilkan 31. 6. Buatlah program untuk membaca tiga bilangan bulat A, B, C, lalu mengurutkannya dari yang kecil ke besar. 7. Buatlah program untuk menghitung total pendapatan dengan ketentuan : Total pendapatan = Gaji Pokok + Uang Lembur Berikut tabel gaji pokok dan lembur per jam berdasarkan golongan : Golongan Gaji Pokok Lembur per jam I 1000000 10000 II 2000000 20000 III 3000000 30000 Uang lembur diberikan jika jam kerja melebihi 50 jam. 30 BAB V STRUKTUR PENGULANGAN Pendahuluan Dalam algoritma/pemrograman disediakan struktur pengulangan untuk mengerjakan instruksi yang sama lebih dari satu kali. Dalam bahasa C/C++ terdapat 3 bentuk struktur pengulangan, yaitu : For, While-Do, dan Do-While. Penyajian 5.1 Struktur Pengulangan Struktur pengulangan secara umum : <inisialisasi> awal pengulangan badan pengulangan akhir pengulangan <terminasi> Awal dan akhir pengulangan tergantung pada struktur pengulangan yang digunakan. Terdapat tiga macam struktur pengulangan, yaitu : 1. Struktur FOR 2. Struktur WHILE 3. Struktur DO-WHILE 5.2 Struktur FOR Bentuk umum struktur FOR ada dua macam, yaitu : menaik atau menurun. 1. FOR : For(tipe_data pencacah=nilai_awal; kondisi; <operasi_peubah_pencacah>) aksi; Keterangan : a. Pada C++, Pencacah haruslah dari tipe data numerik, yaitu integer, float, long, dan enumerasi. b. Aksi adalah satu atau lebih instruksi yang diulang. Jika ada lebih dari satu aksi, maka dimulai dengan karakter ”{” dan diakhiri dengan “}” . 31 c. kondisi adalah statement yang sselama bernilai TRUE, aksi akan terus dijalankan. Biasaya kondisi berhubungan dengan pencacah, missal kita ingin terus berulang sampai pencacah bernilai n+1, maka ditulis “pencacah<=n” artinya selama pencacah masih kurang dari n, maka jalankan aksi. d. Pada mulanya, pencacah diinisialisasi dengan nilai awal, kemudian bertambah sesuai fungsi peubah pencacah, kemudian selama kondisi bernilai TRUE, pencacah diubah sesuai operasi pubah pencacah, lalu jalankan aksi, begitu seterusnya sampai dengan kondisi bernilai FALSE. e. tipe data pencacah harus ada jika belum di deklarasikan sebelumnya, namun tidak boleh ada jika sudah pernah di deklarasikan, serta nilai awal wajib. Contoh program menghitung nilai faktorial. //Program HitungFaktorial; #include<iostream> Using namespace std; int i,n; long Faktorial; int min() { cout<<“Nilai faktorial berapa ?”; cin>>n; Faktorial =1; For(i= 1; i<=n; i++) Faktorial =Faktorial * i; cout<<“Nilai faktorial “<<N<<” adalah =”<<Faktorial<<endl; } Contoh program menghitung nilai faktorial untuk for menurun. //Program HitungFaktorial; #include<iostream> Using namespace std; 32 int i,n; long Faktorial; int min() { cout<<“Nilai faktorial berapa ?”; cin>>n; Faktorial =1; For(i=n; i>=1; i--) Faktorial =Faktorial * i; cout<<“Nilai faktorial “<<N<<” adalah =”<<Faktorial<<endl; } . 5.3 Struktur WHILE Bentuk umum struktur WHILE : while kondisi aksi; Aksi akan dilaksanakan berulangkali selama kondisi bernilai true. Contoh program menghitung nilai faktorial : //Program HitungFaktorial; #include<iostream> Using namespace std; int i,n; long Faktorial; int main() { cout<<“Nilai faktorial berapa ?”; cin>>n; Faktorial =1; i=1; While (i<=n) { Faktorial =Faktorial * i; 33 i=i + 1; } cout<<“Nilai faktorial “<<N<<“ adalah =’,Faktorial); end. 5.4 Struktur do-while Bentuk umum struktur do-while : do aksi; while(kondisi); Aksi akan dilaksanakan berulangkali sampai kondisi bernilai false. Contoh program menghitung nilai faktorial : Program HitungFaktorial; #include<iostream> Using namespace std; int i,n; long Faktorial; int main() { cout<<“Nilai faktorial berapa ?”; cin>>n; Faktorial =1; i=1; do Faktorial =Faktorial * i; i=i + 1; while( i <= n); cout<<”Nilai faktorial” <<N<<” adalah = “<<Faktorial<<endl; } 34 Penutup Latihan soal : 1. Terdapat sejumlah N mahasiswa. Setiap mahasiswa memiliki nilai UTS dan UAS antara 0-100. Misalkan untuk merubah nilai angka menjadi nilai huruf mengikuti aturan : - Jika Nilai rata-rata UTS dan UAS >= 80, maka nilainya A. - Jika 80 > Nilai rata-rata UTS dan UAS >= 65, maka nilainya B. - Jika 65 > Nilai rata-rata UTS dan UAS >= 50, maka nilainya C. - Jika 50 > Nilai rata-rata UTS dan UAS >= 35, maka nilainya D. - Jika 35 > Nilai rata-rata UTS dan UAS >= 0, maka nilainya E. Buatlah program untuk membaca nilai UTS dan UAS dari N mahasiswa, kemudian menghitung berapa mahasiswa yang mendapat nilai A, B, C, D, atau E. 2. Buatlah program untuk menampilkan semua solusi bilangan bulat tidak negatif dari persamaan : X + Y + Z = 25 3. Buatlah program mengisi password. Program akan terus meminta masukan password selama kata kunci yang dimasukkan salah. 35 BAB VI TIPE DATA ARRAY Pendahuluan Pada bab ini akan dijelaskan tipe data array dan penggunaannya. Dengan memahami tipe data array, maka mahasiswa dapat membuat program yag berkaitan dengan manipulasi banyak data dengan tipe yang sama, seperti masalah pencaria data atau pengurutan data. Penyajian Array atau larik terdiri atas bagian-bagian komponen yang memiliki tipe data sama. Dalam penyimpanannya array selalu mempunyai jumlah komponen yang tetap yang ditunjukkan oleh indeksnya. 6.1 Deklarasi Array Variabel array dideklarasikan dengan mencantumkan tipe data dan nama variabel yang diikuti dengan nomor indeks yang menyatakan banyaknya lokasi memori yang ingin dibuat. tipe data nama_variabel[indeks] contoh int nilai[100] Pada bahasa C/C++, no indeks dimulai dari 0, jadi pada contoh di atas, indeks dari 0-99, sehingga bisa menampung 100 elemen bertipe integer. 6.2 Mengakses Data larik : Cara mengakses data larik adalah dengan menunjukkan : Nama_Larik[no.indeks] ; Misal : x[1] berarti kita mengakses data larik x pada no.indeks ke-1. Keuntungan : Menggunakan data larik, kita tidak akan kehilangan nilai dari suatu data. Kelemahan : Saat ditentukan suatu variabel bertipe data array maka ia akan langsung mengambil tempat pada memory penyimpanannya sesuai dengan tipe data yang 36 digunakan pada array, baik nantinya semua komponen pada array itu digunakan ataupun tidak. 6.3 Array Dimensi Banyak Dalam pemrograman kadang kita menghadapi masalah saat kita akan mendeklarasikan suatu matriks. Dengan adanya tipe data array maka masalah itu dapat diselesaikan, yaitu dengan menggunakan array dengan dimensi dua atau lebih yang kemudian dikenal dengan array dimensi banyak. Pendeklarasian : tipe data Nama_Array [indeks1][ indeks2] Contoh : int matriks[10][ 10] Berarti matriks itu akan mempunyai dimensi (10x10), namun itu hanya batas atas dari indeks yang dipesan dalam memori penyimpanan (di atas itu tidak akan disimpan), sedangkan apabila nantinya kita hanya memasukkan jumlah baris misal 2 dan jumlah kolom 2 itu boleh saja selama tidak lebih dari 10. Entry-entry dari matriks tersebut dapat kita panggil dengan mengetikkan Nama_Array[indeks] ; dari contoh diatas berarti Matriks[2,3] yaitu entry dari matriks pada baris kedua kolom ketiga. 6.4 Contoh Kasus menggunakan tipe data array 1. Program menghitung nilai maksimum, minimum, rata-rata dari sejumlah data integer. int main () { int i,n,maks,min,jum,h; int nilai[10]; float rerata; cout<<"Banyaknya data ="; cin>>n; jum=0; for (i=1;i<=n;i++) 37 { cout<<"Data ke - " <<i<<"= "; cin>>nilai[i-1]; jum =jum + nilai[i-1]; } rerata= float(jum)/n; maks=nilai[0]; min=nilai[0]; for (i=1;i<=n-1;i++) { if (nilai[i]>maks) maks=nilai[i]; if (nilai[i]<min) min=nilai[i]; } cout<<"Nilai Terbesar ="<<maks<<endl; cout<<"Nilai Terkecil ="<<min<<endl; cout<<"Nilai Rata-rata ="<<rerata<<endl; } 2. Program penjumlahan 2 matriks #include <iostream.h> using namespace std ; int main(){ //deklarasi int matrix_a[3][3],matrix_b[3][3],matrix_c[3][3]; int i,j; char opr; //input nilai matriks ke-1 dari baris dan kolom for(i=1;i<=3;i++){ for(j=1;j<=3;j++){ 38 cout<<"Masukkan matriks(1) nilai baris ke-"<<i<<"kolom ke-"<<j<<" : "; cin>>matrix_a[i-1][j-1]; } cout<<endl; } //output matriks ke-1 for(i=1;i<=3;i++){ for(j=1;j<=3;j++){ cout<<matrix_a[i-1][j-1]<<"\t"; } cout<<endl; } //input nilai matriks ke-2 dari baris dan kolom for(i=1;i<=3;i++){ for(j=1;j<=3;j++){ cout<<"Masukkan matriks(2) nilai baris ke-"<<i<<"kolom ke-"<<j<<" : "; cin>>matrix_b[i-1][j-1]; } cout<<endl; } //output matriks ke-2 cout<<endl; for(i=1;i<=3;i++){ for(j=1;j<=3;j++){ cout<<matrix_b[i-1][j-1]<<"\t"; } cout<<endl; } //Input Operator cout<<"Tulis operator "; cin>>opr; 39 //switching operator for(i=1;i<=3;i++){ for(j=1;j<=3;j++){ switch(opr){ case '+' : matrix_c[i-1][j-1] = matrix_a[i-1][j-1] + matrix_b[i-1][j-1]; break; case ‘-‘ : matrix_d[i-1][j-1] = matrix_a[i-1][j-1] - matrix_b[i-1][j-1]; break; } } } //Output Hasil matriks dari Operator + cout<<endl; for(i=1;i<=3;i++){ for(j=1;j<=3;j++){ cout<<matrix_c[i-1][j-1]<<"\t"; } cout<<endl; } //Output Hasil matriks dari Operator cout<<endl; for(i=1;i<=3;i++){ for(j=1;j<=3;j++){ cout<<matrix_d[i-1][j-1]<<”\t”; } cout<<endl; } } 40 Penutup Latihan soal : 1. Buatlah program untuk menghitung nilai standar deviasi dari sejumlah data nilai ujian (0-100) 2. Buatlah program untuk menampilkan matriks transpose dari suatu matriks. 41 BAB VII TIPE DATA STUKTUR Pendahuluan Pada bab ini akan dijelaskan tipe data struktur dan array dengan elemennya bertipe struktur. Penyajian 7.1 Deklarasi Struktur Struktur adalah sekumpulan variabel yang masing-masing tipe datanya bisa berbeda dan dikelompokkan ke dalam satu nama. Deklarasi : struct nama_struktur{ tipedata namafield1; tipedata namafield2; tipedata namafieldN; } Contoh : struct mhs{ char NIM[5]; char Nama[30]; float IPK; } 7.2 Pembacaan dan Penulisan variabel bertipe Struct Untuk mengaksesvariabel bertipe struct : nama_struktur.namafield Untuk pembacaan nilai : cin>> nama_struktur.namafield Contoh : cin>>mhs.NIM; Untuk penulisan nilai : cout<< nama_struktur.namafield 42 Contoh : cout<<mhs.NIM; 7.3 Array bertipe Struktur Untuk bisa memanipulasi sejumlah data bertipe struktur maka digunakan array dengan elemen bertipe struktur. Contoh : untuk menyimpan 100 data mahsiswa yang setiap data mahasiswa terdiri dari NIM, Nama, dan IPK adalah sebagai berikut : typedef struct mahasiswa { char NIM[5]; char Nama[30]; float IPK; }mhs; mhs data_mhs[100]; 7.4 Contoh Kasus 1. Program membaca dan menampilkan data mahasiswa yang terdiri dari NIM, Nama, dan IPK : #include <iostream.h> #include <conio.h> main () { struct mahasiswa { char nim[5]; char nama[30]; float ipk; }mhs; cout<<"Masukkan NIM : "; cin.getline(mhs.nim,5); cout<<"Masukkan Nama : "; cin.getline(mhs.nama,30); cout<<"Masukkan IPK : "; cin>>mhs.ipk; cout<<"Data mahasiswa yang dimasukkan : "<<endl; 43 cout<<"NNIM Mahasiswa : "<<mhs.nim<<endl; cout<<"Nama Mahasiswa : "<<mhs.nama<<endl; cout<<"IPK Mahasiswa : "<<mhs.ipk; getch(); } 2. Program membaca dan menampilkan sejumlah data mahasiswa, dengan setiap data mahasiswa terdiri dari NIM, Nama, dan IPK : #include <iostream.h> #include <conio.h> main () { int i,n; struct mahasiswa { char nim[5]; char nama[30]; float ipk; }; struct mahasiswa mhs[5]; cout<<"Barapa data mahasiswa ?"; cin>>n; for (i=0;i<n;i++) { cout<<"Mahasiswa ke - "<<i+1<<": "<<endl; cout<<"Masukkan NIM : "; cin>>mhs[i].nim; cin.getline(mhs[i].nama,30); cout<<"Masukkan Nama : "; cin.getline(mhs[i].nama,30); cout<<"Masukkan IPK : "; cin>>mhs[i].ipk; 44 } cout<<"Data mahasiswa yang dimasukkan : "<<endl; for (i=1;i<=n;i++) { cout<<"Mahasiswa ke - "<<i<<": "<<endl; cout<<"NIM : "<<mhs[i-1].nim<<endl; cout<<"Nama : "<<mhs[i-1].nama<<endl; cout<<"IPK : "<<mhs[i-1].ipk<<endl; cout<<endl; } getch(); } Penutup Latihan Soal : 1. Buatlah program menyimpan suatu titik koordinat dalam struktur. 2. Buatlah program menyimpan sejumlah titik koordinat. 3. Buatlah program untuk menyimpan sejumlah bilangan pecah rasional, dan menampilkan bilangan pecahan tersebut yang nilainya paling besar. 45 46 BAB VIII SUB PROGRAM : Fungsi Tanpa Pengembalian Nilai Pendahuluan Dalam bahasa pemrograman prosedural, program bisa terdiri dari beberapa sub program. Dengan membuat sub program, penulisan kode program yang sama berulangkali bisa dihindarkan, juga memudahkan menulis dan menemukan kesalahan program. Dalam Bahasa C++ terdapat sub program berupa fungsi tanpa pengembalian nilai (menggunakan void) dan fungsi yang mengembalikan nilai dengan tipe data tertentu. Sub program ini hanya perlu ditulis sekali, tetapi dapat dipanggil berkali-kali oleh program utama atau sub program lain. Penyajian 8.1 Pendeklarasian Fungsi tanpa pengembalian nilai Bentuk deklarasi fungsi tanpa pengembalian nilai (tanpa parameter) adalah : void NamaFungsi; Bagian_deklarasi; { Bagian pernyataan; } Contoh : void HitungLuasSegitiga(); float alas, tinggi, Luas; { cout<<“Masukkan panjang alas segi tiga :”; cin>>alas; cout<<“Masukkan tinggi segi tiga :”; cin>>tinggi; Luas=(1/2)*alas*tinggi; 47 cout<<“Luas segi tiga = “<<Luas<<endl; } 8.2 Pemanggilan Fungsi tanpa pengembalian nilai Fungsi tanpa pengembalian nilai bukan program yang berdiri sendiri, jadi tidak bisa dieksekusi secara langsung. Fungsi baru dilaksanakan dengan cara memanggil namanya dari program utama atau sub program lain. Ketika nama fungsi dipangil, kendali program secara otomatis akan berpindah ke fungsi tersebut. Instruksi di dalam fungsi dilaksanakan. Setelah semua selesai, kendali program berpindah secara otomatis ke instruksi sesudah pemanggilan tersebut. Contoh program utama untuk memanggil prosedur HitungLuasSegitiga di atas : Int main(){ HitungLuasSegitiga(); } 8.3 Variabel Global dan Lokal Variabel yang dideklarasikan dalam prosedur hanya dikenal di badan sub program tersebut, sehingga disebut variabel Lokal. Sedangkan variabel yang dideklarasikan sebelum program utama(int main()) bersifat Global, karena dikenali di semua bagian program. //Program TukarNilai; #include<iostream> Using namespace std; int A, B; //A,B variabel global void Tukar(); int temp; //temp variabel lokal { temp= A; A= B; B=temp; } Int main() { 48 cout<<“Masukkan nilai A = “<<endl;cin>>A; cout<<“Masukkan nilai B = “<<endl;cin>>B; Tukar(); cout<<“Nilai A sesudah ditukar = “<<A<<endl; cout<<“Nilai B sesudah ditukar = “<<B<<endl; } 8.4 Parameter Kebanyakan program memerlukan pertukaran informasi antara fungsi dengan pemanggilnya. Tiap item data ditransfer antara parameter aktual dan parameter formal yang bersesuaian. Parameter aktual adalah parameter yang disertakan waktu pemanggilan, sedangkan parameter formal adalah parameter yang dideklarasikan di dalam bagian Nama Fungsi. Berdasarkan maksud penggunaannya, terdapat tiga jenis parameter formal yang disertakan di dalam fungsi tanpa pengembalian nilai : 1. parameter masukan 2. parameter keluaran 3. parameter masukan/keluaran Parameter masukan adalah parameter yang nilainya berlaku sebagai masukan untuk prosedur. Pada bahasa pemrograman seperti C++, parameter masukan dinamakan parameter by value. Parameter keluaran adalah parameter yang menampung keluaran yang dihasilkan oleh prosedur. Pada bahasa pemrograman seperti C++, parameter keluaran dinamakan parameter by reference. Parameter masukan/keluaran adalah parameter yang berlaku sebagai masukan sekaligus keluaran bagi prosedur tersebut. Pada bahasa pemrograman seperti C++, parameter masukan/keluaran termask dalam parameter by reference. Pada C++, parameter formal by value tidak menggunakan karakter "&" dalam deklarasinya, sedangkan parameter by reference menggunakannya, tepat sebelum nama 49 variabel. Bisa juga menggunakan tanda ‘*’ di depan nama parameter formal dan pada saat pemanggilan, di depan parameter aktual diberi tanda ‘&’. 1. Parameter Masukan (By value) Contoh program menggunakan parameter masukan dalam deklarasi fungsi tanpa pengembalian nilai: //Program SegitigaKarakter; #include<iostream> Using namespace std; int M; char K; void CetakSegitiga(char C; int N); { for(int i=1; i<=n; i++) { for(int j=1; j<=i; j++) cout<<C; cout<<endl; } } Int main() { cout<<“Masukkan karakter yang akan dicetak <<endl; cin>>K; cout<<“Masukkan tinggi segi tiga :”; cin>>M; CetakSegitiga(K,M); } 2. Parameter Keluaran (By reference) Bila fungsi tanpa pengembalian nilai menghasilkan satu atau lebih nilai yang digunakan oleh program pemanggil, maka nilai keluaran ditampung di dalam parameter 50 keluaran. Bila fungsi tanpa pengembalian nilai yang mengandung parameter keluaran dipanggil, maka nama parameter aktual secara semu menggantikan nama parameter formal (berlawanan dengan parameter masukan, yang dalam hal ini, nilai parameter aktual yang di assign ke dalam parameter formal). Berikut contoh perbedaan parameter masukan dan keluran : //Program ABC; #include<iostream> Using namespace std; int A, B, C; Void XYZ(int X,Y; int &Z); //X dan Y parameter masukan, Z parameter keluaran} { X= X + 1; Y= Y + 1; Z = X + Y; } Int main() { A= 2; B= 5; XYZ(A,B,C); {Pemanggilan prosedur XYZ} Cout<<A<<“ “<< B<<“ “<<C); //Menampilkan nilai A, B, dan C setelah pemanggilan prosedur } Pada Program ABC di atas, X dan Y adalah parameter masukan, sedangkan Z adalah parameter keluaran. Ketika Prosedur XYZ dipanggil dengan parameter aktual A=2 dan B=5, maka nilai itu mengisi nilai parameter formal X dan Y. Sedangkan nama parameter aktual C secara semu menggantikan nama parameter formal C (bukan nilainya 51 yang diisikan). Sehingga setelah pemanggilan, nilai variabel A dan B tetap, yaitu A=2 dan B =5. Sedangkan nilai variabel C berubah menjadi 9. 3. Parameter Masukan/Keluaran (By reference) Parameter masukan/keluaran berfungsi sebagai masukan untuk prosedur sekaligus menampung nilai keluaran prosedur. Sehingga bila keluarannya berbeda dengan masukannya, maka hasilnya mengikuti nilai keluarannya. Contoh Program TukarNilai berikut : 2 nilai integer A dan B merupakan parameter formal Prosedur Tukar. Setelah instruksi di dalam prosedur dilaksanakan, maka nilai keluaran A dan B berubah. Karena A dan B adalah parameter masukan/keluaran, maka nilai parameter aktual pemanggilnya juga berubah sesuai nilai keluaran yang dihasilkan prosedur. Program TukarNilai; #include<iostream> Using namespace std; Var X, Y : integer; Void Tukar (int &A; int &B); int temp; { temp = A; A = B; B=temp; } Int main() { X= 2; Y= 5; Tukar (X,Y); cout<<“Nilai X setelah ditukar = “<<X<<endl; cout<<“Nilai Y setelah ditukar = “<<Y<<endl; } 52 Penutup Latihan Soal : 1. Buatlah prosedur mencari bilangan terbesar dari 3 bilangan integer A, B, dan C. 2.Buatlah prosedur menghitung nilai rata-rata dari N buah bilangan. 53 BAB IX FUNGSI DENGAN PENGEMBALIAN NILAI Pendahuluan Pada bab ini akan dijelaskan sub program yag kedua, yaitu fungsi yang mengembalikan nilai. Penyajian 9.1 Definisi Fungsi Fungsi adalah sub program yang memberikan/mengembalikan sebuah nilai dari tipe tertentu. Sebagaimana halnya prosedur, fungsi diakses dengan memanggil namanya. Selain itu, fungsi juga dapat mengandung daftar parameter formal. Parameter formal pada fungsi selalu berupa parameter masukan, karena parameter pada fungsi merupakan masukan yang digunakan oleh fungsi tersebut untuk menghasilkan nilai. 9.2 Pendeklarasian Fungsi Deklarasi fungsi adalah : Tipe_data NamaFungsi(daftar parameter masukan):; bagian deklarasi { Bagian Pernyataan; Return nilai_fungsi; } 9.3 Pemanggilan Fungsi Fungsi diakses dengan cara memanggil namanya dari program utama atau sub program lain, diikuti dengan daftar parameter aktual (jika ada). Karena fungsi menghasilkan nilai, maka nilai tersebut dapat ditampung dalam suatu variabel (peubah) yang bertipe sama dengan tipe fungsi. (i). peubah = NamaFungsi(daftar parameter aktual); atau dimanipulasi langsung seperti : 54 (ii) Cin>>NamaFungsi(daftar parameter aktual); (iii) if NamaFungsi(daftar parameter aktual) > 0 .... (iv) y = 2* NamaFungsi(daftar parameter aktual) +3; Contoh 1 : //Program Terbesar #include<iostream> Using namespace std; int A,B,C,D,Z; int Maks(int X,Y) { Int temp; if(X > Y) temp= X; else temp = Y; Return temp; } Int main() { A = 3; B = 6; C= 10; D = 8; cout<<“Bilangan terbesar antara “<<A<<“ dan “<< B<<“ adalah “<<Maks(A,B); Z= Maks(C,D); cout<<“Bilangan terbesar antara “<<C<<“ dan “<<D<<“ adalah “<< Z; cout<<“Yang terbesar antara “<< A<<“ “<<B<<“ “<<C<<“ dan “<<D; If(Maks(A,B) > Maks(C,D)) cout<<“ adalah = “<< Maks(A,B)); cout<<“ adalah = “<< Maks(C,D)); } Contoh 2 : 55 //Program menghitung nilai factorial #include<iostream.h> #include<conio.h> int faktorial(int bil) { int i,f; f=1; for (i=1;i<=bil;i++) { f=f*i; } return f; } main() { int f1,b; cout<<" Pakai fungsi biasa : "<<endl; cout<<"bilangan = "; cin>>b; f1=faktorial(b); cout<<f1<<endl; getch(); } Penutup Latihan Soal : 1. Buatlah fungsi yang menerima masukan 2 titik A( x1, y1) dan B ( x 2, y 2) dan menghitung jarak kedua titik tersebut dengan rumus jarak = d x1 x22 y1 y22 2. Buatlah fungsi untuk mengembalikan nilai mutlak X. 56 BAB X REKURSI Pendahuluan Pada bab ini dijelaskan konsep rekursi dan contoh penggunaannya. Penyajian Suatu subprogram tidak hanya bisa memanggil sub program lain, tetapi juga bisa memanggil dirinya sendiri. Cara ini dikenal dengan sebutan rekursi. Rekursi banyak dipakai pada persoalan yang dapat dipecahkan secara induktif. Misalnya untuk menghitung faktorial. 1, m! 1x 2 x3 x 4....xm jika m 0 jika m 0 Pemecahan secara rekursif : 0!=1 (penghentian rekursi) jika m > 0, m ! = m x (m-1) ! (langkah induksi) 10.1 Fungsi Rekursif Fungsi yang memanggil dirinya sendiri disebut fungsi rekursif. Contoh fungsi rekursif untuk menghitung faktorial. long FaktorialR(int m); { If(m = 0) return (1); else return (m*FaktorialR(m-1)); } 57 10.2 Subprogram Rekursif Rekursi juga bisa diterapkan pada prosedur. Berikut contoh prosedur Balik : Void Balik(int X); Int Sisa; { Cout<<(X %10)<<endl; Sisa = X/10; If (Sisa != 0) Balik(Sisa); } Jika prosedur di atas dipanggil dengan Balik(1024) apa hasilnya ? Penutup Latihan Soal : 1. Lihat kembali Algoritma Euclidean untuk menghitung nilai FPB. Buatlah prosedur untuk menghitung nilai FPB berdasarlan Algoritma Euclidean, secara rekursif. 2. Buatlah fungsi rekursif dan non rekursif untuk menghitung nilai XN, dngan X bilangan riil dan N bilangan bulat. 58 BAB XI ALGORITMA PENGURUTAN DATA ( SORTING ) Pendahuluan Pada bab ini dijelaskan beberapa algoritma pengurutan data (sorting), yaitu : bubble sort, selection sort, dan insertion sort. Penyajian Pengurutan atau sorting merupakan proses untuk menyusun kembali kumpulan entrientri yang telah dimasukkan dengan suatu aturan tertentu. Secara umum ada 2 macam pengurutan yaitu pengurutan secara menaik (ascenden) dan pengurutan secara menurun (descenden). Metode-metode pengurutan data : 11.1 METODE SELEKSI (SELECTION SORT) Masukkan dinyatakan sebagai larik misal larik A (belum terurut), dan N (misal banyak elemen yang akan diurutkan). Keluaran adalah larik A yang telah terurut. Algoritma metode seleksi : - langkah 0 : Baca larik yang akan diurutkan (dalam program utama) - langkah 1 : Kerjakan langkah 2 sampai 4 untuk i = 1 sampai N -1 - langkah 2 : Tentukan awal = i , kerjakan langkah 3 untuk j = i +1 sampai N - langkah 3 : (Mencari data terkecil) Tes : apakah A[awal] > A[j], jika ya maka ubah awal = j - langkah 4 : Tukarkan nilai A[awal] dengan A[i] - langkah 5 : selesai Algoritma Selection sort : for(int i=1;i<=n-1;i++) { terkecil = i; for (j = i; j<= n-1; j++) { if (A[terkecil] > A[j]) { 59 terkecil =j; } } t=A[i];A[i]=A[terkecil];A[terkecil]=t } } 11.2 METODE GELEMBUNG (BUBLE SORT) Disebut juga dengan metode Penukaran (Exchange Sort), yaitu metoda yang mendasarkan pada penukaran elemen untuk mencapai keadaan urut yang diinginkan. Algoritma Metode gelembung : - langkah 0 : Baca vector yang akan diurutkan (dalam program utama) - langkah 1 : Kerjakan langkah 2 untuk i = 1 sampai N-1 - langkah 2 : Kerjakan langkah 3 untuk j = 1 sampai N- i - langkah 3 : Tes apakah A[j] > A[j +1] ? Jika ya, tukarkan nilai kedua elemen ini - langkah 4 : Selesai //bubblesort for(int i=1;i<=n-1;i++) for (int j=1;j<=n-i;j++) { if (A[j] > A[j+1]) { t=A[j];A[j]=A[j+1];A[j+1]=t; } } 11.3 METODE SISIP LANGSUNG (STRAIGHT INSERTION) Pada metode ini elemen terbagi menjadi 2 bagian yaitu kelompok sumber yang merupakan susunan asli dari kelompok tersebut (belum terurut) yaitu dari A1…..AN dan kelompok yang kedua adalah kelompok tujuan yaitu susunan elemen yang telah terurut dengan urutan dari A1….Ai -1. Langkah penyisipan dimulai dari i = 2 dengan 60 pertambahan 1. Elemen ke i diambil dari kelompok sumber dan akan dipindahkan ke kelompok tujuan dengan cara menyisipkannya pada tempatnya yang sesuai. Algoritma metode sisip langsung : - langkah 0 : Baca larik yang akan diurutkan (dalam program utama) - langkah 1 : Kerjakan langkah 2 sampai 5 untuk i = 2 sampai dengan N - langkah 2 : Tentukan : T = A[i] (elemen yang akan disisipkan), A[0] = T (data sentinel) dan j = i -1. - langkah 3 : (lakukan pergeseran). Kerjakan langkah 4 selama T < A[j] - langkah 4 : Tentukan : A[j + 1] = A[j] dan j = j -1. - langkah 5 : Tentukan : A[j + 1] = T - langkah 6 : Selesai for(int i=1;i<=n;i++){ j=i-1;s=A[i]; while (j>0 && A[j]>s) { A[j+1]=A[j]; j--; } A[j+1]=s; } Penutup Latihan Soal : 1. Buatlah program untuk mengurutkan sejumlah bilangan pecah rasional. 2. Sejumlah data mahasiswa yang setiap data terdiri dari NIM, Nama, dan IPK. Buatlah program untuk mengurutkan data mahasiswa berdasarkan IPK (besar ke kecil), jika ada IPK yang sama, diurutka lagi berdasarkan NIM (kecil ke besar). 61 BAB XII ALGORITMA PENCARIAN DATA (SEARCHING) Pendahuluan Ada 2 algoritma pencarian yang akan dibahas pada bab ini, yaitu pencarian sekuensial (sequential search) dan pencarian biner (binary search). Pencarian sekuensial digunakan untuk mencari data pada sejumlah data yang tidak urut. Sedangkan bila pencarian biner digunakan pada sejumlah data yang sudah urut. Penyajian 12. 1 Pencarian Sekuensial Pada pencarian sekuensial, data yang dicari, dibandingkan satu per satu dengan data pada suatu larik data. Algoritmanya adalah sebagai berikut : Misalkan dimiliki N data integer yang disimpan pada larik A, dan data yang dicari adalah X. 1. Ketemu = 0, indeks = 1. 2. Selama data belum ketemu (ketemu = 0) dan indeks ≤N : a. Jika X = A[indeks], maka data ketemu, lalu nilai ketemu =1. b. Jika X ≠A[indeks], maka indeks = indeks +1 Kode programnya sebagai berikut : while ((ketemu == 0) && (indeks <= N){ if (X = A[indeks]){ ketemu=1;} else { indeks = indeks +1;} } 62 12.2 Pencarian Biner Pencarian biner adalah metode pencarian data pada sekumpulan N data (larik) yang sudah urut dengan prinsip membagi dua larik tersebut, kemudian data dicari pada salah satu dari pecahan larik tadi. Jika data yang dicari nilainya lebih besar dari nilai tengah larik awal, maka data dicari pada pecahan larik indeks tengah+1 sampai indeks N, jika tidak, maka data dicari mungkin berada pada lariks indeks 1 sampai tengah-1. Algoritmanya sebagai berikut : Akan dicari data X pada larik A yang berjumlah N elemen. Larik A terurut naik (ascending). 1. Ketemu = 0, awal =1, akhir = N. 2. Selama ketemu = 0 dan awal ≤ akhir , maka tengah = (awal +akhir) / 2 : Jika X = A[tengah], maka ketemu =1. Jika X < A[tengah], maka akhir =tengah- 1 Jika X > A[tengah], maka awal =tengah+1 Kode programnya sebagai berikut : awal =1; akhir = N while ((ketemu == 0) && (awal ≤ akhir){ tengah = (awal + akhir) /2; if (X = A[tengah]){ ketemu=1;} else if (X < A[tengah]){ akhir = tengah-1;} else awal = tengah +1; } 63 Penutup Latihan Soal : 1. Buatlah program untuk menyimpan sejumlah N data mahasiswa yang terdiri dari NIM, Nama, dan IPK, lalu buatlah fungsi untuk menampilkan data mahasiswa dengan NIM tertentu. 2. Buatlah program pencarian biner secara rekursif. 64 BAB XIII TIPE DATA POINTER Pendahuluan Pemakaian array tidak selalu tepat untuk program-program terapan yang kebutuhan pengingatnya selalu bertambah selama eksekusi program tersebut. Untuk itu diperlukan satu tipe data yang dapat digunakan untuk mengalokasikan (membentuk) dan mendealokasikan (menghapus) pengingat secara dinamis, yaitu sesuai dengan kebutuhan pada saat suatu program dieksekusi. Oleh karena itu akan dijelaskan suatu tipe data yang dinamakan sebagai tipe Data Pointer. Nama peubah yang kita gunakan untuk mewakili suatu nilai data sebenarnya merupakan / menunjukkan suatu lokasi tertentu dalam pengingat computer di mana data yang diwakili oleh tipe data tersebut disimpan. Pada saat sebuah program dikompilasi maka compiler akan melihat pada bagian deklarasi peubah untuk mengetahui nama-nama peubah apa saja yang digunakan, sekaligus mengalokasikan atau menyediakan tempat dalam memory untuk menyimpan nilai data tersebut. Dari sini kita bisa melihat bahwa sebelum program dieksekusi, maka lokasi-lokasi data dalam memory sudah ditentukan dan tidak dapat diubah selama program tersebut dieksekusi. Peubah-peubah yang demikian itu dinamakan sebagai Peubah Statis (Static Variable). Dari pengertian diatas kita perhatikan bahwa sesudah suatu lokasi pengingat ditentukan untuk suatu nama peubah maka dalam program tersebut peubah yang dimaksud akan tetap menempati lokasi yang telah ditentukan dan tidak mungkin diubah. Dengan melihat pada sifat-sifat peubah statis maka bisa dikatakan bahwa banyaknya data yang bisa diolah adalah sangat terbatas. Misalnya peubah dalam bentuk Array yang dideklarasikan sbb : int matriks[100][100], maka peubah tersebut hanya mampu menyimpan data sebanyak 100x100=10000 buah data. Jika kita tetap nekat memasukkan data pada peubah tersebut setelah semua ruangnya penuh maka eksekusi program akan terhenti dan muncul error. Memang kita dapat mengubah deklarasi program diatas dengan memperbesar ukurannya. Tetapi jika setiap kali kita harus mengubah deklarasi 65 dari tipe daa tersebut sementara, banyaknya data tidak dapat ditentukan lebih dahulu, maka hal ini tentu merupakan pekerjaan yang membosankan. Sekarang bagaimana jika kita ingin mengolah data yang banyaknya kita tidak yakin sebelumnya bahwa larik yang telah kita deklarasikan sebelumnya mampu menampung data yang kita miliki ? Untuk menjawab pertanyaan di atas maka pascal menyediakan satu fasilitas yang memungkinkan kita untuk menggunakan suatu peubah yang disebut dengan Peubah Dinamis (Dynamic Variable). Peubah dinamis adalah peubah yang dialokasikan hanya pada saat diperlukan, yaitu setelah program dieksekusi. Dengan kata lain, pada saat program dikompilasi, lokasi untuk peubah belum ditentukan sebagai peubah dinamis. Hal ini membawa keuntungan pula, bahwa peubah-peubah dinamis tersebut dapat dihapus pada saat program dieksekusi sehingga ukuran memory selalu berubah. Hal inilah yang menyebabkan peubah tersebut dinamakan sebagai peubah dinamis. Pada peubah statis, isi dari peubah adalah data sesungguhnya yang akan diolah. Pada peubah dinamis nilai peubah adalah alamat lokasi lain yang menyimpan data sesungguhnya. Dengan demikian data yang sesungguhnya tidak dapat dimasup secara langsung. Oleh karena itu, peubah dinamis dikenal dengan sebutan POINTER yang artinya menunjuk ke sesuatu. Penyajian 13.1 Deklarasi Variabel Pointer Deklarasi variabel bertipe pointer : tipe data *namavariabel; Contoh : int *p Maka variabel p menunjuk suatu alamat pada memori. Jika ada variabel A bertipe integer, maka alamat variabel tersebut pada memori bisa diketahui dengan pernyataan &A. Variabel pointer p, bisa menunjuk ke alamat variabel A, yaitu dengan pernyataan : p = &A; atau dengan memesan sendiri memory baru yaitu dengan perintah p = new int; Sedangkan untuk mengetahui isi dari variabel yang alamatnya ditunjuk oleh p, dengan pernyataan *p; 66 Contoh Program menuliskan alamat dan nilai dari suatu variabel pointer : #include<iostream> using namespace std; main(){ int a,*b; a=10; b=&a; c=new int; *c=25; cout<<b<<" "<<*b<<" "<<c; getchar(); } 13.2 Penggunaan variabel pointer untuk membuat linked list Untuk dapat menyimpan data yang banyak dan untuk menunjukan sifat dinamisnya, maka variabel pointer harus dikombinasikan dengan tipe data struct, yaitu membentuk struktur data linked list (senarai berantai), berikut contoh deklarasi dan subprogram untuk membentuk linked list dari data random dengan menggunakan metode insert di depan, sebagai berikut : typedef struct node { int data; struct node *next; } *list; list L; void buatD(list &l) { int i,n; list b; cout<<"banyak data : ";cin>>n; srand((unsigned)time(NULL)); for (i=1;i<=n;i++){ b=new node; b->next=NULL; b->data=rand()%100+1; cout<<b->data<<" "; if (l==NULL) l=b; else {b->next=l; l=b;} 67 } } void cetakdata(list l) { list p; if (l!=NULL) { p=l; while (p!=NULL) {cout<<p->data<<" ";p=p->next;} } else cout<<"kosong"; } int main() { int x; list p; p=NULL; buatD(p); cetakdata(p); getch(); return 0; } Penutup Latihan Soal 1. Tulislah output dari cuplikan program berikut : #include<iostream> using namespace std; main(){ int a,*b, *c; a=10; b=&a; cout<<*b<<endl; c=new int; *c=25; b=c; cout<<*b<<endl; getchar(); } 68 2. Diketahui subprogram berikut : void buatA(list &l) { int i,n; list b,t; n=10; for (i=1;i<=n;i++){ b=new node; b->next=NULL; b->data=(i+i*i*2)%40; cout<<b->data<<" "; if (l==NULL) l=b; else if (b->data%2==0) {b->next=l;l=b;} else { t=l; while (t->next!=NULL) t=t->next; t->next=b; } } } Jika dipanggil list p; BuatA(p); cetakdata(p); Maka tulis outputnya. 69 CONTOH FINAL PROJECT ALGORITMA DAN STRUKTUR DATA 1 PROBLEM 1 (KELOMPOK 1) Buatlah program untuk menentukan jarak terdekat antara dua elemen/bilangan dalam suatu matrik random yang elemennya bilangan bulat positip berbeda semua/tidak ada yang sama (0100000). Jarak antara elemen matrik aij dengan apq dirumuskan sebagai sqrt((i-p)2+(j-q)2). Sebagai contoh, jarak antara elemen 3 dan 4 dalam matrik: 13 25 16 17 3 8 7 60 24 70 15 5 50 10 1 6 9 4 26 18 adalah sqrt(8), yaitu nilai 3 pada baris kedua kolom pertama (2,1) dengan nilai 4 pada baris keempat kolom ketiga (4,3). Masukan Pertama adalah dua buah bilangan bulat A dan B yang akan dicari jaraknya, kemudian dua buah bilangan yang menunjukkan ukuran matrik P x Q (0 P,Q 100). Keluaran Sebuah bilangan yang menunjukkan jarak yang dimaksud. PROBLEM 2 (KELOMPOK 2) Buatlah program yang dapat membaca n data mahasiswa (terdiri dari no_mhs dan IP_semester) yang disimpan di LINKED LIST L dan program dapat menghapus semua data dengan no_mhs tertentu, perhatikan ada beberapa kemungkinan : data tidak ada, hanya ada 1 data dan ada beberapa data yang akan dihapus, serta data yang dihapus berada di depan, tengah dan belakang. 70 Sebagai ilustrasi : data yang akan dihapus data dengan no_mhs : 9840 PROBLEM 3 (KELOMPOK 3) Buatlah program untuk menyusun n buah linked list (n nilainya antara 10 .. 1000) yang masingmasing banyaknya node belum tentu sama, node berisi data (integer) dan next. Program sama sekali tidak boleh menggunakan array. Contoh bentuk masukan : 10 75 : ini berarti membuat node dengan data = 75 dan diinsert (depan atau belakang) di linked list ke 10 1000 50 : ini berarti membuat node dengan data = 50 dan diinsert (depan atau belakang) di linked list ke 1000 PROBLEM 4 (KELOMPOK 4) Buatlah procedure REKURSIF untuk membuat pola sebagai berikut ( n = 5 ): * 71 ** *** **** ***** ***** **** *** ** * PROBLEM 5 (KELOMPOK 5) Buatlah program untuk membalik susunan digit bilangan bulat. Sebagai contoh, nilai 308 dibalik menjadi 803, 123 dibalik menjadi 321 (Tidak boleh menggunakan STRING). Masukan N adalah bilangan bulat yang akan dibalik susunan dijidnya, N berkisar antara 0 – 10 000 000. Keluaran bilangan B sebagai hasil balikan dari bilangan N. PROBLEM 6 (KELOMPOK 6) Diberikan 2 string , A dan B dengan panjang maximum 1000 karakter. Buatlah program untuk mencetak semua karakter/huruf yang ada di string A dan juga ada di string B, terurut secara alfabetik (acending). 72 Input File input terdiri dari beberapa kasus, setiap kasus terdiri dari 2 baris berturutan, yaitu baris 1 dan 2 untuk kasus 1, baris 3 dan 4 untuk kasus 2 , baris 5 dan 6 untuk kasus 3 dst. Dimana baris pertama merupakan string A dan baris kedua merupakan string B. Output Setiap kasus (2 baris berturutan) akan menghasilkan output sederetan karakter/huruf yang sudah terurut secara alfabetik yang memenuhi kreteria di atas. Contoh Input : pretty women walking down the Contoh Output : street e nw et 73 LATIHAN SOAL UJIAN MID SEMESTER 1. a. Untuk membuat program yang terstruktur diperlukan algoritma dan struktur data yang efisien, algoritma yang bagaimana yang efisien itu? dan jelaskan bagaimana langkah-langkah membuat algoritma yang efisien? Kemudian jelaskan apa perlunya struktur data dalam pembuatan program. b. Buatlah algoritma yang efisien untuk menentukan nilai kombinasi(n,r) dengan rumus : 2. a. Algoritma berikut dimaksudkan untuk menentukan warna dominan (warna yang paling sering muncul) dari matrik gambar G (mxn) yang elemennya bernilai antara 0 s.d. 255 (warna grayscale). G : array of array of byte;{matrik dinamis} X : array[0..255] of integer; i,j,m,n,max : integer; BEGIN FOR i=1 TO m DO FOR j=1 TO n DO X[G[i,j]] = X[G[i,j]] + 1; MAX = nilai_awal; //x[0] FOR i=1 TO 255 DO IF x[i]>max THEN MAX=X[i]; WRITE('WARNA DOMINANNYA ADALAH : '); IF (MAX > 1 ) THEN FOR i=0 TO 255 DO IF (X[i]=MAX) THEN WRITE(i,' '); END Sempurnakan algoritma di atas, dengan cara mengganti kata yang dicetak miring dan tebal (nilai_awal, kondisi, nilai dan variabel ) dengan perintah yang seharusnya. 74 b. //program dua b #include<iostream> #include<stdlib.h> #include<conio.h> int main() { int *x, i, n, t=0; cin>>n; x=new int[n]; for (i=1;i<=n;i++) { x[i] = i%3+2*i; t += x[i]; cout<<x[i]<<" "; } cout<<"\nNilai t = "<<t; getch(); free(x); return 0; } Jika n=10, tuliskan bagaimana outputnya? 3. Buatlah program terstruktur (C++) untuk membaca n data gempa yang berupa struct yang fieldnya terdiri dari : magnitude (sr), kedalaman(km), lokasi (record(LS, BT)) dan kota, yang disimpan di suatu larik X (array dinamis), kemudian mengurutkan berdasar magnitude secara decending lalu menghapus data gempa yang nilai magnitude < 5.0 dan akhirnya mencetak m data gempa hasil (m ≤ n) dengan memberi tambahan keterangan ”gempa berpotensi tsunami” jika nilai magnitude lebih besar atau sama dengan 7.5 sr dan kedalaman lebih kecil atau sama dengan 10 km. 75 SOAL LATIHAN UJIAN AKHIR 1. a. Jelaskan keunggulan/keuntungan menggunakan subprogram rekursif, tipe data pointer dan file data. Kemudian jelaskan pula kelebihan dan kekurangan algoritma Selection sort dan buble sort. b. Dengan menggunakan data input di bawah ini, Tuliskan urutan data sampai terurut (acending) dan hitung berapa kali operasi perbandingan dilakukan, jika digunakan algoritma insertion sort, juga tentukan set data tsb termasuk best, worst atau avaragecase? 18, 29, 83, 82, 60, 54, 41, 88, 23, 69, 54, 3, 63, 78, 20, 39 2. a. Perhatikan subprogram berikut : typedef struct node { int data; struct node *next; } *list; void buatA(list &l){ int i,n; list b,t; n=10; for (i=1;i<=n;i++){ b=new node; b->next=NULL; b->data=(i+i*i*2)%40; cout<<b->data<<" "; if (l==NULL) l=b; else if (b->data%2==0) {b->next=l;l=b;} else { t=l; while (t->next!=NULL) t=t->next; t->next=b; } } cout<<endl; } void cetakdata(list l) {list p; if (l!=NULL) { p=l; while (p!=NULL) {cout<<p->data<<" ";p=p->next;} } } Tentukan outputnya jika dipanggil : list p; p=NULL; buatA(p); cetakdata(p); b. Perhatikan subprogram berikut : string stc; void coba(int n,string &st) { int b; string sta,stb; if (n==0) st = "$"; else { b = n%16; if (b<10) stb = 48+b; else stb = 55+b; coba(n/16, &sta); st = sta + stb; } } Tentukan nilai stc, Jika dipanggil coba(256,stc); Jika dipanggil coba(1000,stc); c. Perhatikan subprogram berikut : #include<iostream> using namespace std; string stc; int panjang(int n) {int y; y=n+3*n; return y; } void coba(int n,string &st) { int b,p; char c; if (n==0) st=""; else { b = n%5; p=panjang(b); while (p>0) { c=65+p; st=st+c; p--; } } } main (){ coba(6,stc); cout<<stc; getchar(); } 76 3. Diketahui struktur data pasien sebagai berikut : typedef struct { string NRM; string nama; int umur; } pasien; Buatlah subprogram (C++) untuk mencetak data pasien usia subur (18 sd 35 tahun) terurut acending berdasarkan NRM. 77 DAFTAR PUSTAKA Cay S. Horstmann, 2009, C++ for everyone Adam Drozdek, 2008, Data Structures and Algorithms in Java Alfred V. Aho,dkk., 1988, Data Structures and Algorithms, Data Structures Using C , Tenenbaum, A., Y. Langsam, and M. Augenstein, 1990, Prentice-Hall Munir, R., 2004, Algoritma dan Pemrograman, Informatika, Bandung. 78