6.1 PENGANTAR
Bab ini berfungsi sebagai pengantar topik penting dari struktur data’. Dalam Bab 10, kita
membahas gagasan struktur (struktur) C - struktur data yang terdiri dari item data terkait dari
berbagai jenis yang berbeda. Array dan struktur adalah entitas "statis" karena ukurannya tetap
sama selama eksekusi program (mereka mungkin, tentu saja, menjadi kelas penyimpanan
otomatis dan karenanya dibuat dan dihancurkan setiap kali blok di mana mereka didefinisikan
dimasukkan dan dikeluarkan). Di Bab 12, kami memperkenalkan struktur data dinamis seperti
daftar, antrian, tumpukan dan pohon yang dapat tumbuh dan menyusut saat program dijalankan.
6.2 Array
Array adalah sekelompok lokasi memori yang terkait dengan fakta bahwa mereka semua
memiliki nama yang sama dan jenis yang sama. Untuk merujuk ke lokasi atau elemen tertentu
dalam larik, kami menentukan nama larik dan nomor posisi elemen tertentu dalam larik.
Gambar 6.1 menunjukkan larik bilangan bulat yang disebut c. Array ini mengandung 12
elemen. Salah satu elemen ini dapat dirujuk dengan memberi nama array diikuti oleh nomor
posisi elemen tertentu dalam tanda kurung siku ([]). Elemen pertama di setiap array adalah
elemen zeroth. Dengan demikian, elemen pertama dari array c disebut sebagai c [0], elemen
kedua dari array c disebut sebagai c [1], elemen ketujuh dari array c disebut sebagai c [6], dan,
dalam umum, elemen engan dari array c disebut sebagai c [i - 1]. Nama larik, seperti nama
variabel lainnya, hanya boleh berisi huruf, angka, dan garis bawah. Nama-nama array tidak dapat
dimulai dengan digit.
Nomor posisi yang terdapat dalam tanda kurung siku secara lebih formal disebut sebagai
sub-skrip (atau indeks). Subscript harus berupa integer atau ekspresi integer. Jika sebuah
program menggunakan ekspresi sebagai subskrip, maka ekspresi dievaluasi untuk menentukan
subskrip. Misalnya, jika a = 5 dan b = 6, maka pernyataannya.
c [a + b] + = 2;
menambahkan 2 ke elemen array c [11]. Nama larik langganan adalah lvalue — itu dapat
digunakan di sisi kiri tugas.
Mari kita periksa array c (Gambar 6.1) lebih dekat. Nama array adalah c. Ke-12
elemennya disebut sebagai c [0], c [1], c [2], ..., c [11]. Nilai yang disimpan dalam c [0] adalah –
45, nilai c [1] adalah 6, nilai c [2] adalah 0, nilai c [7] adalah 62 dan nilai c [11] adalah 78. Untuk
mencetak jumlah nilai yang terkandung dalam tiga elemen pertama dari array c, kita akan
menulis.
printf( "%d", c[ 0 ] + c[ 1 ] + c[ 2 ] );
Name of array (note
that all elements of this
array have the same
name, c)
c[ 0 ] -45
c[ 1 ] 6
0
c[ 2 ]
72
c[ 3 ]
1543
c[ 4 ]
-89
c[ 5 ] 0
c[ 6 ] 62
c[ 7 ] -3
1
c[ 8 ]
6453
c[ 9 ]
78
c[ 10 ]
c[ 11 ]
Untuk membagi nilai elemen ketujuh dari array c oleh 2 dan menetapkan hasilnya ke
variabel x, kami akan menulis
x = c[ 6 ] / 2;
Tanda kurung yang digunakan untuk melampirkan subscript dari array sebenarnya
dianggap sebagai operator di C. Mereka memiliki tingkat yang sama diutamakan sebagai
operator panggilan fungsi (yaitu, tanda kurung yang ditempatkan mengikuti nama fungsi
untuk memanggil fungsi itu). Gambar 6.2 menunjukkan preseden dan asosiativitas
operator yang diperkenalkan pada titik ini dalam teks.
2 initializing an array /
3 #include <stdio.h>
4
5 / function main begins program execution /
6 int main( void )
7 {
8 int n[ 10 ]; / n is an array of 10 integers /
9 int i; / counter /
10 / initialize elements of array n to 0 /
11 for ( i = 0; i < 10; i++ ) {
12 n[ i ] = 0; / set element at location i to 0 /
13 } / end for /
14 printf( "%s%13s\n", "Element", "Value" );
15 / output contents of array n in tabular format /
16 for ( i = 0; i < 10; i++ ) { printf( "%7d%13d\n", i, n[ i ] );
17 } / end for /
18 return 0;
19 }
Element Value
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
Menginisialisasi Array dalam Definisi dengan Daftar Initializer
Elemen-elemen array juga dapat diinisialisasi ketika array didefinisikan dengan mengikuti
definisi dengan tanda dan tanda kurung yang sama, {}, yang berisi daftar initial-izer yang
dipisahkan koma. Gambar 6.4 menginisialisasi array integer dengan 10 nilai (baris 9) dan
mencetak array dalam format tabel.
Element Value
0 32
1 27
2 64
3 18
4 95
5 14
6 90
7 70
8 60
9 37
Jika ada lebih sedikit initializers daripada elemen dalam array, elemen yang tersisa diinisialisasi
ke nol. Misalnya, elemen dari array n pada Gambar 6.3 bisa saja diinisialisasi ke nol sebagai
berikut:
int n[ 10 ] = { 0 };
ini secara eksplisit menginisialisasi elemen pertama ke nol dan menginisialisasi sembilan elemen
tersisa ke nol karena ada lebih sedikit initializers daripada ada elemen dalam array. Penting
untuk diingat bahwa array tidak secara otomatis diinisialisasi ke nol. Anda setidaknya harus
menginisialisasi elemen pertama ke nol agar elemen yang tersisa secara otomatis di-role. Metode
menginisialisasi elemen array ke 0 dilakukan pada waktu kompilasi untuk array statis dan saat
runtime untuk array otomatis.
Definisi larik
int n[ 5 ] = { 32, 27, 64, 18, 95, 14 };
menyebabkan kesalahan sintaks karena ada enam initializers dan hanya lima elemen array.
Jika ukuran array dihilangkan dari definisi dengan daftar initializer, jumlah elemen dalam array
akan menjadi jumlah elemen dalam daftar penginisialisasi. Sebagai contoh,
int n[] = { 1, 2, 3, 4, 5 };
Element Value
0 2
1 4
2 6
3 8
4 10
5 12
6 14
7 16
8 18
9 20
Inisialisasi elemen larik s ke bilangan bulat genap dari 2 hingga 20.
Instruksi #define preprocessor diperkenalkan dalam program ini. Jalur 4
mendefinisikan SIZE konstan simbolis yang nilainya 10. Konstanta simbolik adalah identifier
yang diganti dengan teks pengganti oleh preprocessor C sebelum program dikompilasi. Ketika
program ini preprocessed, semua kejadian dari SIZE konstan simbolis
diganti dengan teks pengganti 10. Menggunakan konstanta simbolis untuk menentukan ukuran
larik membuat program lebih skalabel. Pada Gambar 6.5, kita bisa memiliki yang pertama untuk
loop (baris 13) mengisi array 1000-elemen hanya dengan mengubah nilai SIZE dalam direktif
#define dari 10 hingga 1000. Jika SIZE konstan simbolis belum digunakan, kita harus mengubah
program di tiga tempat terpisah untuk skala program untuk menangani 1000 elemen array.
Ketika program menjadi lebih besar, teknik ini menjadi lebih berguna untuk menulis program
yang jelas.
11 int i; / counter /
12 int total = 0; / sum of array /
13 / sum contents of array a /
14 for ( i = 0; i < SIZE; i++ ) { total += a[ i ];
15 } / end for /
16 printf( "Total of array element values is %d\n", total );
17 return 0;}
18 1, 6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7, 5, 6, 6,
19 5, 6, 7, 5, 6, 4, 8, 6, 8, 10 };
20 / for each answer, select value of an element of array responses
21 and use that value as subscript in array frequency to
22 determine element to increment /
23 for ( answer = 0; answer < RESPONSE_SIZE; answer++ ) {
25 ++frequency[ responses [ answer ] ];
26 }/ end for /
27
28 / display results /
29 printf( "%s%17s\n", "Rating", "Frequency" );
30
31 / output the frequencies in a tabular format /
32 for ( rating = 1; rating < FREQUENCY_SIZE; rating++ ) {
33 printf( "%6d%17d\n", rating, frequency[ rating ] );
34 } / end for /
35 return 0;}
Rating Frequency
1 2
2 2
3 2
4 2
5 5
6 11
7 5
8 7
9 1
10 3
yang menambahkan elemen array satu. Ketika jawabannya 1, respons [jawaban] adalah 2, jadi
++ frekuensi [tanggapan [jawaban]]; ditafsirkan sebagai
++ frekuensi [2];
yang menambahkan elemen array dua. Ketika jawabannya adalah 2, jawaban [jawaban] adalah 6,
jadi
++ frekuensi [tanggapan [jawaban]]; sebenarnya ditafsirkan sebagai
++ frekuensi [6];
diolah dalam survei, hanya diperlukan 11 elemen array (mengabaikan elemen nol) untuk
menjumlahkan hasilnya. Jika data berisi nilai yang tidak valid seperti 13, program akan mencoba
menambahkan 1 ke frekuensi [13]. Ini akan berada di luar batas-batas array. C tidak memiliki
batas array yang memeriksa untuk mencegah program merujuk ke elemen yang tidak ada.
Dengan demikian, program eksekusi dapat "berjalan" dari ujung array tanpa peringatan. Anda
harus memastikan bahwa semua referensi array tetap dalam batas-batas array.
15
13 / for each element of array n, output a bar of the histogram /
14 for ( i = 0; i < SIZE; i++ ) {
15 printf( "%7d%13d ", i, n[ i ]) ;
16 for ( j = 1; j <= n[ i ]; j++ ) { / print one bar / printf( "%c", ' ' );
17 } / end inner for /
18 printf( "\n" ); / end a histogram bar /
19 } / end outer for /
26. return 0;}
Element Histogram
16
17 / roll die 6000 times /
18 for ( roll = 1; roll <= 6000; roll++ ) {
19 face = 1 + rand() % 6;
20 ++frequency[ face ]; / replaces 26-line switch of Fig. 5.8 /
21 }/ end for /
22
23 printf( "%s%17s\n", "Face", "Frequency" );
24
25 / output frequency elements 1-6 in tabular format /
26 for ( face = 1; face < SIZE; face++ ) {
27 printf( "%4d%17d\n", face, frequency[ face ] );
28 } / end for /
29
14 return 0 ;}
Face Frequency
1 1029
2 951
3 987
4 1033
5 1010
6 990
Kita juga dapat memasukkan string langsung ke array karakter dari keyboard menggunakan
scanf dan pengubah konversi% s. Sebagai contoh,
Gambar 6.10 | Memperlakukan susunan karakter sebagai string. (Bagian 2 dari 2.)
Gambar 6.10 menggunakan pernyataan untuk (baris 22) untuk loop melalui string1 array dan
mencetak karakter individual yang dipisahkan oleh spasi, menggunakan% c konversi specifier.
Kondisi dalam pernyataan, string1 [i]! = '\ 0', adalah benar ketika karakter null terminating belum
ditemukan dalam string.
49
50 printf( "\n\nValues on entering
automaticArrayInit:\n" );
51
52 / output contents of array2 /
53 for ( i = 0; i <= 2; i++ ) {
58
59 / modify and output contents of array2 /
60 for ( i = 0; i <= 2; i++ ) {
10.
11. return 0; }
Gambar 6.12 | Nama array sama dengan alamat elemen pertama array.
Untuk fungsi untuk menerima larik melalui pemanggilan fungsi, daftar parameter fungsi harus
menentukan bahwa larik akan diterima. Sebagai contoh, header fungsi untuk fungsi modifyArray
(yang kami panggil sebelumnya di bagian ini) mungkin ditulis sebagai
void modifyArray (int b [], int size)
menunjukkan bahwa memodifikasiArray mengharapkan untuk menerima array integer dalam
parameter b dan jumlah elemen array dalam ukuran parameter. Ukuran array tidak diperlukan
antara kurung array. Jika sudah dimasukkan, kompilator memeriksa bahwa itu lebih besar dari
nol, lalu mengabaikannya. Menentukan ukuran negatif adalah kesalahan kompilasi. Karena array
secara otomatis dilewatkan oleh referensi, ketika fungsi yang dipanggil menggunakan nama
array b, itu akan merujuk ke array di pemanggil (array hourlyTemperatures pada panggilan
sebelumnya). Di Bab 7, kami memperkenalkan notasi lain untuk menunjukkan bahwa suatu array
sedang diterima oleh suatu fungsi. Seperti yang akan kita lihat, notasi ini didasarkan pada
hubungan intim antara array dan pointer dalam C.
Gambar 6.13 menunjukkan perbedaan antara melewatkan seluruh larik dan meneruskan elemen
larik. Program ini pertama kali mencetak lima elemen dari integer array a (baris 20-22).
Selanjutnya, a dan ukurannya diteruskan ke fungsi modifyArray (baris 27), di mana setiap
elemen a dikalikan dengan 2 (garis 54-55). Kemudian dicetak ulang di utama (baris 32-34).
Seperti yang ditunjukkan output, elemen-elemen a memang dimodifikasi dengan
memodifikasiArray. Sekarang program mencetak nilai [3] (baris 38) dan meneruskannya ke
fungsi modifyElement (baris 40). Function modifyElement mengalikan argumennya dengan 2
(baris 64) dan mencetak nilai baru. Ketika [3] dicetak ulang di utama (baris 43), itu belum
dimodifikasi, karena elemen array individual dilewatkan oleh nilai.
Efek melewatkan seluruh larik dengan referensi: Nilai-nilai larik asli adalah:
01234
Nilai dari array yang dimodifikasi adalah: 0 2 4 6 8
Efek dari elemen array yang lewat berdasarkan nilai: Nilai [3] adalah 6
Nilai dalam modifikasi adalah 12 Nilai dari [3] adalah 6
Gambar 6.13 | Lewat array dan elemen array individu ke fungsi. (Bagian 3 dari 3.)
Mungkin ada situasi di program Anda di mana suatu fungsi tidak boleh diizinkan untuk
memodifikasi elemen array. Karena array selalu dilewatkan oleh referensi, modifikasi nilai
dalam array sulit untuk dikendalikan. C menyediakan tipe kualifikasi const untuk mencegah
modifikasi dari nilai-nilai larik dalam suatu fungsi. Ketika parameter array didahului oleh const
qualifier, elemen array menjadi konstan dalam tubuh fungsi, dan setiap upaya untuk
memodifikasi elemen dari array dalam hasil fungsi tubuh dalam kesalahan waktu kompilasi. Ini
memungkinkan Anda untuk memperbaiki program sehingga tidak mencoba mengubah elemen
array.
Gambar 6.14 menunjukkan kualifikasi const. Fungsi tryToModifyArray (baris 20) didefinisikan
dengan parameter const int b [], yang menentukan bahwa array b adalah konstan dan tidak dapat
dimodifikasi. Output menunjukkan pesan kesalahan yang dihasilkan oleh kompiler-kesalahan
mungkin berbeda pada sistem Anda. Masing-masing dari tiga upaya oleh fungsi untuk
memodifikasi elemen array menghasilkan kesalahan kompilator "l-nilai menentukan objek
const." Kualifier const dibahas lagi di Bab 7.
1 / Fig. 6.14: fig06_14.c
6
7 / function main begins program execution /
8 int main( void )
9 {
10 int a[] = { 10, 20, 30 }; / initialize a /
11. tryToModifyArray( a );
12. printf("%d %d %d\n", a[ 0 ], a[ 1 ], a[ 2 ] );
13. return 0;}
14. void tryToModifyArray( const int b[] ){
15. b[ 0 ] /= 2; / error / b[ 1 ] /= 2; / error / b[ 2 ] /= 2;} / error /
Compiling...
FIG06_14.C
fig06_14.c(22) : error C2166: l-value specifies const object fig06_14.c(23) : error C2166: l-
value specifies const object fig06_14.c(24) : error C2166: l-value specifies const object
2 #include <stdio.h>
3 #define SIZE 10
5
6 / function main begins program execution /
7 int main( void )
8{
9 / initialize a /
10 int a[ SIZE ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };
2 6 4 8 10 12 89 68 45 37
Data items in ascending order 2
8 10 12 37 45 68 89
Gambar 6.15 | Menyortir sebuah array dengan bubble sort. (Bagian 2 dari 2.)
Pertama program membandingkan [0] ke [1], kemudian [1] ke [2], kemudian [2] ke [3], dan
seterusnya sampai selesai lulus dengan membandingkan [8] ke [9]. Meskipun ada 10 elemen,
hanya sembilan perbandingan yang dilakukan. Karena cara perbandingan berturut-turut dibuat,
nilai yang besar dapat bergerak ke bawah array dengan banyak posisi pada satu laluan, tetapi
nilai yang kecil dapat naik hanya satu posisi. Pada lintasan pertama, nilai terbesar dijamin untuk
tenggelam ke elemen bawah larik, [9]. Pada pass kedua, nilai terbesar kedua dijamin akan
tenggelam ke [8]. Pada tiket kesembilan, nilai kesembilan terbesar tenggelam ke [1]. Ini
meninggalkan nilai terkecil dalam [0], sehingga hanya sembilan lintasan dari array diperlukan
untuk mengurutkan larik, meskipun ada sepuluh elemen.
Penyortiran dilakukan oleh loop untuk loop (baris 24-37). Jika swap diperlukan, itu dilakukan
oleh tiga tugas
tahan = a [i];
a [i] = a [i + 1]; a [i + 1] = tahan;
di mana variabel ekstra terus menyimpan sementara salah satu dari dua nilai yang bertukar. Swap
tidak dapat dilakukan hanya dengan dua tugas
a [i] = a [i + 1];
a [i + 1] = a [i];
Jika, misalnya, [i] adalah 7 dan [i + 1] adalah 5, setelah penugasan pertama, kedua nilai akan
menjadi 5
dan nilai 7 akan hilang. Oleh karena itu kebutuhan untuk mempertahankan variabel ekstra.
Keutamaan utama dari jenis gelembung adalah mudah untuk memprogram. Namun, gelembung
semacam itu berjalan lambat karena setiap pertukaran memindahkan satu elemen hanya satu
posisi lebih dekat ke tujuan akhirnya. Ini menjadi jelas ketika menyortir array besar. Dalam
latihan, kami akan mengembangkan versi yang lebih efisien dari jenis gelembung. Jauh lebih
efisien dari jenis gelembung yang telah dikembangkan. Kami akan menyelidiki beberapa di
antaranya dalam latihan. Kursus yang lebih maju menyelidiki penyortiran dan pencarian secara
lebih mendalam.
6.7 Studi Kasus: Komputasi Mean, Median dan Mode Menggunakan Array
Kami sekarang mempertimbangkan contoh yang lebih besar. Komputer biasanya digunakan
untuk analisis data survei untuk mengumpulkan dan menganalisis hasil survei dan jajak
pendapat. Gambar 6.16 menggunakan tanggapan array diinisialisasi dengan 99 tanggapan
terhadap survei. Setiap respons adalah angka dari 1 hingga 9. Program ini menghitung mean,
median, dan mode dari 99 nilai.
Mean adalah rata-rata aritmatika dari 99 nilai. Function mean (garis 40) menggabungkan mean
dengan total 99 elemen dan membagi hasilnya dengan 99.
Median adalah "nilai tengah." Fungsi median (baris 61) menentukan median dengan memanggil
fungsi bubbleSort (didefinisikan sejalan 133) untuk mengurutkan array tanggapan ke dalam
urutan menaik, lalu memilih elemen tengah, jawab [SIZE / 2], dari susunan yang diurutkan.
Ketika ada genap jumlah elemen, median harus dihitung sebagai mean dari dua elemen tengah.
Median fungsi saat ini tidak menyediakan kemampuan ini. Fungsi printArray (baris 156)
dipanggil untuk menampilkan array tanggapan.
Modusnya adalah nilai yang paling sering terjadi di antara 99 tanggapan. Mode fungsi (baris 82)
menentukan mode dengan menghitung jumlah tanggapan dari setiap jenis, lalu memilih nilai
dengan jumlah terbesar. Versi mode fungsi ini tidak menangani dasi (lihat Latihan 6.14). Mode
fungsi juga menghasilkan histogram untuk membantu menentukan mode secara grafis. Gambar
6.17 berisi contoh menjalankan program ini. Contoh ini mencakup sebagian besar manipulasi
umum yang biasanya diperlukan dalam masalah susunan, termasuk melewatkan array ke fungsi.
1/ Fig. 6.16: fig06_16.c
18
19 / initialize array response /
20 int response[ SIZE ] =
21 { 6, 7, 8, 9, 8, 7, 8, 9, 8, 9,
22 7, 8, 9, 5, 9, 8, 7, 8, 7, 8,
23 6, 7, 8, 9, 3, 9, 8, 7, 8, 7,
24 7, 8, 9, 8, 9, 8, 9, 7, 8, 9,
25 6, 7, 8, 7, 8, 7, 9, 8, 9, 2,
26 7, 8, 9, 8, 9, 8, 9, 7, 5, 3,
27 5, 6, 7, 2, 5, 3, 9, 4, 6, 4,
28 7, 8, 9, 6, 8, 7, 8, 9, 7, 8,
29 7, 4, 4, 2, 5, 3, 8, 7, 5, 6,
30 4, 5, 6, 1, 6, 5, 7, 8, 7 };
31
32 / process responses /
33 mean( response );
34 median( response );
35 mode( frequency, response );
36 return 0; / indicates successful termination /
37 }
39 / calculate average of all response values /
40 void mean( const int answer[] )
41 {
42 int j; / counter for totaling array elements /
43 int total = 0; / variable to hold sum of array elements /
44
45 printf( "%s\n%s\n%s\n", " ", " Mean", " " );
46
47 / total response values /
48 for ( j = 0; j < SIZE; j++ ) {
49 total += answer[ j ];
50 } / end for /
51
52 printf( "The mean is the average value of the data\n"
53 "items. The mean is equal to the total of\n"
54 "all the data items divided by the number\n"
55 "of data items ( %d ). The mean value for\n"
56 "this run is: %d / %d = %.4f\n\n",
57 SIZE, total, SIZE, ( double ) total / SIZE );
58 } / end function mean /
59
60 / sort array and determine median element's value /
61 void median( int answer[] )
62 {
63 printf( "\n%s\n%s\n%s\n%s",
64 " ", " Median", " ",
65 "The unsorted array of responses is" );
66
67 printArray( answer ); / output unsorted array /
68
69 bubbleSort( answer ); / sort array /
70
71 printf( "\n\nThe sorted array is" );
72 printArray( answer ); / output sorted array /
73
74 / display median element /
75 printf( "\n\nThe median is element %d of\n"
76 "the sorted %d element array.\n"
77 "For this run the median is %d\n\n",
78 SIZE / 2, SIZE, answer[ SIZE / 2 ] );
79 } / end function median /
80
81 / determine most frequent response /
82 void mode( int freq[], const int answer[] )
83 {
84 int rating; / counter for accessing elements 1-9 of array freq /
85 int j; / counter for summarizing elements 0-98 of array answer /
86 int h; / counter for diplaying histograms of elements in array freq /
87 int largest = 0; / represents largest frequency /
88 int modeValue = 0; / represents most frequent response /
89
90 printf( "\n%s\n%s\n%s\n",
91 " ", " Mode", " " );
92
93 / initialize frequencies to 0 /
94 for ( rating = 1; rating <= 9; rating++ ) {
95 freq[ rating ] = 0;
96 } / end for /
97
98 / summarize frequencies /
99 for ( j = 0; j < SIZE; j++ ) {
100 ++freq[ answer[ j ] ];
101 }/ end for /
102
103 / output headers for result columns /
104 printf( "%s%11s%19s\n\n%54s\n%54s\n\n",
105 "Response", "Frequency", "Histogram",
106 "1 1 2 2", "5 0 5 0 5" );
107
108 / output results /
109 for ( rating = 1; rating <= 9; rating++ ) {
110 printf( "%8d%11d ", rating, freq[ rating ] );
111
112 / keep track of mode value and largest frequency value /
144
145 / swap elements if out of order /
146 if ( a[ j ] > a[ j + 1 ] ) {
147 hold = a[ j ];
148 a[ j ] = a[ j + 1 ];
149 a[ j + 1 ] = hold;
150 } / end if /
151 } / end inner for /
152 } / end outer for /
153 } / end function bubbleSort /
154
155 / output array contents (20 values per row) /
156 void printArray( const int a[] )
157 {
158 int j; / counter /
159
160 / output array contents /
161 for ( j = 0; j < SIZE; j++ ) {
162
163 if ( j % 20 == 0 ) { / begin new line every 20 values /
164 printf( "\n" );
165 } / end if /
166
167 printf( "%2d", a[ j ] );
Mean
Median
Fig. 6.17 | Sample run for the survey data analysis program. (Part 1 of 2.)
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
Mode
Histogram
Contoh dijalankan untuk program analisis data survei. (Bagian 2 dari 2.)
21
22 printf( "Enter integer search key:\n" );
23 scanf( "%d", &searchKey );
24
/ attempt to locate searchKey in array a / element =
25 linearSearch( a, searchKey, SIZE );
26
27
28 / display results /
29 if ( element != -1 ) {
30 printf( "Found value in element %d\n", element );
31 } / end if /
32 else {
33 printf( "Value not found\n" );
34 } / end else /
35
36 return 0; / indicates successful termination /
37 } / end main /
38 / compare key to every element of array until the location is found or until the
end of array is reached; return subscript of element if key or -1 if key is
39 not found /
42
43 / loop through array /
47 } / end if /
} / end for /
48
37
36
23
24 printf( "Enter a number between 0 and 28: " );
25 scanf( "%d", &key );
26
27 printHeader();
28
29 / search for key in array a /
30 result = binarySearch( a, key, 0, SIZE - 1 );
31
32 / display results /
33 if ( result != -1 ) {
34 printf( "\n%d found in array element %d\n", key, result );
35 } / end if /
36 else {
37 printf( "\n%d not found\n", key );
38 } / end else /
39
40 return 0; / indicates successful termination /
41 } / end main /
42
43 / function to perform binary search of an array /
44 int binarySearch( const int b[], int searchKey, int low, int high )
45 {
46 int middle; / variable to hold middle element of array /
47
48 / loop until low subscript is greater than high subscript /
49 while ( low <= high ) {
50
51 / determine middle element of subarray being searched /
52 middle = ( low + high ) / 2;
53
54 / display subarray used in this loop iteration /
55 printRow( b, low, middle, high );
56 / if searchKey matched middle element, return middle /
57 if ( searchKey == b[ middle ] ) {
58 return middle;
59 } / end if /
60 else if ( searchKey < b[ middle ] ) {
61 high = middle - 1; / search low end of array /
54 }
55 / if searchKey greater than middle element, set new low /
56 else {
57 low = middle + 1; / search high end of array /
58 }
}
72
73 return -1; / searchKey not found /
74 } / end function binarySearch /
75
76 / Print a header for the output /
77 void printHeader( void )
78 {
79 int i; / counter /
80
81 printf( "\nSubscripts:\n" );
82
83 / output column head /
84 for ( i = 0; i < SIZE; i++ ) {
85 printf( "%3d ", i );
86 } / end for /
87
88 printf( "\n" ); / start new line of output /
89
90 / output line of - characters /
91 for ( i = 1; i <= 4 SIZE; i++ ) {
92 printf( "-" );
93 } / end for /
94
95 printf( "\n" ); / start new line of output /
59 }
98 /Print one row of output showing the current
99 part of the array being processed. /
100 void printRow( const int b[], int low, int mid, int high )
101 {
102 int i; / counter for iterating through array b /
103
104 / loop through entire array /
105 for ( i = 0; i < SIZE; i++ ) {
106
107 / display spaces if outside current subarray range /
108 if ( i < low || i > high ) {
109 printf( " " );
110 } / end if /
111 else if ( i == mid ) { / display middle element /
112 printf( "%3d ", b[ i ] ); / mark middle value /
113 } / end else if /
114 else { / display other elements in subarray /
115 printf( "%3d ", b[ i ] );
Subscripts:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
02 4 6
8 10 12 14 16 18 20 22 24 26 28
16 18 20 22 24 26 28
Subscripts:
Subscripts:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
02 4 6
8 10 12 14 16 18 20 22 24 26 28
Row 0 a[ 0 ][ 0 ] a[ 0 ][ 1 ] a[ 0 ][ 2 ] a[ 0 ][ 3 ]
a[ 1 ][ 0 ] a[ 1 ][ 1 ] a[ 1 ][ 2 ] a[ 1 ][ 3 ]
Row 1
a[ 2 ][ 0 ] a[ 2 ][ 1 ] a[ 2 ][ 2 ] a[ 2 ][ 3 ]
Row 2
Gambar 6.20 | Array langganan ganda dengan tiga baris dan empat kolom.
Setiap elemen dalam array a diidentifikasi pada Gambar. 6.20 oleh nama elemen bentuk a [i] [j];
a adalah nama array, dan i dan j adalah subscript yang secara unik mengidentifikasi setiap
elemen dalam a. Nama-nama elemen di baris pertama semuanya memiliki subscript pertama
0; nama-nama elemen di kolom keempat semuanya memiliki subscript kedua 3.
Larik multi-langganan dapat diinisialisasi saat ditentukan, mirip dengan larik bersusun tunggal.
Sebagai contoh, array double-subscripted int b [2] [2] dapat didefinisikan dan diinisialisasi
dengan
int b [2] [2] = {{1, 2}, {3, 4}};
Nilai dikelompokkan berdasarkan baris dalam kurung kurawal. Nilai-nilai dalam set pertama
braces menginisialisasi baris 0 dan nilai-nilai di set kedua braces menginisialisasi baris 1. Jadi,
nilai-nilai 1 dan 2 menginisialisasi elemen b [0] [0] dan b [0] [1], masing-masing , dan nilai-nilai
3 dan 4 elemen inisialisasi b [1] [0] dan b [1] [1], masing-masing. Jika tidak ada cukup
penginisialisasi untuk baris yang diberikan, elemen yang tersisa dari baris tersebut diinisialisasi
ke 0. Jadi,
int b [2] [2] = {{1}, {3, 4}};
akan menginisialisasi b [0] [0] hingga 1, b [0] [1] hingga 0, b [1] [0] hingga 3 dan b [1] [1]
hingga 4. Gambar 6.21 menunjukkan pendefinisian dan inisialisasi double- array langganan.
Program ini mendefinisikan tiga array dari dua baris dan tiga kolom (masing-masing enam
elemen). Definisi array1 (baris 11) menyediakan enam initializers dalam dua sublist. Sublist
pertama menginisialisasi baris pertama (yaitu, baris 0) dari array ke nilai 1, 2 dan 3; dan sublist
kedua menginisialisasi baris kedua (yaitu, baris 1) dari array ke nilai 4, 5 dan 6.
1 / Fig. 6.21: fig06_21.c
6
7 / function main begins program execution /
8 int main( void )
9 {
10 int array1[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } };
11 int array2[ 2 ][ 3 ] = { 1, 2, 3, 4, 5 };
12 int array3[ 2 ][ 3 ] = { { 1, 2 }, { 4 } };
15 printf( "Values in array1 by row are:\n" );
16 printArray( array1 );
17
18 printf( "Values in array2 by row are:\n" );
19 printArray( array2 );
20
21 printf( "Values in array3 by row are:\n" );
22 printArray( array3 );
23 return 0; / indicates successful termination /
24 }
25 / function to output array with two rows and three columns /
26 void printArray( const int a[][ 3 ] )
27 {
28 int i; / row counter /
29 int j; / column counter
30
31 / loop through rows /
32 for ( i = 0; i <= 1; i++ ) {
33 / output column values /
34 for ( j = 0; j <= 2; j++ ) { printf( "%d ", a[ i ][ j ] );
35 } / end inner for /
36 printf( "\n" ); / start new line of output /
37 }
Values in array1 by row are: 1 2 3
4 5 6
4 5 0
4 0 0
a[ 2 ][ 0 ] = 0;
a[ 2 ][ 1 ] = 0;
a[ 2 ][ 2 ] = 0;
a[ 2 ][ 3 ] = 0;
Pernyataan bersarang berikut ini menentukan total semua elemen dalam larik a.
total = 0;
for ( row = 0; row <= 2; row++ ) {
for ( column = 0; column <= 3; column++ ) { total += a[ row ][
column ];
}
}
Pernyataan untuk total elemen dari array satu baris pada suatu waktu. Bagian luar untuk
pernyataan dimulai dengan mengatur baris (yaitu, baris subskrip) ke 0 sehingga unsur-unsur
baris pertama dapat dijumlahkan oleh bagian dalam untuk pernyataan. Pernyataan luar untuk
kemudian menambahkan baris ke 1, sehingga elemen dari baris kedua dapat dijumlahkan.
Kemudian, pernyataan luar untuk kenaikan baris ke 2, sehingga elemen dari baris ketiga dapat
dijumlahkan. Hasilnya dicetak saat pernyataan nested for berakhir.
Manipulasi 2-Dimensonal Array
Gambar 6.22 melakukan beberapa manipulasi array umum lainnya pada 3-oleh-4 array stu-
dentGrades menggunakan untuk pernyataan. Setiap baris array mewakili seorang siswa dan
masing-masing kolom mewakili nilai pada salah satu dari empat ujian yang siswa ambil selama
semester. Manipulasi array dilakukan oleh empat fungsi. Fungsi minimum (baris 43–
62) menentukan nilai terendah dari setiap siswa untuk semester. Fungsi maksimum (baris 65-84)
menentukan nilai tertinggi dari setiap siswa untuk semester tersebut. Rata-rata fungsi (baris 87-
98) menentukan rata-rata semester siswa tertentu. Fungsi printArray (baris 101–120)
menghasilkan larik ber-subscript ganda dalam format tabular yang rapi.
1 / Fig. 6.22: fig06_22.c
17
18 / initialize student grades for three students (rows) /
19 const int studentGrades[ STUDENTS ][ EXAMS ] =
20 { { 77, 68, 86, 73 },
21 { 96, 87, 89, 78 },
22 { 70, 90, 86, 81 } };
23
24 / output array studentGrades /
25 printf( "The array is:\n" );
26 printArray( studentGrades, STUDENTS, EXAMS );
27
28 / determine smallest and largest grade values /
29 printf( "\n\nLowest grade: %d\nHighest grade: %d\n",
30 minimum( studentGrades, STUDENTS, EXAMS ),
31 maximum( studentGrades, STUDENTS, EXAMS ) );
32
33 / calculate average grade for each student /
34 for ( student = 0; student < STUDENTS; student++ ) {
35 printf( "The average grade for student %d is %.2f\n",
36 student, average( studentGrades[ student ], EXAMS ) );
37 } / end for /
38
39 return 0; / indicates successful termination /
40 } / end main /
41
42 / Find the minimum grade /
43 int minimum( const int grades[][ EXAMS ], int pupils, int tests )
44 {
108
109 / output grades in tabular format /
110 for ( i = 0; i < pupils; i++ ) {
111
112 / output label for row /
113 printf( "\nstudentGrades[%d] ", i );
114 / output grades for one student /
115 for ( j = 0; j < tests; j++ ) {
116 printf( "%-5d", grades[ i ][ j ] );
117 } / end inner for /
118 } / end outer for /}
The array is:
Lowest grade: 68
Highest grade: 96
Argumen studentGrades [1] adalah alamat awal dari baris kedua dari array. Ingat bahwa larik
bersusun ganda pada dasarnya merupakan larik dari larik bersusun tunggal dan bahwa nama larik
bersyarat tunggal adalah alamat larik dalam memori. Fungsi rata-rata menghitung jumlah elemen
array, membagi total dengan jumlah hasil tes dan mengembalikan hasil floating-point.