Modul 2 Array, Pointer Dan ADT
Modul 2 Array, Pointer Dan ADT
2.1 Tujuan
Setelah mengikuti praktikum ini mahasiswa diharapkan dapat:
1. Memahami penggunaan pointer dan alamat memory
2. Mengimplementasikan fungsi dan prosedur dalam program.
2.2 Array
Array merupakan kumpulan data dengan nama yang sama dan setiap elemen bertipe data sama.
Untuk mengakses setiap komponen / elemen array berdasarkan indeks dari setiap elemen.
Keterangan:
Tipe_data menyatakan jenis elemen array (int, char, float, dll).
Ukuran menyatakan jumlah maksimum array.
Contoh:
int nilai[10];
nilai[5] elemen ke-5 dari array nilai. Contoh memasukkan data ke dalam array :
nilai[4] = 90; /*memasukkan 90 kedalam array nilai indeks ke-4*/
cin << nilai[4] /*membaca inputan dari keyboard*/
Contoh:
int data_rumit[4][6][6];
Array sebenarnya masih banyak pengembangannya untuk penyimpanan berbagai betuk data,
pengembangan array misalnya untuk array tak berukuran.
2.3 Pointer
2.3.1 Data dan Memory
Semua data yang ada digunakan oleh program komputer disimpan di dalam memory (RAM)
komputer. Memory dapat digambarkan sebagai sebuah array 1 dimensi yang berukuran sangat
besar. Seperti layaknya array, setiap cell memory memiliki “index” atau “alamat” unik yang berguna
untuk identitas yang biasa kita sebut sebagai “address”
Saat program berjalan, Sistem Operasi (OS) akan mengalokasikan space memory untuk setiap
variable, objek, atau array yang kita buat. Lokasi pengalokasian memori bisa sangat teracak sesuai
proses yang ada di dalam OS masing-masing. Perhatikan ilustrasi berikut
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 …
Digambarkan sebuah memory diasumsikan setiap cell menyimpan 1 byte data. Pada saat computer
pertama kali berjalan keadaan memory adalah kosong. Saat variable dideklarasikan, OS akan
mencarikan cell kosong untuk dialokasikan sebagai memori variable tersebut.
char a;
int j;
char arr[6];
arr[3] = ‘b’
a = ‘u’
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 …
u b
Char a int j char arr[6]
Pada contoh di atas variable a dialokasikan di memory alamat x6, variable j dialokasi kan di alamat
x10-13, dan variable arr dialokasiakan di alamat x17-22. Nilai variable yang ada di dalam memory
dapat dipanggil menggunakan alamat dari cell yang menyimpannya. Untuk mengetahui alamat
memori tempat di mana suatu variable dialokasikan, kita bisa menggunakan keyword & yang
ditemptakan di depan nama variable yang ingin kita cari alamatnya
Contoh:
int *p_int;
/* p_int merupakan variable pointer yang menunjuk ke data bertipe int */
Agar suatu pointer menunjuk ke variable lain, mula-mula pointer harus diisi dengan alamat memory
yang ditunjuk.
p_int = &j;
Pernyataan di atas berarti bahwa p_int diberi nilai berupa alamat dari variable j. Setelah pernyataan
tersebut di eksekusi maka dapat dikatakan bahwa p_int menunjuk ke variable j. Jika suatu variable
sudah ditunjuk oleh pointer. Maka, variable yang ditunjuk oleh pointer dapat diakses melalui
variable itu sendiri ataupun melalui pointer.
Untuk mendapatkan nilai dari variabel yang ditunjuk pointer, gunakan tanda * di depan nama
variabel pointer
Pointer juga merupakan variable, karena itu pointer juga akan menggunakan space memory dan
memiliki alamat sendiri
int *p_int;
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 …
u b
int *p_int Char a int j char arr[6]
10 Nilai variable j
X6 Alamat variable j
X6 Nilai variable p_int
X1 Alamat variable p_int
10 Nilai variable k
Program 22 Pointer
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
maka pernyataan :
pa=&a[0];
akan membuat pa menunjuk ke alamat dari elemen ke-0 dari variable a. Sehingga, pa akan
mengandung alamat dari a[0].
pa
a:
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
Sekarang, pernyataan :
x=*pa;
Akan mengcopykan isi dari a[0] ke variable x.
Jika pa akan menunjuk ke elemen tertentu dari array , maka pendefinisian pa+1 akan menunjuk elem
berikutnya,pa+i akan menunjuk elemen ke i setelah pa, sedangkan pa-i akan menunjuk elemen ke i
sebelum pa. Sehingga jika pa menunjuk ke a[0] maka *(pa+1) akan mengandung isi elemen ke a[1].
pa+i merupakan alamat dari a[i] , dan *(pa+i) akan mengandung isi dari elemen a[i].
Merupakan array dari karakter. Dalam representasi internal, array diakhiri dengan karakter ‘\0’
sehingga program dapat menemukan akhir dari program.Panjang dari storage merupakan panjang
dari karakter yang ada dalam tanda petik dua ditambah satu.Ketika karakter string tampil dalam
sebuah program maka untuk mengaksesnya digunakan pointer karakter.standar input/output akan
menerima pointer dari awal karakter array.Sehingga, konstanta string akan diakses oleh pointer
mulai dari elemn pertama.
Jika pmessage di deklarasikan :
char *pmessage ;
Maka pernyataan berikut :
pmessage = "now is the time";
Akan membuat pmessage sebagai pointer pada karakter array. Ini bukan copy string, hanya pointer
yang terlibat. C tidak menyediakan operator untuk memproses karakter string sebagai sebuah unit.
Ada perbedaan yang sangat penting diantara pernyataan berikut :
char amessage[]="now is the time"; //merupakan array
char *pmessage= "now is the time"; //merupakan pointer
Variable amessage merupakan sebuah array, hanya cukup besar untuk menampung karakter-
karakter sequence tersebut dan karakter null ‘\0’ yang menginisialisasinya.Tiap-tiap karakter dalam
array bisa saja berubah tapi variable amessage akan selalu menunjuk apada storage yang sama.Di
sisi lain, pmessage merupakan pointer, diinisialisasikan menunjuk konstanta string,pointer bisa di
modifikasi untuk menunjuk kemanapun, tapi hasilnya tidak akan terdefinisi jika kamu mencoba
untuk mengubah isi string.
pmessage now is the time \0
2.4 Fungsi
Fungsi merupakan blok dari kode yang dirancang untuk melaksanakan tugas khusus dengan tujuan:
1. Program menjadi terstruktur, sehingga mudah dipahami dan mudah dikembangkan.
Program dibagi menjadi beberapa modul yang kecil.
2. Dapat mengurangi pengulangan kode (duplikasi kode) sehingga menghemat ukuran
program.
Pada umumnya fungsi memerlukan masukan yang dinamakan sebagai parameter. Masukan ini
selanjutnya diolah oleh fungsi. Hasil akhir fungsi berupa sebuah nilai (nilai balik fungsi).
Bentuk umum sebuah fungsi:
tipe_keluaran nama_fungsi(daftar_parameter) {
blok pernyataan fungsi ;
}
Jika penentu_tipe fungsi merupakan tipe dari nilai balik fungsi, bila tidak disebutkan maka akan
dianggap (default) sebagai int.
Algoritma C++
Program coba_fungsi
Kamus
x,y,z : integer
function max3(input:
a,b,c : integer) : integer
Algoritma
input(x,y,z)
output( max3(x,y,z) )
2.5 Prosedur
Dalam C sebenarnya tidak ada prosedure, semua berupa fungsi, termasuk main() pun adalah sebuah
fungsi. Jadi prosedur dalam C merupakan fungsi yang tidak mengembalikan nilai, biasa diawali
dengan kata kunci void di depan nama prosedur.
Bentuk umum sebuah prosedur:
void nama_prosedur (daftar_parameter) {
blok pernyataan prosedur ;
}
Algoritma C++
Program coba_procedur
Kamus
jum : integer
procedure tulis(input:
x: integer)
Algoritma
input(jum)
tulis(jum)
Dari pernyataan diatas a dan b merupakan parameter aktual, begitu pula 10 dan 30. parameter
aktual tidak harus berupa variabel, melainkan bisa berupa konstanta atau ungkapan.
Algoritma C++
Program coba_parameter_by_value
Kamus
a,b : integer
procedure tukar(input:
x,y : integer)
Algoritma
a 4
b 6
output(a,b)
tukar(a,b)
output(a,b)
algoritma
temp x
x y
y temp
output(x,y)
Jelas bahwa pada pemanggilan fungsi tukar, yang melewatkan variabel a dan b tidak merubah nilai
dari variabel tersebut. Hal ini dikarenakan ketika pemanggilan fungsi tersebut nilai dari a dan b
disalin ke variabel formal yaitu x dan y.
untuk melewatkan nilai dengan referensi, argumen dilalui ke fungsi seperti nilai lain. Jadi pada
akhirnya, harus mendeklarasikan di parameter awal, serta untuk pemanggilan tidak perlu
menggunakan paramter tambahan seperti pada call by pointer.
Algoritma C++
Program
coba_parameter_by_reference
Call By
Kamus Reference
a,b : integer
procedure tukar(input/output:
x,y : integer)
Algoritma
a 4
b 6
output(a,b)
tukar(a,b)
output(a,b)
procedure tukar(input/output
:x,y : integer)
kamus
temp : integer
algoritma
temp x
x y
y temp
output(x,y)
Algoritma C++
Program coba_parameter_by_pointer
Kamus
a,b : integer Call by
Pointer
procedure tukar(input/output:
x,y : integer)
Algoritma
a 4
b 6
output(a,b)
tukar(a,b)
output(a,b)
procedure tukar(input/output
:x,y : integer)
kamus
temp : integer
algoritma
temp x
x y
y temp
output(x,y)
Program 27 Pemanggilan dengan referensi (call by pointer) dan pointer (call by pointer)
2.7 Rekursif
Rekursif berarti suatu fungsi dapat memanggil fungsi yang merupakan dirinya sendiri.
Algoritma C++
Program coba_rekursif
Kamus
bil, bil_pkt : integer
Algoritma
input(bil, bil_pkt)
output( pangkat(bil, bil_pkt) )
Program 28 Rekursif
Untuk memahami lebih jelas mengenai konsep ADT, perhatikan ilustrasi berikut
Algoritma C++
Program coba_ADT
Type
mahasiswa <
nim : char[10]
nilai1,nilai2 : integer
Kamus Definisi/
mhs : mahasiswa Spesifikasi Type
dan Primitif /
procedure inputMhs(input/output
m : mahasiswa ) Header fungsi
function rata2(input: (&.h)
m : mahasiswa) : real
Algoritma
inputMhs(mhs)
output( rata2(mhs) )
procedure inputMhs(input/output
m : mahasiswa )
kamus
algoritma
input(m.nim, m.nilai1, m.nilai2)
Body/ relisasi
function rata2(input:
m : mahasiswa) : real dari primitive
kamus (&.c)
algoritma
(m.nilai1 + m.nilai1) / 2
Untuk menerapkan konsep ADT, kita harus memisah deklarasi tipe, variabel, dan fungsi dari program
ke dalam sebuah file .h dan memisah definisi fungsi dari program ke sebuah file .cpp. Sehingga jika
kita menerapkan konsep ADT berdasarkan contoh program di atas, bentuk code program akan
dipisah menjadi seperti berikut
Algoritma C++
mahasiswa.h
Program coba_ADT
Type
mahasiswa <
nim : char[10]
nilai1,nilai2 : integer
Kamus
mhs : mahasiswa
procedure inputMhs(i/o
m : mahasiswa )
function rata2(input:
m : mahasiswa) : real
Algoritma
inputMhs(mhs)
output( rata2(mhs) )
mahasiswa.cpp
procedure inputMhs(input/output
m : mahasiswa )
kamus
algoritma
input(m.nim, m.nilai1, m.nilai2)
function rata2(input:
m : mahasiswa) : real
kamus
algoritma
(m.nilai1 + m.nilai1) / 2
main.cpp
2.9 Latihan
1. Buatlah FUNGSI atau PROSEDUR untuk menghitung faktorial dari suatu bilangan secara
rekursif.
Contoh:
input bilangan: 5 <inputan>
faktorial dari 5 adalah 120 <outputan>
2. Buat program yang dapat menyimpan data mahasiswa (max. 10) kedalam sebuah array
dengan field nama, nim, uts, uas, tugas, dan nilai akhir. Nilai akhir diperoleh dari FUNGSI
dengan rumus 0.3*uts+0.4*uas+0.3*tugas.
3. Studi Kasus
Buatlah sebuah program pemrosesan data mahasiswa sederhana yang
mengimplementasikan konsep ADT.
Ketentuannya :
- Tipe bentukan Mahasiswa berupa Nama, NIM, dan Nilai
- Terdiri dari 3 file, main.c, mahasiswa.c, mahasiswa.h
- Menu program terdiri dari Input Data Mahasiswa, View Data Mahasiswa, dan Cari Data
Mahasiswa
- View Data Mahasiswa termasuk menampilkan Nilai Rata-rata, Tertinggi, dan Terrendah
- Menu program tambahan terdiri dari Update Data Mahasiswa dan Delete Data
Mahasiswa (nilai bonus)
file mahasiswa.h harus berisi :
Program 31 mahasiswa.h