Anda perlu menyimpan seribu bilangan bulat. Apakah Anda benar-benar ingin mendeklarasikan int a, b, c... hingga z dan kemudian melanjutkan? Tidak. Itu membosankan dan rawan kesalahan. Sebagai gantinya, Anda menggunakan array.
Array adalah kumpulan nilai dengan tipe yang sama. Ini mengemasnya ke dalam satu blok memori. Di C, Anda mendeklarasikannya seperti ini:
ke dalam sebuah[5];
Itu saja. Lima bilangan bulat. Siap berangkat.
Mengapa Array C Mulai dari Nol
Inilah trik yang membuat pemula tersandung. Array C diindeks nol.
Jika Anda mendeklarasikan int a[5], Anda memiliki lima slot. Namun diberi nomor 0, 1, 2, 3, dan 4. Tidak ada a[5]. Jika Anda mencoba mengakses a[5], Anda membaca memori yang bukan milik array Anda. C tidak akan menghentikanmu. Itu hanya akan memberi Anda sampah atau kecelakaan. Ini adalah fitur, bukan bug. Ini cepat. Itu juga berbahaya.
Anda mengakses elemen menggunakan tanda kurung siku. a[0] adalah item pertama. a[4] adalah yang terakhir.
Menghasilkan Angka Acak di C
Mari kita membangun sesuatu yang bermanfaat. Kami akan membuat program yang menghasilkan 10 angka acak dan mengurutkannya.
Pertama, Anda memerlukan nomornya. Pustaka standar C memiliki rand(), tetapi mari kita lihat implementasi klasik untuk memahami mekanismenya. Kode ini menggunakan generator kongruensial linier, sebuah metode dari buku K&R C.
Perhatikan baris #define MAX 10. Ini menciptakan sebuah konstanta. Konstanta ditulis dalam huruf kapital semua berdasarkan konvensi. Itu membuat mereka menonjol. Anda mendeklarasikan array int a[MAX] di luar fungsi main. Hal ini menjadikannya variabel global. Itu ada di mana-mana dalam program ini.
Variabel rand_seed juga bersifat global. Ini dimulai pada 10. Karena seednya tetap, angka “acak” sebenarnya sama setiap kali Anda menjalankan program. Jika Anda menginginkan keacakan yang sesungguhnya, Anda dapat memasukkannya ke dalam waktu sistem. Untuk saat ini, konsistensi bagus untuk debugging.
Memahami Pengurutan Gelembung
Sekarang sampai pada bagian yang sulit. Penyortiran.
Kami akan menggunakan penyortiran gelembung. Ini adalah algoritma pengurutan yang paling sederhana. Ini juga yang paling lambat. Tapi ini mengajarkan Anda bagaimana loop dan array berinteraksi.
Tambahkan kode ini ke fungsi main Anda, ganti komentar tentang “lebih banyak hal”:
Apa yang terjadi di sini?
Loop luar berjalan MAX-1 kali. Loop bagian dalam berjalan lebih sedikit setiap kali lintasan. Mengapa? Karena angka terbesar “menggelembung” ke akhir array dengan setiap lintasan. Anda tidak perlu memeriksanya lagi.
Di dalam loop dalam, kita membandingkan a[y] dengan a[y+1]. Jika yang kiri lebih besar, kita tukar. Kita menggunakan variabel sementara t untuk menyimpan nilai saat kita memindahkan potongannya.
“Satu-satunya cara mudah untuk benar-benar memahami apa yang dilakukan kode ini adalah dengan mengeksekusinya dengan tangan.”
Ambil selembar kertas. Gambarlah lima kotak. Masukkan angka ke dalamnya. Jalankan kode baris demi baris. Pindahkan angkanya. Anda akan melihat sejumlah besar tenggelam ke dasar. Yang kecil melayang. Itu visual. Itu mekanis.
Kesalahan Umum Array C
C tidak memegang tanganmu. Anda akan terjatuh dari tepian.
- Tidak ada pemeriksaan rentang. Jika Anda mengakses
a[10]dalam array berukuran 10, C tidak akan berteriak. Ini akan membaca memori apa pun selanjutnya. Hal ini menyebabkan bug halus yang sulit ditemukan. - Pemanggilan fungsi memerlukan tanda kurung. Anda harus menulis
x = rand();. Jika Anda menulisx = rand;, Anda menetapkan alamat memori fungsi tersebut kex. Bukan hasilnya. Itu dikompilasi. Itu rusak.
Coba Ini
Jangan hanya membaca. Kode.
- Ubah loop yang mengisi array menjadi satu baris. Apakah Anda bisa?
- Pindahkan logika pengurutan gelembung ke dalam fungsinya sendiri. Sebut saja
void bubble_sort(). Pindahkan variabelx,y, dantke dalam fungsi tersebut. Mereka menjadi lokal. Arrayabersifat global, jadi Anda tidak perlu meneruskannya. - Ubah
rand_seedke nilai yang berbeda. Perhatikan perubahan keluarannya.
Array adalah hal mendasar. Mereka adalah blok bangunan struktur data. Kuasai mereka, dan sisa C menjadi lebih jelas. Abaikan indeks nol, dan Anda akan menghabiskan waktu berjam-jam untuk men-debug kerusakan yang terjadi tiga langkah lalu.






























