Pengertian ARRAY
Array merupakan koleksi data dimana setiap elemen memakai
nama dan tipe yang sama serta setiap elemen diakses dengan membedakan indeks
array-nya. Berikut contoh variabel bernama C yang mempunnyai 7
lokasi memori yang semuanya bertipe int.
C[0]
|
-45
|
C[1]
|
6
|
C[2]
|
0
|
C[3]
|
72
|
C[4]
|
1543
|
C[5]
|
43
|
C[6]
|
4
|
Masing-masing nilai dalam setiap lokasi mempunyai identitas
berupa nama C dan nomor indeks yang dituliskan didalam tanda
kurung siku ‘[…]’. Sebagai contoh, 72 adalah nilai dari C[3].
Deklarasi Array
Variabel Array dideklarasikan dengan
mencantumkan tipe dan nama variabel yang diikuti dengan banyaknya lokasi memori
yang ingin dibuat. Dengan demikian, deklarasi untuk variabel array C diatas
adalah:
Int
c[7];
Perlu diperhatikan bahwa C++ secara otomatis akan
menyediakan lokasi memori sesuai dengan yang dideklarasikan, dimana nomor
indeks selalu dimulai dari 0. Nilai suatu variabel array dapat
juga diinisialisasi secara langsung pada saat deklarasi, misalnya:
Int
C[7] = {-45, 0, 6, 72, 1543, 43, 4};
Berarti setiap lokasi memori dari variabel array C langsung
diisi dengan nilai-nnilai yang dituliskan di dalam tanda kurung kurawal.
Banyaknya
lokasi memori dapat secara otomatis disediakan sesuai dengan banyaknya nilai
yang akan dimasukkan, seperti contoh berikut yang tentunya membuat variabel
array dengan 10 lokasi memori:
Int
x[] = {10, 15, 12, 5, 13, 9, 6, 17, 25, 31};
Untuk memperjelas gambaran anda tentang array perhatikan
contoh aplikasi variabel array, yaitu program untuk menghitung
jumlah setiap elemen dalam suatu array.
Sebagai
gambaran dari program tersebut, dapat dibuat se-buah algoritma sebagai berikut:
1. Tentukan elemen array sebanyak yang
diinginkan (dalam hal ini, elemen array tersebut berjumlah 12 buah).
2. Tentukan nilai awal indeks, batas akhir indeks dan
kenaikannya (dalam hal ini , nilai awal indeks adalah 0, batas akhir indeks
adalah jumlah elemen array diatas yaitu 12 dikurangin dengan 1, dan kenaikannya
adalah 1).
3. Lakukan perulangan sesuai dengan langkah 2.
4. Lakukan penjumlahan masing-masing elemen array sampai
batas akhir indeks terpenuhi.
5. Tampilkan penjumlahan semua elemen array.
6. Selesai.
Contoh Program-nya :
Bila program diatas dijalankan, akan muncul hasil:
Total
setiap elemen array adalah 383
Adapun
keterangan dari program diatas adalah sebagai berikut:
Hasil penjumlahan setiap elemen array diperoleh
dari jumlah data atau elemen array sebanyak 12 buah yang sudah
didefiniskan pada awal program yaitu #define SIZE 12. Kemudian setiap elemen
array dari a[0] yang berisi data 1, a[1] yang berisi data 3 di-jumlah sampai
dengan a[11] yang berisi data 45. Proses pen-jumlahan dilakukan pada loop
dimulai dari 0 sampai data yang terakhir atau elemen terakhir.
ARRAY DIMENSI SATU
Bentuknya :
Tipe
nama_var[ukuran];
Dengan:
Tipe :
menyatakan jenis elemen array (int, char, unsigned, dan lain-lain)
Ukuran
: menyatakan jumlah maksimal elemen array.
Contoh:
Float
nilai_ujian[5];
Pada
Borland C++, array disimpan dalam memori secara berurutan. Elemen pertama
berindeks nol digambarkan sebagai berikut:
Nilai_ujian[0]
|
Nilai_ujian[1]
|
Nilai_ujian[2]
|
Nilai_ujian[3]
|
Nilai_ujian[4]
|
Masing-masing bertipe float dan berjumlah 5 elemen.
Contoh Program Array 1 Dimensi:
Hasil pada program array 1 dimensi seperti
pada gambar berikut:
ARRAY DIMENSI DUA
Struktur array yang dibahas diatas
mempunyai satu dimensi , sehingga variabelnya disebut dengan variabel array
berdimensi satu.
Pada bagian ini ditunjukkan array berdimensi lebih dari
satu, yang sering disebut dengan array berdimensi dua.
Sebagai
contoh, sebuah matrik B berukuran 2 x 3 dapat dideklarasikan dalam bahasa C++
seperti
berikut: int
b[2][3] = {{2, 4, 1}, {5, 3, 7}};
yang akan menempati lokasi memori dengan susunan sebagai
berikut:
0
|
1
|
2
|
|
0
|
2
|
4
|
1
|
1
|
5
|
3
|
7
|
Dan definisi variabel untuk setiap elemen tersebut adalah:
0
|
1
|
2
|
|
0
|
b[0][0]
|
b[0][1]
|
b[0][2]
|
1
|
b[1][0]
|
b[1][1]
|
b[1][2]
|
Sebagai implementasi dari keterangan diatas, perhatikan
contoh program berikut ini:
ila program diatas dijalankan, akan muncul hasil:
123
456
123
450
120
400
Penjelasan:
Dari program diatas untuk matriks1, penulisannya adalah 123
456, sedangkan pada matriks2 penulisannya adalah 123 450. 0 disini mempunyai
arti tempat yang disediakan untuk data kolom ke 3 dari baris ke dua tidak
diisi. Sedangkan matriks3 penulisannya adalah 120 400. Dari matriks 3 disini
kita bias melihat bahwa pada baris pertama kolom ketiga data tidak diisi dan
dianggap 0 dan pada baris kedua kolom kedua dan ketiga juga tidak diisi juga
diisi 0.
Sumber : Referensi dari Buku : ALGORITMA DAN PEMROGRAMAN DENGAN C++ (edisi II)
Penyimpanan Pada memory
Data adalah sesuatu yang memakai memori, karena data
diletakkan di memori. Program sebetulnya adalah data. Kode program itu sendiri,
dan kode mesin yang terjadi setelah program itu di-compile adalah data yang
akan diletakkan di suatu tempat di memori. Oleh karena itu, bahkan program
seperti ini:
begin
end.
tetap memakan memori yang besarnya lebih daripada 0 bytes.
Oleh karena itu, jika dituliskan pada “header” soal bahwa batas memori adalah 1
MB, mungkin Anda hanya mendapatkan memori sebesar 700 KB – 800 KB untuk
variabel-variabel Anda.
Setiap variabel yang Anda deklarasikan di program utama
(global variable) akan dianggap sebagai data yang memakan sejumlah memori, dari
permulaan program sampai program selesai. Setiap variabel memiliki tipe data,
dan setiap tipe data memiliki besar memori yang berbeda-beda dan jangkauan yang
berbeda-beda. Misalnya, sebuah integer memakan memori 2 bytes, dan oleh karena
itu hanya dapat menyimpan sebuah bilangan bulat bernilai -32768 sampai dengan
32767.
Tipe data yang umum digunakan dalam Pascal adalah sebagai
berikut:
Jenis
|
Tipe data
|
Range
|
Memori (byte)
|
Bilangan bulat
|
shortint
|
-128..127
|
1
|
Bilangan bulat
|
byte
|
0..255
|
1
|
Bilangan bulat
|
smallint
|
-32768..32767
|
2
|
Bilangan bulat
|
integer
|
-32768..32767
|
2
|
Bilangan bulat
|
word
|
0..65535
|
2
|
Bilangan bulat
|
longint
|
-2147483648..2147483647
|
4
|
Bilangan bulat
|
longword
|
0..4294967295
|
4
|
Bilangan bulat
|
int64
|
-9223372036854775808..9223372036854775807
|
8
|
Bilangan bulat
|
qword
|
0..18446744073709551615
|
8
|
Bilangan real
|
real
|
tergantung platform
|
4-8
|
Bilangan real
|
single
|
1.5e-45..3.4e38
|
4
|
Bilangan real
|
double
|
5.0e-324..1.7e308
|
8
|
Boolean
|
boolean
|
false, true
|
1
|
Karakter
|
char
|
#0..#255
|
1
|
String
|
string
|
String dengan panjang maksimal 255
|
256
|
String
|
string[x]
|
String dengan panjang maksimal x
|
(x + 1)
|
(Diambil dari http://www.freepascal.org/docs-html/ref/ref.html)
–> silahkan cari sendiri, saya malas meng-konekkan linknya :p
Tipe data yang sering digunakan untuk bilangan bulat adalah
longint. Biasakan menggunakan longint sebagai pengganti integer, karena longint
diproses sangat cepat oleh prosesor 32-bit, bahkan lebih cepat daripada
memroses sebuah integer.
Catatan untuk bilangan real: Semua tipe bilangan real dapat
menyimpan bilangan positif dan negatif. Dan BASEe-EXP artinya adalah BASE x 10EXP.
Jadi, misalnya tipe data single dapat menyimpan nilai 0, 1.5 x 10-45..3.4
x 1038 (positif), dan -3.4 x 1038..-1.5 x 10-45(negatif).
Bilangan real juga memiliki tingkat keakuratan yang berbeda.
Misalnya single akurat sampai 7-8 digit dan double akurat sampai 15-16 digit.
Jadi, hasil dari 1.0 / 3.0 * 3.0 mungkin bukan 1.0, tetapi 0.9999999 atau
1.0000001. Oleh karena itu, pada saat menggunakan tipe data real, jangan
melakukan pembandingan dengan tanda “sama dengan” ( = ). Misalkan Anda memiliki
variabel bilangan real bernama r. Pernyataan
if (r = 1.0) then
adalah hal yang salah, karena tipe bilangan real mungkin
tidak menyimpan nilai yang persis sama dengan 1.0. Hal yang seharusnya
dilakukan adalah
if (abs(r - 1.0) > toleransi) then
dengan toleransi didefinisikan sebagai sebuah nilai yang
sangat kecil, misalnya 0.0001. Ingat bahwa nilai toleransi juga tidak boleh
terlalu kecil, karena nilai toleransi yang terlalu kecil tidak akan berguna
untuk pembandingan bilangan real.
Pada artikel-artikel berikutnya, akan dibahas array dan
record, sebagai tipe data yang sering kali lebih bermanfaat, tetapi akan
memakan memori yang lebih besar dari sebuah variabel tunggal.
Sebagai catatan, ada perbedaan antara pemakaian memori oleh
global variable dan local variable. Semua global variable akan memakai memori
pada saat program mulai dijalankan sampai program selesai. Sedangkan, local
variable hanya memakan memori pada saat prosedur atau fungsi yang mengandungnya
dipakai. Misalnya Anda memiliki sebuah prosedur seperti ini (notasi array akan
dibahas selanjutnya):
procedure Tulis;
var
a:
array[1..1000000] of longint;
begin
writeln;
end;
Prosedur ini akan memakai memori 1000000 * 4 bytes = 4 MB
hanya jika prosedur ini dipanggil. Setelah prosedur ini selesai, memori 4 MB
tersebut akan dibebaskan kembali. Jika prosedur Tulis tidak pernah dipanggil,
array a tidak akan pernah diciptakan. Biasanya total memori yang boleh dipakai
global variable dan yang boleh dipakai local variable memiliki batasan yang berbeda.
Batas memori global variable adalah sesuai yang tertera di header soal, tetapi
batas memori local variable biasanya ditandai dengan “stack size”, dan biasanya
tidak lebih dari 8 MB. Oleh karena itu, disarankan tidak membuat struktur data
local variable yang terlalu besar.
Prosedur atau fungsi rekursif juga akan memakan memori yang
cukup besar jika fungsi atau prosedur tersebut dipanggil terus-menerus sehingga
mencapai kedalaman yang sangat besar. Contohnya:
function Genap(n: integer): boolean;
begin
if (n = 0) then
return true
else
return not
Genap(n - 1);
end;
Fungsi di atas adalah fungsi rekursif yang berfungsi untuk
menentukan apakah suatu bilangan genap atau ganjil, tetapi melakukannya dengan
cara yang sangat tidak efisien. Jika Genap(10000000) dipanggil, fungsi tersebut
akan melakukan rekursi ke Genap(9999999), Genap(9999998), Genap(9999997), dan
seterusnya, berusaha mencapai Genap(0). Namun, pada kedalaman tertentu, fungsi
tersebut akan mengalami “stack overflow”, yaitu sebuah kondisi di mana batas
stack (batas memori local variable) telah dilampaui. Perhatikan bahwa fungsi
genap paling sedikit memakan 12 bytes memori:
- 4
bytes untuk tipe data parameter n: integer
- 4
bytes untuk boolean (meskipun boolean hanya memakai 1 byte, tetapi
compiler akan membulatkan ke atas menjadi 4 bytes)
- 4
bytes untuk menyimpan alamat “return address” pada saat run-time
Jadi, setelah sekitar hampir 670000 kali memanggil dirinya
sendiri, stack yang dipakai akan melebihi 8 MB, sehingga terjadi “stack
overflow”.
0 comments:
Post a Comment