Anda di halaman 1dari 33

MODUL ARSIKOM

POINTER DAN ARRAY

Disusun oleh :

Afif Setyo Nugroho (4611412001)

Agus Setyawan (4611412001)

Maulana Akhsan (4611412010)

Imam Ahmad Ashari (4611412015)

Ahmad Asif Qolbi (4611412026)

JURUSAN ILMU KOMPUTER

FAKULTAS MIPA

UNIVERSITAS NEGERI SEMARANG

2013
PRAKTIKUM ARSIKOM

POINTER DAN ARRAY

TUJUAN

 Memahami konsep array, pointer dan alokasi memori


 Melatih penggunaan array dan pointer dalam C dan assembler

ALAT PERCOBAAN

 Personal Computer – PC
 Software compiler C misalnya MinGW atau GCC

DASAR TEORI

Array adalah kumpulan lokasi penyimpanan data, setiap data menyimpan tipe data yang
sama. Setiap lokasi penyimpanan disebut elemen array.

Anda tahu bahwa semua bahasa pemrograman tingkat tinggi menggunakan variabel.
Sedangkan pada bahasa pemrograman tingkat rendah variabel didefinisikan dengan cara yang
lebih rumit. Di sinilah salah satu kelebihan C ditunjukkan, dimana ia dapat menjembatani
antara bahasa kelas tinggi (unggul dengan kemudahan karena konsepnya manusiawi) dengan
bahasa tingkat rendah (powerfull, karena akses maksimal terhadap hardware). Dalam C,
programmer memiliki akses terhadap memory secara langsung dengan menggunakan pointer.
Untuk memahami konsep pointer, anda perlu mempelajari konsep pengalamatan memory.
Definisi pointer adalah variabel yang menyimpan alamat memory.
PERCOBAAN

Percobaan 1 :

a) Masukkan kode program berikut dengan menggunakan teks editor. Simpan kode
program tersebut dengan nama coba.c

void coba(int* x, int* y, int* z)

int a = *x;

int b = *y;

int c = *z;

int d = a + b;

*y = d ;

*z = b ;

*x = c ;

b) Kemudian kompilasi program tersebut agar didapat coba.s, pada file coba.s terdapat
angka‐angka yang menunjukkan penggunaan memory, apa arti angka‐angka tersebut.
c) pada file coba.c ganti keyword int dengan double, kemudian kompilasi file coba.c
yang sudah diubah, lihat kode assembler yang dihasilkan, apakah berbeda dengan
yang sebelumnya ? Mengapa ? seperti sebelumnya pada kode assembler yang
dihasilkan akan muncul angka‐angka, apa arti angka‐angka ini dalam penggunaan
memory?
Percobaan 2 :

Pada percobaan ini anda diminta untuk membuat beberapa fungsi yang berkaitan
dengan array dan pointer. Berikan juga penjelasan cara kerja programnya di laporan, terutama
yang berhubungan dengan array dan pointer.

Fungsi 1 :

Buat fungsi yang dapat membaca beberapa karakter dalam array (1 elemen array terdapat 1
karakter) dan menghasilkan output dalam susunan yang terbalik.

Contoh: H E L L O menjadi O L L E H

Fungsi 2 :

Buat fungsi yang dapat melakukan penyimpanan sebuah list (Nama) dalam “two‐dimensional
array of char” untuk menampilkan nama.

Contoh: Bob

Alice

Jude

Newton

Fungsi 3 :

Buat fungsi seperti pada Fungsi 2, namun dengan menggunakan “array of pointers” yang
menunjuk pada penyimpanan (Nama). Jelaskan perbedaan antara Fungsi 3 dengan Fungsi 2.

Fungsi 4 :

Buat fungsi yang dapat melakukan perkalian pada dua matriks. Keluaran dari fungsi
merupakan matriks hasil perkalian tersebut. Dalam melakukan operasi perkalian matriks
gunakan proses loop

Contoh : mulMatriks(int A[m][n], int B[n][o]) = C[m][o] = A[m][n] * B[n][o]


Catatan:

Pada fungsi di atas, anda harus dapat membuat agar fungsi mengoutput sebuah matriks. Ada
beberapa cara untuk melakukan ini, misalnya cara paling sederhana adalah membuat matriks
hasilnya sebagai parameter fungsi dan diubah‐ubah nilainya di dalam fungsi (misal C adalah
outputnya):

void addMatriks(int A[m][n], int B[m][n], int C[m][n]);

Tetapi prototype ini memunculkan pertanyaan mengenai kemungkinan implementasi dan cara
pemakaian fungsinya: apakah dari fungsi yang memanggil matriks C hanya merupakan
pointer dan akan dialokasikan nilainya di dalam fungsi, atau matriks C sudah terbentuk
sebagai array dan tinggal diubah nilainya? Biasanya prototype seperti ini lebih cenderung ke
cara yang kedua, yaitu array C sudah ada dan tinggal digunakan. Yang menjadi masalah, dari
dalam fungsi tidak ada jaminan bahwa array C sudah teralokasikan dengan benar dan
memiliki ukuran yang benar. Apabila ternyata salah, ada kemungkinan fungsi menulis data ke
alamat memori yang sebetulnya bukan milik C (misalnya karena melebihi batas indeks
maksimum array yang dialokasikan untuk C).

Cara lain yang lebih aman adalah membuat fungsi mereturn pointer dari matriks yang
dialokasikan secara dinamik di dalam fungsi:

int** addMatriks(int A[m][n], int B[m][n]);

Perhatikan juga bahwa anda harus dapat memberitahukan kepada fungsi berapa nilai m, n,
dan o (ukuran matriks) dari fungsi yang memanggilnya. Cara paling mudah adalah membuat
m, n, dan o sebagai global variable. Namun demikian cara ini biasanya tidak disukai karena
penggunaan global variable membuat alur dan struktur program menjadi kurang jelas, selain
membuat fungsi anda menjadi kurang fleksibel. Cara lain adalah membuat m, n, dan o
menjadi parameter fungsi, :

int** mulMatriks(int m, int n, int o, int A[m][n], int B[n][o]);

tetapi ini membuat jumlah parameter fungsi menjadi banyak. Selain itu, dengan menyimpan
ukuran matriks pada variabel terpisah, berarti perlu dibuat dua variabel tambahan, yang
secara struktural dalam program tidak ada hubungannya dengan array matriksnya, untuk
menyimpan ukuran matriks.
Salah satu solusi adalah dengan menyimpan matriks dalam suatu struktur data, misalnya yang
sederhana saja:

struct Matriks

int jumlahBaris;

int jumlahKolom;

int** nilai; // ini akan menjadi dynamic array 2 dimensi

};

sehingga prototype fungsi menjadi:

struct Matriks mulMatriks(struct Matriks A, struct Matriks B);

atau jika ingin lebih efisien memori:

struct Matriks* mulMatriks(struct Matriks* pA, struct Matriks* pB);

Anda bebas memilih cara apapun yang disebutkan di atas, atau menggunakan cara lain jika
menurut anda lebih baik.

TUGAS

Buatlah sebuah program yang mensimulasikan operasi aritmatika pada level bit 2’s
complement dengan menggunakan array. Array yang digunakan terdiri dari 8 bit saja dan
hanya boleh diisi oleh angka 1 dan 0. Operasi aritmatika yang akan disimulasikan hanya
penjumlahan dan pengurangan. Contoh : penjumlahan antara 7 dan 8. Angka 7 dimasukkan
ke dalam array menjadi 00000111 dan angka 8 menjadi 00001000, maka hasil penjumlahan
adalah 00001111 dan kemudian diubah kembali menjadi angka desimal, yaitu 15. Buatlah
makefile yang akan mengkompilasi program ini.
PEMBAHASAN

Percobaan 1

Dari percobaan ini, pada assembly hasil coba.c baris :

subl $16, %esp

Berarti program menyediakan 16 byte data untuk menyimpan variabel-variabel yang


diperlukan. Karena ada 4 variabel yang digunakan (a,b,c,d) yang masing-masing bertipe int,
bisa diketahui bahwa masing-masing variabel menggunakan 4 byte data.
Percobaan 2 :

Fungsi 1

Pada Fungsi 1 ini yaitu Fungsi 1: membaca beberapa karakter dalam array (1 elemen array
terdapat 1 karakter) dan menghasilkan output dalam susunan yang terbalik.

kata = HELLO

Output: OLLEH

Fungsi 1: Fungsi ini meminta panjang teks yang akan diinput lebih dulu, lalu membaca
karakter yang diinput satu persatu, dan mencetaknya terbalik dari huruf paling belakang.

Untuk mempersingkat program, bagian pembacaan karakter dilakukan seperti membaca


string pada c. Karena itu, sebenarnya meminta panjang teks yang akan diinput tidak
diperlukan, karena bisa menggunakan fungsi strlen().

Hasil percobaan menunjukkan fungsi sudah berjalan dengan benar


Fungsi 2

Fungsi 2: Fungsi ini meminta jumlah data yang akan diinput lebih dulu, lalu membaca setiap
string masukan satu per satu, dan mencetaknya lagi dengan urutan yang sama
Fungsi ini menyimpan list nama sebagai tabel kontigu, dengan array statik.

Hasil percobaan menunjukkan fungsi sudah berjalan dengan benar.


Fungsi 3
Fungsi 3: Sama dengan fungsi 2, tetapi menggunakan array of pointer yang masing-masing
elemennya menunjuk pada array of character (string).

Array of pointer sebelumnya hanya dideklarasikan sebagai pointer, lalu dialokasikan space
untuk menyimpan sebanyak 10 pointer pada program ini. Masing-masing pointer pada array
tersebut kemudian dialokasikan lagi untuk menyimpan array of character.

Hasil percobaan menunjukkan fungsi sudah berjalan dengan benar.


Fungsi 4

Fungsi 4: Untuk menghemat penggunaan memori, fungsi ini mengalokasikan memori untuk
matriks setelah menerima input panjang dan lebar matriks.

Cara mengalokasikannya sama dengan fungsi 3, pertama dialokasikan dulu untuk array of
pointer. Kemudian masing-masing elemennya dialokasikan lagi untuk menyimpan data
bertipe int.

Perkalian matriks mengikuti persamaan berikut:

O_ij=∑_(k=1)^(k=m.brs)▒〖m_ik*n_kj 〗

Hasil percobaan menunjukkan fungsi sudah berjalan dengan benar.


TUGAS

2.3 Tugas

Program ini dibagi ke 3 file: mtugas.c (berisi main program dan prosedur cetak), convert.c
(berisi prosedur konversi), dan adder.c (berisi prosedur penjumlahan).

Awalnya, kedua data input dalam desimal dikonversi ke biner menggunakan array of integer.
Kemudian, karena fungsi yang ada hanya adder, untuk melakukan pengurangan input
pengurangan harus dinegasikan dulu.

Penjumlahan dilakukan perbit pada baris berikut:

outp[i]=carry^(arg1[i]^arg2[i]);
carry=(arg1[i]&arg2[i])|(carry&(arg1[i]^arg2[i]));

Kedua baris tersebut diulang dari LSB ke MSB, dengan nilai awal carry = 0. Array hasil
(array outp) kemudian di konversi ke desimal untuk di-output.

Hasil percobaan menunjukkan fungsi sudah benar.


KESIMPULAN

a) Tipe data int menggunakan 4 byte data dan double menggunakan 8 byte data.

b) Array pada bahasa C sebenarnya adalah data bertipe pointer yang menunjuk ke alamat data
pertama array.

c) Two-dimensional array bisa menggunakan array kontigu atau array of pointer yang setiap
elemennya menunjuk pada array lain

Anda mungkin juga menyukai