PERTEMUAN 14
DEFINISI
■ Secara umum Array/larik adalah kumpulan data yang bertipe sama yang
menggunakan nama yang sama. Dengan menggunakan array, sejumlah
variabel dapat memakai nama yang sama. Antara satu variabel dengan
variabel lain di dalam array dibedakan berdasarkan nomor elemen
(subscript).
■ Pada pengembangannya larik banyak digunakan untuk mengolah data
yang mempunyai nama dan tipe yang berbeda, seperti hasil ujian
mahasiswa dengan field-field misal NIM, NAMA, NILAI, INDEKS, dsb
sehingga mempunyai tipe yang kompleks.
■ Untuk larik dangan kasus ini kita harus menggunakan tipe bentukan
Record (Structure), agar suatu kumpulan field dengan tipe data yang
berbeda dapat diolah.
■ Tipe larik yang tersusun atas field-field dengan nama dan tipe yang
berbeda disebut sebagai “Larik Terstruktur”.
GAMBARAN LOGIK
Gambaran lojik sebuah larik dapat dijelaskan sebagai berikut:
A A
1 1 80
2 2 75
3 3 60
4 4 82
5 5 59
6 6 76
7 7 87
8 8 71
■ Larik adalah struktur data yang statik, artinya jumlah elemen larik harus sudah
diketahui sebelum program dieksekusi. Jumlah elemen larik tidak dapat diubah,
ditambah, atau dikurangi selama pelaksanaan program.
■ Mendefinisikan larik di bagian DEKLARASI berarti:
– Mendefinisikan banyaknya elemen larik, dan
– Mendefinisikan tipe eleman larik
■ Mendefinisikan banyaknya elemen larik berarti memesan sejumlah tempat di
memori sebanyak elemen larik yang bersangkutan. Tipe elemen larik dapat berupa
tipe dasar (integer, real, boolean, string), tipe terstruktur (tipe bentukan seperti
record), atau bahkan bertipe larik lain.
Pendefinisian larik di dalam bagian DEKLARASI:
■ Misal:
– L adalah nama peubah yang mempunyai 5 buah elemen yang bertipe integer.
Indeks larik bertipe integer dimulai dari 1.
– Nama adalah peubah larik yang mempunyai 5 buah elemen bertipe string
dengan panjang string 25.
– Nilai adalah peubah larik yang mempunyai 20 buah elemen yang bertipe real.
Cara Mengacu Elemen Larik
■ Elemen larik diacu melalui indeksnya. Nilai indeks harus terdefinisi.
■ Cara mengacu elemen larik adalah:
■ Misal indeks larik didefinisikan sebagai peubah k bertipe integer, maka cara mengacu
eleman larik tersebut adalah:
– L[k];
– Nama[k];
– Nilai[k]
■ Elemen larik juga dapat diacu melalui isi nilai dari indeks larik tersebut:
– L[4]
#include<iostream>
using namespace std;
int main() {
int data[10];
int elemen;
for (elemen=0;elemen <= 9;elemen++)
{
cout << "Data ke – " << elemen << ": "; cin >> data[elemen];
}
for (elemen=0;elemen<= 9;elemen++)
{
cout << " Data ke – " << elemen << " : " << data[elemen] ;
}
}
#include<iostream>
using namespace std;
int main()
{
int data[5] = {4, 1, 0,-9, 8};
int elemen;
for (elemen=0;elemen <= 4;elemen++)
{
cout << "Data ke– " << elemen << ": " << data[elemen]<<endl;
}
}
#include<iostream>
using namespace std;
int main()
{
int j, k;
int data[5][3]=
{
{3, 4, -1},
{2, 3, 0},
{1, 1, 2},
{5, 9, -4},
{6, 6, 2}
};
for (j = 0; j<=4; j++)
{
for (k = 0; k<=2; k++)
cout << "data[" << j << "]["<< k << "] = "<< data[j][k] << endl;
}
}
#include<iostream>
using namespace std;
int main()
{
char Nama[5][25];
int k;
for(k=0;k<5;k++)
{
cout<<"Nama " <<k<<" = ";
cin >> Nama[k];
}
cout<<"==============="<<endl;
cout<<"Data Nama Mhs" << endl;
cout<<"==============="<<endl;
for(k=0;k<5;k++)
cout<<Nama[k]<<endl;
cout<<"==============="<<endl;
}
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int Nilai[5];
int k; // indeks larik
for (k=1; k<=5; k++)
{
cout<<”Nilai “ <<k<< “ = “;
cin >> Nilai[k];
}
cout<<”===============================”<<endl;
cout<<”Data Nilai Ujian Akhir Semester”<<endl;
cout<<”===============================”<<endl;
for(k=1; k<=5; k++)
cout<< setiosflags(ios::right)<<setw(6)<<Nilai[k]<< endl;
cout<<”===============================”<<endl;
}
INISIALISASI LARIK
■ Menginisialisasikan larik adalah memberikan harga awal untuk seluruh elemen larik.
Seperti halnya variabel biasa, larik juga dapat diberi nilai awal (diinisialisasi) pada saat
didefinisikan.
■ Cara mendeklarasikan elemen larik yang diberi nilai awal adalah:
int jum_hari[12] =
{
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
31 28 31 30 31 30 31 31 30 31 30 31
■ C++ secara otomatis akan memberi nilai awal nol terhadap larik yang bersifat global.
■ Tidak demikian bila larik didefinisikan secara lokal (diatur sendiri oleh pemrogram).
#include<iostream>
using namespace std;
int main()
{
int i;
int jum_hari[12] =
{
31,28,31,30,31,30,31,31,30,31,30,31
};
for(i=0;i<12;i++)
cout<<"jum_hari["<<i<<"] = "<<jum_hari[i]<<endl;
}
MENCARI NILAI MAKSIMUM
■ Terkadang kita ingin mencari nilai maksimum dari suatu larik, misalnya mencari
juara pertama dari sekumpulan skor sebuah pertandingan, mencari juara kelas dan
sebagainya. Pencarian nilai maksimum pada larik haruslah data bertipe integer
atau real.
■ Bila elemen larik sudah terurut menaik, harga maksimum langsung dapat diperoleh
pada elemen pertamanya. Tetapi bila elemen larik tersusun acak, kita harus
“mengunjungi” seluruh elemen larik satu persatu untuk mendapatkan nilai
maksimum.
PERHATIKAN TABEL BERIKUT
A
1 80
2 75
3 60
4 82
5 59
6 76
7 87
8 71
ALGORITMA VERSI 1
■ Algoritma ini mengasumsikan nilai mula-mula (maks) adalah nilai yang sangat kecil,
misalnya dari kumpulan nilai ujian kita definisikan bahwa nilai maksimum mula-
mula adalah –999.
■ Teknik dari versi 1 ini dapat dijabarkan sebagai berikut:
– Larik dikunjungi mulai dari elemen pertama.
– Setiap kali mengunjungi elemen larik, bandingkan elemen tersebut dengan
nilai maksimum sementara.
– Jika elemen larik yang sedang dibandingkan lebih besar dari nilai maksimum
sementara, maka nilai pada elemen tersebut menjadi maksimum sementara
sekarang.
– Pada akhir kunjungan (yaitu setelah seluruh elemen larik dikunjungi, nilai
maksimum sementara menjadi nilai maksimum di seluruh elemen larik.
ALGORITMA VERSI 2
■ Pada algoritma versi dua ini, nilai maksimum sementara diinisialisasi dengan elemen
pertama larik. Selanjutnya, larik dikunjungi mulai dari elemen kedua. Setiap kali
mengunjungi elemen larik, bandingkan elemen tersebut dengan nilai maksimum
sementara. Jika elemen larik yang sedang dibandingkan lebih besar dari nilai maksimum
sementara, maka elemen tersebut menjadi maksimum sementara sekarang. Pada akhir
kunjungan (yaitu setelah seluruh elemen larik dikunjungi), nilai maksimum sementara
menjadi nilai maksimum dari seluruh elemen larik.
■ Algoritma versi 2 lebih umum dan pasti benar untuk nilai larik apapun (baik bernilai positif
ataupun negatif). Algoritma tetap benar meskipun larik hanya berukuran 1 elemen A (yaitu
N = 1).
#include<iostream>
using namespace std;
int main()
{
int nilai[7];
int k,maks;
for (k=1;k<=8;k++)
{
cout<<"Nilai " <<k<<" = ";
cin >> nilai[k];
}
maks=nilai[1];
for (k=2;k<=8;k++)
{
if (nilai[k] > maks)
maks=nilai[k];
}
cout<<"Nilai terbesar = "<<maks<<endl;
}
Nilai Minimum Larik
■ Teknik mencari nilai minimum pada larik dikembangkan dengan cara pemikiran yang sama
seperti pencarian harga maksimum larik.
int main()
{
int nilai[5]; //larik dengan data nilai 5 orang mhs
int min,k;
for(k=1;k<=5;k++){
cout<<"Nilai " <<k<<" = ";
cin >> nilai[k];
}
min=nilai[1];
for(k=2;k<=5;k++)
{
if (nilai[k] < min)
min=nilai[k];
}
cout<<"Nilai terkecil = "<<min<<endl;
}
Mencari Nilai tertentu
■ Mencari “sesuatu” di dalam sekumpulan data sering kita lakukan, misalnya mencari No.
Telp di dalam buku telepon, alamat dan sebagainya.
■ Algoritma pencarian merupakan algoritma yang sangat penting, karena program
komputer umumnya berisi proses menyimpan, mencari, memanipulasi dan menulis
data.
■ Sama halnya mencari nilai maksimum dan minimum, pencarian data tertentu di dalam
larik juga merupakan proses mengunjungi elemen larik satu per satu, mulai dari elemen
pertama dengan membandingkan apakah elemen tersebut sama dengan nilai yang
dicari. Jika sama, maka pencarian sukses, dan jika belum sama, maka pencarian
dilanjutkan ke elemen berikutnya. Proses pencarian diteruskan sampai nilai yang dicari
ditemukan atau seluruh elemen larik sudah diperiksa.
Masalah pencarian nilai tertentu pada larik
■ Kekurangan
– Tingkat efisiensinya yang kurang.
– Jumlah pengulangan yang dilakukan oleh algortima ini akan tetap sama
jumlahnya, meskipun data yang diurutkan sudah cukup terurut.
Proses dalam Buble Short
■Asscending
■Descending
Contoh pengurutan Ascending :
■ Berikut ini adalah sebuah deretan bilangan : [5, 12, 3, 19, 1, 47]
■ Iterasi 1:
5, 12, 3, 19, 1, 47 –> Tidak ada pertukaran. (5 < 12 == true)
5, 3, 12, 19, 1, 47 –> Ada pertukaran. (12 < 3 == false)
5, 3, 12, 19, 1, 47 –> Tidak ada pertukaran. (12 < 19 == true)
5, 3, 12, 1, 19, 47 –> Ada pertukaran. (19 < 1 == false)
5, 3, 12, 1, 19, 47 –> Tidak ada pertukaran. (19 < 47 == true)
■ Iterasi 2:
3, 5, 12, 1, 19, 47 –> Ada petukaran. (5 < 3 == false)
3, 5, 12, 1, 19, 47 –> Tidak ada pertukaran. (5 < 12 == true)
3, 5, 1, 12, 19, 47 –> Ada pertukaran. (12 < 1 == false)
3, 5, 1, 12, 19, 47 –> Tidak ada pertukaran. (12 < 19 == true)
3, 5, 1, 12, 19, 47 –> Tidak ada pertukaran. (19 < 47 == true)
■ Iterasi 3:
3, 5, 1, 12, 19, 47 –> Tidak ada pertukaran. (3 < 5 == true)
3, 1, 5, 12, 19, 47 –> Ada pertukaran. (5 < 1 == false)
3, 1, 5, 12, 19, 47 –> Tidak ada pertukaran. (5 < 12 == true)
3, 1, 5, 12, 19, 47 –> Tidak ada pertukaran. (12 < 19 == true)
3, 1, 5, 12, 19, 47 –> Tidak ada pertukaran. (19 < 47 == true)
Cont..
■ Iterasi 4:
1, 3, 5, 12, 19, 47 –> Ada pertukaran. (3 < 1 == false)
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (3 < 5 == true)
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (5 < 12 == true)
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (12 < 19 == true)
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (19 < 47 == true)
■ Iterasi 5:
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (1 < 3 == true)
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (3 < 5 == true)
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (5 < 12 == true)
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (12 < 19 == true)
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (19 < 47 == true)
■ Iterasi 6:
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (1 < 3 == true)
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (3 < 5 == true)
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (5 < 12 == true)
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (12 < 19 == true)
1, 3, 5, 12, 19, 47 –> Tidak ada pertukaran. (19 < 47 == true)
■ Jadi, hasil akhir deretan bilangan di atas setelah diurutkan dengan algoritma Bubble
Sort secara Ascending ialah [1, 3, 5, 12, 19, 47]
Contoh Descending :
■ Menggunakan deretan bilangan : [5, 12, 3, 19, 1, 47]
■ Iterasi 1:
12, 5, 3, 19, 1, 47 –> Ada pertukaran. (5 > 12 == false)
12, 5, 3, 19, 1, 47 –> Tidak ada pertukaran. (5 > 3 == true)
12, 5, 19, 3, 1, 47 –> Ada pertukaran. (3 > 19 == false)
12, 5, 19, 3, 1, 47 –> Tidak ada pertukaran. (3 > 1 == true)
12, 5, 19, 3, 47, 1 –> Ada pertukaran. (1 > 47 == false)
■ Iterasi 2:
12, 5, 19, 3, 47, 1 –> Tidak ada pertukaran. (12 > 5 == true)
12, 19, 5, 3, 47, 1 –> Ada pertukaran. (5 > 19 == false)
12, 19, 5, 3, 47, 1 –> Tidak ada pertukaran. (5 > 3 == true)
12, 19, 5, 47, 3, 1 –> Ada pertukaran. (3 > 47 == false)
12, 19, 5, 47, 3, 1 –> Tidak ada pertukaran. (3 > 1 == true)
■ Iterasi 3:
19, 12, 5, 47, 3, 1 –> Ada pertukaran. (12 > 19 == false)
19, 12, 5, 47, 3, 1 –> Tidak ada pertukaran. (12 > 5 == true)
19, 12, 47, 5, 3, 1 –> Ada pertukaran. (5 > 47 == false)
19, 12, 47, 5, 3, 1 –> Tidak ada pertukaran. (5 > 3 == true)
19, 12, 47, 5, 3, 1 –> Tidak ada pertukaran. (3 > 1 == true)
Cont…
■ Iterasi 4:
19, 12, 47, 5, 3, 1 –> Tidak ada pertukaran. (19 > 12 == true)
19, 47, 12, 5, 3, 1 –> Ada pertukaran. (12 > 47 == false)
19, 47, 12, 5, 3, 1 –> Tidak ada pertukaran. (12 > 5 == true)
19, 47, 12, 5, 3, 1 –> Tidak ada pertukaran. (5 > 3 == true)
19, 47, 12, 5, 3, 1 –> Tidak ada pertukaran. (3 > 1 == true)
■ Iterasi 5:
47, 19, 12, 5, 3, 1 –> Ada pertukaran. (19 > 47 == false)
47, 19, 12, 5, 3, 1 –> Tidak ada pertukaran. (19 > 12 == true)
47, 19, 12, 5, 3, 1 –> Tidak ada pertukaran. (12 > 5 ==true)
47, 19, 12, 5, 3, 1 –> Tidak ada pertukaran. (5 > 3 == true)
47, 19, 12, 5, 3, 1 –> Tidak ada pertukaran. (3 > 1 == true)
■ Iterasi 6:
47, 19, 12, 5, 3, 1 –> Tidak ada pertukaran. (47 > 19 == true)
47, 19, 12, 5, 3, 1 –> Tidak ada pertukaran. (19 > 12 == true)
47, 19, 12, 5, 3, 1 –> Tidak ada pertukaran. (12 > 5 == true)
47, 19, 12, 5, 3, 1 –> Tidak ada pertukaran. (5 > 3 == true)
47, 19, 12, 5, 3, 1 –> Tidak ada pertukaran. (3 > 1 == true)
■ Jadi, hasil akhir deretan bilangan di atas setelah diurutkan dengan algoritma Bubble Sort secara
Descending ialah [47, 19, 12, 5, 3, 1]
Selection Short
■ Digunakan atas dasar gagasan memilih elemen maksimum/minimum dari larik, lalu
menempatkan elemen maksimum /minimum itu pada awal atau akhir larik (elemen
terujung). Selanjutnya elemen terujung tersebut “diisolasi” dan tidak disertakan
pada proses selanjutnya. Proses yang sama diulang untuk elemen larik yang tersisa,
yaitu memilih elemen maksimum/minimum berikutnya dan mempertukarkannya
dengan elemen terujung larik sisa.
■ Sebagaimana halnya pada algoritma pengurutan gelembung, proses memilih nilai
maksimum/minimum dilakukan pada setiap pass. Jika larik berukuran N, maka
jumlah pass adalah N-1.
Misalkan ada data-data sebagai berikut :5,34, 32, 1
Daftar bilangan diatas masih belum urut dari kecil ke besar. Kita ingin melakukan pengurutan dari
yang terkecil sampai yang terbesar dari 3 data tersebut.
Langkah pertama , membandingkan satu persatu sampai dengan yang terkakhir. Langkah-
langkahnya sebagai berikut :
Langkah pertama :
Pembanding Posisi
5<34 1
5<32 1
5<1 4
Tukar data pada posisi 1 dengan data posisi 4
Hasil sementara : 1, 34,32,5
Langkah Kedua :
Pembanding Posisi
34>32 3
32>5 4
Tukar data pada posisi 2 dengan data posisi 4
Hasil akhir : 1, 5, 32, 34
Proses pengurutan data di atas memerlukan 2 kali perulangan.
LATIHAN
■ Jelaskan Algoritma Pencarian kemudian buat program untuk pencarian nilai
tertentu pada Array dengan menggunakan
a. Pembanding dengan peubah Boolean
b. Pembanding tanpa peubah Boolean