Anda di halaman 1dari 106

Buku Ajar

Modul Program Studi


Sistem Informasi

Pemrograman
Drs. Janoe Hendarto M.Kom.

1
Kata Pengantar

Belajar Pemrograman terutama pemrograman dasar menggunakan Bahasa


pemrograman C++ adalah sangat menyenangkan, banyak tantangan dan kasus-kasus
pemrograman yang dapat memacu kecerdasan kita. Kemampuan berfikir komputasional
pada diri kita menjadi lebih meningkat dengan belajar pemrograman dasar, permasalahan-
permasalahan pemrograman seiring berjalannya waktu selalu berkembang dan muncul
permasalahan baru yang dapat memacu kemajuan bidang pemrograman dasar.

Buku ajar Pemrograman ini disusun dalam rangka membantu para mahasiswa dalam
belajar pemrograman dasar, yang diharapkan mahasiswa dari program studi apapun dapat
membuat program dengan Bahasa pemrograman C++ untuk menyelesaikan permasalahan
baik yang berhubungan dengan prodinya maupun permasalahan pada umumnya.

Buku ajar ini disusun dalam 14 Bab, secara umum diharapkan mahasiswa
mempelajari dari awal hingga akhir, akan tetapi dimungkinkan untuk tidak selalu
berurutan. Pada bagian awal, buku ini membahas konsep pemrograman yang sangat
penting agar para mahasiswa tidak salah persepsi terhadap program komputer. Bagian
berikutnya mempelajari detil dari komponen program komputer, mulai algoritme,
kemudian struktur data dan bahasa pemrograman, khususnya C++. Struktur data yang
dipelajari masih sederhana akan tetapi sudah cukup untuk menyelesaikan permasalahan
pemrograman yang lebih kompleks. Hal ini diharapkan mahasiswa dari program studi non
informatika dapat memahami dengan mudah walaupun harus banyak berlatih membuat
program sendiri.

Contoh-contoh program komputer pada setiap Bab hanya memberikan contoh dan
gambaran kepada mahasiswa tentang materi yang dibahas, diharapkan mahasiswa dapat
mengembangkan dan membuat program komputer sendiri serta berinovasi dalam mencari
solusi dari setiap permasalahan pemrograman. Semoga buku ajar ini bermanfaat dan
tentunya masih banyak kekurangannya sehingga diharapkan masukan atau saran demi
kesempurnaan buku ajar ini.

2
Prakata

Puji syukur kami panjatkan ke hadirat Allah SWT., karena berkat pertolongan dan taufikNya,
maka Buku Ajar “Pemrograman “ ini dapat diselesaikan. Buku ajar ini diharapkan dapat
dimanfaatkan oleh para mahasiswa untuk melengkapi dalam belajar Bahasa pemrograman
prosedural C++.

Penulisan buku ajar ini terlaksana dalam rangka kegiatan Laptop Merah Putih dari
Direktorat Jenderal Pendidikan Tinggi (Ditjen Dikti) Kemendikbud-Ristek bekerjasama dengan
Universitas Gadjah Mada, Kegiatan penulisan buku ajar dikoordinasi oleh Fakultas Matematika
dan Ilmu Pengetahuan Alam Universitas Gadjah Mada. Untuk itu pada kesempatan ini kami
mengucapkan banyak terimakasih kepada Fakultas Matematika dan Ilmu Pengetahuan Alam
Universitas Gadjah Mada dan Direktorat Jenderal Pendidikan Tinggi (Ditjen Dikti)
Kemendikbud-Ristek atas kepercayaannya sehingga penulisan buku ajar ini dapat terlaksana.

Tidak lupa kami ucapkan terimakasih juga kepada teman-teman dosen matakuliah
keMipaan Pemrograman yang banyak memberikan inspirasi, Terimakasih kepada semua pihak
yang telah membantu sehingga terselesaikannya penulisan buku ajar ini. Semoga buku ajar ini
bermanfaat bagi kita semua Aamiin.

Jogjakarta, Desember 2021


Penulis,

Janoe Hendarto
jhendarto@ugm.ac.id

3
Tinjauan Matakuliah

Matakuliah Pemrograman ini memberikan pengetahuan dan ketrampilan kepada mahasiswa


untuk melakukan analisa terhadap permasalahan, perancangan algoritme dan menentukan
struktur data yang tepat agar program komputer yang dihasilkan terstruktur dan efisien.

Materi Pemrograman ini, lebih menitik beratkan pada algoritme dan pemrogramannya
karena struktur data yang digunakan masih relatif sederhana, yaitu mulai konsep dasar, struktur
program, implementasi dan juga komponen-komponen lain dalam algoritme dan pemrograman,
diharapkan mahasiswa akan memiliki kemampuan baru untuk menganalisa permasalahan dan
juga mengimplementasikannya dalam program komputer dengan menggunakan bahasa
pemrograman C++.

Penerapan cara pembelajaran Pemrograman secara umum ditujukan untuk memberikan


pembekalan kepada mahasiswa dalam berfikir secara kritis, kreatif dan logis dalam
menganalisis dan memecahkan masalah berbasis program komputer. Secara khusus pada
matakuliah ini akan diberikan ketrampilan baru dalam hal pengimplementasian hasil analisis
pemecahan masalah ke dalam bentuk program komputer yang benar baik secara logika maupun
secara sintaksis.

Luaran atau output dari matakuliah Pemrograman ini adalah :

1. Mahasiswa memiliki pengetahuan mengenai konsep dasar pemrograman, algoritme, dan


dapat berpikir komputasional
2. Mahasiswa memiliki pengetahuan mengenai struktur data sederhana dan bahasa
pemrograman.
3. Mahasiswa dapat membuat program komputer dengan menggunakan struktur data
sederhana, seperti larikan, matriks, dan record/struct.
4. Mahasiswa memiliki pengetahuan mengenai pemrograman modular/subprogram dan dapat
mengimplementasikan dalam program komputer.
5. Mahasiswa dapat menjelaskan dan cakap dalam mengimplementasikan algoritme sorting
dan searching.

4
Daftar Isi

Kata Pengantar ................................................................................................ 2

Prakata .......................................................................................................... 3

Tinjauan Matakuliah ......................................................................................... 4

Daftar Isi ....................................................................................................... 5

BAB I – KONSEP PEMROGRAMAN ................................................................ 12

Capaian Pembelajaran Mata Kuliah .................................................................. 12

1.1 Pendahuluan ...................................................................................... 12

1.2 Algoritme ......................................................................................... 12

1.3 Struktur Data ..................................................................................... 14

1.4 Komponen Komputer........................................................................... 14

1.5 Program dan Bahasa Pemrograman .......................................................... 15

1.6 Penerjemah Bahasa Pemrograman ........................................................... 18

1.7 Pemrograman Terstruktur...................................................................... 19

1.8 Tahapan Penyelesaian Masalah dengan Pemrograman ................................... 19

1.9 Rangkuman ....................................................................................... 20

1.10 Bahan Diskusi.................................................................................... 21

1.11 Daftar Pustaka ................................................................................... 21

1.12 Latihan Soal ...................................................................................... 21

BAB II – BERFIKIR KOMPUTASIONAL DAN ALGORITME ................................ 22

Capaian Pembelajaran Mata Kuliah .................................................................. 22

2.1 Pendahuluan .......................................................................................... 22

2.2 Pengantar Berfikir Komputasional ........................................................... 22

2.3 Notasi Deskriptif .................................................................................... 23

2.4 Notasi Flowchart .................................................................................... 23

5
2.5 Notasi Menggunakan pseudocode ..................................................... 25

2.6 Rangkuman ....................................................................................... 26

2.7 Bahan Diskusi.................................................................................... 27

2.8 Daftar Pustaka ................................................................................... 27

2.9 Latihan Soal ...................................................................................... 27

BAB III - TIPE DATA .................................................................................... 28

Capaian Pembelajaran Mata Kuliah .................................................................. 28

3.1 Pendahuluan .......................................................................................... 28

3.2 Tipe Data ............................................................................................. 28

3.2.1 Tipe Dasar ....................................................................................... 28

3.2.2 Tipe Bentukan .................................................................................. 31

3.3 Nama .................................................................................................. 31

3.4 Variabel. ........................................................................................... 31

3.5 Nilai ................................................................................................ 32

3.5.1 Pengisian Nilai ke Variabel .................................................................. 32

3.5.2 Ekspresi .......................................................................................... 33

3.5.3 Menuliskan Nilai ke Piranti Keluaran ...................................................... 33

3.6 Struktur program C++ .......................................................................... 33

3.6.1 Kepala Program (Header) .................................................................... 34

3.6.2 Bagian Deklarasi ............................................................................... 34

3.6.3 Bagian Pernyataan ............................................................................. 36

3.7 Rangkuman ....................................................................................... 36

3.8 Bahan Diskusi.................................................................................... 36

3.9 Daftar Pustaka ................................................................................... 36

3.9 Latihan soal....................................................................................... 37

BAB IV - STRUKTUR RUNTUNAN DAN PENCABANGAN ................................. 38

6
Capaian Pembelajaran Mata Kuliah .................................................................. 38

4.1 Pendahuluan ...................................................................................... 38

4.2 Struktur Runtunan ............................................................................... 38

4.3 Struktur Percabangan ........................................................................... 39

4.3.1 Satu Kasus ....................................................................................... 39

4.3.2 Dua Kasus ....................................................................................... 40

4.3.3 Tiga Kasus atau Lebih ........................................................................ 40

4.3.4 Struktur Switch ................................................................................. 41

4.4 Rangkuman ....................................................................................... 42

4.5 Bahan Diskusi.................................................................................... 42

4.6 Daftar Pustaka ................................................................................... 42

4.7 Latihan Soal ...................................................................................... 42

BAB V - STRUKTUR PENGULANGAN ......................................................... 43

Capaian Pembelajaran Mata Kuliah .................................................................. 43

5.1 Pendahuluan ...................................................................................... 43

5.2 Struktur Pengulangan ........................................................................... 43

5.3 Struktur FOR ..................................................................................... 43

5.4 Struktur WHILE ................................................................................. 45

5.5 Struktur do-while ................................................................................ 45

5.6 Rangkuman ....................................................................................... 46

5.7 Bahan Diskusi.................................................................................... 46

5.8 Daftar Pustaka ................................................................................... 46

5.9 Latihan Soal ...................................................................................... 46

BAB VI - SUB PROGRAM ........................................................................... 48

Capaian Pembelajaran Mata Kuliah .................................................................. 48

6.1 Pendahuluan ...................................................................................... 48

7
6.2 Pendeklarasian Fungsi tanpa pengembalian nilai ......................................... 48

6.3 Pemanggilan Fungsi tanpa pengembalian nilai ............................................ 48

6.4 Variabel Global dan Lokal .................................................................... 49

6.5 Parameter ......................................................................................... 49

6.6 Rangkuman ....................................................................................... 52

6.7 Bahan Diskusi.................................................................................... 53

6.8 Daftar Pustaka ................................................................................... 53

6.9 Latihan Soal ...................................................................................... 53

BAB VII - FUNGSI DENGAN PENGEMBALIAN NILAI .................................. 54

Capaian Pembelajaran Mata Kuliah .................................................................. 54

7.1 Pendahuluan ...................................................................................... 54

7.2 Fungsi dengan Pengembalian Nilai .......................................................... 54

7.3 Pendeklarasian Fungsi dengan Pengembalian Nilai ...................................... 54

7.4 Pemanggilan Fungsi ............................................................................ 54

7.5 Rangkuman ....................................................................................... 56

7.6 Bahan Diskusi.................................................................................... 56

7.7 Daftar Pustaka ................................................................................... 56

7.8 Latihan Soal ...................................................................................... 56

BAB VIII - TIPE DATA ARRAY .................................................................... 57

Capaian Pembelajaran Mata Kuliah .................................................................. 57

8.1 Pendahuluan ...................................................................................... 57

8.2 Deklarasi Array .................................................................................. 57

8.3 Mengakses Data: ................................................................................ 57

8.4 Array Dimensi Banyak ......................................................................... 58

8.5 Contoh Kasus menggunakan tipe data array ............................................... 58

8.7 Rangkuman ....................................................................................... 61

8
8.8 Bahan Diskusi.................................................................................... 62

8.9 Daftar Pustaka ................................................................................... 62

8.10 Latihan Soal ...................................................................................... 62

BAB IX - TIPE DATA STUKTUR .................................................................. 63

Capaian Pembelajaran Mata Kuliah .................................................................. 63

9.1 Pendahuluan ...................................................................................... 63

9.2 Deklarasi Struktur ............................................................................... 63

9.3 Akses dan Input Data Struktur ................................................................ 63

9.4 Array bertipe Struktur .......................................................................... 64

9.5 Contoh Kasus .................................................................................... 64

9.6 Fungsi dalam struktur .......................................................................... 66

9.7 Rangkuman ....................................................................................... 67

9.8 Bahan Diskusi.................................................................................... 67

9.9 Daftar Pustaka ................................................................................... 68

9.10 Latihan Soal ...................................................................................... 68

BAB X - REKURSI...................................................................................... 69

Capaian Pembelajaran Mata Kuliah .................................................................. 69

10.1 Pendahuluan ...................................................................................... 69

10.2 Fungsi Rekursif .................................................................................. 69

10.3 Subprogram Rekursif ........................................................................... 70

10.4 Rangkuman ....................................................................................... 70

10.5 Bahan Diskusi.................................................................................... 70

BAB XI - PENGURUTAN DATA SEDERHANA ............................................. 72

Capaian Pembelajaran Mata Kuliah .................................................................. 72

11.1 Pendahuluan ...................................................................................... 72

11.2 Selection Sort .................................................................................... 72

9
11.3 Bubble Sort ....................................................................................... 73

11.4 Insertion ........................................................................................... 73

11.5 Rangkuman ....................................................................................... 74

11.6 Bahan Diskusi.................................................................................... 74

11.7 Daftar Pustaka ................................................................................... 74

11.8 Latihan Soal ...................................................................................... 74

BAB XII - PENGURUTAN DATA LANJUT .................................................... 75

Capaian Pembelajaran Mata Kuliah .................................................................. 75

12.1 Pendahuluan ...................................................................................... 75

12.4 Rangkuman ....................................................................................... 80

12.5 Bahan Diskusi.................................................................................... 80

12.6 Daftar Pustaka ................................................................................... 80

12.7 Latihan Soal ...................................................................................... 80

BAB XIII – PENCARIAN DATA .................................................................... 81

Capaian Pembelajaran Mata Kuliah .................................................................. 81

13.1 Pendahuluan ...................................................................................... 81

13.2 Pencarian Sekuensial ........................................................................... 81

13.3 Pencarian Biner .................................................................................. 82

13.4 Pencarian Dengan Fungsi Hashing ........................................................... 82

13.5 Rangkuman ....................................................................................... 93

13.6 Bahan Diskusi.................................................................................... 94

13.7 Daftar Pustaka ................................................................................... 94

13.8 Latihan Soal ...................................................................................... 94

BAB XIV - TIPE DATA POINTER DAN FILE DATA ............................................ 95

Capaian Pembelajaran Mata Kuliah .................................................................. 95

14.1 Deklarasi Variabel Pointer ....................................................................... 96

10
14.2 Penggunaan variabel pointer untuk membuat linked list ................................. 97

14.4 Vektor ............................................................................................. 98

14.5 File Data ........................................................................................ 100

14.6 Rangkuman ..................................................................................... 102

14.7 Bahan Diskusi.................................................................................. 103

14.8 Daftar Pustaka ................................................................................. 103

14.9 Latihan Soal .................................................................................... 103

DAFTAR PUSTAKA .................................................................................... 105

11
BAB I – KONSEP PEMROGRAMAN
Capaian Pembelajaran Mata Kuliah
Mahasiswa memiliki pengetahuan mengenai konsep dasar pemrograman, algoritme, dan
struktur data

1.1 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.

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.

Pemilihan algoritme juga mempengaruhi waktu eksekusi oleh komputer, sebagai contoh
pada 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
“corona”. Jika dimisalkan dibutuhkan waktu 1 milidetik untuk mencek sebuah kata sama
dengan “corona”.

 Solusi 1: menggunakan linear search, membutuhkan waktu 1 milidetik x 600.000 kata


= 600 detik = 10 menit

 Solusi 2 : Binary search : log 2 600000 = 19 milidetik vs 10 menit!

1.2 Algoritme
Algoritme adalah urutan logis pengambilan putusan untuk pemecahan masalah (set of
steps). Dalam lingkungan pemrograman, langkah penyelesaian permasalahan harus
mengikuti 3 tahap berikut:

1. Analisis permasalahan, merupakan rinci permasalahan dan pendalaman permasalahan


hingga mendapatkan ide solusi dalam pemecahannya.

2. Perancangan algoritme untuk menyelesaikan masalah tersebut, meliputi proses


menyatakan algoritme, validasi dan analisis algoritme.

12
3. Implementasikan algoritme tersebut pada sebuah bahasa pemrograman seperti C++,
Java, Python, dan lain sebagainya. Pastikan program tersebut berjalan tanpa error
(sintax, running maupun output error) dengan menggunakan data uji.
Dalam merancang sebuah program, algoritme memiliki lima ciri penting:
1. Algoritme harus berhenti setelah mengerjakan sejumlah langkah terbatas (langkahnya
berhingga, tidak looping)
2. Setiap langkah harus didefinisikan dengan tepat/pasti (definite) dan tidak berarti – dua
(ambigu).
3. Algoritme memiliki nol atau lebih masukan.
4. Algoritme memiliki satu atau lebih keluaran.
5. Algoritme harus efektif.
Struktur data adalah susunan data di penyimpanan/RAM agar efisien dalam
penyimpanan dan pengolahannya. Struktur data seharusnya diterapkan pada algoritme yang
efisien.

Algoritme, struktur data dan Pemrograman secara umum ditujukan untuk memberikan
pembekalan kepada mahasiswa dalam berfikir secara kritis, kreatif dan logis dalam
menganalisis dan memecahkan masalah berbasis program komputer. Secara khusus akan
diberikan ketrampilan baru dalam hal pengimplementasian hasil analisis pemecahan masalah
ke dalam bentuk program komputer yang benar, baik secara logika maupun secara sintaksis.
Roadmap belajar algoritme dan pemrograman seperti pada Gambar 1.1 berikut.

Problem Solving (Ultimate Goals)

Advanced Topics (Algoritma dan Struktur Data Kompleks) Peng


emb
anga
Intermediate Topics (Algoritma dan Struktur Data Kompleks)
n
Kepri
Matematika
Algoritma dan Struktur Data Sederhana badi
Diskrit
an
Matematika Dasar Bahasa
Dasar Pemrograman Pemrograman

Gambar 1.1 Roadmap belajar pemrograman

13
1.3 Struktur Data
Struktur data adalah susunan data di RAM, yang meliputi
1. Nilai Data
Data bisa bernilai numerik yaitu bilangan baik integer/bilangan bulat maupun bilangan
riil atau bisa bernilai non nemerik bisa berupa karakter, string dan nilai kebenaran true
dan false
2. Hubungan diantara data
Data disusun sedemikian rupa agar efisien dalam pengolahan datanya, data yang
banyak bisa disusun secara linear atau non linear
3. Operasi pada data
Operasi pada data minimal ada 3 macam yaitu insert (memasukkan data pada suatu
susunan), delete (menghapus data dari suatu susunan) dan find (mencari data pada suatu
susunan data)
Terdapat 3 tahapan untuk membuat struktur data
1. Abstraksi
Data yang akan diolah menjadi informasi perlu digambarkan susunannya agar orang
lain memahami bagaimana susunan data di RAM.
2. Implementasi
Setelah susunan data di abstraksikan Langkah berikutnya adalah implementasi struktur
data dalam program, tipe data apa saja yang digunakan dan bagaimana susunannya.
3. Fisik di RAM
Secara fisik di RAM data berupa kumpulan bit bit (byte), yang mempunyai alamat dan
susunan tertentu, yang mungkin berbeda dengan yang di abstraksikan.

1.4 Komponen Komputer


Komputer merupakan suatu alat untuk membaca, memanipulasi, dan menyajikan data.
Pada masa lalu, penggunaan komputer masih sangat terbatas, yaitu pada masa 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

14
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 Internal storage atau Peralatan


masukan Memory 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).

1.5 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

15
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 sehari-hari
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

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

16
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 antara lain:

1. BASIC (Beginer All-purpose Symbolic Instruction Code)


2. Cobol (Common Business Oriented Language)
3. FORTRAN (Formula Translator)
4. Pascal
5. C
6. C++
7. Java
8. Python
9. Dan lain lain
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 program-program yang
bersifat bahasa alamiah (natural language) dan menggunakan pengetahuan (knowledge)
sebagai basis pengolahan.
17
1.6 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 yaitu
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 :

Tabel 1.1 Perbedaan kompiler dan interpreter.

Kompiler Interpreter
Menerjemahkan program sebelum dijalankan Menerjemahkan program pada saat dijalankan
Penerjemahan bersifat tetap Penerjemahan bersifat sementara
Kesalahan penulisan diketahui setelah proses Kesalahan penulisan langsung diberitahukan
kompilasi
Perbaikan program dilakukan dengan kembali Perbaikan program dapat langsung dilaksanakan
ke pengedit teks program
Sehubungan dengan perbedaan di atas, maka pelaksanaan program dengan menggunakan
interpreter maupun dengan kompiler dapat digambarkan pada Gambar 1.3 berikut:

a) Dengan interpreter

Program Baca satu Terjemahkan ke Laksanakan


sumber pernyataan bahasa mesin pernyataan

b) Dengan kompiler

Program Terjemahkan Program dalam bahasa


sumber seluruhnya mesin lengkap

Laksanakan
program lengkap

Gambar 1.3 Tahapan pelaksanaan program.

18
1.7 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 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.8 Tahapan Penyelesaian Masalah dengan Pemrograman


Langkah-langkah penyelesaian masalah dengan algoritme 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. Perancangan/Desain algoritme, meliputi :

 Deskripsi (cara penulisan):

o natural language

o pseudocode

o diagram (seperti flowchart)

19
 Kriteria algoritme:

o Input: nol atau lebih

o Output: satu atau lebih

o Definisi/terjemahan/interprestasi: jelas, tepat untuk tiap instruksi

o Batasan: sebuah algoritme 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

3. Analisis Algoritme

 Space complexity

o Berapa banyak space yang dibutuhkan

 Time complexity

o Berapa lama waktu running algoritme

4. Implementasi

 Penentuan bahasa pemrograman yang akan digunakan

o C, C++, Lisp, Java, Perl, Prolog, assembly, dll.

 Penulisan koding harus terdokumentasi dengan baik dan jelas.

5. Uji hasil

Mengintegrasikan feedback dari user, perbaiki bug, penjaminan kompatibelitas pada


berbagai platform

6. Pemeliharaan

1.9 Rangkuman
Belajar pemrograman, yaitu diberikan permasalahan bagaimana membuat solusinya dalam
bentuk program komputer, memerlukan pemahaman konsep program komputer yaitu 3
komponan program komputer

1. Algoritme
2. Struktur data

20
3. Bahasa pemrograman
Setelah memahami 3 komponen program komputer tersebut, berikutnya adalah mengetahui
bagaimana langkah-langkah membuat program yang baik yaitu yang terstruktur yang efisien
dari segi waktu dan memory, 5 tahapan utama adalah

1. Analisis permasalahan
2. Perancangan algoritme
3. Menulis program
4. Menguji hasil program
5. Dokumentasi
1.10 Bahan Diskusi
1. Diskusikan tentang apa saja komponen dari program komputer, masing-masing
komponen perlu dijelaskan
2. Dari komponen suatu program, komponen yang mana yang sering menjadi kendala bagi
programmer pemula.
1.11 Daftar Pustaka
1. Alfred V. Aho,dkk., 1988, Data Structures and Algorithms,
2. Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.
1.12 Latihan Soal
1. Dalam rangka membuat program komputer, mengapa data perlu disimpan dan mengapa
menyimpannya perlu menggunakan struktur tertentu!
2. Jelaskan dengan singkat mengapa dalam membuat program komputer perlu
memperhatikan ketepatan struktur data dan efisiensi algoritme yang digunakan!
3. Jelaskan bagaimana cara menguji kebenaran program komputer yang kita buat!
4. Sebutkan 2 perbedaan utama antara compiler dengan interpreter!
5. Mengapa algoritme perlu dianalisi!

21
BAB II – BERFIKIR KOMPUTASIONAL DAN ALGORITME
Capaian Pembelajaran Mata Kuliah
Mahasiswa memiliki pengetahuan mengenai algoritme, dan dapat berfikir komputasional

2.1 Pendahuluan
Pada bab ini akan dijelaskan sedikit tentang ap aitu berfikir komputasional dan juga
akan dibahas tentang notasi algoritme dan contoh penggunaannya pada beberapa permasalahan
sederhana. Diharapkan mahasiswa dapat menuliskan algoritme untuk suatu penyelesaian
masalah.

Notasi algoritme bukan notasi bahasa pemrograman. Ada beberapa notasi yang digunakan
dalam penulisan algoritme, yaitu antara lain notasi algoritme deskriptif dan notasi algoritme
flowchart.

2.2 Pengantar Berfikir Komputasional


Berfikir Komputasional adalah proses pemecahan masalah yang memiliki ciri-ciri atau
komponen sebagai berikut:
1. Dekomposisi
Dekomposisi adalah memecah masalah menjadi bagian-bagian yang sederhana, yang
diharapkan lebih mudah penyelesaiannya.
2. Abstraksi
Abstraksi adalah proses menyaring informasi yang tidak perlu. Abstraksi
memungkinkan kita untuk membuat gagasan umum tentang apa masalahnya dan
bagaimana menyelesaikannya
3. Pengenalan Pola
Tujuan pengenalan pola adalah untuk menemukan persamaan dan perbedaan umum di antara
objek. Hal ini memungkinkan kita untuk memecahkan masalah yang tampaknya beragam
dengan satu algoritme

4. Algoritme
a. “Algoritme itu seperti resep, harus diikuti dengan tepat, tidak ambigu, dan harus
ada akhirnya.”
b. Algoritme adalah urutan langkah-langkah yang tepat untuk memecahkan masalah.
c. Sebuah algoritme harus menghasilkan solusi. Solusinya mungkin BUKAN
merupakan solusi "terbaik" untuk masalah tersebut.
d. Algoritme mungkin TIDAK cara yang paling efisien untuk memecahkan masalah.

22
e. Masalah yang muncul dalam merancang suatu algoritme adalah bahwa kita harus
menyatakan algoritme dengan teratur dan tidak ambigu.

2.3 Notasi Deskriptif


Notasi yang menyatakan langkah-langkah algoritme dengan kalimat deskriptif.
Contoh:
Algoritme 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.4 Notasi 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

FLOW Arah aliran program

PREPARATION inisialisasi/pemberian nilai awal

PROCES Proses/pengolahan data

INPUT/OUTPUT
input/output data
DATA

23
SUB PROGRAM sub program

DECISION Seleksi atau kondisi

ON PAGE Penghubung bagian-bagian flowchart


CONNECTOR pada halaman yang sama

OFF PAGE Penghubung bagian-bagian flowchart


CONNECTOR pada halaman yang berbeda

Tempat komentar tentang suatu


COMMENT
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.

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 :

24
mulai

Masukkan Bilangan Bulat

Bilangan dibagi 2 dengan


operasi sisa bagi/modulo

Sisa bagi=0 ? YA Tulis “GENAP”

Tidak

Tulis “GANJIL”

Selesai

2.5 Notasi Menggunakan pseudocode


Pseudocode adalah notasi yang menyerupai notasi bahasa pemrograman tingkat tinggi, bisa
menyerupai bahasa Pascal (pseudoPascal) atau menyerupai bahasa C (pseudoC).

Algoritme 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
25
endwhile
write(m)
Contoh algoritme yang lain, misalnya :
1. Menghitung Luas Lingkaran
Algoritme LuasLingkaran
deklarasi
jari2, Luas : real
deskripsi
read(jari2)
Luas314*jari2*jari2
write(Luas)
2. Menghitung selisih waktu
Algoritme 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)
tdetik1 3600*jam1+60*menit1*detik1
tdetik2 3600*jam2+60*menit2*detik2
selisihtdeti2-tdetik1
sjamselisih div 3600
sisa selisih mod 3600
smenitselisih div 60
sdetikselisih mod 60
write(sjam,smenit,sdetik)

2.6 Rangkuman
Berfikir komputasional diperlukan dalam problem solving agar kita dapat menyelesaikan
permasalahan dengan efisien atau minimal mendekati optimal.

26
Dalam perancangan algoritme, salah satu tahapan yang penting adalah menyatakan
algoritme yang merupakan bagian paling dirasakan sulit oleh programer pemula. Algoritme
dapat dinyatakan secara deskriptif, dengan flowchart atau menggunakan pseudocode. Masing-
masing cara mempunyai kelebihan dan kekurangannya, flowchart yang berupa gambar atau
diagram lebih cepat dilihat aliran prosesnya, sedangkan pseudocode lebih dekat dengan Bahasa
pemrograman.

2.7 Bahan Diskusi


1. Bagaimana peran berfikir komputasional dalam pemrograman.
2. Dari 3 cara menyatakan algoritme, deskriptif, flowchart dan pseudocode yang mana
yang lebih mudah untuk mengimplementasikan dalam Bahasa pemrograman

2.8 Daftar Pustaka


1. Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.
2. Peterson, J., 2018 , Introduction to Computational Thinking, in Tallahassee, Florida.

2.9 Latihan Soal


1. Jelaskan mengapa dengan dekomposisi permasalahan menjadi lebih mudah
diselesaikan!
2. Tulislah algoritme menentukan bilangan terbesar dari 3 bilangan bulat A, B, C
menggunakan notasi bahasa alami (deskriptif).
3. Tulislah algoritme mengurutkan dari kecil ke besar 3 bilangan bulat A, B, C
menggunakan notasi diagram alir.
4. Tulislah algoritme menghitung luas segi tiga menggunakan pseudocode.

27
BAB III - TIPE DATA
Capaian Pembelajaran Mata Kuliah
Mahasiswa memiliki pengetahuan mengenai struktur data sederhana dan bahasa
pemrograman.

3.1 Pendahuluan
Pada bab ini dileaskan tipe data dan operasi baca tulis data, juga dijelaskan struktur
pemrograman pada bahasa C/C++.

3.2 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.2.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 Keterangan Ukuran Jangkauan nilai

char Abjad/karakter atau 1 byte signed : -128..127


untuk bilangan
bulat kecil
unsigned : 0..255
short int Bilangan bulat 2 byte signed : -32768..32767
(short) dengan jangkauan
pendek
unsigned : 0..65535
int Bilangan bulat 4 byte signed : -2147483648..2147483647

unsigned : 0.. 4294967295

28
long int Bilangan bulat 4 byte signed : -2147483648..2147483647
(long) dengan jangkauan
panjang
unsigned : 0.. 4294967295
long long Bilangan bulat 8 byte 20 digit bilangan bulat
dengan jangkauan
panjang

Operator Integer terdiri atas :


+ (penjumlahan),
- (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.
48 0
49 1
65 A
66 B
97 a
dst
Operasi yang dilakukan terhadap tipe karakter adalah operasi perbandingan =, <>, <, >, <=,
>=.

29
4. Bilangan Riil (float, double)
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
-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


(dalam byte)
float 4 3.4*(10^-38) … 3.4*(10^+38)
double 8 1.7*(10^-308) – 1.7*(10^+308)
long double 10 3.4*(10^-4932) – 1.1*(10^+4932)

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.

30
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.2.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)

3.3 Nama
Nama diberikan kepada peubah (variabel), konstanta, tipe bentukan dan nama fungsi.

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.4 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 :


31
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 :

int x;

float p,q,r;

char a,b;

boolean m,n;

3.5 Nilai
Nilai adalah besaran dari tipe data yang sudah didefinisikan. Nilai dapat berupa variabel
atau konstanta.
3.5.1 Pengisian Nilai ke Variabel
1. Pengisian nilai secara langsung
Pengisian nilai secara langsung adalah memasukkan nilai ke dalam nama variabel
langsung di teks program.

variabel = nilai
Contoh : N = 10;

Atau variabel=variabel
Contoh : N=M;

32
2. Pembacaan Nilai dari Piranti Masukan
Dalam bahasa C++ untuk keperluan input (membaca nilai) digunakan identifier standar cin.
Bentuk umum penulisannya
cin>>variabel input;
Contoh : cin>>A>>B>>C;

3.5.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.
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.5.3 Menuliskan Nilai ke Piranti Keluaran
Untuk keperluan keluaran (mencetak keluaran) digunakan identifier standar COUT.
Pada setiap keluaran ada fungsi untuk pindah ke baris baru (new line). Pada COUT ada ENDL.

Bentuk umum penulisannya :


cout<<variabel_output atau cout<<variabel_output<<endl;
Contoh:
cout<<”luas lingkaran adalah”<<luas<<endl;

3.6 Struktur program C++


Struktur program C++ dapat dikelompokkan menjadi tiga bagian,yaitu :

1. Kepala Program (header)

33
2. Bagian Deklarasi (pada C++ bisa dimana saja)

3. Bagian Pernyataan

1. //Program LuasLingkaran;
2. #include<iostream>
3. Using namespace std;
4. float jari2, Luas ;
5. int main(){
6. cout<<”Masukkan jari-jari : ”; cin>>jari2;
7. Luas = 314*jari2*jari2;
8. cout<<”Luas = ”<<Luas<<endl;
9. return 0;
10. }

Pada program di atas Program LuasLingkaran merupakan judul program.

float jari2, Luas;

merupakan deklarasi, dan selebihnya bagian pernyatan.

3.6.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.6.2 Bagian Deklarasi


Pada bagian ini dideklarasikan : tipe, variabel, konstanta, dan fungsi.

1. Deklarasi tipe

Digunakan untuk membuat tipe bentukan atau tipe khusus yang nantinya digunakan
dalam deklarasi variabel.

34
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 :

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 :

int x;

float p,q,r;

char a,b;

boolean m,n;

3. Deklarasi konstanta

Deklarasi ini untuk mendefinisikan nama yang memiliki nilai tetap.

35
Bagian umum deklarasinya adalah :

CONST identifier = nilai;

Contoh :

CONST phi = 3.14;

x= 2;

y = ‘S’;

3.6.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 ”{”.

3.7 Rangkuman
Data diproses atau diolah menjadi informasi, data supaya bisa diolah harus disimpan (dalam
RAM) dan untuk menyimpannya diperlukan variabel RAM. Dalam pemrograman setiap
penggunaan variabel harus dideklarasikan terlebih dahulu yaitu tipe datanya apa dan berapa
byte ukurannya.

Ada 2 macam jenis data, data numerik (bilangan) dan data non-numerik, data bilangan ada
bilangan bulat dan riil, sedangkan data non-numerik bisa berupa karakter, string dan Boolean
(true, false). Kemudian data diolah menggunakan operasi, ada 5 macam operasi yaitu
aritmatika, relasional, logika, pemberian nilai dan operasi bitwise. Terakhir, data diinputkan
menggunakan perintah input (cin), sedangkan informasi dicetak ke layer monitor menggunakan
perintah output (cout).

3.8 Bahan Diskusi


1. Mengapa kita perlu mengetahui ukuran memory dari suatu tipe data?
2. Dari macam-macam operator yang digunakan dalam suatu ekspresi kita juga harus
mengetahui tingkat prioritasnya, mengapa demikian?

3.9 Daftar Pustaka


1. Alfred V. Aho,dkk., 1988, Data Structures and Algorithms,
2. Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.
36
3.9 Latihan soal
1. Tulislah rumus berikut dalam bahasa C++ :

4 3
V = r
a. 3

a −b b
m= (1 − )
b. 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 − x2)2 + ( y1 − y 2)2

37
BAB IV - STRUKTUR RUNTUNAN DAN PENCABANGAN
Capaian Pembelajaran Mata Kuliah
Mahasiswa memiliki pengetahuan mengenai struktur data sederhana dan bahasa
pemrograman.

4.1 Pendahuluan
Pada bab ini dijelaskan struktur pada algoritme atau pemrograman. Pada bab ini
dijelaskan 2 dari 3 struktur tersebut, yaitu struktur runtunan dan struktur percabangan.

4.2 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.

1. //Program Tukar;
2. #include<iostream>
3. using namespace std;
4. int A,B, temp;
5. int main()
6. {
7. cout<<”Masukkan nilai A : ”; cin>>A;
8. cout<<”Masukkan nilai B : ”; cin>>B;
9. temp=A; A=B; B= temp;
10. cout<<”Nilai A sekarang = “<< A;
11. cout<<”Nilai B sekarang = “<< B;
12. return 0;
13. }

Jika urutan instruksi di atas diubah, maka hasilnya juga berubah. Misal:

temp=A;

A=B;

B= temp;

diubah menjadi :

temp=A;
38
B= temp;

A=B;

Silakan dicek sendiri.

4.3 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.3.1 Satu Kasus


Bentuk umum untuk kasus satu kasus :
if(kondisi) aksi ;

Contoh program dengan satu kasus :

1. //Program BilanganGenap;
2. #include<iostream>
3. using namespace std;
4. int Bil;
5. int main(){
6. cout<<”Masukkan bilangan”;
7. cin>>Bil;
8. if(bil mod 2 == 0) Cout<<Bil<<” adalah bilangan genap”;
9. return 0;
10. }

39
4.3.2 Dua Kasus
Bentuk umum untuk kasus dua kasus :

1. if(kondisi) aksi1;
2. else aksi 2;

Contoh program dengan dua kasus :

1. //Program BilanganGenapGanjil;
2. #include<iostream>
3. using namespace std;
4. int Bil;
5. int main(){
6. cout<<”Masukkan bilangan : “; cin>>Bil;
7. if(bil mod 2 == 0) cout<<Bil<<” adalah bilangan genap”;
8. else Cout<<Bil<<” adalah bilangan ganjil”;
9. return 0;
10. }

4.3.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:

1. //Program KonversiNilai;
2. /*Program untuk merubah nilai angka menjadi nilai huruf*/
3. #include<iostream>
4. using namespace std;
5. int Nilai;
6. int main(){
7. cout<<”Masukkan bilangan”; cin>>Nilai>>;
8. if(Nilai>= 80) cout<<”Nilai =A”<<endl;
9. else {if(Nilai>= 65) cout<<”Nilai = B”<<endl;
10. else {if(Nilai>= 50) cout<<”Nilai = C”<<endl;
11. else {if(Nilai>= 35) cout<<”Nilai = D”<<endl;
12. else cout<<”Nilai = E”<<endl;
13. }
14. }
15. }
16. return 0;
17. }

40
4.3.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 :

1. //Program KonversiNilai;
2. //Program untuk merubah nilai angka menjadi nilai huruf
3. #include<iostream>
4. using namespace std;
5. int NilaiAngka;
6. int main()
7. {
8. cin<<” Masukkan bilangan”; cin>>NilaiAngka;
9. switch (NilaiAngka/10){
10. case 10 :
11. case 9 : cout<<“Nilai = A”; break;
12. case 8 :
13. case 7 : cout<<“Nilai = B”; break;
14. case 6 :
15. case 5 : cout<<“Nilai = C”; break;
16. case 4 :
17. case 3 : cout<<“Nilai = D”; break;
18. case 2 :
19. case 1 :
20. case 0 : cout<<“Nilai = E”; break;
21. default: cout<<” Masukkan nilai salah”;
22. }
23. return 0;
24. }

Nilai bisa berupa nilai tunggal atau beberapa nilai yang disebutkan satu per satu.

41
4.4 Rangkuman
Proses pengolahan data menjadi informasi, selain menggunakan operasi pada data, juga
diperlukan perintah atau statemen untuk mengontrol proses, ada 2 macam perintah untuk
mengontrol proses, yaitu pencabangan dan pengulangan. Pencabangan terdiri dari 1 cabang
atau kasus, 2 kasus dan banyak kasus.

4.5 Bahan Diskusi


1. Bagaimana cara menentukan perintah pencabangan dalam suatu kasus, kapan digunakan
if, if else atau switch?.
2. Carilah permasalahan yang cocok menggunakan pencabangan 1 kasus, 2 kasus dan
banyak kasus.
4.6 Daftar Pustaka
1 Alfred V. Aho,dkk., 1988, Data Structures and Algorithms,
2 Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.
4.7 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 perjam 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.
42
BAB V - STRUKTUR PENGULANGAN

Capaian Pembelajaran Mata Kuliah


Mahasiswa memiliki pengetahuan mengenai struktur data sederhana dan bahasa
pemrograman.

5.1 Pendahuluan
Dalam algoritme/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.

5.2 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.3 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;

43
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 “}” .

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.

1. //Program HitungFaktorial;
2. #include<iostream>
3. using namespace std;
4.
5. int i,n;
6. long Faktorial;
7. int min()
8. {
9. cout<<“Nilai faktorial berapa ?”; cin>>n;
10. Faktorial =1;
11. for(i= 1; i<=n; i++)
12. Faktorial =Faktorial * i;
13. cout<<“Nilai faktorial “<<N<<” adalah =”<<Faktorial<<endl;
14. return 0;
15. }

Contoh program menghitung nilai faktorial untuk for menurun.

1. //Program HitungFaktorial;
2. #include<iostream>
3. using namespace std;
4. int i,n;
5. long Faktorial;
6. int min()
7. {
44
8. cout<<“Nilai faktorial berapa ?”; cin>>n;
9. Faktorial =1;
10. For(i=n; i>=1; i--)
11. Faktorial =Faktorial * i;
12. cout<<“Nilai faktorial “<<N<<” adalah =”<<Faktorial<<endl;
13. return 0;
14. }

5.4 Struktur WHILE


Bentuk umum struktur WHILE :

while kondisi

aksi;

Aksi akan dilaksanakan berulangkali selama kondisi bernilai true.

Contoh program menghitung nilai faktorial :

1. //Program HitungFaktorial;
2. #include<iostream>
3. using namespace std;
4.
5. int i,n;
6. long Faktorial;
7. int main()
8. {
9. cout<<“Nilai faktorial berapa ?”; cin>>n;
10. Faktorial =1; i=1;
11. while (i<=n)
12. {
13. Faktorial =Faktorial * i;
14. i=i + 1;
15. }
16. cout<<“Nilai faktorial “<<N<<“ adalah =’,Faktorial);
17. retun 0;
18. }

5.5 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;

45
1. #include<iostream>
2. using namespace std;
3.
4. int i,n;
5. long Faktorial;
6. int main() {
7. cout<<“Nilai faktorial berapa ?”; cin>>n;
8. Faktorial=1; i=1;
9. do
10. Faktorial =Faktorial * i;
11. i=i + 1;
12. while(i <= n);
13. cout<<”Nilai faktorial” <<N<<” adalah = “<<Faktorial<<endl;
14. return 0;
15. }

5.6 Rangkuman
Perintah atau statemen untuk mengontrol proses, ada 2 macam yaitu pencabangan dan
pengulangan. Pengulangan ada 3 macam yaitu for, while dan do while. Masing-masing perintah
pengulangan digunakan sesuai kasusnya, secara umum pengulangan bisa menggunakan while,
hanya untuk kasus yang sudah pasti berapa kali diulang sebaiknya menggunakan for, do while
hamper sama dengan while hanya pengecekan kondisi dilakukan di belakang setelah perintah
yang diulang dikerjakan sekali.

5.7 Bahan Diskusi


1. Bagaimana cara menentukan perintah pengulangan dalam suatu kasus, kapan digunakan
for, while atau do while?.
2. Carilah permasalahan yang cocok menggunakan pengulangan for, while dan do while.
5.8 Daftar Pustaka
1. Alfred V. Aho,dkk., 1988, Data Structures and Algorithms,
2. Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.
5.9 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.
46
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.

47
BAB VI - SUB PROGRAM
Capaian Pembelajaran Mata Kuliah
Mahasiswa memiliki pengetahuan mengenai pemrograman modular/subprogram dan dapat
mengimplementasikan dalam program komputer.

6.1 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.

6.2 Pendeklarasian Fungsi tanpa pengembalian nilai


Bentuk deklarasi fungsi tanpa pengembalian nilai (tanpa parameter) adalah :
void NamaFungsi;
Bagian_deklarasi;
{
Bagian pernyataan;
}
Contoh :

1. void HitungLuasSegitiga();
2. float alas, tinggi, Luas;
3. {
4. cout<<“Masukkan panjang alas segi tiga :”; cin>>alas;
5. cout<<“Masukkan tinggi segi tiga :”; cin>>tinggi;
6. Luas=(1/2)*alas*tinggi;
7. cout<<“Luas segi tiga = “<<Luas<<endl;
8. }

6.3 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.

48
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 fungsi HitungLuasSegitiga di atas :

int main(){

HitungLuasSegitiga();

6.4 Variabel Global dan Lokal


Variabel yang dideklarasikan dalam fungsi 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.

1. //Program TukarNilai;
2. #include<iostream>
3. using namespace std;
4.
5. int A, B; //A,B variabel global
6. void Tukar();
7. int temp; //temp variabel lokal
8. {
9. temp= A;
10. A= B;
11. B=temp;
12. }
13. int main() {
14. cout<<“Masukkan nilai A = “<<endl;cin>>A;
15. cout<<“Masukkan nilai B = “<<endl;cin>>B;
16. Tukar();
17. cout<<“Nilai A sesudah ditukar = “<<A<<endl;
18. cout<<“Nilai B sesudah ditukar = “<<B<<endl;
19. return 0;
20. }

6.5 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.

49
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
fungsi. Pada bahasa pemrograman seperti C++, parameter masukan dinamakan parameter by
value.

Parameter keluaran adalah parameter yang menampung keluaran yang dihasilkan oleh
fungsi. Pada bahasa pemrograman seperti C++, parameter keluaran dinamakan parameter by
reference.

Parameter masukan/keluaran adalah parameter yang berlaku sebagai masukan sekaligus


keluaran bagi fungsi tersebut. Pada bahasa pemrograman seperti C++, parameter
masukan/keluaran termasuk dalam parameter by reference.

Pada C++, parameter formal by value tidak menggunakan karakter "&" dalam
deklarasinya, sedangkan parameter by reference menggunakannya, tepat sebelum nama
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:

1. //Program SegitigaKarakter;
2. #include<iostream>
3. using namespace std;
4.
5. int M;
6. char K;
7. void CetakSegitiga(char C; int N);
8. {
9. for(int i=1; i<=n; i++)
10. {
11. for(int j=1; j<=i; j++)
12. cout<<C;
13. cout<<endl;
14. }
15. }
50
16.
17. int main() {
18. cout<<“Masukkan karakter yang akan dicetak <<endl; cin>>K;
19. cout<<“Masukkan tinggi segi tiga :”; cin>>M;
20. CetakSegitiga(K,M);
21. return 0;
22. }

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 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 :

1. //Program ABC;
2. #include<iostream>
3. using namespace std;
4.
5. int A, B, C;
6. void XYZ(int X,Y; int &Z);
7. {
8. //X dan Y parameter masukan, Z parameter keluaran}
9. X= X + 1;
10. Y= Y + 1;
11. Z = X + Y;
12. }
13.
14. int main()
15. {
16. A= 2;
17. B= 5;
18. XYZ(A,B,C); {Pemanggilan fungsi XYZ}
19. cout<<A<<" "<< B<<" "<<C); //Menampilkan nilai A, B, dan C setelah pemangg
ilan fungsi
20. return 0;
21. }

Pada Program ABC di atas, X dan Y adalah parameter masukan, sedangkan Z adalah
parameter keluaran. Ketika fungsi 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 yang diisikan). Sehingga setelah

51
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 fungsi sekaligus


menampung nilai keluaran fungsi. Sehingga bila keluarannya berbeda dengan masukannya,
maka hasilnya mengikuti nilai keluarannya.

Contoh Program TukarNilai berikut : 2 nilai integer A dan B merupakan parameter


formal fungsi Tukar. Setelah instruksi di dalam fungsi 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 fungsi.

Program TukarNilai;

1. #include<iostream>
2. using namespace std;
3.
4. int X, Y;
5. void Tukar (int &A; int &B);
6. int temp;
7. {
8. temp = A;
9. A = B;
10. B=temp;
11. }
12. int main() {
13. X= 2; Y= 5;
14. Tukar (X,Y);
15. cout<<“Nilai X setelah ditukar = “<<X<<endl;
16. cout<<“Nilai Y setelah ditukar = “<<Y<<endl;
17. return 0;
18. }

6.6 Rangkuman
Subprogram adalah semacam program di dalam program, dalam Bahasa pemrograman C++
subprogram sering disebut fungsi. Ada 2 macam fungsi, yaitu fungsi tanpa mengembalikan
nilai ( tanpa perintah return) yang mempunyai tipe void dan fungsi dengan mengembalikan
nilai, fungsi dengan tipe selain void dan terdapat perintah return.

Pada fungsi yang penting untuk diperhatikan adalah tentang input dan outputnya, yang
dapat berupa parameter dari suatu fungsi. Fungsi tanpa mengembalikan nilai mempunyai input
dan output yang beragam, antara lain bisa melalui paramaternya, jika output maka
parameternya diberi simbul & di depan variabelnya, menunjukkan addres dari variabelnya
52
sehingga diharapakan nilai yang tersimpan pada variabel tersebut tetap terjaga nilainya, berbeda
jika tanpa simbul & makan hanya nilainya yang digunakan ( sebagai input).

6.7 Bahan Diskusi


1. Bagaimana peran fungsi dalam pembuatan program yang baik atau terstruktur.
2. Selain menggunakan simbul & pada parameter output, juga dapat menggunakan simbul
pointer * , bagaimana perbedaannya?
6.8 Daftar Pustaka
1 Alfred V. Aho,dkk., 1988, Data Structures and Algorithms,
2 Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.
6.9 Latihan Soal
1. Buatlah fungsi untuk mencari bilangan terbesar dari 3 bilangan integer A, B, dan C.

2. Buatlah fungsi menghitung nilai rata-rata dari N buah bilangan.

53
BAB VII - FUNGSI DENGAN PENGEMBALIAN NILAI
Capaian Pembelajaran Mata Kuliah
Mahasiswa memiliki pengetahuan mengenai pemrograman modular/subprogram dan
dapat mengimplementasikan dalam program komputer.

7.1 Pendahuluan
Pada bab ini akan dijelaskan sub program yag kedua, yaitu fungsi yang mengembalikan
nilai.

7.2 Fungsi dengan Pengembalian Nilai


Fungsi dengan pengembalian nilai adalah sub program yang
memberikan/mengembalikan sebuah nilai dari tipe tertentu. Sebagaimana halnya fungsi tanpa
pengembalian nilai, fungsi ini diakses dengan memanggil namanya. Selain itu, fungsi ini juga
dapat mengandung daftar parameter formal. Parameter formal pada fungsi ini selalu berupa
parameter masukan, karena parameter pada fungsi merupakan masukan yang digunakan oleh
fungsi tersebut untuk menghasilkan nilai.

7.3 Pendeklarasian Fungsi dengan Pengembalian Nilai


Deklarasi fungsi adalah :

Tipe_data NamaFungsi(daftar parameter masukan):;

bagian deklarasi
{
Bagian Pernyataan;
Return nilai_fungsi;
}
7.4 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.

1. peubah = NamaFungsi(daftar parameter aktual);


atau dimanipulasi langsung seperti :
2. cin>>NamaFungsi(daftar parameter aktual);
54
3. if NamaFungsi(daftar parameter aktual) > 0 ....
4. y = 2* NamaFungsi(daftar parameter aktual) +3;
Contoh 1 :

1. //Program Terbesar
2. #include<iostream>
3. using namespace std;
4.
5. int A,B,C,D,Z;
6. int Maks(int X,Y)
7. {
8. int temp;
9. if(X > Y) temp= X;
10. else temp = Y;
11. return temp;
12. }
13.
14. int main() {
15. A = 3; B = 6; C= 10; D = 8;
16. cout<<"Bilangan terbesar antara "<<A<<" dan "<< B<<" adalah "<<Maks(A,B);

17. Z= Maks(C,D);
18. cout<<"Bilangan terbesar antara "<<C<<" dan "<<D<<" adalah "<< Z;
19. cout<<"Yang terbesar antara "<< A<<" "<<B<<" "<<C<<" dan "<<D;
20. If(Maks(A,B) > Maks(C,D))
21. cout<<" adalah = "<< Maks(A,B));
22. cout<<" adalah = "<< Maks(C,D));
23. return 0;
24. }

Contoh 2 :

1. //Program menghitung nilai factorial


2. #include<iostream.h>
3. #include<conio.h>
4. int faktorial(int bil)
5. {
6. int i,f;
7. f=1;
8. for (i=1;i<=bil;i++)
9. {
10. f=f*i;
11. }
12. return f;
13. }
14. int main()
15. {
16. int f1,b;
17. cout<<" Pakai fungsi biasa : "<<endl;
18. cout<<"bilangan = "; cin>>b;
19. f1=faktorial(b);
20. cout<<f1<<endl;
21. return 0;
22. }

55
7.5 Rangkuman
Fungsi dengan mengembalikan nilai digunakan untuk kasus dimana outputnya hanya satu nilai
sehingga nilai tersebut dapat disimpan pada nama fungsinya. Fungsi jenis ini harapannya lebih
praktis dalam penggunaan, nama fungsinya bisa langsung dicetak dengan perintah output cout.

Yang perlu diperhatikan dalam fungsi dengan pengembalian nilai adalah perintah return
nya ditempatkan di bagian mana dan nilai apa yang dikembalikan.

7.6 Bahan Diskusi


1. Bagaimana jika kita akan mengembalikan nilai yang berupa pasangan 2 nilai , seperti
data koordinat dari suatu titik, apakah bisa menggunakan fungsi dengan mengembalikan
nilai.
2. Tipe apa saja yang dapat digunakan untuk memberi tipe pada fungsi dengan
mengembalikan nilai.

7.7 Daftar Pustaka


1 Alfred V. Aho,dkk., 1988, Data Structures and Algorithms,
2 Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.
7.8 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 :

d= (x1 − x2)2 + ( y1 − y 2)2


2. Buatlah fungsi untuk mengembalikan nilai mutlak x.

56
BAB VIII - TIPE DATA ARRAY

Capaian Pembelajaran Mata Kuliah


Mahasiswa dapat membuat program komputer dengan menggunakan struktur data
sederhana, seperti larikan, matriks, dan record/struct.

8.1 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.

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.

8.2 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.

8.3 Mengakses Data:


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 :

57
Saat ditentukan suatu variabel bertipe data array maka ia akan langsung mengambil
tempat pada memory penyimpanannya sesuai dengan tipe data yang digunakan pada array, baik
nantinya semua komponen pada array itu digunakan ataupun tidak.

8.4 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.

8.5 Contoh Kasus menggunakan tipe data array


1. Program menghitung nilai maksimum, minimum, rata-rata dari sejumlah data integer.

1. int main ()
2. {
3. int i,n,maks,min,jum,h;
4. int nilai[10];
5. float rerata;
6. cout<<"Banyaknya data =";
7. cin>>n;
8. jum=0;
9. for (i=1;i<=n;i++)
10. {
11. cout<<"Data ke - " <<i<<"= ";
12. cin>>nilai[i-1];
58
13. jum =jum + nilai[i-1];
14. }
15. rerata= float(jum)/n;
16. maks=nilai[0];
17. min=nilai[0];
18. for (i=1;i<=n-1;i++)
19. {
20. if (nilai[i]>maks)
21. maks=nilai[i];
22. if (nilai[i]<min)
23. min=nilai[i];
24. }
25. cout<<"Nilai Terbesar ="<<maks<<endl;
26. cout<<"Nilai Terkecil ="<<min<<endl;
27. cout<<"Nilai Rata-rata ="<<rerata<<endl;
28. return 0;
29. }

2. Program penjumlahan 2 matriks

1. #include <iostream.h>
2. using namespace std ;
3. int main(){
4. //deklarasi
5. int matrix_a[3][3],matrix_b[3][3],matrix_c[3][3];
6. int i,j;
7. char opr;
8. //input nilai matriks ke-1 dari baris dan kolom
9. for(i=1;i<=3;i++){
10. for(j=1;j<=3;j++){
11. cout<<"Masukkan matriks(1) nilai baris ke-"<<i<<"kolom ke-
"<<j<<" : ";
12. cin>>matrix_a[i-1][j-1];
13. }
14. cout<<endl;
15. }
16. //output matriks ke-1
17. for(i=1;i<=3;i++){
18. for(j=1;j<=3;j++){
19. cout<<matrix_a[i-1][j-1]<<"\t";
20. }
21. cout<<endl;
22. }
23. //input nilai matriks ke-2 dari baris dan kolom
24. for(i=1;i<=3;i++){
25. for(j=1;j<=3;j++){
26. cout<<"Masukkan matriks(2) nilai baris ke-"<<i<<"kolom ke-
"<<j<<" : ";
27. cin>>matrix_b[i-1][j-1];
28. }
29. cout<<endl;
30. }
31. //output matriks ke-2
32. cout<<endl;

59
33. for(i=1;i<=3;i++){
34. for(j=1;j<=3;j++){
35. cout<<matrix_b[i-1][j-1]<<"\t";
36. }
37. cout<<endl;
38. }
39. //Input Operator
40. cout<<"Tulis operator ";
41. cin>>opr;
42. //switching operator
43. for(i=1;i<=3;i++){
44. for(j=1;j<=3;j++){
45. switch(opr){
46. case '+' : matrix_c[i-1][j-1] = matrix_a[i-1][j-
1] + matrix_b[i-1][j-1];
47. break;
48. case ‘-‘ : matrix_d[i-1][j-1] = matrix_a[i-1][j-
1] - matrix_b[i-1][j-1];
49. break;
50. }
51. }
52. }
53.
54. //Output Hasil matriks dari Operator +
55. cout<<endl;
56. for(i=1;i<=3;i++){
57. for(j=1;j<=3;j++){
58. cout<<matrix_c[i-1][j-1]<<"\t";
59. }
60. cout<<endl;
61. }
62. //Output Hasil matriks dari Operator -
63. cout<<endl;
64. for(i=1;i<=3;i++){
65. for(j=1;j<=3;j++){
66. cout<<matrix_d[i-1][j-1]<<”\t”;
67. }
68. cout<<endl;
69. }
70. return 0;
71. }

8.6 Array di dalam Fungsi


Berikut adalah program untuk menentukan rerata, maksimum dan minimum pada array dengan
menggunakan fungsi.

1. #include <iostream>
2. #include <conio.h>
3. using namespace std;
4. typedef int larik[100000];
5.
6. void bacadata(larik x, int& n)
7. {
8. srand(time(NULL));
9. cout << "banyak data :";

60
10. cin >> n;
11. for (int i = 1; i <= n; i++) {
12. x[i] = rand() % 100 + 1;
13. }
14. }
15. float rerata(larik y, int m)
16. {
17. long long sum = 0;
18. for (int i = 1; i <= m; i++)
19. sum += y[i];
20. return (float)sum / m;
21. }
22.
23. void maxmin(larik x, int n, int& max, int& min)
24. {
25. max = x[1];
26. min = x[1];
27. for (int i = 2; i <= n; i++)
28. if (x[i] > max)
29. max = x[i];
30. else if (x[i] < min)
31. min = x[i];
32. }
33.
34. void cetak(larik x, int n)
35. {
36. for (int i = 1; i <= n; i++) {
37. cout << x[i] << " ";
38. if (i % 20 == 0)
39. cout << endl;
40. }
41. cout << "\n";
42. getch();
43. }
44.
45. int main()
46. {
47. larik y;
48. int m, max, min;
49. bacadata(y, m);
50. cetak(y, m);
51. cout << "\nrata-rata = " << rerata(y, m) << endl;
52. maxmin(y, m, max, min);
53. cout << "maximum = " << max << endl;
54. cout << "minimum = " << min << endl;
55. getch();
56. return 0;
57. }

8.7 Rangkuman
Array merupakan tipe data yang dapat menangani banyak data yang besar tapi setipe,
dengan menggunakan variabel array kita cukup terbantu untuk menangani data yang banyak,
cukup hanya dengan satu nama variabel, elemennya dapat diakses menggunakan indeksnya.

61
Array bisa 1 dimensi atau berdimensi banyak, array 1 dimensi digunakan untuk
menyimpan larikan, array 2 dimensi bisa digunakan untuk menyimpan data matriks, data
gambar.

8.8 Bahan Diskusi


1. Bagaimana jika kita mendeklarasikan variabel array 1 dimensi dengan ukuran besar
sekali, ratusan juta, apakah bisa?
2. Bagaimana cara menghapus 1 elemen data array, yang posisinya bisa di indeks awal,
tengah atau indeks akhir.
8.9 Daftar Pustaka
1 Alfred V. Aho,dkk., 1988, Data Structures and Algorithms,
2 Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.

8.10 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.

62
BAB IX - TIPE DATA STUKTUR

Capaian Pembelajaran Mata Kuliah


Mahasiswa dapat membuat program komputer dengan menggunakan struktur data
sederhana, seperti larikan, matriks, dan record/struct.

9.1 Pendahuluan
Pada bab ini akan dijelaskan tipe data struktur dan array dengan elemennya bertipe
struktur.

9.2 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;

9.3 Akses dan Input Data Struktur


Untuk mengaksesvariabel bertipe struct :

nama_struktur.namafield
63
Untuk pembacaan nilai :

cin>> nama_struktur.namafield

Contoh : cin>>mhs.NIM;

Untuk penulisan nilai :

cout<< nama_struktur.namafield

Contoh : cout<<mhs.NIM;

9.4 Array bertipe Struktur


Untuk bisa memanipulasi sejumlah data bertipe struktur maka digunakan array dengan
elemen bertipe struktur.

Contoh : untuk menyimpan 100 data mahmahasiswa 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];

9.5 Contoh Kasus


1. Program membaca dan menampilkan data mahasiswa yang terdiri dari NIM, Nama, dan IPK
:

1. #include <iostream.h>
2. #include <conio.h>
3. int main()
4. {
5. struct mahasiswa {
6. char nim[5];
7. char nama[30];
8. float ipk;
9. } mhs;
10. cout<<"Masukkan NIM : ";
11. cin.getline(mhs.nim,5);
64
12. cout<<"Masukkan Nama : ";
13. cin.getline(mhs.nama,30);
14. cout<<"Masukkan IPK : ";
15. cin>>mhs.ipk;
16. cout<<"Data mahasiswa yang dimasukkan : "<<endl;
17. cout<<"NNIM Mahasiswa : "<<mhs.nim<<endl;
18. cout<<"Nama Mahasiswa : "<<mhs.nama<<endl;
19. cout<<"IPK Mahasiswa : "<<mhs.ipk;
20. return 0;
21. }

2. Program membaca dan menampilkan sejumlah data mahasiswa, dengan setiap data
mahasiswa terdiri dari NIM, Nama, dan IPK :

1. #include <iostream.h>
2. #include <conio.h>
3. int main ()
4. {
5. int i,n;
6. struct mahasiswa {
7. char nim[5];
8. char nama[30];
9. float ipk;
10. };
11. struct mahasiswa mhs[5];
12. cout<<"Barapa data mahasiswa ?";
13. cin>>n;
14. for (i=0;i<n;i++)
15. {
16. cout<<"Mahasiswa ke - "<<i+1<<": "<<endl;
17. cout<<"Masukkan NIM : ";
18. cin>>mhs[i].nim;
19. cin.getline(mhs[i].nama,30);
20. cout<<"Masukkan Nama : ";
21. cin.getline(mhs[i].nama,30);
22. cout<<"Masukkan IPK : ";
23. cin>>mhs[i].ipk;
24. }
25. cout<<"Data mahasiswa yang dimasukkan : "<<endl;
26. for (i=1;i<=n;i++)
27. {
28. cout<<"Mahasiswa ke - "<<i<<": "<<endl;
29. cout<<"NIM : "<<mhs[i-1].nim<<endl;
30. cout<<"Nama : "<<mhs[i-1].nama<<endl;
31. cout<<"IPK : "<<mhs[i-1].ipk<<endl;
32. cout<<endl;
33. }
34. return 0;
35. }

65
9.6 Fungsi dalam struktur
Fungsi dapat didefinisikan dalam struktur sehingga lebih sederhana dan dapat mengurangi
jumlah parameternya.

Sebagai contoh perhatikan program berikut :

1. #include <iostream>
2. #include <string.h>
3. #include <conio.h>
4. using namespace std;
5.
6. typedef struct {
7. string no_hp, nama;
8. string Operator()
9. {
10. string kartu;
11. if (no_hp[4] == 49 && no_hp[5] == 49)
12. kartu = "Halo";
13. else if (no_hp[4] == 49)
14. kartu = "Simpati";
15. else if (no_hp[4] == 53 && no_hp[5] == 50)
16. kartu = "As";
17. else if (no_hp[4] == 55 || (no_hp[4] == 49 && no_hp[5] == 56))
18. kartu = "XL";
19. else if (no_hp[4] == 51)
20. kartu = "Axis";
21. else if (no_hp[4] == 57)
22. kartu = "Tri";
23. else if (no_hp[4] == 53 || no_hp[4] == 54)
24. kartu = "M3";
25. else
26. kartu = "Operator lain";
27. return kartu;
28. }
29. } kontak;
30. typedef kontak larik[102];
31. int i, kk = 0;
32. void buatdata(larik x, int& n)
33. {
34. char c, d, e;
35. int k, i, j;
36. bool b, cek[10];
37. cout << "banyak kontak : ";
38. cin >> n;
39. srand(time(NULL));
40. for (i = 1; i <= n; i++) {
41. x[i].no_hp = "+628";
42. for (j = 0; j < 10; j++) {
43. c = rand() % 9;
44. x[i].no_hp += 49 + c;
45. }
46. x[i].nama = "";
47. for (j = 0; j < 10; j++) {
48. d = (65 + rand() % 20);
49. x[i].nama += d;

66
50. }
51. }
52. }
53.
54. void cetak(larik x, int n)
55. {
56. int i, j, p;
57. for (i = 1; i <= n; i++) {
58. cout << x[i].nama << " "
59. << " " << x[i].no_hp << " " << x[i].Operator();
60. cout << endl;
61. }
62. cout << endl;
63. }
64.
65. void cetakOperator(larik x, int n, string noperator)
66. {
67. for (int i = 1; i <= n; i++) {
68. if (x[i].Operator() == noperator) {
69. cout << x[i].nama << " "
70. << " " << x[i].no_hp << " " << x[i].Operator();
71. cout << endl;
72. }
73. }
74. }
75.
76. int main()
77. {
78. int n;
79. larik x, y, z;
80. buatdata(x, n);
81. cetak(x, n);
82. cetakOperator(x, n, "Simpati");
83. getch();
84. return 0;
85. }

9.7 Rangkuman
Tipe struct sangat bermanfaat untuk menangani data yang beragam, hampir semua data di
dunia bentuknya record/struct dengan salah satu fieldnya berupa waktu. Array dari tipe
struct dapat menangani data yang banyak dan beragam, seperti data pegawai, data siswa,
data penduduk dll.

9.8 Bahan Diskusi


1. Bagaimana jika variabel struct mempunyai beberapa field yang tipenya semua sama,
apakah masih diperlukan struct?
2. Apakah dengan struct kita dapat menghemat memory? Atau justru menambah
kebutuhan memory?

67
9.9 Daftar Pustaka
1 Alfred V. Aho,dkk., 1988, Data Structures and Algorithms,
2 Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.

9.10 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.

68
BAB X - REKURSI

Capaian Pembelajaran Mata Kuliah


Mahasiswa memiliki pengetahuan mengenai pemrograman modular/subprogram dan
dapat mengimplementasikan dalam program komputer.

10.1 Pendahuluan
Pada bab ini dijelaskan konsep rekursi dan contoh penggunaannya.

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, jika m = 0
m! = 
1x 2 x3 x 4....xm jika m  0

Pemecahan secara rekursif :

0!=1 (penghentian rekursi)

jika m > 0, m ! = m x (m-1) ! (langkah induksi)

10.2 Fungsi Rekursif


Fungsi yang memanggil dirinya sendiri disebut fungsi rekursif. Contoh fungsi rekursif
untuk menghitung faktorial.

1. long fact(int m);


2. {
3. if(m = 0) return (1);
4. else return (m*fact(m-1));
5. }

Jika dipanggil dengan cout << fact(3) << endl; maka hasilnya adalah 6.

69
10.3 Subprogram Rekursif
Rekursi juga bisa diterapkan pada subprogram secara umum (fungsi tanpa
pengembalian nilai). Berikut contoh fungsi Balik :

1. void Balik(int X);


2. int Sisa;
3. {
4. Cout<<(X %10)<<endl;
5. Sisa = X/10;
6. if (Sisa != 0) Balik(Sisa);
7. }

Jika fungsi di atas dipanggil dengan Balik(1024) apa hasilnya ?

10.4 Rangkuman
Fungsi rekursif adalah fungsi yang di dalamnya ada perintah untuk memanggil fungsi itu
sendiri. Rekursif sangat membantu kita menyelesaikan permasalahan yang bisa
diselesaikan secara rekursif (dekomposisi), programnya menjadi lebih ringkas.
10.5 Bahan Diskusi
Coba buatlah fungsi rekursif untuk menentukan suku ke-n dari barisan fibonachi,
bagaimana efisiensinya?
70
10.6 Daftar Pustaka
1 Alfred V. Aho,dkk., 1988, Data Structures and Algorithms,
2 Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.

10.7 Latihan Soal


1. Lihat kembali Algoritme Euclidean untuk menghitung nilai FPB. Buatlah subprogram
untuk menghitung nilai FPB berdasarlan Algoritme Euclidean, secara rekursif.
2. Buatlah fungsi rekursif dan non rekursif untuk menghitung nilai XN, dngan X bilangan
riil dan N bilangan bulat.

71
BAB XI - PENGURUTAN DATA SEDERHANA
Capaian Pembelajaran Mata Kuliah
Mahasiswa dapat menjelaskan dan cakap dalam mengimplementasikan algoritme sorting dan
searching.

11.1 Pendahuluan
Pada bab ini dijelaskan beberapa algoritme pengurutan data (sorting), yaitu : bubble
sort, selection sort, dan insertion sort.
Pengurutan atau sorting merupakan proses untuk menyusun kembali kumpulan entri-
entri yang telah dimasukkan dengan suatu aturan tertentu. Secara umum ada 2 macam
pengurutan yaitu pengurutan secara menaik (ascending) dan pengurutan secara menurun
(descending).
11.2 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.

Algoritme 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
Algoritme Selection sort :

1. for(int i=1;i<=n-1;i++)
2. {
3. terkecil = i;
4. for (j = i; j<= n-1; j++)
5. {
6. if (A[terkecil] > A[j]) {
7. terkecil =j;
8. }
9. }
10. t=A[i];
11. A[i]=A[terkecil];
12. A[terkecil]=t;
13. }

72
11.3 Bubble Sort
Disebut juga dengan metode Penukaran (Exchange Sort), yaitu metoda yang
mendasarkan pada penukaran elemen untuk mencapai keadaan urut yang diinginkan.

Algoritme 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

1. //bubblesort
2. for(int i=1;i<=n-1;i++)
3. for (int j=1;j<=n-i;j++) {
4. if (A[j] > A[j+1]) {
5. t=A[j];
6. A[j]=A[j+1];
7. A[j+1]=t;
8. }
9. }

11.4 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 pertambahan 1. Elemen
ke i diambil dari kelompok sumber dan akan dipindahkan ke kelompok tujuan dengan cara
menyisipkannya pada tempatnya yang sesuai.

Algoritme 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

73
1. for(int i=1;i<=n;i++){
2. j=i-1;
3. s=A[i];
4. while (j>0 && A[j]>s)
5. {
6. A[j+1]=A[j];
7. j--;
8. }
9. A[j+1]=s;
10. }

11.5 Rangkuman
Pengurutan data adalah mengaturan data agar urutannya menaik atau menurun, algoritme
pengurutan yang sederhana mudah difahami akan tetapi waktu prosesnya agak lambat
terutama untuk banyak data yang besar.

Ada 3 algoritme pengurutan data yang termasuk sederhana, yaitu bubble sort,
selection sort dan insertion sort, dari ketiga algoritme tersebut, insertion sort yang paling
cepat dan bubble sort yang paling lambat, walaupun ketiganya mempunyai kompleksitas
waktu yang sama yaitu kwadratis.

11.6 Bahan Diskusi


1. Mengapa bubble sort lebih lambat dibanding selection sort, berikan ulasannya
2. Mengapa insertion sort lebih cepat dibandingkan 2 algoritme yang lainnya.
11.7 Daftar Pustaka
1 Alfred V. Aho,dkk., 1988, Data Structures and Algorithms,
2 Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.
11.8 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).

74
BAB XII - PENGURUTAN DATA LANJUT
Capaian Pembelajaran Mata Kuliah
Mahasiswa dapat menjelaskan dan cakap dalam mengimplementasikan algoritme sorting dan
searching.

12.1 Pendahuluan
Bab ini menjelaskan tentang algoritme sorting yang optimal yang meliputi: QuickSort,
MergeSort dan Hybrid Mergesort quicksort.
Algoritme sorting sering digunakan dalam penyelesaian masalah pemrograman dan
biasanya melibatkan data yang cukup besar.
12.2 Algoritme Quick Sort dan Merge Sort
Algoritme Quick Sort dan algoritme Merge Sort dirancang dengan teknik devide and
conquer, merupakan algoritme sorting yang optimal dan sangat efisien.
Quick Sort adalah algoritme yang proses pembagian data dengan cara partisi, sehingga
diharapkan lebih menghemat memory. Teknik devide and conquer yang digunakan yaitu
dengan mempartisi data yang disimpan di array X menjadi 2 subarray, yaitu subarray1 berisi
data yang ≤ bound dan subarray2 berisi data yang ≥ bound, dimana bound (pivot) adalah suatu
elemen yang diharapkan bisa membagi X menjadi 2 subarray yang banyak datanya seimbang,
kemudian terhadap masing-masing subarray dilakukan dengan cara yang sama secara rekursif.
Algoritme QuickSort secara rekursif dapat dinyatakan sebagai berikut :
Subprogram QuickSort (X[ ], n) {
If ( n>1) then {
Pilih bound;
Partisi (X, bound);
QuickSort(subarray1, j-1);
QuickSort(subarray2, j+1);
}
}
Sedangkan subprogram Partisi adalah sebagai berikut :
Subprogram Partisi (X[ ], first, last ) {
bound = X[first];
i = first +1; j=last;
while ( i<j ) {
75
while (X[ i ] < bound ) i = i + 1;
while (X[ j ] > bound ) j = j – 1;
if ( i < j ) Swap(X[ i ], X[ j ]);
}
Swap( X[ first ], X[ j ]);
}
Algoritme QuickSort mempunyai kelemahan yaitu untuk keadaan worstcase, salah satu
subarray selalu kosong, kompleksitas waktunya O(n2), hal ini karena sangat sulit untuk
mengontrol proses partisi. Algoritme MergeSort membagi data yang disimpan di larik X
menjadi 2 subarray yang berukuran sama dan mengurutkan masing-masing subarray dengan
cara rekursif kemudian melakukan merge kedua subarray yang sudah terurut tersebut.

Implementasi dari algoritme merge sort memakai tiga buah tabel, dua untuk menyimpan
elemen dari tabel yang telah di bagi dua dan satu untuk menyimpan elemen yang telah terurut.
Namun algoritme ini dapat juga dilakukan langsung pada dua tabel, sehingga menghemat ruang
atau memori yang dibutuhkan.
Subprogram MergeSort secara rekursif adalah sebagai berikut :
Subprogram MergeSort (X[ ], first, last) {
If ( first < last) then {
mid = ( first + last ) / 2 ;
MergeSort(X[ ], first, mid);
MergeSort(X[ ], mid + 1, last);
Merge(X[ ], first, mid, last);
}
}
Sedangkan subprogram Merge adalah sebagai berikut :
Subprogram Merge (X[ ], first, mid, last ) {
I = first; j = mid + 1;k = 0;
while ( i ≤ mid or j ≤ last ) {
if ( X[ i ] < X[ j ] ) {Temp[k] = X[ i ]; i = i + 1;}
else {Temp[k] = X[ j ]; j = j + 1;}
}
Masukkan data yang tersisa ke dalam Temp;
76
Copy Temp ke array X;
}

Berikut adalah program tentang Merge Sort dan Quick Sort.

#include<iostream>
#include<stdlib.h>
#include<conio.h>
using namespace std;

typedef int larik[250001];


long long c=0;
int n,cc=0;

void cetakdata(larik x,int n)


{int i;
for (i=1;i<=n;i++) {
cout<<x[i]<<" ";
}
cout<<endl;
cout<<endl;getch();
}
void partisi(larik x,int aw,int ak,int &j)
{ int i,t,pivot;
pivot=x[aw];
i=aw;j=ak;
while (i<j){
while ((i<ak)&&(x[i]<=pivot)) {i++;cc++;}if(i<ak) cc++;
while ((j>aw)&&(x[j]>pivot)) {j--;cc++;}if(j>aw) cc++;

if (i<j) {t=x[i];x[i]=x[j];x[j]=t;}
}
x[aw]=x[j];x[j]=pivot;
}

void qsort(larik x,int aw,int ak)


{int j;
if (aw<ak) {
partisi(x,aw,ak,j);//cetakdata(x,n);
qsort(x,aw,j-1);
qsort(x,j+1,ak);
}
}

void merge(larik x, int aw,int mid,int ak)


{larik z;
int i,j,k,l;
i=aw; j=mid+1; k=aw;
77
do {
if(x[i]<=x[j]) {z[k]=x[i];i++;}
else {z[k]=x[j];j++;}
k++;}
while ((i<=mid) && (j<=ak));
if (i>mid) for (l=j;l<=ak;l++) {z[k]=x[l];k++;}
else for (l=i;l<=mid;l++) {z[k]=x[l];k++;}
for (k=aw;k<=ak;k++) x[k]=z[k];
}
void mergesort(larik x,int aw,int ak)
{int mid;
if(aw<ak) {
mid =(aw+ak)/2;
mergesort(x,aw,mid);
mergesort(x,mid+1,ak);
merge(x,aw,mid,ak);
}
}

void buatdata(larik x,int &n)


{int i;
cout<<"banyak data :";cin>>n;
srand(time(NULL));
for (i=1;i<=n;i++) {
x[i]= rand()%100+1;
cout<<x[i]<<" ";
}
cout<<endl;
}

int main()
{ int i,j;
larik x;
buatdata(x,n);
cetakdata(x,n);
clock_t begin_time = clock();
mergesort1(x,1,n);
cout << float( clock () - begin_time )/CLOCKS_PER_SEC;
cetakdata(x,n);
return 0;
}

12.3 Algoritme Hybrid MergeQuick


Algoritme pengurutan internal dalam pengurutan eksternal biasanya digunakan
algoritme quicksort karena algoritme quicksort untuk data dalam jumlah yang kecil lebih
cepat dibanding mergesort sedangkan untuk jumlah data yang besar Mergesort lebih cepat.

78
Pada penelitian ini dirancang algoritme hybrid yang memanfaatkan kelebihan dari algoritme
mergesort dan quicksort, algoritme hybrid tersebut diberi nama MergeQuick, yang
algoritmenya sebagai berikut :

Subprogram MergeQuick (X[ ], first, last) {

If ( last-first < 1000) then Quicksort(X[ ], first, last)


else {
mid = ( first + last ) / 2 ;
MergeSort(X[ ], first, mid);
MergeSort(X[ ], mid + 1, last);
Merge(X[ ], first, mid, last);
}
}
Dimana subprogram Quicksort dan subprogram Merge sama persis dengan yang sudah
dibahas pada sebelumnya.

Berikut hasil perbandingan antara algoritme MergeQuick dengan algoritme Mergesort


dan Quicksort untuk jumlah data 1 juta, 2 juta hingga 5 juta, selengkapnya dapat dilihat pada
Tabel 12.1.

Tabel 12.1 Perbandingan Waktu Proses MergeQuick dengan Mergesort dan


Quicksort

Banyak Waktu Proses (dalam detik)


data
MergeQuick MergeSort QuickSort

N=1 juta 0,354 0,419 0,464

N=2 juta 0,743 0,88 1,346

N=3 juta 1,137 1,348 2,684

N=4 juta 1,536 1,815 4,380

N=5 juta 1,957 2,342 6,584

79
Dari Tabel 12.1 menunjukkan bahwa algoritme MergeQuick lebih cepat dibanding
dengan algoritme Mergesort dan Quicksort.

12.4 Rangkuman
Algoritme pengurutan data yang optimal adalah antara lain mergesort dan quicksort,
dimana keduanya mempunyai running time n*log n , tidak ada lagi algoritme pengurutan
dengan perbandingan yang lebih cepat. Kedua algoritme menggunakan Teknik
dekomposisi yaitu devide and conquer.

Mergesort menggunakan proses merger dari sub array kiri dan sub array kanan
yang banyaknya data sama, yang sudah diurutkan secara rekursif. Quicksort menggunakan
proses partisi yaitu membagi data menjadi 2 bagian, yaitu bagian yang lebih kecil dari dta
pivot (data pertama) dan bagian yang lebih besar dari pivot, dengan kata lain proses partisi
juga menempatkan data pivot pada posisi terurutnya.

12.5 Bahan Diskusi


1. Bandingkan kecepatan ke 3 algoritme sorting optimal tersebut menggunakan bahasa
pemrograman (IDE) yang berbeda beda, bagaimana hasilnya?
2. Mengapa quicksort mempunyai kompleksitas waktu kuadratis pada kasus terburuk.
12.6 Daftar Pustaka
1 Alfred V. Aho,dkk., 1988, Data Structures and Algorithms,
2 Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.

12.7 Latihan Soal


1. Algoritme mergesort dan quicksort sama sama menggunakan teknik devide and conquer,
jelaskan apa saja perbedaan dari kedua algoritme sorting tersebut.
2. Jelaskan kelebihan dan kekurangan dari Algoritme mergesort dan quicksort.
3. Dengan menggunakan data input di bawah ini, Tuliskan urutan data sampai terurut
(acending) dan hitung berapa kali operasi perbandingan dilakukan, jika digunakan algoritme
mergesort, juga tentukan set data tsb termasuk best, worst atau avaragecase?
74, 21, 65, 35, 4, 96, 10, 32, 89, 62, 85, 32, 68, 89, 81
4. Dengan menggunakan data input di bawah ini, Tuliskan urutan data sampai terurut
(acending) dan hitung berapa kali operasi perbandingan dilakukan, jika digunakan algoritme
quicksort, juga tentukan set data tsb termasuk best, worst atau avaragecase?
74, 21, 65, 35, 4, 96, 10, 32, 89, 62, 85, 32, 68, 89, 81

80
BAB XIII – PENCARIAN DATA
Capaian Pembelajaran Mata Kuliah
Mahasiswa dapat menjelaskan dan cakap dalam mengimplementasikan algoritme sorting dan
searching.

13.1 Pendahuluan
Bab ini menjelaskan tentang algoritme pencarian data (searching) yang meliputi:
pencarian sekuensial, pencarian biner dan searching dengan menggunakan fungsi hashing.
Searching secara umum, termasuk searching dengan fungsi hashing, adalah suatu
konsekuensi dari penyimpanan data secara terstruktur dimana proses pencarian kembalinya
juga harus efisien.
Pada Bab ini, pertama akan dibahas 2 algoritme pencarian data (Searching) yang biasa
dilakukan, yaitu pencarian sekuensial (sequential search) dan pencarian biner (binary search).
Pencarian sekuensial lebih cocok digunakan untuk mencari data pada sejumlah data yang belum
terurut sedangkan pencarian biner digunakan pada sejumlah data yang sudah terurut. Kemudian
dibahas metode pencarian yang sangat efisien yaitu searching dengan fungsi hashing.
13.2 Pencarian Sekuensial
Pada pencarian sekuensial, data yang dicari, dibandingkan satu per satu dengan data
pada suatu larik data.
Algoritme globalnya adalah sebagai berikut :
Misalkan dimiliki N data integer yang disimpan pada larik X, dan data yang dicari adalah a.
1. Ketemu = 0, indeks = 1.
2. Selama data belum ketemu (ketemu = 0) dan indeks ≤N :
a. Jika X[indeks] = a, maka data ketemu, lalu nilai ketemu =1.
b. Jika X[indeks] ≠ 𝑎, maka indeks = indeks +1

Kode programnya sebagai berikut :


while ((ketemu == 0) && (indeks <= N){
if ( X[indeks]=a){
ketemu=1;}
else {
indeks = indeks +1;}
}

81
13.3 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.
Algoritme globalnya sebagai berikut :
Akan dicari data a pada larik X yang berjumlah N elemen. Larik X terurut naik (ascending).
1. Ketemu = 0, awal =1, akhir = N.
2. Selama ketemu = 0 dan awal ≤ akhir , maka tengah = (awal +akhir) / 2 :
• Jika X[tengah]=a, maka ketemu =1.

• Jika a < X[tengah], maka akhir =tengah- 1

• Jika a > X[tengah], maka awal =tengah+1

Kode programnya sebagai berikut :

awal =1; akhir = N


while ((ketemu == 0) && (awal ≤ akhir){
tengah = (awal + akhir) /2;
if (X[tengah]=a){
ketemu=1;}
else if (a < X[tengah]){
akhir = tengah-1;}
else awal = tengah +1;
}

13.4 Pencarian Dengan Fungsi Hashing


Pada metode-metode pencarian yang telah kita bahas di atas, secara umum banyaknya
pembandingan untuk mencari data atau rekaman yang diinginkan tergantung dari banyaknya
data atau rekaman yang diketahui. Jika setiap data atau rekaman bisa ditemukan dengan sekali
pemasupan terhadap tabel yang digunakan untuk menyimpan data atau rekaman tersebut, maka
lokasi data atau rekaman dalam tabel hanya tergantung dari kunci yang digunakan dan tidak
tergantung dari kunci yang lain, seperti dalam pohon. Cara yang paling efisien untuk

82
mengorganisir tabel ini adalah dengan menggunakan larik. Jika kunci berupa integer, kunci
tersebut sekaligus bisa digunakan sebagai subskrip dari larik yang dimaksud.
Suatu fungsi untuk mengkonversikan suatu data ke nomor posisi dari larik yang
diketahui. Fungsi ini disebut dengan fungsi hash. Metode pencarian yang memanfaatkan fungsi
hash disebut hashing atau hash addressing. Tujuan utama dalam penentuan fungsi hash adalah
agar dua buah kunci yang berbeda tidak mempunyai nilai hash yang sama. Jika hal ini terjadi,
akan menyebabkan terjadinya tabrakan (hash collision / hash clash).
1. Fungsi Hash
Secara umum fungsi hash (H) adalah fungsi untuk mengkonversikan himpunan kunci rekaman
(K) menjadi himpunan alaman pengingat (posisi subskrib dalam larik / L) dan bisa dituliskan
dengan menggunakan notasi
H:K→L
Dua aspek penting yang perlu dipertimbangkan dalam pemilihan fungsi hash adalah
sebagai berikut. Pertama, fungsi H harus mudah dan cepat dicari atau dihitung. Kedua, fungsi
H sebisa mungkin mendistribusikan posisi yang dimaksud secara uniform sepanjang himpunan
L, sehingga banyaknya tabrakan yang mungkin terjadi bisa diminimalkan. Secara alamiah,
tidak ada garansi yang memungkinkan bahwa aspek kedua bisa dipenuhi tanpa terlebih dahulu
mengetahui kunci-kunci yang ada. Meskipun demikian, ada beberapa metode untuk memotong-
motong kunci dalam himpunan K menjadi kombinasi tertentu yang akan dipakai sebagai fungsi
H.
Berikut disajikan beberapa cara untuk memotong-motong kunci sehingga bisa
diperoleh fungsi hash yang dengan mudah bisa dihitung.
a. Metode Pembagian
Dalam cara ini kita bisa memlih suatu perubah m yang nilainya lebih besar dibanding
banyaknya kunci dalam K, misalnya n, dan biasanya dipilih suatu bilangan prima. Fungsi
hashnya ditentukan sebagai :
H(k) = k mod m atau H(k) = k mod m + 1
Persamaan pertama dipilih apabila diinginkan alamat kunci adalah 0 sampai m – 1. Persamaan
kedua dipilih jika diinginkan alamat kunci adalah 1 sampai m. Sebagai contoh, nomor
mahasiswa terdiri dari 5 buah digit. Misalkan L terdiri dari 100 buah alamat yang masing-
masing alamat terdiri dari 2 karakter : 00...99. Nomor mahasiswa yang diketahui misalnya
10347, 87492, 34212 dan 88688. Untuk menentukan alamat dari keempat nomor mahasiswa
ini kita pilih suatu bilangan prima yang dekat dengan 99, misalnya m = 97.

83
Dengan menggunakan fungsi H(k) = k mod m, diperoleh H(10347) = 65, H(87492) =
95, H(34212) = 68, H(88688) = 30 Dengan demikian, nomor mahasiswa 10347 akan disimpan
dalam alamat 65, nomor mahasiswa 87492 akan disimpan dalam alamat 95, nomor mahasiswa
34212 akan disimpan dalam alamat 68 dan nomor mahasiswa 88688 akan disimpan dalam
alamat 30.
Jika dipilih fungsi H(k) = k mod m + 1, maka keempat nomor mahasiswa diatas masing
masing akan disimpan dalam alamat 66, 96, 69 dan 31.
b. Metode Midsquare
Dalam metode ini, kunci yang diketahui dikuadratkan dan fungsi hash yang dipilih adalah :
H(k) = l
Nilai l diperoleh dengan menghapus digit-digit pada kedua sisi dari k2, dengan catatan bahwa
banyaknya digit di sebelah kiri dan sebelah kanan harus sama. Jika tidak sama, maka pada digit
di sebelah kiri seolah-olah ditambahkan sejumlah trailing zero, sehingga
akan menghasilkan alamat yang benar. Dengan menggunakan contoh yang sama dengan diatas,
maka alamat dari masing-masing nomor mahasiswa diatas adalah :
k: 10347 87492 34212 88688
k2 : 107060409 76548500564 1170460944 7865561344
H(k): 06 85 46 56
c. Penjumlahan Digit
Dalam penjumlahan digit, kunci yang diketahui bisa dipecah menjadi beberapa kelompok yang
masing-masing terdiri dari beberapa buah digit, misalnya dua buah. Kemudian digit-digit dari
kelompok-kelompok yang ada dijumlahkan. Pemecahan dan penjumlahan terus dilakukan jika
jumlah keseluruhan kelompok yang ada masih lebih besar dari banyaknya alamat yang akan
dipakai. Dengan menggunakan nomor mahasiswa diatas, maka alamat dari masing-masing
nomor mahasiswa bisa ditentukan sebagai berikut (dalam hal ini digunakan kelompok dengan
dua buah digit, karena alamatnya diketahui dari 00 sampai 99) :
H(10347) = 1 + 03 + 47 = 51
H(87492) = 8 + 74 + 92 = 174 = 1 + 74 = 75
H(34212) = 3 + 42 + 12 = 57
H(88688) = 8 + 86 + 88 = 182 = 1 + 82 = 83
2. Cara Mengatasi Tabrakan
Tujuan dari pemilihan fungsi hash adalah untuk menempatkan rekaman pada alamat
tertentu, sehingga bisa dihindari adanya tabrakan, yaitu suatu keadaan dimana dua buah atau

84
lebih rekaman yang mempunyai data kunci yang berbeda mampunyai alamat hash yang sama.
Meskipun demikian, kemungkinan adanya tabrakan selalu tetap saja terjadi, meskipun kita
sudah menentukan fungsi hash yang cukup baik. Dengan demikian, kita harus mempunyai satu
cara untuk mengatasi tabrakan yang mungkin terjadi, yang disebut dengan collision resolution.
Prosedur yang baik untuk mengatasi adanya tabrakan gayut antara lain terhadap
perbandingan banyaknya data kunci (n) dalam K, dan banyaknhya alamat hash (m) dalam
L. Perbandingan ini, λ = n/m, disebut faktor beban. Lebih lanjut, efisiensi fungsi hash yang
dilengkapi dengan prosedur untuk mengatasi tabrakan diukur dengan banyaknya
pembandingan kunci (probe) yang diperlukan untuk mencari alamat dari rekaman yang
mempunyai kunci k. Efisiensi ini gayut terhadap faktor beban dan diukur menggunakan dua
besaran berikut ini :
B(λ) = rata-rata probe untuk pencarian yang berhasil
G(λ) = rata-rata probe untuk pencarian yang gagal
a. Pengalamatan Terbuka (closed hashing)
Secara umum, cara mengatasi tabrakan dengan pengalamatan terbuka (open addressing)
bisa dijelaskan sebagai berikut. Dimisalkan sebuah rekaman dengan kunci k akan disisipkan ke
dalam tabel alamat hash. Berdasarkan fungsi hash yang dipakai, alamat untuk kunci k tersebut
dihitung, misalnya pada alamat h. Jika kemudian ternyata bahwa alamat h sudah terisi, maka
harus dicari alamat lain yang masih kosong. Cara yang termudah adalah dengan mencari alamat
berikutnya yang kosong. Cara ini disebut dengan linear probing.
Dari gambaran diatas kita bisa melihat, bahwa untuk mencari rekaman dengan kunci k,
harus dilakukan pencarian pada alamat h, h + 1, h + 2, ... dan seterusnya.
Berdasarkan hal ini, rata-rata pencarian yang berhasil dan tidak berhasil adalah :
B(λ) = ½ (1 + 1/(1 - λ))
G(λ) = ½ (1 + 1/(1 - λ)2)
Dari gambaran diatas bisa dilihat satu kerugian yang utama dari linear probing ini adalah data
cenderung untuk mengumpul pada satu tempat. Hal ini bisa dipahami karena jika ada suatu data
yang akan disisipkan pada suatu alamat dan alamat yang dimaksud sudah dipakai, maka data
baru tersebut akan ditempatkan pada lokasi berikutnya yang letaknya berurutan. Kedua cara ini
disebut dengan quadratic probing atau double hashing.
Dalam quadratic probing, jika alamat untuks uatu data baru yang akan disisipkan sudah
dipakai (misalnya alamat h), maka data baru tersebut tidak ditempatkan pada posisi h + 1 atau

85
h + 2 (alamat h + 1 juga sudah dipakai) dan seterusnya, tetapi data baru akan diletakkan pada
alamat dengan urutan
h, h + 1, h + 4, h + 9, ...
Dengan demikian, pencarian akan dilaksanakan pada alamat diatas. Hal ini membawa
keuntungan, bahwa jika banyaknya alamat yang tersedia adalah merupakan bilangan prima,
cara diatas akan melakukan pencarian pada separuh dari seluruh alamat yang ada dalam doubel
hashing yang digunakan dua buah fungsi hash untuk menghindari adanya tabrakan. Secara
sederhana cara ini bisa dijelaskan sebagai berikut. Dari kunci k ditentukan alamat hash-nya
yang pertama, misalnya H(k) = h. Kemudian ditentukan alamat hash yang kedua, misalnya
H’(k) = h’ ≠ m (denga m adalah banyaknya alamat hash yang dihasilkan darifungsi hash yang
pertama). Dengan demikian, pencarian dilakukan secara urut pada alamat alamat :
h, h + h’, h + 2h’, h + 3h’, ...
Satu kerugian yang cukup mendasar dalam sistem pengalamatan terbuka adalah sebagai
berikut. Dimisalkan bahwa kita akan menyisipkan sebuah rekaman baru, misalnya rek2, yang
akan menempati alamat x pada tabel hash. Tetapi karena alamat x sudah terisi, maka rekaman
rek2 ini akan ditempatkan pada lokasi kosong yang pertama sesudah alamat x, misalnya x1.
Sekarang misalnya rekaman yang ada pada alamat x dihapus. Dengan demikian, maka alamat
x sekarang menjadi kosong. Jika kemudian kita akan mencari rekaman rek2 kita akan
mendapatkan kenyataan bahwa program mungkin tidak akan mendapatkan kenyataan bahwa
program mungkin tidak akan menemukan rekaman tersebut meskipun sesungguhnya ada.
Sebabnya adalah bahwa pada saat rekaman rek2 akan dicari, maka berdasar fungsi hash yang
dipakai, rekaman tersebut akan menempati alamat x. Tetapi karena sekarang alamat x sudah
kosong, maka program tidak akan meneruskan pencariannya ke alamat-alamat yang lain.
Salah satu cara untuk mengatasi persoalan diatas adalah dengan memberi tanda khusus
pada alamat-alamat yang isi sesungguhnya sudah dihapus. Dengan demikian program akan
meneruskan pencarian jika program membaca alamat yang diberi tandai “dihapus”. Tetapi
persoalan lain bisa timbul, yaitu jika hampir semua alamat diisi dengan tanda “dihapus”.
Dengan cara ini, maka pencarian bisa menjadi pencarian berurutan.
b. Penggandengan (open hashing)
Penggandengan (Separate chaining) merupakan metode lain yang digunakan untuk
mengatasi kemungkinan adanya tabrakan alamat hash. Metode ini pada prinsipnya
memanfaatkan senarai berantai (yang juga bisa diimplementasikan menggunakan larik) yang
dipasang pada setiap alamat hash yang diketahui. Dengan demikian, kita melihat pada sebuah

86
alamat hash lengkap dan senarai yang menyimpan rekaman rekaman yang mempunyai alamat
hash yang sama, maka kita akan melihat adanya sebuah senarai berantai tunggal berkepala
denga kepalanya adalah alamat hash.
Sebagai contoh, jika kita mempunyai rekaman-rekaman yang kunci rekamannya bisa dituliskan
sebagai
34 56 123 78 93 70 100 21 11 77 28
dan fungsi hash yang dipilih adalah k mod 10. Dengan demikian, alamat hash akan terdiri
dari sepuluh buah alamat yang bernomor 0 samapi 9 sebagai berikut :
0 : 70 → 100
1 : 21 → 11
2:
3 : 123 → 93
4 : 34
5:
6 : 56
7 : 77
8 : 78 → 28
9:
Hal ini menunjukkan bahwa alamat hash sebaiknya menggunakan senarai berantai untuk
menyimpan rekaman-rekaman diatas, yaitu kita bisa menyusun struktur data untuk menyajikan
metode penggandengan dengan menggunakan link list.
3. Fungsi Hashing untuk Data String
Fungsi hash untuk data yang berupa string diperlukan nilai dari suatu karakter, yang
biasanya digunakan berdasar kode ASCII. ASCII singkatan dari American Standard Code for
Information Interchange. Komputer hanya dapat memahami bilangan, sehingga kode ASCII
adalah representasi numerik dari karakter seperti 'a' atau '@' atau beberapa macam tindakan. Di
bawah ini adalah tabel karakter ASCII dan ini termasuk deskripsi dari 32 karakter pertama non-
cetak. Tabel ASCII selengkapnya dapat dilihat pada Tabel 5.1
Ada berbagai cara untuk mengkonversi suatu string menjadi suatu bilangan bulat, fungsi
hash untuk data string memerlukan konversi tersebut. Misalkan metode hash yang dipilih
adalah metode pembagian (modulo atau mod) dengan menggunakan beberapa rumus fungsi
hash dari suatu data string, secara umum fungsi hashnya dinyatakan dalam bentuk :
H(string) = nilai_hash mod P + 1
dengan
nilai_hash adalah bilangan bulat positif yang ditentukan berdasar stringnya.
P adalah ukuran tabel hash yaitu bilangan prima ≥ banyak data key.

87
Tabel 13.1 Tabel ASCII (http://www.asciitable.com)

Nilai_hash di atas dapat ditentukan dengan berbagai rumus, pada penelitian ini
digunakan 3 rumus penentuan nilai_hashnya, yaitu antara lain :
a. Fungsi Hash H1
Fungsi hash H1 dihitung berdasarkan rumus berikut :
Nilai_hash = (nilai_string[0] + nilai_string[1] + ... + nilai_string[n-1])
dengan n adalah panjang dari string, nilai_string[i] ditentukan dengan menggunakan Tabel
5.1 Tabel ASCII
Sebagai gambaran :
Jika string = ‘byte’ maka nilai_hash = 98 + 121 + 116 + 101 = 436
Jika string = ‘RAM’ maka nilai_hash = 82 + 65 + 77 = 224
b. Fungsi Hash H2
Fungsi hash H2 dihitung berdasarkan rumus berikut :
Nilai_hash = (((nilai_string[0] + nilai_string[n-1])/2) * n)
dengan n adalah panjang dari string, nilai_string[i] ditentukan dengan menggunakan Tabel
13.1 Tabel ASCII.
Sebagai gambaran :
Jika string = ‘byte’ maka nilai_hash = ((98 + 101)/2 ) * 4 = 398

88
Jika string = ‘RAM’ maka nilai_hash = ((82 + 77 )/2) * 3) = 238

c. Fungsi Hash H3
Fungsi hash H3 dihitung berdasarkan rumus iterasi sebagai berikut :
nilai_hash = 0;
for i = 0 to n-1 do nilai_hash = (nilai_hash *3 + nilai_string[i]) mod P;
dengan n adalah panjang dari string, P adalah ukuran tabel hash yaitu bilangan prima ≥
banyak data key, nilai_string[i] ditentukan dengan menggunakan Tabel 5.1 Tabel ASCII
Sebagai gambaran :
Dengan nilai P = 239,
Jika string = ‘byte’ maka nilai_hash = 121
Jika string = ‘RAM’ maka nilai_hash = 54
Tujuan dari pemilihan fungsi hash adalah untuk menempatkan rekaman pada alamat
tertentu, sehingga bisa dihindari terjadinya tabrakan (collision resolution), yaitu suatu keadaan
dimana dua buah atau lebih rekaman yang mempunyai data kunci yang berbeda mampunyai
alamat hash yang sama. Meskipun demikian, kemungkinan adanya tabrakan selalu tetap saja
terjadi, meskipun fungsi hashnya sudah dipilih yang cukup baik. Dengan demikian, diperlukan
satu cara untuk mengatasi tabrakan yang mungkin terjadi.
Terdapat 2 metode atau cara untuk mengatasi tabrakan, dimana kedua cara tersebut
mempunyai kelebihan dan kekurangan, yaitu antara lain :

a. Closed hashing (Open Addressing)


Metode Open adressing baik yang Linear Probing, Quadratic Probing maupun
Double hashing mempunyai kelebihan yaitu penggunaan memorynya lebih sedikit, akan tetapi
kelemahannya adalah waktu pencariannya lebih lambat

b. Open hashing (Separate Chaining)


Metode Separate Chaining atau linked mempunyai kelebihan yaitu waktu
pencariannya lebih cepat, sedangkan kekurangannya penggunaan memorynya lebih banyak.
Misalkan digunakan metode Separate Chaining, yaitu dengan membuat struktur data untuk
tabel hash menggunakan linked list (pointer), yang dapat digambarkan sebagai berikut :

89
1 Account

Akun

2 Byte browse cancel

Bita jelajah batal

.
.
.

P RAM copy
Memory salin
utama

Gambar 13.1 Struktur Data untuk Tabel Hash


Pada studi kasus data kamus, untuk menyimpan ke dalam tabel hash diperlukan
langkah-langkah sebagai berikut :
1. Menentukan ukuran tabel hash, yaitu nilai P merupakan bilangan prima yang lebih besar atau
sama dengan banyaknya data key.
2. Untuk setiap data key X[i].key
• Hitung nilai indeks IH, yaitu nilai fungsi hash H untuk data key X[i].key

• Tempatkan data key X[i].key pada tabel hash H[i].data.key

Jika terjadi tabrakan tempatkan pada linkednya yang masih kosong.

Kode program untuk menyimpan data kamus pada tabel hash adalah sebagai berikut :
// Menentukan bilangan prima P, ukuran tabel hashnya
long prima(int N)
{long p; bool prima;
do {
if ((N==2)||(N==3)) prima=true;
else if ((N%2==0)||(N<2)) prima=false;

90
else
{ p=3;prima=true;
do {
if ((N%p)==0) prima=false; else p=p+2; }
while ( prima && p<=(sqrt(N)+1));}
if (!prima) N++;
} while (!prima);
return N;
}
//Menentukan nilai fungsi hash, ada 3 macam fungsi hash
int nilai1(strg s,int p) {
int sum=0;
for(int i=0;i<strlen(s);i++) sum +=s[i];
return sum%p+1;
}
int nilai2(strg s,int p) {
int sum=0;
sum =((s[0]+s[strlen(s)-1])*strlen(s))/2;
return sum%p+1;
}
int nilai3(strg s,int p) {
int sum=0;
for(int i=0;i<strlen(s);i++) {
sum = (sum*3 + s[i])%p;}
return sum%p+1;}
//Menempatkan data kamus pada tabel hash H
void hashing(datakamus X[1000], int N, larik H, int &p)
{ int IH,I,t=0;list Q,b;
p=prima(N);
for(int i=1;i<=p;i++) {
strcpy(H[i].data.key,"");H[i].next=NULL;
}
for(int i=1;i<=N;i++) {

91
IH = nilai1(X[i].key,p);
if (strcmp(H[IH].data.key,"")==0) H[IH].data=X[i];
else {
b=new node;b->data=X[i];b->next=NULL;
if (H[IH].next==NULL) H[IH].next=b;
else {
Q=H[IH].next;
while (Q->next!=NULL) Q=Q->next;
Q->next=b;
}
}
}
}
Sedangkan cuplikan program untuk menampilkan isi tabel hash sekaligus menghitung
rerata probe adalah sebagai berikut :
cout<<"TABEL HASH : \n";
for (int I=1;I<=p;I++) {
cout<<I<<" ";
if (strcmp(H[I].data.key,"")!=0) {s++;cout<<H[I].data.key<<" , ";}
if(H[I].next!=NULL) {
Q=H[I].next;t=2;
while(Q!=NULL) {
s+=t; t++;
cout<<Q->data.key<<" , "; Q=Q->next;
}
}
cout<<"Rerata probe : "<<(float)s/n;
Untuk mencari data kamus tertentu pada tabel hash diperlukan langkah-langkah
sebagai berikut :
1. Membaca data key tertentu, misalkan a
2. Menghitung nilai indeks IH dari data key a, kemudian mencari data key a di tabel hash
dengan indeks IH.
Kode program untuk mencari data kamus pada tabel hash adalah sebagai berikut :

92
void cari(larik H,int p)
{int lokasi,i,k=1;list q;bool ada;strg a="";
cout<<"\nmasukkan data yg dicari : ";gets(a);cout<<endl;
i= nilai1(a,p);
ada=false;
if (strcmp(a,"")!=0 && strcmp(H[i].data.key,a)==0)
{ada=true;lokasi=i;cout<<H[i].data.info<<endl<<endl;}
else
if (H[i].next!=NULL) {
q=H[i].next;ada=false;
while (q!=NULL && !ada) {
if (strcmp(q->data.key,a)==0) {
ada=true;lokasi=i;k++;
cout<<q->data.info<<endl<<endl;}
else {q=q->next;k++;}
}
} else ada=false;
if (ada) {cout<<"data ada di "<<lokasi<<" ke "<<k<<endl;}
else cout<<"data tidak ada";
}
13.5 Rangkuman
Pencarian data merupakan hal yang sangat penting, bagaimana menyimpan data sehingga
cepat jika akan mencari Kembali datanya adalah hal yang diharapkan. Pencarian
sekuensial adalah algoritme pencarian yang paling sederhana yang dapat diterapkan pada
semua keadaan data, yang mempunyai kompleksitas waktu linear. Pencarian biner yang
menggunakan Teknik devide and conquer jauh lebih cepat yaitu mempunyai kompleksitas
waktu log n, akan tetapi hanya untuk mencari pada data yang sudah terurut. Yang paling
efisien adalah pencarian data menggunakan fungsi hashing, dimana data disusun dalam
sebuah table (hash table) menggunakan fungsi atau rumus tertentu sehingga untuk proses
penempatan data maupun pencarian kembali data dilakukan dengan sangat cepat yaitu
hanya menghitung nilai fungsi hashnya lalu menuju indeks yang sama dengan nilai fungsi
hashnya. Akan tetapi sangat mungkin terjadi tabrakan nilai, yaitu dua data yang berbeda

93
mempunyai nilai fungsi hash yang sama, hal ini dapat ditangani dengan beberapa metode
yaitu separate chaining dan open addressing.

13.6 Bahan Diskusi


1. Jika data sudah terurut, akan tetapi ada kemungkinan data bertambah terus menerus, mana
yang lebih efisien menggunakan pencarian sekuensial atau pencarian biner?
2. Pada pencarian data menggunakan fungsi hasing modulo, penangan tabrakan yang mana
yang paling baik?
13.7 Daftar Pustaka
1. Alfred V. Aho,dkk., 1988, Data Structures and Algorithms
2. Lafore, R. , 2003, Data Structures and Algorithms in Java, 2nd Edition

13.8 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.

3. Jika diketahui data key adalah :

70, 89, 92, 17, 71, 86, 24, 3, 34, 75, 21, 77, 7, 74, 35

Menggunakan fungsi hash dengan metode sisa pembagian (key mod P1) + 1, tempatkan key
tersebut pada larik H1, jika terjadi tabrakan gunakan metode linked dan kemudian tentukan
rata-rata pencariannya. {P1: bilangan prima terkecil yang >= n}

selanjutnya tempatkan key tersebut pada larik H2, jika terjadi tabrakan gunakan linear
probing dan kemudian tentukan rata-rata pencariannya.
4. Buatlah sebuah program untuk menyelesaikan proses mapping pada nomor telepon yang ada
di Telkom dengan menggunakan metode Hashing. Data yang ada berupa struktur yang
terdiri dari no telpon, nama, alamat pelanggan. Program memberikan pilihan berupa
menampilkan data, menambah data, menghapus data.

94
BAB XIV - TIPE DATA POINTER DAN FILE DATA
Capaian Pembelajaran Mata Kuliah
Mahasiswa dapat membuat program komputer dari permasalahan yang lebih kompleks

14.1 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 komputer 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
Variabel).

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 dari tipe daa tersebut sementara, banyaknya data tidak dapat ditentukan lebih dahulu,
maka hal ini tentu merupakan pekerjaan yang membosankan.

95
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 Variabel). 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.

14.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;
Contoh Program menuliskan alamat dan nilai dari suatu variabel pointer:

1. #include<iostream>
2. using namespace std;
3.
4. int main(){

96
5. int a,*b;
6. a=10;
7. b=&a;
8. c=new int;
9. *c=25;
10. cout<<b<<" "<<*b<<" "<<c;
11. return 0;
12. }

14.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 :

1. typedef struct node


2. { int data;
3. struct node *next;
4. } *list;
5. list L;
6. void buatD(list &l)
7. {
8. int i,n;
9. list b;
10. cout<<"banyak data : ";cin>>n;
11. srand((unsigned)time(NULL));
12. for (i=1;i<=n;i++){
13. b=new node;
14. b->next=NULL;
15. b->data=rand()%100+1;
16. cout<<b->data<<" ";
17. if (l==NULL) l=b;
18. else {b->next=l;
19. l=b;}
20. }
21. }
22. void cetakdata(list l)
23. {
24. list p;
25. if (l!=NULL) {
26. p=l;
27. while (p!=NULL) {cout<<p->data<<" ";p=p->next;}
28. }
29. else cout<<"kosong";
30. }
31.
32. int main()
33. {
34. int x;
35. list p;
36. p=NULL;
37. buatD(p);
38. cetakdata(p);
39. getch();
97
40. return 0;
41. }

14.3 Array dinamis


Array biasa jumlah memory yang sudah dipesan sudah fixed tidak dapat diubah lagi, Array
dinamis adalah array yang jumlah pemesanan tempat di memory dapat dirubah sesuai dengan
kebutuhan sehingga lebih optimal dalam pemanfaatan ruang di memory.

Berikut contoh program menggunakan array dinamis, yaitu menggunakan tipe pointer :

1. #include <iostream>
2. #include <conio.h>
3. using namespace std;
4. int main()
5. {
6. float* Ipk;
7. int i, n, countL = 0, countTL = 0;
8. cout << "banyak data : ";
9. cin >> n;
10. Ipk = new float[n];
11. for (i = 0; i < n; i++) {
12. Ipk[i] = (rand() % 100 + 1) / 25.0;
13. if (Ipk[i] > 2) {
14. cout << Ipk[i] << " Lulus" << endl;
15. countL++;
16. }
17. else {
18. cout << Ipk[i] << " Tidak lulus" << endl;
19. countTL++;
20. }
21. }
22. cout << "\nBanyak data yang Lulus = " << countL;
23. cout << "\nBanyak data yang Tidak Lulus = " << countTL;
24. getch();
25. return 0;
26. }

14.4 Vektor
Pada Bab VIII kita telah mempelajari mengenai tipe data array. Selanjutnya kita dapat
mempelajari bagaimana membuat array menggunakan salah satu tipe data yang disebut vector.
Vector memanfaatkan pointer di dalam implementasinya. Dengan menggunakan tipe data ini,
jumlah data yang dimasukkan sangat fleksibel, tergantung dari keinginan kita. Kita tidak perlu
mendeklarasikan secara eksplisit berapa jumlah data yang bisa disimpan ke dalam array. Tipe
data ini menyediakan sebuah fungsi yang bisa dipakai untuk mengetahui sebarapa banyak
jumlah data yang telah tersimpan, disebut size(). Terdapat juga fungsi yang digunakan untuk
menambahkan data ke dalam array, disebut push_back().

98
Secara formal, Vector dikenal sebagai container / wadah dan diperkenalkan dalam C++.
Kita tidak akan menemukan Vector di dalam bahasa C. Vector adalah wadah yang bisa
menampung semua jenis tipe data, sehingga yang perlu kita lakukan hanyalah menentukan tipe
data apa yang hendak disimpan sedangkan cara untuk bekerja dengan data tersebut adalah sama
untuk semua tipe data.

Untuk bisa menggunakan vector, kita perlu memberitahukan compiler bahwa kita
menggunakan pustaka vector

#include<vector>

Contoh kita ingin bekerja dengan tipe data int, maka yang perlu kita lakukan adalah
mendefinisikan variabel yang bertipe vector of int, seperti berikut:

vector<int> myVariabel;

Jika ingin bekerja dengan tipe data float maka definisinya seperti berikut:

vector<float> myVariabel;

Kita juga bisa bekerja dengan class (ingat class juga bisa digunakan sebagai tipe data) maka
definisinya seperti berikut:

vector<nama_class> myVariabel;

Untuk mengetahui jumlah data yang disimpan, kita bisa menggunakan fungsi size() seperti
berikut:

myVariabel.size();

Andaikan kita bekerja dengan tipe data int, maka cara menambahkan data ke dalam vector
adalah seperti berikut:

myVariabel.push_back(5);

atau bisa juga seperti berikut:

int data = 10;

myVariabel.push_back(data);

atau bisa juga seperti berikut:

int data_baru = 0;
99
cout << “Input data baru : “;

cin >> data_baru;

myVariabel.push_back(data_baru);

Untuk mengakses data tertentu yang tersimpan, cara yang digunakan sama persis dengan
penggunaan array. Misal untuk menampilkan data pada indeks ke-5 (ingat indeks selalu dimulai
dari 0);

cout << myVariabel[5];

14.5 File Data


Agar data dapat tersimpan lebih permanen maka data tidak hanya disimpan di RAM
saja akan tetapi juga disimpan di eksternal memory dalam bentuk file. Data yang besar juga
akan lebih efisien jika disimpan dalam bentuk file data.

Ada 2 tipe file data :

3. File teks
File berisi teks dan dapat dibaca oleh orang dengan editor teks.

• Membuat file teks

File teks dapat dibuat langsung menggunakan teks editor, note pad, atau juga bisa
menggunakan program.

#include<fstream>

ofstream f; string nama;int nilai;

f.open("nilai.txt",ios::out|ios::app);

cout<<"Nama anda : ";getline(cin,nama);

cout<<"Nilai anda : ";cin>>nilai;

f<<nama<<endl;

f<<nilai<<endl;

f.close();

100
Mode untuk membuka File data :

• Membaca file teks


File teks dapat dibaca menggunakan program.
#include<fstream>

ifstream f; string nama;int nilai;

f.open("nilai.txt");

if (f.is_open()){

while (!f.eof()) {

getline(f,nama);

f>>nilai;f.ignore();

cout<<"Nama anda : "<<nama<<" Nilai

anda : "<<nilai<<endl;

f.close();

4. File biner
File ini berisi deretan bit, didesain untuk dibaca oleh program komputer, bukan oleh orang.
File ini biasanya lebih efisien daripada file teks
• Membuat file biner
File biner dibuat menggunakan program.
#include<fstream>

struct barang {char kode[10];int harga;};

ofstream f;

101
barang x;

f.open("barang01.bin",ios::app|ios::binary);

if (f.is_open()){

cout<<"Kode barang : ";cin>>x.kode;

cout<<"Harga barang : ";cin>>x.harga;

f.write((char*)&x, sizeof(barang));

f.close();

• Membaca file biner


File biner dibaca menggunakan program.
#include<fstream>

struct barang {char kode[10];int harga;};

ifstream f; barang x;

f.open("barang01.bin",ios::in|ios::binary);

if (f.is_open()){

while (!f.eof()) {

f.read((char*)&x, sizeof(barang));

if (!f.eof())

cout<<"kode barang : "<<x.kode<<" Harga

barang : "<<x.harga<<endl;

f.close();

14.6 Rangkuman
Tipe data pointer memberikan kita untuk membuat struktur data dinamis, yaitu struktur
data yang kebutuhan memorinya bergantung dari data yang ada, bisa bertambah dan
berkurang di saat program berjalan. Dengan menggunakan simbol * kita bisa
mendeklarasikan variabel bertipe pointer, yaitu variabel yang isinya berupa address di
RAM, kita bisa membuat struktur data linked list, yang bisa ditambah data di posisi
depan, belakang atau tengah dengan mudah tanpa harus menggeser data yang ada.

102
Array dinamis yang dideklarasikan dengan variabel pointer juga dapat
menyimpan jumlah data yang jauh lebih besar dibandingkan dengan variabel array
biasa. Array dinamis juga bisa menggunakan vector yang juga menggunakan pointer di
dalamnya. Terakhir, untuk menyimpan data (data yang besar dan beragam) yang lebih
permanen yaitu pada hardisk bis akita gunakan file data, baik file teks maupun file biner.

14.7 Bahan Diskusi


1. Variabel pointer menyimpan address dimana lokasi dari address tersebut bisa berisi
nilai integer, float dan lain lain, tipe apa saja yang bisa dibuat variabel pointernya?
2. File biner disimpan dalam bentuk kode biner, amati kebutuhan memorinya apakah
sesuai ukuran memori dari data (bisa berupa struct) yang disimpan atau ada tambahan
memori?
14.8 Daftar Pustaka
1 Cay S. Horstmann, 2009, C++ for everyone
2 Lafore, R. , 2003, Data Structures and Algorithms in Java, 2nd Edition
3 Tenenbaum, A., Y. Langsam, and M. Augenstein, 1990, Data Structures Using C,
Prentice-Hall.
14.9 Latihan Soal
1. Tulislah output dari cuplikan program berikut :

1. #include<iostream>
2. using namespace std;
3. int main(){
4. int a,*b, *c;
5. a=10;
6. b=&a;
7. cout<<*b<<endl;
8. c=new int;
9. *c=25;
10. b=c;
11. cout<<*b<<endl;
12. return 0;
13. }

2. Diketahui subprogram berikut :

1. void buatA(list& l)
2. {
3. int i, n;
4. list b, t;
5. n = 10;
6. for (i = 1; i <= n; i++) {
7. b = new node;
8. b->next = NULL;
103
9. b->data = (i + i * i * 2) % 40;
10. cout << b->data << " ";
11. if (l == NULL)
12. l = b;
13. else if (b->data % 2 == 0) {
14. b->next = l;
15. l = b;
16. }
17. else {
18. t = l;
19. while (t->next != NULL)
20. t = t->next;
21. t->next = b;
22. }
23. }
24. }

Jika dipanggil

1. list p;
2. BuatA(p);
3. cetakdata(p);

Maka tulis outputnya.

104
DAFTAR PUSTAKA

Abdul Kadir, Belajar Sendiri Pasti Bisa Pemrograman C++, 2014, Andi Offset.
Adam Drozdek, 2001, Data Structures and Algorithms in C++
Alfred V. Aho,dkk., 1988, Data Structures and Algorithms
Cay S. Horstmann, 2009, C++ for everyone
Lafore, R. , 2003, Data Structures and Algorithms in Java, 2nd Edition
Munir, R., 2004, Algoritme dan Pemrograman, Informatika, Bandung.
Peterson, J., 2018 , Introduction to Computational Thinking, in Tallahassee, Florida.
Tenenbaum, A., Y. Langsam, and M. Augenstein, 1990, Data Structures Using C, Prentice-
Hall.

105
106

Anda mungkin juga menyukai