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