Masukan - eLisa UGM

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