Friday, December 23, 2016

Bab 5. Pemrograman C Belajar Dari Contoh



Bab. 5 Array

Tujuan Instruksional
      ·         Array.
      ·         Mendefinisikan array.
      ·         Contoh array.
      ·         Melewatkan array ke fungsi.
·         Pengurutan array.
·         Pencarian array.
·         Array subskript-jamak




5.1 Introduksi

Bab ini akan berperan sebagai pengantar topik struktur data. Array adalah struktur data yang memuat item-item berelasi bertipe sama. Pada Bab 9, akan didiskusikan notasi C tentang struktur (struct), sebuah struktur data yang memuat data berelasi dengan tipe berbeda. Array dan struktur adalah entitas statik dimana ukurannya tetap sama selama eksekusi program. Pada Bab 11, akan dikenalkan struktur data dinamis seperti list, antrian (queue), tumpukan (stack), dan pohon (tree) yang ukurannya dapat berubah selama program dieksekusi.

5.2 Array
Array adalah sekelompok lokasi memori yang berelasi oleh fakta bahwa semua memiliki nama dan tipe sama. Untuk menunjuk ke lokasi atau elemen tertentu di dalam array, nama array dan nomor posisi elemen tertentu di dalam array perlu dispesifikasi.


Gambar 5.1 | Array 12-elemen

Gambar 5.1 menampilkan sebuah array integer c. Array ini memuat 12 elemen. Sembarang elemen dapat dirujuk atau ditunjuk dengan memberikan nama array yang diikuti dengan nomor posisi elemen tertentu yang diapit dengan sepasang kurung siku ([]). Elemen pertama di dalam setiap array disebut dengan elemen ke-nol. Jadi, elemen pertama array c dirujuk dengan c[0], elemen keduanya dirujuk dengan c[1], dan secara umum, elemen ke-i dirujuk dengan c[i-1]. Nama array, seperti nama variabel yang lain, hanya dapat memuat huruf, dijit, dan garis-bawah (_). Nama array tidak bisa diawali dengan dijit.

Nomor posisi yang diapit sepasang kurung siku lebih formal disebut dengan subskript (atau indeks). Indeks harus berupa integer atau ekspresi integer. Jika suatu program menggunakan sebuah ekspresi sebagai subskript, maka ekspresi tersebut dievaluasi lebih dahulu untuk menentukan subskript. Sebagai contoh, jika a = 5 dan b = 6, maka statemen

c[ a + b ] += 2;

menambahkan 2 kepada elemen array c[11]. Nama array yang bersubskript merupakan lvalue, jadi hanya bisa digunakan di sisi kiri suatu penugasan.

Operator
Asosiatifitas
Tipe
[]   ()

++   --  !   (tipe)

*   /   %

+   -

<   <=   >   >=

==   !=

&

||

?:

=   +=   -=   *=   /=   %=

,
kiri ke kanan

kanan ke kiri

kiri ke kanan

kiri ke kanan

kiri ke kanan

kiri ke kanan

kiri ke kanan

kiri ke kanan

kanan ke kiri

kanan ke kiri

kiri ke kanan
tertinggi

unary

multiplikatif

aditif

relasional

ekualitas

AND logikal

OR logikal

kondisional

penugasan

koma

Gambar 5.2 | Keutamaan dan asosiatifitas operator

Akan diamati array c (Gambar 5.1) lebih dekat. Nama array adalah c. 12 elemennya dapat dirujuk dengan c[0], c[1], c[2], ..., c[11]. Nilai yang disimpan di dalam c[0] adalah -45, nilai yang disimpan di dalam c[1] adalah 6, nilai yang disimpan di dalam c[2] adalah 0, nilai yang disimpan di dalam c[7] adalah 62, dan nilai yang disimpan di dalam c[11] adalah 78. Untuk menampilkan penjumlahan semua nilai yang dimuat di dalam tiga elemen pertama array c, dituliskan

printf( "%d", c[ 0 ] + c[ 1 ] + c[ 2 ] );

Untuk membagi nilai dari elemen ketujuh array c dengan 2 dan menugaskan hasilnya kepada variabel x, dituliskan

x = c[ 6 ] / 2;

Kurung siku yang digunakan untuk mengapit subskript sebuah array dipandang sebagai suatu operator di dalam C. Operator tersebut memiliki level keutamaan yang sama dengan operator pemanggilan fungsi (yaitu, sepasang kurung yang ditempatkan setelah nama fungsi pada pemanggilan fungsi). Gambar 5.2 menunjukkan derajat keutamaan dan asosiatifitas yang telah dikenalkan sejauh ini.

5.3 Mendefinisikan Array
Array menempati ruang di dalam memori. Tipe setiap elemen dan jumlah elemen yang dibutuhkan setiap array dapat dispesifikasi sehingga komputer bisa mencadangkan jumlah memori yang sesuai untuk kebutuhan itu. Untuk memberitahu komputer dalam mencadangkan 12 elemen bagi array integer c, definisi

int c[ 12 ];

digunakan. Definisi berikut

int b[ 100 ], x[ 27 ];

memberikan ruang di dalam memori untuk 100 elemen dari array integer b dan 27 elemen dari array integer x.

Array dapat memuat tipe data lainnya. Misalnya, sebuah array bertipe char dapat dipakai untuk menyimpan suatu string karakter. String karakter dan kesamaannya dengan array didiskusikan pada Bab 7. Relasi antara pointer dan array didiskusikan pada Bab 6.

5.4 Contoh Array
Bagian ini akan menyajikan beberapa contoh yang mendemonstrasikan bagaimana mendefinisikan array, bagaimana menginisialisasi array, dan bagaimana memanipulasi array.

Mendefinisikan Array dan Menggunakan Loop untuk Menginisialisasi Array
Gambar 5.3 menggunakan statemen for untuk menginisialisasi dengan nol elemen-elemen dari suatu array integer n 10-elemen dan menampilkannya dalam format tabular. Statemen printf yang pertama (baris 16) menampilkan kepala kolom untuk dua kolom yang ditampilkan di dalam statemen for.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* Gambar 5.3: gambar05_03.c
   Penginisialisasian suatu array */
#include <stdio.h>

/* fungsi main memulai eksekusi program */
int main( void )
{
  int n[ 10 ]; /* n adalah array dengan 10 integer */
  int i; /* kounter */

  /* menginisialisasi elemen array array n dengan 0 */
  for ( i = 0; i < 10; i++ ) {
    n[ i ] = 0; /* menetapkan elemen pada lokasi i menjadi 0 */
  } /* akhir for */

  printf( "%s%13s\n", "Elemen", "Nilai" );

  /* menampilkan isi array n dalam format tabular */
  for ( i = 0; i < 10; i++ ) {
    printf( "%6d%13d\n", i, n[ i ] );
  } /* akhir for */

  return 0; /* indikasi terminasi sukses */
} /* akhir main */


Elemen        Nilai
     0            0
     1            0
     2            0
     3            0
     4            0
     5            0
     6            0
     7            0
     8            0
     9            0


Gambar 5.3 | Penginisialisasian elemen-elemen suatu array dengan nol

Menginisialisasi Array
Elemen suatu array dapat pula diinisialisasi ketika array didefinisikan dengan definisi berikut menggunakan tanda sama dengan dan separang kurung kurawal, { }, yang memuat daftar penginisialisasi terpisahkan koma. Gambar 5.4 menginisialisasi suatu array integer dengan 10 nilai (baris 9) dan menampilkan array dalam format tabular.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* Gambar 5.4: gambar05_04.c
   Penginisialisasian array menggunakan daftar penginisialisasi */
#include <stdio.h>

/* fungsi main memulai eksekusi */
int main( void )
{
  /* menggunakan daftar penginisialisasi untuk menginisialisasi array n */
  int n[ 10 ] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 };
  int i; /* kounter */

  printf( "%s%13s\n", "Elemen", "Nilai" );

  /* menampilkan isi array dalam format tabular */
  for ( i = 0; i < 10; i++ ) {
    printf( "%6d%13d\n", i, n[ i ] );
  } /* akhir for */

  return 0; /* indikasi terminasi sukses */
} /* akhir main */


Elemen        Nilai
     0           32
     1           27
     2           64
     3           18
     4           95
     5           14
     6           90
     7           70
     8           60
     9           37


Gambar 5.4 | Penginisialisasian elemen-elemen suatu array dengan suatu daftar penginisialisasi

Jika terdapat penginisialisasi lebih sedikit daripada jumlah elemen di dalam array, maka sisa elemen diinisialisasi dengan 0. Sebagai contoh, elemen-elemen array n pada Gambar 5.3 dapat diinisialisasi dengan 0 sebagai berikut:

int n[ 10 ] = { 0 };

Ini secara eksplisit menginisialisasi elemen pertama dengan 0 dan menginisialisasi sembilan elemen lainnta dengan 0 karena terdapat penginisialisasi lebih sedikit daripada jumlah elemen di dalam array. Hal penting untuk diingat adalah array tidak secara otomatis diinisialisasi dengan 0. Anda harus sedikitnya menginisialisasi elemen pertama dengan nol dan sisa elemen yang lain akan diinisialisasi secara otomatis dengan nol. Metode penginisialisasian terhadap elemen array dengan nol dilakukan pada waktu kompilasi untuk array static dan pada waktu runtime untuk array otomatis.

Definisi array

int n[ 5 ] = { 32, 27, 64, 18, 95, 14 };

akan menyebabkan error sintaks karena terdapat enam penginisialisasi dan hanya ada lima elemen array.

Jika ukuran array diabaikan dari suatu definisi dengan sebuah daftar penginisialisasi array, maka jumlah elemen di dalam array merupakan jumlah elemen di dalam daftar penginisialisasi. Sebagai contoh,

int n[] = { 1, 2, 3, 4, 5 };

akan menciptakan suatu array lima-elemen.

Menspesifikasi Ukuran Array dengan Konstanta Simbolik
Gambar 5.5 menginisialisasi elemen-elemen suatu array 10-elemen dengan nilai-nilai 2, 4, 6, ..., 20 dan menampilkan array dalam format tabular. Nilai-nilai yang dihasilkan dikalikan dengan kounter loop dan ditambahkan 2.

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
/* Gambar 5.5: gambar05_05.c
   Penginisialisasian elemen array s dengan integer genap dari 2 sampai 20 */
#include <stdio.h>
#define UKURAN 10 /* ukuran maksimum array */

/* fungsi main memulai eksekusi */
int main( void )
{
  /* konstanta simbolik UKURAN dapat dipakai untuk menetapkan ukuran array */
  int s[ UKURAN ]; /* array s mempunyai UKURAN elemen */
  int j; /* kounter */

  for ( j = 0; j < UKURAN; j++ ) { /* menetapkan nilai */
    s[ j ] = 2 + 2 * j;
  } /* akhir for */

  printf( "%s%13s\n", "Elemen", "Nilai" );

  /* menampilkan isi array s dalam format tabular */
  for ( j = 0; j < UKURAN; j++ ) {
    printf( "%6d%13d\n", j, s[ j ] );
  } /* akhir for */

  return 0; /* indikasi terminasi sukses */
} /* akhir main */


Elemen        Nilai
     0            2
     1            4
     2            6
     3            8
     4           10
     5           12
     6           14
     7           16
     8           18
     9           20


Gambar 5.5 | Penginisialisasian elemen-elemen array s dengan integer genap dari 2 sampai 20

Direktif preprosesor #define diintroduksi pada program ini. Baris 4

#define UKURAN 10

mendefinisikan suatu konstanta simbolik UKURAN yang memiliki nilai 10. Konstanta simbolik adalah suatu pengenal yang digantikan dengan teks pengganti oleh preprosesor C sebelum program dikompilasi. Ketika program dipra-olah, semua kemunculan konstanta simbolik UKURAN diganti dengan teks pengganti 10. Penggunaan konstanta simbolik dalam menetapkan ukuran array membuat program lebih gampang diskalakan. Pada Gambar 5.5, Anda dapat membuat loop for pertama (baris 13) untuk mengisi suatu array 1000-elemen hanya dengan mengubah nilai UKURAN di dalam direktif #define dari 10 menjadi 1000. Jika konstanta simbolik UKURAN tidak digunakan, maka Anda perlu mengubah program di tiga lokasi yang berbeda untuk menskalakan program agar dapat menangani suatu array 1000-elemen. Jika program lebih besar, teknik penggunaan konstanta simbolik ini tentu sangat berguna.

Menjumlahkan Elemen Array
Gambar 5.6 menjumlahkan nilai-nilai yang dimuat suatu array integer a 12-elemen. Tubuh statemen for (baris 16) melakukan penjumlahan ini.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* Gambar 5.6: gambar05_06.c
   Menghitung jumlah elemen-elemen suatu array */
#include <stdio.h>
#define UKURAN 12

/* fungsi main memulai eksekusi program */
int main( void )
{
  /* menggunakan daftar penginisialisasi untuk menginisialisasi array */
  int a[ UKURAN ] = { 1, 3, 5, 4, 7, 2, 99, 16, 45, 67, 89, 45 };
  int i; /* kounter */
  int total = 0; /* jumlah array */

  /* jumlah isi suatu array a */
  for ( i = 0; i < UKURAN; i++ ) {
    total += a[ i ];
  } /* akhir for */

  printf( "Total nilai elemen array adalah %d\n", total );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */




Total nilai elemen array adalah 383


Gambar 5.6 | Menghitung jumlah elemen-elemen suatu array

Menggunakan Array untuk Menyimpulkan Hasil Survey
Pada contoh berikutnya akan digunakan array dalam menyimpulkan hasil atas data yang dikoleksi dalam suatu survey. Perhatikan statemen permasalahan berikut:

Empat puluh mahasiswa diminta untuk memberikan penilaian atas kualitas makanan di kantin kampus dengan skala 1 sampai 10 (1 berarti sangat buruk dan 10 berarti sangat baik). Tempatkan 40 respon yang didapatkan di dalam suatu array integer dan simpulkan hasil survey tersebut.

Ini merupakan aplikasi array yang umum dijumpai (lihat Gambar 5.7). Anda diminta untuk menyimpulkan jumlah respon untuk tiap jenis (1 sampai 10). Array respon (baris 17) merupakan suatu array 40-elemen yang memuat respon mahasiswa. Anda menggunakan suatu array 11-elemen frekuensi (baris 14) untuk menghitung jumlah kemunculan setiap respon. Anda mengabaikan frekuensi[0] karena yang dipakai adalah mulai dari respon pada frekuensi[1].

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
26
27
28
29
30
31
32
33
34
35
36
37
/* Gambar 5.7: gambar05_07.c
   Program survey mahasiswa */
#include <stdio.h>
#define UKURAN_RESPON 40 /* mendefinisikan ukuran array */
#define UKURAN_FREKUENSI 11

/* fungsi main memulai program */
int main( void )
{
  int jawaban; /* kounter loop dengan 40 respon */
  int rating; /* kounter untuk loop dengan frekuensi 1-10 */

  /* menginisialisasi kounter frekuensi dengan 0 */
  int frekuensi[ UKURAN_FREKUENSI ] = { 0 };

  /* menempatkan respon di dalam array */
  int respon[ UKURAN_RESPON ] = { 1, 2, 6, 4, 8, 5, 9, 7, 8, 10,
     1, 6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7, 5, 6, 6,
     5, 6, 7, 5, 6, 4, 8, 6, 8, 10 };

  /* untuk setiap jawaban, pilih nilai suatu elemen array respon
     dan gunakan nilai itu sebagai subskript di dalam array frekuensi
     untuk menentukan elemen yang akan diinkremens */
  for ( jawaban = 0; jawaban < UKURAN_RESPON; jawaban++ ) {
    ++frekuensi[ respon [ jawaban ] ];
  } /* end for */

  /* menampilkan hasil */
  printf( "%s%17s\n", "Rating", "Frekuensi" );

 /* menampilkan frekuensi dalam format tabular */
 for ( rating = 1; rating < UKURAN_FREKUENSI; rating++ ) {
   printf( "%6d%17d\n", rating, frekuensi[ rating ] );
 } /* akhir for */

 return 0; /* indikasi terminasi sukses */
 } /* akhir main */



Rating        Frekuensi
     1                2
     2                2
     3                2
     4                2
     5                5
     6               11
     7                5
     8                7
     9                1
    10                3


Gambar 5.7 | Program untuk menganalisa survey mahasiswa

Loop for (baris 24) mengambil respon satu demi satu dari array respon dan menginkremen sebesar satu terhadap 10 kounter sehingga menjadi frekuensi[1] sampai frekuensi[10] di dalam array frekuensi. Statemen kunci di dalam loop adalah baris 25

++frekuensi[ respon [ jawaban ] ];

yang menginkremen kounter frekuensi tergantung nilai dari respon[jawaban]. Ketika variabel kounter jawaban bernilai 0, maka respon[jawaban] adalah 1, jadi ++frekuensi[respon[jawaban]] diinterpretasikan sebagai

++frequency[ 1 ];

yang menginkremen elemen array yang kedua. Ketika jawaban adalah 1, respon[jawaban] adalah 2, jadi ++frekuensi[respon[jawaban]] diinterpretasikan sebagai

++frequency[ 2 ];

yang menginkremen elemen array yang ketiga. Ketika jawaban adalah 2, respon[jawaban] adalah 6, jadi ++frekuensi[respon[jawaban]] diinterpretasikan sebagai

++frequency[ 6 ];

dan seterusnya.


Histogram Atas Nilai Elemen Array
Pada contoh berikutnya (Gambar 5.8), akan dibaca beberapa angka dari suatu array dan menampilkan grafik informasi dalam format grafik batang atau histogram, dimana setiap angka ditampilkan, dan kemudian sebuah batang yang memuat asterik ditampilkan. Statemen for bersarang (baris 20) dipakai untuk menggambarkan grafik batang. Perhatikan kegunaan printf(“\n”) untuk mengakhiri suatu grafik batang (baris 24).

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
26
27
28
/* Gambar 5.8: gambar05_08.c
   Program untuk menampilkan histogram */
#include <stdio.h>
#define UKURAN 10

/* function main begins program execution */
int main( void )
{
  /* menggunakan daftar penginsialisasi untuk menginisialisasi array n */
  int n[ UKURAN ] = { 19, 3, 15, 7, 11, 9, 13, 5, 17, 1 };
  int i; /* kounter untuk elemen-elemen array */
  int j; /* kounter untuk menghitung * di dalam grafik batang */

  printf( "%s%13s%17s\n", "Elemen", "Nilai", "Histogram" );

  /* untuk setiap elemen array n, ditampilkan batang histogram */
  for ( i = 0; i < UKURAN; i++ ) {
    printf( "%6d%13d        ", i, n[ i ]) ;

    for ( j = 1; j <= n[ i ]; j++ ) { /* print one bar */
      printf( "%c", '*' );
       } /* akhir for sebelah dalam*/

    printf( "\n" ); /* akhir suatu batang histogram */
  } /* end outer for */

  return 0; /* indikasi terminasi sukses */
} /* akhir main */



Elemen        Nilai        Histogram
     0           19        *******************
     1            3        ***
     2           15        ***************
     3            7        *******
     4           11        ***********
     5            9        *********
     6           13        *************
     7            5        *****
     8           17        *****************
     9            1        *


Gambar 5.8 | Program untuk menampilkan histogram
Melempar Dadu 6000 Kali dan Menyimpan Hasilnya Dalam Array
Pada Bab 4, telah disebutkan bahwa akan ditunjukkan metode yang lebih elegan dalam menulis program pelemparan-dadu pada Gambar 4.8. Permasalahannya adalah melempar dadu enam-sisi sebanyak 6000 kali untuk menguji apakah pembangkit bilangan acak sesungguhnya menghasilkan angka acak  atau tidak. Versi array dari program tersebut ditampilkan pada Gambar 5.9.

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
26
27
28
29
30
31
/* Gambar 5.9: gambar05_09.c
   Melempar dadu enam-sisi 6000 kali */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define UKURAN 7

/* fungsi main memulai eksekusi program */
int main( void )
{
  int muka; /* nilai dadu acak 1 sampai 6 */
  int lempar; /* kounter lempar 1-6000 */
  int frekuensi[ UKURAN ] = { 0 }; /* menghampus frekuensi */

  srand( time( NULL ) ); /* benih pembangkit acak */

  /* melempar dadu 6000 kali */
  for ( lempar = 1; lempar <= 6000; lempar++ ) {
    muka = 1 + rand() % 6;
    ++frekuensi[ muka ]; /* mengganti 26-baris switch pada Gambar 4.8 */
  } /* akhir for */

  printf( "%s%17s\n", "Muka", "Frekuensi" );

  /* elemen-elemen frekuensi 1-6 dalam format tabular */
  for ( muka = 1; muka < UKURAN; muka++ ) {
    printf( "%4d%17d\n", muka, frekuensi[ muka ] );
  } /* akhir for */

  return 0; /* indikasi terminasi sukses */
} /* akhir main */



Muka        Frekuensi
   1              998
   2              987
   3             1022
   4             1043
   5              968
   6              982


Gambar 5.9 | Program pelemparan-dadu menggunakan array menggantikan switch

Menggunakan Array Karakter Untuk Menyimpan dan Memanipulasi String
Yang didiskusikan sejauh ini hanya array integer. Tetapi, array juga mampu menampung data sembarang tipe. Sekarang akan didiskusikan bagaimana menyimpan string di dalam array karakter. Sejauh ini, satu-satunya kapabilitas pemrosesan-string yang dijelaskan adalah menampilkan suatu string dengan printf. Sebuah string seperti “mataram” merupakan suatu array statik yang memuat karakter di dalam C.

Array karakter memiliki beberapa fitur unik. Suatu array karakter dapat diinisialisasi menggunakan sebuah literal string. Misalnya,

char string1[] = "pertama";

menginisialisasi elemen-elemen array string1 dengan karakter-karakter individual di dalam literal string “pertama”. Pada kasus ini, ukuran array string1 ditentukan oleh kompiler berdasarkan pada panjang string. String “pertama” memuat lima karakter ditambah dengan karakter terminasi-string yang disebut dengan karakter null. Jadi, array string1 sebenarnya memuat enam elemen. Konstanta karakter yang merepresentasikan karakter null adalah ‘\0’. Semua string dalam C diakhiri dengan karakter ini. Array karakter yang merepresentasikan sebuah string harus didefinisikan cukup besar untuk menampung jumlah karakter di dalam string ditambah dengan karakter null.

Array karakter juga dapat diinisialisasi dengan konstanta karakter di dalam sebuah daftar penginisialisasi. Definisi sebelumnya ekivalen dengan

char string1[] = { 'p', 'e', 'r', 't', 'a', ‘m’, ‘a’, '\0' };

Karena suatu string sebenarnya adalah sebuah array karakter, Anda dapat mengakses karakter-karakter tersebut secara individual di dalam string secara langsung menggunakan notasi subskript array. Sebagai contoh, string1[0] adalah karakter ‘p’ dan string1[3] adalah karakter ‘t’.

Anda juga dapat mengentrikan sebuah string secara langsung ke suatu array karakter dari papan-ketik menggunakan scanf dan penspesifikasi konversi %s. Sebagai contoh,

char string2[ 20 ];

menciptakan sebuah karakter array yang mampu menyimpan suatu string dengan maksimum 19 karakter dan sebuah karakter null. Statemen

scanf( "%s", string2 );

membaca sebuah string dari papan-ketik ke dalam string2. Nama array yang dilewatkan kepada scanf tanpa menggunakan operator &, yang digunakan untuk variabel tak-string. Operator & biasanya digunakan untuk menyediakan lokasi variabel di dalam memori kepada scanf sehingga suatu nilai dapat disimpan di lokasi tersebut. Pada bagian 5.5, ketika mendiskusikan pelewatan array kepada fungsi, Anda akan melihat bahwa nilai dari nama array adalah alamat awal suatu array; oleh karena itu, & tidak diperlukan. Fungsi scanf akan membaca karakter sampai ditemukan spasi, tab, garis-barum atau indikator end-of-file. String harus tidak boleh lebih panjang dari 19 karakter agar masih ada rung untuk karakter null. Jika pengguna mengetikkan 20 atau lebih karakter, maka program Anda akan bermasalah! Karena alasan ini, Anda sebainya menggunakan penspesifikasi konversi %19s sehingga scanf tidak menulis karakter ke dalam memori di luar batas akhir array s.

Array karakter yang merepresentasikan sebuah string dapat ditampilkan dengan printf dan penspesifikasi string %s. Array string2 dapat ditampilkan dengan statemen

printf( "%s\n", string2 );

Fungsi printf, seperti scanf, tidak memeriksa berapa besar karakter array. Karakter-karakter di dalam array ditampilkan sampai ditemukannya karakter null penghenti.

Gambar 5.10 mendemonstrasikan penginisialisasian sebuah array karakter dengan suatu literal string, pembacaan string ke dalam suatu array karakter, dan penampilan array karakter, dan pengaksesan karakter-karakter secara individual.

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
26
27
28
29
/* Gambar 5.10: gambar05_10.c
   Memperlakukan array karakter sebagai string */
#include <stdio.h>

/* fungsi main memulai eksekusi program */
int main( void )
{
  char string1[ 20 ]; /* mencadangkan memori untuk 20 karakter */
  char string2[] = "string literal"; /* mencadangkan memori untuk 15 karakter */
  int i; /* kounter */

  /* membaca string dari pengguna ke dalam array string1 */
  printf("Masukkan sebuah string: ");
  scanf( "%s", string1 ); /* masukan berakhir dengan karakter spasi */

  /* menampilkan string */
  printf( "string1 adalah: %s\nstring2 is: %s\n"
          "string1 dengan spasi di antara karakter adalah:\n",
           string1, string2 );

  /* menampilkan karakter sampai ditemukan karakter null */
  for ( i = 0; string1[ i ] != '\0'; i++ ) {
    printf( "%c ", string1[ i ] );
  } /* akhir for */

  printf( "\n" );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */



Masukkan sebuah string: Teknik Elektro
string1 adalah: Teknik
string2 is: string literal
string1 dengan spasi di antara karakter adalah:
T e k n i k


Gambar 5.10 | Program untuk memperlakukan array karakter sebagai string

Gambar 5.10 menggunakan statemen for (baris 20) untuk menjelajahi array string1 menggunakan loop dan menampilkan karakter-karakter individual yang dipisahkan dengan spasi, menggunakan penspesifikasi konversi %c. Kondisi di dalam statemen for, string1[i] != ‘\0’, bernilai true jika belum ditemukan karakter null penghenti di dalam string.

Array Lokal Statik dan Array Lokal Otomatis
Bab 5 telah mendiskusikan penspesifikasi static. Variabel lokal static eksis selama program dijalankan, dan hanya dikenal di dalam tubuh fungsi. Anda dapat menerapkan static terhadap suatu definisi array lokal sehingga array tersebut tidak diciptakan dan diinisialisasi setiap kali fungsi dipanggil dan array tersebut tidak dihancurkan setiap kali fungsi selesai dieksekusi di dalam program. Hal ini mereduksi waktu eksekusi program, khususnya untuk program dengan fungsi-fungsi terpanggil yang memuat array besar.

Array static hanya diinisialisasi sekali pada saat kompilasi. Anda tidak perlu secara eksplisit menginisialisasi suatu array static, karena elemen-elemenya diinisialisasi nol oleh kompiler.

Gambar 5.11 mendemonstrasikan fungsi staticArrayInit (baris 22) dengan suatu array lokal static (baris 25) dan fungsi otomatisArrayInit (baris 44) dengan sebuah array otomatis lokal (baris 47). Fungsi staticArrayInit dipanggil dua kali (baris 12 dan 16). Array lokal static di dalam fungsi tersebut diinisialisasi dengan nol oleh kompiler (baris 25). Fungsi tersebut menampilkan array, menambahkan 5 pada tiap elemen dan menampilkan array tersebut kembali. Saat kedua kalinya fungsi tersebut dipanggil, array static memuat nilai-nilai yang disimpan selama pemanggilan fungsi yang pertama. Fungsi otomatisArrayInit juga dipanggil dua kali (baris 13 dan 17). Elemen-elemen dari array lokal otomatis di dalam fungsi tersebut diinisialisasi dengan nilai-nilai 1, 2, dan 3 (baris 47). Fungsi ini menampilkan array, menambahkan 5 pada tiap elemen, dan menampilkan array kembali. Ketika kedua kalinya fungsi tersebut dipanggil, elemen-elemen array diinisialisasi-ulang dengan 1, 2, dan 3 kembali karena array mempunyai durasi penyimpanan otomatis.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/* Gambar 5.11: gambar05_11.c
   Array static diinisialisasi dengan nol */
#include <stdio.h>

void staticArrayInit( void ); /* prototipe fungsi */
void otomatisArrayInit( void ); /* protipe fungsi */

/* fungsi main memulai eksekusi program */
int main( void )
{
  printf( "Pemanggilan pertama terhadap tiap fungsi:\n" );
  staticArrayInit();
  otomatisArrayInit();

  printf( "\n\nPemanggilan kedua terhadap tiap fungsi:\n" );
  staticArrayInit();
  otomatisArrayInit();
  return 0; /* indikasi terminasi sukses */
} /* akhir main */

/* fungsi untuk mendemonstrasikan array lokal statik */
void staticArrayInit( void )
{
  /* menginisialisasi elemen dengan 0 ketika pertama kali fungsi dipanggil */
  static int array1[ 3 ];
  int i; /* kounter */

  printf( "\nNilai-nilai pada saat memasuki staticArrayInit:\n" );

  /* menampilkan isi array1 */
  for ( i = 0; i <= 2; i++ ) {
    printf( "array1[ %d ] = %d ", i, array1[ i ] );
  } /* akhir for */

  printf( "\nNilai-nilai saat keluar dari staticArrayInit:\n" );

  /* memodifikasi dan menampilkan isi array1 */
  for ( i = 0; i <= 2; i++ ) {
    printf( "array1[ %d ] = %d ", i, array1[ i ] += 5 );
  } /* akhir for */
} /* akhir fungsi staticArrayInit */

/* fungsi untuk mendemonstrasikan array lokal otomatis */
void otomatisArrayInit( void )
{
  /* menginisialisasi elemen saat pertama kali fungsi dipanggil */
  int array2[ 3 ] = { 1, 2, 3 };
  int i; /* kounter */

  printf( "\n\nNilai-nilai pada saat memasuki otomatisArrayInit:\n" );

  /* menampilkan isi array2 */
  for ( i = 0; i <= 2; i++ ) {
    printf("array2[ %d ] = %d ", i, array2[ i ] );
  } /* akhir for */

  printf( "\nNilai-nilai saat keluar dari otomatisArrayInit:\n" );

  /* memodifikasi dan menampilkan isi array2 */
  for ( i = 0; i <= 2; i++ ) {
    printf( "array2[ %d ] = %d ", i, array2[ i ] += 5 );
  } /* akhir for */
} /* akhir fungsi otomatisArrayInit */

Pemanggilan pertama terhadap tiap fungsi:

Nilai-nilai pada saat memasuki staticArrayInit:
array1[ 0 ] = 0 array1[ 1 ] = 0 array1[ 2 ] = 0
Nilai-nilai saat keluar dari staticArrayInit:
array1[ 0 ] = 5 array1[ 1 ] = 5 array1[ 2 ] = 5

Nilai-nilai pada saat memasuki otomatisArrayInit:
array2[ 0 ] = 1 array2[ 1 ] = 2 array2[ 2 ] = 3
Nilai-nilai saat keluar dari otomatisArrayInit:
array2[ 0 ] = 6 array2[ 1 ] = 7 array2[ 2 ] = 8

Pemanggilan kedua terhadap tiap fungsi:

Nilai-nilai pada saat memasuki staticArrayInit:
array1[ 0 ] = 5 array1[ 1 ] = 5 array1[ 2 ] = 5
Nilai-nilai saat keluar dari staticArrayInit:
array1[ 0 ] = 10 array1[ 1 ] = 10 array1[ 2 ] = 10

Nilai-nilai pada saat memasuki otomatisArrayInit:
array2[ 0 ] = 1 array2[ 1 ] = 2 array2[ 2 ] = 3
Nilai-nilai saat keluar dari otomatisArrayInit:
array2[ 0 ] = 6 array2[ 1 ] = 7 array2[ 2 ] = 8


Gambar 5.11 | Array statik diinisialisasi dengan nol jika tidak secara eksplisit diinisialisasi

5.5 Melewatkan Array Kepada Fungsi
Untuk melewatkan suatu argumen array kepada fungsi, diperlukan untuk menspesifikasi nama array tanpa adanya kurung kurawal. Sebagai contoh, jika array temperaturPerjam didefinisikan sebagai

int temperaturPerjam [ 24 ];

maka pemanggilan fungsi

modifikasiArray(temperaturPerjam, 24 )

melewatkan array temperaturPerjam dan ukurannya kepada fungsi modifikasiArray. Tidak seperti array char yang memuat string, array bertipe lain tidak memiliki karakter null sebagai terminator. Karena alasan ini, ukuran suatu array dilewatkan kepada fungsi, sehingga fungsi tersebut dapat memproses jumlah elemen secara benar. C secara otomatis melewatkan array kepada fungsi melalui referensi, yaitu fungsi terpanggil dapat memodifikasi nilai elemen array asli di dalam fungsi pemanggil. Nama array menjadi alamat dari elemen pertama dari array. Karena alamat awal array dilewatkan, fungsi terpanggil dapat mengetahui secara pasti dimana array disimpan. Oleh karena itu, ketika fungsi terpanggil memodifikasi elemen array di dalam tubuh fungsinya, yang terjadi adalah bahwa ia memodifikasi elemen aktual di dalam lokasi memori yang asli.

Gambar 5.12 mendemonstrasikan bahwa nama array sebenarnya merupakan alamat dari elemen pertama suatu array dengan menampilkan array, &array[0], dan &array menggunakan penspesifikasi konversi %p (penspesifikasi konversi spesial untuk menampilkan alamat). Penspesifikasi konversi %p menampilkan alamat sebagai bilangan heksadesimal. Bilangan heksadesimal (basis 16) memuat dijit dari 0 sampai 9 dan huruf A sampai F. Keluaran program menunjukkan bahwa kedua array dan &array[0] mempunyai nilai yang sama. Keluara program berbeda tergantung sistem yang dipakai.

Meskipun keseluruhan array dilewatkan melalui referensi, elemen-elemen array secara individual dilewatkan dengan nilai seperti variabel biasa. Untuk melewatkan suatu elemen array ke fungsi, digunakan nama elemen array tersubskript (skalar) sebagai argumen di dalam pemanggilan fungsi. Pada Bab 7, akan ditunjukkan bagaimana melewatkan skalar (variabel individual dan elemen array) kepada fungsi melalui referensi.

1
2
3
4
5
6
7
8
9
10
11
12
13
/* Gambar 5.12: gambar05_12.c
   Nama suatu array sama dengan &array[ 0 ] */
#include <stdio.h>

/* fungsi main memulai eksekusi program */
int main( void )
{
  char array[ 5 ]; /* mendefinisikan array berukuran 5 */

  printf( "    array = %p\n&array[0] = %p\n   &array = %p\n",
            array, &array[ 0 ], &array );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */


    array = 0018FF40
&array[0] = 0018FF40
   &array = 0018FF40


Gambar 5.12 | Nama array sama dengan alamat dari elemen pertama array

Untuk suatu fungsi agar bisa menerima sebuah array melalui pemanggilan fungsi, daftar parameter fungsi tersebut harus menspesifikasikan bahwa suatu array akan diterima. Misalnya, header fungsi untuk fungsi modifikasiArray dapat dituliskan sebagai

void modifikasiArray( int b[], int ukuran )

mengindikasikan bahwa modifikasiArray berharap menerima suatu array integer di dalam parameter b dan jumlah elemen array di dalam parameter ukuran. Ukuran array tidak diapit oleh sepasang kurung siku. Jika dilakukan, kompiler akan memeriksa apakah ia lebih besar dari nol, kemudian mengabaikannya. Penetapan jumlah elemen array menjadi negatif akan menyebabkan error kompilasi. Karena array secara otomatis dilewatkan dengan referensi, ketika fungsi terpanggil menggunakan nama array b, ia akan merujuk kepada array yang ada di dalam pemanggil (array temperaturPerjam di dalam pemanggilan sebelumnya). Pada Bab 6, akan dikenalkan beberapa notasi lain dalam mengindikasikan bahwa suatu array sedang diterima oleh suatu fungsi. Seperti yang akan Anda lihat, notasi tersebut didasarkan pada relasi yang intim antara array dan pointer di dalam C.

Gambar 5.13 mendemonstrasikan perbedaan antara pelewatan keseluruhan array dan pelewatan suatu elemen array. Program pertama-tama menampilkan lima elemen dari array integer a (baris 20-220). Selanjutnya, a dan ukurannya dilewatkan kepada fungsi modifikasiArray (baris 27), dimana setiap elemen array a akan dikalikan dengan 2 (baris 54-55). Kemudian a ditampilkan ulang di dalam main (baris 32-34). Seperti yang ditunjukkan keluaran program, elemen-elemen array a termodifikasi oleh modifikasiArray. Sekarang program menampilkan nilai dari a[3] (baris 38) dan melewatkannya kepada fungsi modifikasiElemen (baris 40). Fungsi modifikasiElemen mengalikan argumennya dengan 2 (baris 64) dan menampilkan nilai baru tersebut. Ketika a[3] ditampilkan ulang di dalam main (baris 43), ternyata elemen tersebut tidak termodifikasi, karena elemen-elemen array individual dilewatkan dengan nilai.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/* Gambar 5.13: gambar05_13.c
   Pelewatan array dan elemen array individual kepada fungsi */
#include <stdio.h>
#define UKURAN 5

/* prototipe fungsi */
void modifikasiArray( int b[], int ukuran );
void modifikasiElemen( int e );

/* fungsi main memulai eksekusi program */
int main( void )
{
  int a[ UKURAN ] = { 0, 1, 2, 3, 4 }; /* menginisialisasi a */
  int i; /* kounter */

  printf( "Efek pelewatan keseluruhan array dengan referensi: \n\n"
          "Nilai-nilai array asli adalah:\n" );

  /* menampilkan array asli */
  for ( i = 0; i < UKURAN; i++ ) {
    printf( "%3d", a[ i ] );
  } /* akhir for */

  printf( "\n" );

  /* melewatkan array a kepada fungsi modifikasiArray dengan referensi */
  modifikasiArray( a, UKURAN );

  printf( "Nilai-nilai array termodifikasi adalah:\n" );

  /* menampilkan array termodifikasi */
  for ( i = 0; i < UKURAN; i++ ) {
    printf( "%3d", a[ i ] );
  } /* akhir for */

  /* menampilkan nilai a[ 3 ] */
  printf( "\n\n\nEfek pelewatan elemen array "
          "dengan nilai:\n\nNilai a[3] adalah %d\n", a[ 3 ] );

  modifikasiElemen( a[ 3 ] ); /* melewatkan elemen array a[ 3 ] dengan nilai*/

  /* menampilkan nilai a[ 3 ] */
  printf( "Nilai a[ 3 ] adalah %d\n", a[ 3 ] );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */

/* Di dalam fungsi modifikasiArray, "b" menunjuk ke array asli "a"
   di dalam memori */
void modifikasiArray( int b[], int ukuran )
{
  int j; /* kounter */
  /* mengalikan setiap elemen array dengan 2 */
  for ( j = 0; j < ukuran; j++ ) {
    b[ j ] *= 2;
  } /* akhir for */
} /* akhir fungsi modifikasiArray */

/* Di dalam fungsi modifikasiElemen, "e" adalah salinan lokal dari elemen array
   a[ 3 ] dilewatkan dari main */
void modifikasiElemen( int e )
{
  /* mengalikan parameter dengan 2 */
  printf( "Nilai di dalam modifikasiElemen adalah %d\n", e *= 2 );
} /* akhir fungsi modifikasiElemen */


Efek pelewatan keseluruhan array dengan referensi:

Nilai-nilai array asli adalah:
  0  1  2  3  4
Nilai-nilai array termodifikasi adalah:
  0  2  4  6  8

Efek pelewatan elemen array dengan nilai:

Nilai a[3] adalah 6
Nilai di dalam modifikasiElemen adalah 12
Nilai a[ 3 ] adalah 6

Gambar 5.13 | Pelewatan array dan elemen array individual kepada fungsi
Kadangkala ada situasi di dalam program Anda dimana sebuah fungsi tidak diijinkan untuk memodifikasi elemen array. Karena array selalu dilewatkan dengan referensi, modifikasi atas nilai-nilai di dalam suatu array sangat susah untuk dikendalikan. C menyediakan kualifier const untuk mencegah modifikasi atas nilai array di dalam suatu fungsi. Ketika sebuah parameter array diawali dengan kualifier const, elemen array menjadi konstanta di dalam tubuh fungsi, dan segala usaha untuk memodifikasi elemen array di dalam tubuh fungsi akan menyebabkan error kompilasi.

Gambar 5.14 mendemonstrasikan kualifier const. Fungsi cobaModifikasiArray (baris 20) didefinisikan dengan parameter const int b[], yang menspesifikasi bahwa array b merupakan konstanta dan tidak dapat dimodifikasi. Keluaran program menunjukkan pesan error yang dihasilkan kompiler. Ketiga pencobaan oleh fungsi untuk memodifikasi elemen array menghasilkan error kompilasi. Kualifier const akan didiskusikan kembali pada Bab 6.

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
/* Gambar 5.14: gambar05_14.c
   Mendemonstrasikan kualifier const dengan array */
#include <stdio.h>

void cobaModifikasiArray( const int b[] ); /* prototipe fungsi */

/* fungsi main untuk memulai eksekusi program */
int main( void )
{
  int a[] = { 10, 20, 30 }; /* menginisialisasi a */

  cobaModifikasiArray( a );

  printf("%d %d %d\n", a[ 0 ], a[ 1 ], a[ 2 ] );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */

/* Di dalam fungsi cobaModifikasiArray, array b adalah const, jadi
   dapat digunakan untuk memodifikasi array asli a di dalam main. */
void cobaModifikasiArray( const int b[] )
{
  b[ 0 ] /= 2; /* error */
  b[ 1 ] /= 2; /* error */
  b[ 2 ] /= 2; /* error */
} /* akhir fungsi cobaModifikasiArray */


Compiling...

gambar05_14.c(22) : error C2166: l-value specifies const object
gambar05_14.c(23) : error C2166: l-value specifies const object
gambar05_14.c(24) : error C2166: l-value specifies const object


Gambar 5.14 | Kualifier tipe const


5.6 Pengurutan Array
Pengurutan data (penempatan data dengan urutan tertentu seperti urutan menaik atau menurun) merupakan salah satu aplikasi komputasi yang penting. Sebuah bank perlu mengurutkan semua nomor akun sehingga memudahkan banyak pekerjaan perbankan. Perusahaan telepon mengurutkan daftar pelanggan melalui nama terakhir dan nama pertama sehingga memudahkan untuk mencari nomor telepon. Hampir semua organisasi perlu mengurutkan datanya dan pada banyak kasus data yang perlu diurutkan berukuran sangat besar. Pengurutan data merupakan masalah yang sangat rumit dan merupakan bidang penelitian intensif dalam ilmu komputer. Pada bab ini, akan didiskusikan tentang skema pengurutan paling sederhana. Pada Bab 11, akan diinvestigasi skema pengurutan yang lebih kompleks dengan kinerja yang lebih baik.

Gambar 5.15 mengurutkan nilai elemen-elemen dari array a 10-elemen (baris 10) agar tertata dalam urutan menaik. Teknik yang digunakan adalah pengurutan bubble atau pengurutan sinking karena nilai yang lebih kecil secara bertahap mengambang ke atas array seperti gelembung air di permukaan air, sedangkan nilai yang lebih besar tenggelam ke dasar array. Tekniknya adalah dengan melakukan beberapa pass terhadap array. Pada setiap pass, pasangan-pasangan elemen yang berurutan dibandingkan. Jika sepasang elemen tertata dalam urutan menaik (atau jika kedua nilainya identik), maka akan dibiarkan apa adanya. Jika sepasang elemen tertata dalam urutan menurun, maka keduanya saling dipergantikan.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* Gambar 5.15: gambar05_15.c
   Program ini mengurutkan nilai-nilai array menjadi urutan menaik */
#include <stdio.h>
#define UKURAN 10

/* fungsi main memulai eksekusi program */
int main( void )
{
  /* menginisialisasi a */
  int a[ UKURAN ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };
  int pass;
  int i; /* kounter perbandingan */
  int hold; /* lokasi sementara digunakan untuk menukar elemen */

  printf( "Item data dalam tatanan asli\n" );

  /* menampilkan array asli */
  for ( i = 0; i < UKURAN; i++ ) {
    printf( "%4d", a[ i ] );
  } /* akhir for */

  /* pengurutan bubble */
  /* loop untuk mengendalikan jumlah pass */
  for ( pass = 1; pass < UKURAN; pass++ ) {
   
    /* loop untuk mengendalikan jumlah perbandingan tiap pass */
    for ( i = 0; i < UKURAN - 1; i++ ) {
     
      /* membandingkan dua elemen bertetangga dan menukarnya jika
         elemen pertama lebih besar dari elemen kedua */
      if ( a[ i ] > a[ i + 1 ] ) {
        hold = a[ i ];
        a[ i ] = a[ i + 1 ];
        a[ i + 1 ] = hold;
         } /* akhir if */
       } /* akhir for dalam */
  } /* akhir for luar */

  printf( "\nItem data dalam urutan menaik\n" );

  /* menampilkan array terurut */
  for ( i = 0; i < UKURAN; i++ ) {
    printf( "%4d", a[ i ] );
  } /* akhir for */

  printf( "\n" );
  return 0; /* indikasi terminasi sukses */
 } /* akhir main */


Item data dalam tatanan asli
   2   6   4   8  10  12  89  68  45  37
Item data dalam urutan menaik
   2   4   6   8  10  12  37  45  68  89

Gambar 5.15 | Pengurutan bubble atas array

5.7 Studi Kasus: Menghitung Rerata, Median, dan Mode Menggunakan Array
Sekarang akan disajikan contoh yang lebih besar. Komputer umumnya digunakan untuk menganalisa data survey untuk mendapatkan hasil opini. Gambar 5.16 menggunakan array respon yang diinisialisasi dengan 99. Setiap respon diberi angka 1 sampai 9. Program akan menghitung rerata, median, dan mode dari 99 nilai yang didapatkan.

Rerata adalah rata-rata aritmatik atas 99 nilai. Fungsi rerata (baris 40) menghitung rerata dengan mencari total atas 99 nilai dan membagi hasilnya dengan 99.

Median adalah nilai tengah. Fungsi median (baris 61) menentukan median dengan memanggil fungsi pengurutanBubble (yang didefinisikan pada baris 133) untuk mengurutkan array respon menjadi tatanan menaik, kemudian memilih elemen tengah, jawaban[UKURAN/2], dari array terurut. Ketika terdapat jumlah elemen genap, median harus dihitung sebagai rerata atas dua nilai tengah. Fungsi median saat ini tidak menyediakan kapabilitas ini. Fungsi tampilArray (baris 156) dipanggil untuk menampilkan array respon.

Mode adalah nilai yang kemunculannya paling sering di antara 99 respon. Fungsi mode (baris 82) menentukan mode dengan menghitung jumlah respon tiap tipe, kemudian memilih nilai dengan hitungan tertinggi. Fungsi mode juga menghasilkan histogram untuk membantu menentukan mode secara grafikal. Gambar 5.17 memuat contoh keluaran program. Contoh ini mencakup banyak manipulasi array yang telah dipelajari, termasuk pelewatan array kepada fungsi.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
1661
167
168
169
/* Gambar 5.16: gambar05_16.c
   Program ini mengenalkan topik analisa survey.
   Program ini menghitung rerata, median, dan mode data */
#include <stdio.h>
#define UKURAN 99

/* protipe fungsi */
void rerata( const int jawaban[] );
void median( int jawaban[] );
void mode( int frek[], const int jawaban[] ) ;
void pengurutanBubble( int a[] );
void tampilArray( const int a[] );

/* fungsi main memulai eksekusi program */
int main( void )
{
  int frekuensi[ 10 ] = { 0 }; /* menginisialisasi array frekuensi */

  /* menginisialisasi array respon */
  int respon[ UKURAN ] =
  { 6, 7, 8, 9, 8, 7, 8, 9, 8, 9,
    7, 8, 9, 5, 9, 8, 7, 8, 7, 8,
    6, 7, 8, 9, 3, 9, 8, 7, 8, 7,
    7, 8, 9, 8, 9, 8, 9, 7, 8, 9,
    6, 7, 8, 7, 8, 7, 9, 8, 9, 2,
    7, 8, 9, 8, 9, 8, 9, 7, 5, 3,
    5, 6, 7, 2, 5, 3, 9, 4, 6, 4,
    7, 8, 9, 6, 8, 7, 8, 9, 7, 8,
    7, 4, 4, 2, 5, 3, 8, 7, 5, 6,
    4, 5, 6, 1, 6, 5, 7, 8, 7 };

  /* memproses respon */
  rerata( respon );
  median( respon );
  mode( frekuensi, respon );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */

/* menghitung rerata atas semua nilai respon */
void rerata( const int jawaban[] )
{
  int j; /* kounter untuk mentotal elemen-elemen array */
  int total = 0; /* variabel untuk menampung jumlah elemen array */

  printf( "%s\n%s\n%s\n", "********", " Rerata", "********" );

  /* total nilai respon values */
  for ( j = 0; j < UKURAN; j++ ) {
    total += jawaban[ j ];
  } /* akhir for */

  printf( "Rerata adalah rata-rata dari nilai data.\n"
          "Rerata sama dengan total dari\n"
          "semua item data dibagi dengan jumlah\n"
          "item data ( %d ). Nilai rerata untuk\n"
          "contoh ini adalah: %d / %d = %.4f\n\n",
           UKURAN, total, UKURAN, ( double ) total / UKURAN );
} /* akhir fungsi rerata */

/* mengurutkan array dan menentukan median */
void median( int jawaban[] )
{
  printf( "\n%s\n%s\n%s\n%s",
          "********", " Median", "********",
          "Array respon tak-terurut adalah" );

  tampilArray( jawaban ); /* menampilkan array tak-terurut */

  pengurutanBubble( jawaban ); /* mengurutkan array */

  printf( "\n\nArray terurut adalah" );
  tampilArray( jawaban ); /* menampilkan array terurut */

  /* menampilkan elemen median */
  printf( "\n\nMedian adalah elemen %d dari\n"
          "array %d elemen terurut.\n"
          "Untuk kasus ini median adalah %d\n\n",
           UKURAN / 2, UKURAN, jawaban[ UKURAN / 2 ]);
} /* akhir fungsi median */

/* menentukan respon paling sering muncul */
void mode( int frek[], const int jawaban[] )
{
  int rating; /* kounter untuk mengakses elemen 1-9 dari array frek */
  int j; /* kounter untuk menyimpulkan elemen 0-98 dari array jawaban */
  int h; /* kounter untuk menampilkan histogram di dalam array frek */
  int terbesar = 0; /* merepresentasikan frekuensi terbesar */
  int nilaiMode = 0; /* merepresentasikan respon paling sering muncul */

  printf( "\n%s\n%s\n%s\n",
          "********", " Mode", "********" );

  /* menginisialisasi frekuensi dengan 0 */
  for ( rating = 1; rating <= 9; rating++ ) {
    frek[ rating ] = 0;
  } /* akhir for */

  /* menyimpulkan frekuensi */
  for ( j = 0; j < UKURAN; j++ ) {
    ++frek[ jawaban[ j ] ];
  } /* akhir for */

  /* output headers for result columns */
  printf( "%s%11s%19s\n\n%54s\n%54s\n\n",
          "Respon", "Frekuensi", "Histogram",
          "1 1 2 2", "5 0 5 0 5" );

  /* menampilkan hasil */
  for ( rating = 1; rating <= 9; rating++ ) {
    printf( "%8d%11d ", rating, frek[ rating ] );

    /* menjejak nilai mode dan nilai frekuensi terbesar */
    if ( frek[ rating ] > terbesar ) {
      terbesar = frek[ rating ];
      nilaiMode = rating;
    } /* akhir if */

    /* menampilkan batang histogram bar merepresentasikan nilai frekuensi */
    for ( h = 1; h <= frek[ rating ]; h++ ) {
      printf( "*" );
    } /* akhir for dalam */

    printf( "\n" ); /* baris baru pada keluaran */
  } /* akhir for luar */

  /* menampilkan nilai mode */
  printf( "Mode adalah nilai yang paling sering muncul.\n"
          "Untuk kasus ini, mode adalah %d yang muncul"
          " %d kali.\n", nilaiMode, terbesar );
} /* akhir fungsi mode */

/* function that sorts an array with bubble sort algorithm */
void pengurutanBubble( int a[] )
{
  int pass; /* kounter pass */
  int j; /* kounter perbandingan */
  int hold; /* lokasi sementara untuk menukar elemen */

  /* loop untuk mengendalikan jumlah pass */
  for ( pass = 1; pass < UKURAN; pass++ ) {

    /* loop untuk mengendalikan jumlah perbandingan tiap pass */
    for ( j = 0; j < UKURAN - 1; j++ ) {

      /* menukar elemen jika tidak terurut */
      if ( a[ j ] > a[ j + 1 ] ) {
        hold = a[ j ];
        a[ j ] = a[ j + 1 ];
        a[ j + 1 ] = hold;
         } /* akhir if */
       } /* akhir for dalam */
  } /* akhir for luar */
} /* akhir fungsi pengurutanBubble */

/* menampilkan isi array (20 nilai per baris) */
void tampilArray( const int a[] )
{
  int j; /* kounter */

  /* menampilkan isi array */
  for ( j = 0; j < UKURAN; j++ ) {

    if ( j % 20 == 0 ) { /* memulai baris baru untuk setiap 20 nilai */
      printf( "\n" );
    } /* akhir if */

    printf( "%2d", a[ j ] );
  } /* akhir for */
} /* akhir fungsi tampilArray */

Gambar 5.16 | Program untuk menganalisa data survey

********
 Rerata
********
Rerata adalah rata-rata dari nilai data.
Rerata sama dengan total dari
semua item data dibagi dengan jumlah
item data ( 99 ). Nilai rerata untuk
contoh ini adalah: 681 / 99 = 6.8788

********
 Median
********
Array respon tak-terurut adalah
 6 7 8 9 8 7 8 9 8 9 7 8 9 5 9 8 7 8 7 8
 6 7 8 9 3 9 8 7 8 7 7 8 9 8 9 8 9 7 8 9
 6 7 8 7 8 7 9 8 9 2 7 8 9 8 9 8 9 7 5 3
 5 6 7 2 5 3 9 4 6 4 7 8 9 6 8 7 8 9 7 8
 7 4 4 2 5 3 8 7 5 6 4 5 6 1 6 5 7 8 7

Array terurut adalah
 1 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5 5
 5 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7
 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8
 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9

Median adalah elemen 49 dari
array 99 elemen terurut.
Untuk kasus ini median adalah 7

********
 Mode
********
Respon  Frekuensi          Histogram
                                   1 1 2 2
                                 5 0 5 0 5
     1          1 *
     2          3 ***
     3          4 ****
     4          5 *****
     5          8 ********
     6          9 *********
     7         23 ***********************
     8         27 ***************************
     9         19 *******************
Mode adalah nilai yang paling sering muncul.
Untuk kasus ini, mode adalah 8 yang muncul 27 kali.


Gambar 5.17 | Contoh keluaran program penganalisa data survey

5.8 Pencarian Array
Anda akan sering menjumpai data dalam jumlah besar yang disimpan di dalam array. Pada kasus itu, akan menjadi penting untuk menentukan apakah array memuat suatu nilai yang cocok dengan nilai kunci. Proses pencarian elemen tertentu suatu array disebut dengan pencarian. Pada bagian ini, akan didiskusikan dua teknik pencarian, teknik pencarian linier dan teknik pencarian biner.

Pencarian Suatu Array Dengan Pencarian Linier
Pencarian linier (Gambar 5.18) membandingkan setiap elemen array dengan kunci pencarian. Karena array tidak terurut, maka adalah hal yang memungkinkan untuk menemukan kunci di elemen pertama atau bahkan di elemen terakhir array. Pada umumnya, program harus membandingkan kunci pencarian dengan setengah dari jumlah elemen di dalam array.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/* Gambar 5.18: gambar05_18.c
   Pencarian linier pada suatu array */
#include <stdio.h>
#define UKURAN 100

/* prototipe fungsi */
int pencarianLinier( const int array[], int kunci, int ukuran );

/* fungsi main memulai eksekusi program */
int main( void )
{
  int a[ UKURAN ]; /* menciptakan array a */
  int x; /* kounter untuk menginisialisasi 0-99 array a */
  int kunciPencarian; /* nilai untuk dicari di dalam array a */
  int elemen; /* variabel untuk menampung lokasi kunciPencarian atau -1 */

  /* menciptakan data */
  for ( x = 0; x < UKURAN; x++ ) {
    a[ x ] = 2 * x;
  } /* akhir for */

  printf( "Masukkan kunci pencarian integer:\n" );
  scanf( "%d", &kunciPencarian );

  /* mencoba untuk mencari kunciPencarian di dalam array a */
  elemen = pencarianLinier( a, kunciPencarian, UKURAN );

  /* menampilkan hasil */
  if ( elemen != -1 ) {
    printf( "Nilai ditemukan di dalam elemen %d\n", elemen );
  } /* akhir if */
  else {
    printf( "Nilai tidak ditemukan\n" );
  } /* akhir else */

 return 0; /* indikasi terminasi sukses */
} /* akhir main */

/* membandingkan kunci dengan setiap elemen array sampai lokasi ditemukan
   atau sampai akhir array dicapai. Menghasilkan subskript elemen
   jika kunci ditemukan atau -1 jika tidak ditemukan */
int pencarianLinier( const int array[], int kunci, int ukuran )
{
  int n; /* kounter */
 
  /* menjelajah array */
  for ( n = 0; n < ukuran; ++n ) {
   
    if ( array[ n ] == kunci ) {
      return n; /* mengembalikan lokasi kunci */
    } /* akhir if */
  } /* akhir for */
 
  return -1; /* kunci tidak ditemukan */
} /* akhir fungsi pencarianLinier */

Masukkan kunci pencarian integer:
36
Nilai ditemukan di dalam elemen 18


Masukkan kunci pencarian integer:
37
Nilai tidak ditemukan

Gambar 5.18 | Pencarian linier atas suatu array

Pencarian Suatu Array Dengan Pencarian Biner
Metode pencarian linier bekerja dengan baik untuk array kecil atau array tak-terurut. Namun, untuk array besar, pencarian linier tidak efisien. Jika array telah terurut, teknik pencarian biner dengan kecepatan tinggi dapat dipakai.

Algoritma pencarian biner mengeliminasi setengah jumlah elemen di dalam suatu array terurut pada tiap perbandingan. Algoritma mencari elemen tengah dari array dan membandingkannya dengan kunci pencarian. Jik sama, kunci pencarian ditemukan dan subskript array dari elemen tersebut dijadikan nilai balik. Jika tidak sama, masalah tereduksi hanya melakukan pencarian setengah bagian array. Jika kunci pencarian kurang dari elemen tengah array, maka setengah bagian pertama array yang dicari, sebaliknya setengah bagian kedua array yang dicari. Pencarian berlanjut sampai kunci pencarian sama dengan elemen tengah subarray, atau sampai subarray hanya memuat satu elemen yang tidak sama dengan kunci pencarian (kunci pencarian tidak ditemukan).

Pada skenario terburuk, pencarian suatu array 1023-elemen hanya memerlukan 10 perbandingan menggunakan pencarian biner.  Pembagian 1024 dengan 2 secara berulang akan menghasilkan nilai-nilai 512, 256, 128, 64, 32, 16, 8, 4, 2, dan 1. Jumlah 1024  dibagi dengan 2 sebanyak 10 kali untuk mendapatkan nilai 1. Pembagian dengan 2 ekivalen dengan satu perbandingan dalam algoritma pencarian biner. Suatu array 1048576-elemen  hanya memerlukan maksimum 20 perbandingan untuk menemukan kunci pencarian. Array dengan satu miliar elemen hanya memerlukan maksimum 30 perbandingan untuk menemukan kunci pencarian.

Gambar 5.19 menyajikan versi iteratif dari fungsi pencarianBiner (baris 44-74). Fungsi ini menerima empat argumen, yaitu suatu array integer b yang akan dicari, sebuah integer kunciPencarian, subskript array rendah, dan subskript array tinggi. Jika kunci pencarian tidak cocok dengan elemen tengah subarray, maka subskript rendah atau tinggi dimodifikasi sehingga subarray yang lebih kecil dapat dicari. Jika kunci pencarian kurang dari elemen tengah, maka subskript tinggi ditetapkan menjadi tengah – 1 dan pencarian dilanjutkan pada elemen-elemen dari rendah sampai tengah – 1. Jika kunci pencarian lebih besar dari elemen tengah, maka subskript rendah ditetapkan menjadi tengah + 1 dan pencarian dilakukan pada elemen-elemen dari tengah + 1 sampai tinggi. Program menggunakan sebuah array 15 elemen. Program menggunakan fungsi tampilKepala (baris 77-96) untuk menampilkan subskript array dan fungsi tampilBaris (baris 110-120) untuk menampilkan setiap subarray selama proses pencarian biner. Elemen tengah di dalam setiap subarray ditandai dengan sebuah asterik (*) untuk mengindikasikan tempat dilakukannya perbandingan.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* Gambar 5.19: gambar05_19.c
   Pencarian biner atas suatu array terurut */
#include <stdio.h>
#define UKURAN 15

/* prototipe fungsi */
int pencarianBiner(const int b[], int pencarianKunci, int rendah, int tinggi);
void tampilKepala( void );
void tampilBaris( const int b[], int rendah, int tengah, int tinggi);

/* fungsi main memulai eksekusi program */
int main( void )
{
  int a[ UKURAN ]; /* menciptakan array a */
  int i; /* kounter untuk inisialisasi elemen 0-14 dari array a */
  int kunci; /* nilai untuk dicari di dalam array a */
  int hasil; /* variabel untuk menampung lokasi kunci atau -1 */

  /* menciptakan data */
  for ( i = 0; i < UKURAN; i++ ) {
    a[ i ] = 2 * i;
  } /* akhir for */

  printf( "Masukkan angka dari 0 sampai 28: " );
  scanf( "%d", &kunci );

  tampilKepala();

  /* mencari kunci di dalam a */
  hasil = pencarianBiner( a, kunci, 0, UKURAN - 1 );

  /* menampilkan hasil */
  if ( hasil != -1 ) {
    printf( "\n%d ditemukan di dalam elemen array %d\n", kunci, hasil );
  } /* akhir if */
  else {
    printf( "\n%d tidak ditemukan\n", kunci );
  } /* akhir else */

  return 0; /* indikasi terminasi sukses */
} /* akhir main */

/* fungsi untuk melakukan pencarian biner */
int pencarianBiner( const int b[], int kunciPencarian, int rendah, int tinggi)
{
  int tengah; /* variabel untuk menampung elemen tengah array */

  /* loop sampai subskript rendah lebih dari tinggi */
  while ( rendah <= tinggi ) {

    /* menentukan elemen tengah dari subarray yang sedang dicari */
    tengah = ( rendah + tinggi ) / 2;

    /* menampilkan subarray yang digunakan dalam iterasi loop ini */
    tampilBaris( b, rendah, tengah, tinggi );

    /* jika kunciPencarian cocok dengan elemen tengah, tengah jadi nilai balik*/
    if ( kunciPencarian == b[ tengah ] ) {
      return tengah;
    } /* akhir if */

    /* jika kunciPencarian kurang dari elemen tengah, tetapkan tinggi baru */
    else if ( kunciPencarian < b[ tengah ] ) {
      tinggi = tengah - 1; /* mencari subarray rendah */
    } /* akhir else if */

    /* jika kunciPencarian lebih dari elemen tengah, tetapkan rendah baru */
    else {
      rendah = tengah + 1; /* mencari subarray tinggi */
    } /* akhir else */
  } /* akhir while */

  return -1; /* kunciPencarian tidak ditemukan */
} /* akhir fungsi pencarianBiner */

/* Menampilkan kepala untuk keluaran */
void tampilKepala( void )
{
  int i; /* kounter */

  printf( "\nSubskript:\n" );

  /* menampilkan kepala kolom */
  for ( i = 0; i < UKURAN; i++ ) {
    printf( "%3d ", i );
  } /* akhir for */

  printf( "\n" ); /* memulai garis bari pada keluaran */

  /* menampilkan baris karakter - */
  for ( i = 1; i <= 4 * UKURAN; i++ ) {
    printf( "-" );
  } /* akhir for */

  printf( "\n" ); /* memulai garis baru pada keluaran */
} /* akhir fungsi tampilKepala */

/* Menampilkan satu baris keluaran menunjukkan
   bagian array terkini yang sedang diproses. */
void tampilBaris( const int b[], int rendah, int tengah, int tinggi )
{
  int i; /* kounter untuk menjelajah array b */

  /* loop untuk menjelajah keseluruhan array */
  for ( i = 0; i < UKURAN; i++ ) {

    /* menampilkan spasi jika di luar rentang subarray terkini */
    if ( i < rendah || i > tinggi ) {
      printf( " " );
    } /* akhir if */
    else if ( i == tengah ) { /* menampilkan elemen tengah */
      printf( "%3d*", b[ i ] ); /* menandai nilai tengah */
    } /* akhir else if */
    else { /* menampilkan elemen lainnya di dalam subarray */
      printf( "%3d ", b[ i ] );
    } /* akhir else */
  } /* akhir for */

  printf( "\n" ); /* memulai baris baru pada keluaran */
} /* akhir fungsi tampilBaris */

Masukkan angka dari 0 sampai 28: 25

Subskript:
  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14
------------------------------------------------------------
  0   2   4   6   8  10  12  14* 16  18  20  22  24  26  28
         16  18  20  22* 24  26  28
             24  26* 28
             24*

25 tidak ditemukan


Masukkan angka dari 0 sampai 28: 8

Subskript:
  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14
------------------------------------------------------------
  0   2   4   6   8  10  12  14* 16  18  20  22  24  26  28
  0   2   4   6*  8  10  12
      8  10* 12
      8*

8 ditemukan di dalam elemen array 4

Masukkan angka dari 0 sampai 28: 6

Subskript:
  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14
------------------------------------------------------------
  0   2   4   6   8  10  12  14* 16  18  20  22  24  26  28
  0   2   4   6*  8  10  12

6 ditemukan di dalam elemen array 3

Gambar 5.19 | Pencarian biner atas suatu array

5.9 Array Subskript-Jamak
Array dalam C dapat memuat subskript jamak. Kegunaan umum dari array subskript-jamak (disebut pula dengan array multidimensi) adalah untuk merepresentasikan tabel nilai yang memuat informasi yang ditata dalam baris dan kolom. Untuk mengidentifikasi elemen tabel tertentu, Anda harus menspesifikasikan dua subskript: Pertama untuk mengidentifikasi baris elemen dan kedua untuk mengidentifikasi kolom elemen. Tabel atau array yang memerlukan dua subskript untuk mengidentifikasi suatu elemen tertentu disebut dengan array subskript-ganda. Array subskript-jamak dapat memiliki lebih dari dua subskript.

Gambar 5.20 mengilustrasikan sebuah array subskript-ganda a. Array tersebut memuat tiga baris dan empat kolom, sehingga dikatakan sebagai array 3-kali-4. Secara umum, sebuah array dengan m baris dan n kolom dinamakan dengan array m-kali-n.



Gambar 5.20 | Array subskript-ganda dengan tiga baris dan empat kolom


Setiap elemen di dalam array a diidentifikasi pada Gambar 5.20 menggunakan nama elemen dengan format a[i][j]; a adalah nama array, dan i dan j adalah subskript yang secara unik dipakai untuk mengidentifikasi setiap elemen di dalam a. Nama-nama elemen pada baris pertama semua mempunyai subskript pertama 0; Nama-nama elemen pada kolom keempat semua mempunyai subskript kedua 3;

Sebuah array subskript-jamak dapat diinisialisasi ketika didefinisikan, sama seperti array subskript-tunggal. Sebagai contoh, array subskript-ganda int b[2][2] dapat didefinisikan dan diinisialisasi dengan

int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } };

  
Nilai-nilai dikelompokkan baris demi baris  yang diapit kurung kurawal. Nilai-nilai dalam himpunan pertama menginisialisasi baris 0 dan nilai-nilai dalam himpunan kedua menginisialisasi baris 1. Jadi, nilai 1 dan 2 menginisialisasi elemen b[0][0] dan b[0][1], dan nilai 3 dan 4 menginisialisasi elemen b[1][0] dan b[1][1]. Jika tidak terdapat penginisialisasi yang cukup untuk baris tertentu, elemen yang tak terinisialisasi pada baris tersebut diinisialisasi dengan 0. Jadi,

int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } };

akan menginisialisasi b[0][0] dengan 1, b[0][1] dengan 0, b[1][0] dengan 3, dan b[1][1] dengan 4. Gambar 5.21 mendemonstrasikan pendefinisian dan penginisialisasian array subskript-ganda.

Program mendefinisikan tiga array yang memuat dua baris dan tiga kolom (enam elemen untuk setiap array). Definisi array1 (baris 11) menyediakan enam penginisialisasi dalam dua subdaftar. Subdaftar pertama menginisialisasi baris pertama (baris 0) dengan nilai 1, 2, dan 3; dan subdaftar kedua menginisialisasi baris kedua (baris 1) dengan nilai 4, 5, dan 6.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/* Gambar 5.21: gambar05_21.c
   Menginisialisasi array multidimensi */
#include <stdio.h>

void tampilArray( const int a[][ 3 ] ); /* prototipe fungsi */

/* fungsi main memulai eksekusi program */
int main( void )
{
  /* menginisialisasi array1, array2, array3 */
  int array1[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } };
  int array2[ 2 ][ 3 ] = { 1, 2, 3, 4, 5 };
  int array3[ 2 ][ 3 ] = { { 1, 2 }, { 4 } };

  printf( "Nilai dalam array1 dalam baris adalah:\n" );
  tampilArray( array1 );

  printf( "Nilai dalam array2 dalam baris adalah:\n" );
  tampilArray( array2 );

  printf( "Nilai dalam array31 dalam baris adalah:\n" );
  tampilArray( array3 );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */

/* fungsi untuk menampilkan array dengan dua baris dan tiga kolom */
void tampilArray( const int a[][ 3 ] )
{
  int i; /* kounter baris */
  int j; /* kounter kolom */

  /* loop melalui baris */
  for ( i = 0; i <= 1; i++ ) {
    /* menampilkan kolom */
    for ( j = 0; j <= 2; j++ ) {
      printf( "%d ", a[ i ][ j ] );
    } /* akhir for dalam */
    printf( "\n" ); /* memulai baris baru pada keluaran */
  } /* akhir for luar */
} /* akhir fungsi tampilArray */

Nilai dalam array1 dalam baris adalah:
1 2 3
4 5 6
Nilai dalam array2 dalam baris adalah:
1 2 3
4 5 0
Nilai dalam array31 dalam baris adalah:
1 2 0
4 0 0

Gambar 5.21 | Penginisialisasian array multidimensi

Banyak manipulasi array yang umum dijumpai menggunakan statemen repetisi for. Misalnya, statemen berikut menetapkan semua elemen pada baris ketiga suatu array a pada Gambar 5.20 menjadi nol:

for ( kolom = 0; kolom <= 3; kolom++ ) {
  a[ 2 ][ kolom] = 0;
}

Karena yang ditarget adalah baris ketiga, Anda harus mengetahui bahwa subskript pertama selalu 2. Loop hanya akan memvariasi subskript kedua (kolom). Statemen for tersebut sama dengan statemen penugasan:

a[ 2 ][ 0 ] = 0;
a[ 2 ][ 1 ] = 0;
a[ 2 ][ 2 ] = 0;
a[ 2 ][ 3 ] = 0;

Statemen for bersarang berikut menentukan total semua elemen di dalam array a.

total = 0;
for ( baris = 0; baris <= 2; baris++ ) {
  for ( kolom = 0; kolom <= 3; kolom++ ) {
    total += a[ baris ][ kolom ];
  }
}

Statemen for mentotal semua elemen array baris demi baris. Statemen for luar memulai dengan menetapkan baris (subskript baris) menjadi 0 sehingga semua elemen baris pertama ditotal oleh statemen for dalam. Statemen for luar kemudian menginkremen baris menjadi 1, dan semua elemen baris kedua ditotal. Selanjutnya, statemen for luar menginkremen baris menjadi 2, dan semua elemen baris ketiga ditotal. Hasilnya ditampilkan ketika statemen for bersarang selesai dieksekusi.

5.10 Manipulasi Array Dua-Dimensi
Gambar 5.22 melakukan beberapa manipulasi array yang umum dijumpai pada array nilaiMahasiswa berukuran 3-kali-4 menggunakan statemen for. Setiap baris array merepresentasikan seorang mahasiswa dan setiap kolom merepresentasikan nilai pada empat ujian yang diambil mahasiswa pada semester tertentu. Manipulasi array dilakukan menggunakan empat fungsi. Fungsi minimum (baris 43-62) menentukan nilai terkecil dari semua mahasiswa pada semester tertentu. Fungsi maksimum (baris 65-84) menentukan nilai tertinggi dari semua mahasiswa pada semester tertentu. Fungsi rerata (baris 87-98) menentukan rata-rata nilai seorang mahasiswa selama satu semester. Fungsi tampilArray (baris 101-120) menampilkan array subskript-ganda dalam format tabular.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* Gambar 5.22: gambar05_22.c
   Contoh array subskript-ganda */
#include <stdio.h>
#define MAHASISWA 3
#define UJIAN 4

/* prototipe fungsi */
int minimum( const int nilai[][ UJIAN ], int pelajar, int test );
int maksimum( const int nilai[][ UJIAN ], int pelajar, int test );
double rerata( const int himpunanNilai[], int test );
void tampilArray( const int nilai[][ UJIAN ], int pelajar, int test );

/* fungsi main mengeksekusi program */
int main( void )
{
  int pelajar; /* kounter pelajar */

  /* menginisialisasi nilai mahasiswa untuk tiga orang (baris) */
  const int himpunanNilai[ MAHASISWA ][ UJIAN ] =
    { { 77, 68, 86, 73 },
      { 96, 87, 89, 78 },
      { 70, 90, 86, 81 } };

  /* menampilkan array himpunanNilai*/
  printf( "Array adalah:\n" );
  tampilArray( himpunanNilai, MAHASISWA, UJIAN );

  /* menentukan nilai terendah dan tertinggi */
  printf( "\n\nNilai terendah: %d\nNilai tertinggi: %d\n",
  minimum( himpunanNilai, MAHASISWA, UJIAN ),
  maksimum( himpunanNilai, MAHASISWA, UJIAN ) );

  /* menghitung nilai untuk tiap mahasiswa */
  for ( pelajar = 0; pelajar < MAHASISWA; pelajar++ ) {
    printf( "Rata-rata nilai untuk mahasiswa %d adalah %.2f\n",
      pelajar, rerata( himpunanNilai[ pelajar ], UJIAN ) );
  } /* akhir for */

  return 0; /* indikasi terminasi sukses */
} /* akhir main */

/* Mencari nilai minimum */
int minimum( const int nilai[][ UJIAN ], int pelajar, int test )
{
  int i; /* kounter pelajar */
  int j; /* kounter ujian */
  int nilaiBawah = 100; /* inisialisasi nilai tertinggi */

  /* loop menjelajah baris nilai */
  for ( i = 0; i < pelajar; i++ ) {

    /* loop menjelajah kolom nilai */
    for ( j = 0; j < test; j++ ) {

      if ( nilai[ i ][ j ] < nilaiBawah ) {
        nilaiBawah = nilai[ i ][ j ];
         } /* akhir if */
       } /* akhir for dalam */
  } /* akhir for luar */

  return nilaiBawah; /* menghasilkan nilai minimum */
} /* akhir fungsi minimum */

/* Mencari nilai maksimum */
int maksimum( const int nilai[][ UJIAN ], int pelajar, int test )
{
  int i; /* kounter pelajar */
  int j; /* kounter ujian */
  int nilaiAtas = 0; /* inisialisasi nilai terendah */

  /* loop menjelajah baris nilai */
  for ( i = 0; i < pelajar; i++ ) {

    /* loop menjelajah kolom nilai */
    for ( j = 0; j < test; j++ ) {

      if ( nilai[ i ][ j ] > nilaiAtas ) {
        nilaiAtas = nilai[ i ][ j ];
         } /* akhir if */
       } /* akhir for dalam */
  } /* akhir for luar */

  return nilaiAtas; /* menghasilkan nilai maksimum */
} /* akhir fungsi maksimum */

/* Menentukan rata-rata nilai untuk seorang mahasiswa */
double rerata( const int himpunanNilai[], int test )
{
  int i; /* kounter ujian */
  int total = 0; /* jumlah nilai ujian */

  /* total semua nilai untuk satu mahasiswa */
  for ( i = 0; i < test; i++ ) {
    total += himpunanNilai[ i ];
  } /* akhir for */
 
  return ( double ) total / test; /* rata-rata */
} /* akhir fungsi rerata */

/* Menampilkan Array */
void tampilArray( const int nilai[][ UJIAN ], int pelajar, int test )
{
  int i; /* kounter pelajar */
  int j; /* kounter ujian */

  /* menampilkan kepala kolom */
  printf( " [0] [1] [2] [3]" );

  /* menampilkan nilai dalam format tabular */
  for ( i = 0; i < pelajar; i++ ) {

    /* menampilkan label untuk baris */
    printf( "\nnilaiMahasiwa[%d] ", i );

    /* menampilkan nilai untuk satu mahasiswa */
    for ( j = 0; j < test; j++ ) {
      printf( "%-5d", nilai[ i ][ j ] );
       } /* akhir for dalam */
  } /* akhir for luar */
} /* akhir fungsi tampilArray */

Array adalah:
                [0]  [1]  [2]  [3]
nilaiMahasiwa[0] 77   68   86   73
nilaiMahasiwa[1] 96   87   89   78
nilaiMahasiwa[2] 70   90   86   81

Nilai terendah: 68
Nilai tertinggi: 96
Rata-rata nilai untuk mahasiswa 0 adalah 76.00
Rata-rata nilai untuk mahasiswa 1 adalah 87.50
Rata-rata nilai untuk mahasiswa 2 adalah 81.75

Gambar 5.22 | Contoh array subskript-ganda

Kesimpulan
§  Array adalah sekelompok lokasi memori yang berelasi oleh fakta bahwa semua memiliki nama dan tipe sama. Untuk menunjuk ke lokasi atau elemen tertentu di dalam array, nama array dan nomor posisi elemen tertentu di dalam array perlu dispesifikasi.

§  Nomor posisi yang diapit sepasang kurung siku lebih formal disebut dengan subskript (atau indeks). Indeks harus berupa integer atau ekspresi integer. Jika suatu program menggunakan sebuah ekspresi sebagai subskript, maka ekspresi tersebut dievaluasi lebih dahulu untuk menentukan subskript.

§  Array menempati ruang di dalam memori. Tipe setiap elemen dan jumlah elemen yang dibutuhkan setiap array dapat dispesifikasi sehingga komputer bisa mencadangkan jumlah memori yang sesuai untuk kebutuhan itu.

§  Elemen suatu array dapat pula diinisialisasi ketika array didefinisikan dengan definisi berikut menggunakan tanda sama dengan dan separang kurung kurawal, { }, yang memuat daftar penginisialisasi terpisahkan koma.

§  Jika terdapat penginisialisasi lebih sedikit daripada jumlah elemen di dalam array, maka sisa elemen diinisialisasi dengan 0. Hal penting untuk diingat adalah array tidak secara otomatis diinisialisasi dengan 0. Anda harus sedikitnya menginisialisasi elemen pertama dengan nol dan sisa elemen yang lain akan diinisialisasi secara otomatis dengan nol.

§  Array karakter memiliki beberapa fitur unik. Suatu array karakter dapat diinisialisasi menggunakan sebuah literal string.

§  Array karakter yang merepresentasikan sebuah string dapat ditampilkan dengan printf dan penspesifikasi string %s.

§  Variabel lokal static eksis selama program dijalankan, dan hanya dikenal di dalam tubuh fungsi. Anda dapat menerapkan static terhadap suatu definisi array lokal sehingga array tersebut tidak diciptakan dan diinisialisasi setiap kali fungsi dipanggil dan array tersebut tidak dihancurkan setiap kali fungsi selesai dieksekusi di dalam program.

§  Untuk melewatkan suatu argumen array kepada fungsi, diperlukan untuk menspesifikasi nama array tanpa adanya kurung kurawal.

§  Meskipun keseluruhan array dilewatkan melalui referensi, elemen-elemen array secara individual dilewatkan dengan nilai seperti variabel biasa. Untuk melewatkan suatu elemen array ke fungsi, digunakan nama elemen array tersubskript (skalar) sebagai argumen di dalam pemanggilan fungsi.

§  C menyediakan kualifier const untuk mencegah modifikasi atas nilai array di dalam suatu fungsi. Ketika sebuah parameter array diawali dengan kualifier const, elemen array menjadi konstanta di dalam tubuh fungsi, dan segala usaha untuk memodifikasi elemen array di dalam tubuh fungsi akan menyebabkan error kompilasi.

§  Array dalam C dapat memuat subskript jamak. Kegunaan umum dari array subskript-jamak (disebut pula dengan array multidimensi) adalah untuk merepresentasikan tabel nilai yang memuat informasi yang ditata dalam baris dan kolom. Untuk mengidentifikasi elemen tabel tertentu, Anda harus menspesifikasikan dua subskript: Pertama untuk mengidentifikasi baris elemen dan kedua untuk mengidentifikasi kolom elemen.

Soal
1.       Tulis statemen untuk melakukan hal berikut:
a)       Tampilkan nilai dari elemen ke tujuh dari array karakter f.
b)      Masukkan suatu nilai ke elemen 4 dari array pecahan subskript-tunggal b.
c)       Inisialisasi kelima elemen dari array integer subskript-tunggal g dengan 8.
d)      Salin array a ke dalam penggalan pertama dari array b. Asumsikan double a[11], b[34].
e)       Tentukan dan tampilkan nilai terendah dan tertinggi yang dimuat di dalam array pecahan w.

2.       Apakah yang dilakukan kode berikut?

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
26
27
28
29
30
31
/* soal5_2.c */
/* Apakah yang dilakukan program? */
#include <stdio.h>
#define UKURAN 10

int ApaIni( const int b[], int p ); /* prototipe fungsi */

/* fungsi main memulai eksekusi */
int main( void )
{
  int x; /* memuat nilai balik dari fungsi ApaIni */

  /* inisialisasi array a */
  int a[UKURAN] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

  x = ApaIni( a, UKURAN);

  printf( "Hasilnya adalah %d\n", x );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */

int ApaIni ( const int b[], int p )
{
  /* kasus basis */
  if ( p == 1 ) {
    return b[ 0 ];
  } /* akhir if */
  else { /* langkah rekursi */
    return b[ p - 1 ] + ApaIni( b, p - 1 );
  } /* akhir else */
} /* akhir fungsi ApaIni */

3.       Modifikasilah program pada Gambar 5.18 untuk menggunakan suatu fungsi pencarianLinier rekursif dalam melakukan pencarian linier atas array. Fungsi tersebut harus menerima sebuah array integer dan ukuran array sebagai argumen. Jika kunci pencarian ditemukan, maka subskript array akan dijadikan nilai balik; sebaliknya, -1 dijadikan nilai balik.

4.       Modifikasilah program pada Gambar 5.19 untuk menggunakan fungsi pencarianBiner dalam melakukan pencarian biner atas array. Fungsi tersebut harus menerima sebuah array integer, subskript awal, dan subskript akhir sebagai argumen. Jika kunci pencarian ditemukan, maka subskript array dijadikan nilai balik; sebaliknya, -1 dijadikan nilai balik.

5.       Tulislah suatu fungsi rekursif tampilArray yang mengambil suatu array dan ukuran array sebagai argumen, yang menampilkan array, dan yang tidak menghasilkan nilai balik apapun. Fungsi ini harus berhenti memproses ketika menerima suatu array berukuran nol.

6.       Tulislah suatu fungsi rekursif balikString yang mengambil sebuah array karakter sebagai argumen, yang menampilkan array karakter secara terbalik, dan yang tidak menghasilkan nilai balik apapun. Fungsi ini harus berhenti memproses ketika menemukan karakter null di dalam string masukan.

7.       Tulislah suatu fungsi rekursif minimumRekursif yang mengambil sebuah array integer dan ukuran array sebagai argumen dan menghasilkan nilai balik berupa elemen terkecil di dalam array. Fungsi harus berhenti memproses dan menghasilkan  nilai balik ketika menerima suatu array dengan satu elemen.

8.       Tulislah suatu fungsi rekursif maksimumRekursif yang mengambil sebuah array integer dan ukuran array sebagai argumen dan menghasilkan nilai balik berupa elemen terbesar di dalam array. Fungsi harus berhenti memproses dan menghasilkan  nilai balik ketika menerima suatu array dengan satu elemen.

9.       Apakah yang dilakukan kode berikut?

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
26
27
/* soal5_9.c */
/* What does this program do? */
#include <stdio.h>
#define UKURAN 10

/* prototipe fungsi */
void suatuFungsi( const int b[], int indeksAwal, int ukuran);

/* fungsi main memulai eksekusi program */
int main( void )
{
  int a[UKURAN] = { 8, 3, 1, 2, 6, 0, 9, 7, 4, 5 }; /* inisialisasi a */

  printf( "Jawaban adalah:\n" );
  suatuFungsi( a, 0, UKURAN);
  printf( "\n" );
  return 0; /* indikasi terminasi sukses */
} /* akhir main */

/* Apa yang dilakukan fungsi ini? */
void suatuFungsi( const int b[], int indeksAwal, int ukuran )
{
  if (indeksAwal < ukuran) {
    suatuFungsi( b, indeksAwal + 1, ukuran);
    printf( "%d ", b[indeksAwal] );
  } /* akhir if */
} /* akhir fungsi suatuFungsi */

10.    Tulislah suatu program yang mensimulasikan pelemparan dua dadu. Program harus menggunakan rand untuk melemparkan dadu pertama, dan harus menggunakan rand kembali untuk melemparkan dadu kedua. Penjumlahan atas dua nilai kemudian dilakukan. [Perhatikan: Karena setiap dadu menghasilkan suatu nilai integer dari 1 sampai 6, maka penjumlahan dua nilai yang dihasilkan akan bervariasi dari 2 sampai 12, dengan 7 menjadi penjumlahan yang paling sering dijumpai dan 2 dan 12 menjadi penjumlahan yang paling jarang ditemui]. Gambar 5.22 menunjukkan 36 kombinasi yang mungkin dari dua dadu tersebut. Program Anda harus melemparkan kedua dadu tersebut sebanyak 36000 kali. Gunakan array subskript-tunggal untuk menyimpan jumlah kemunculan masing-masing penjumlahan. Tampilkan hasil dalam format tabular.



Gambar 5.23 | Keluaran pelemparan dua dadu






No comments:

Post a Comment