Search This Blog

Tuesday 30 August 2016

Merge array 1 dimensi

Merge merupakan suatu proses untuk penggabungan, atau dengan kata lain merge berarti menggabungkan. Untuk menggabungkan sendiri sudah jelas bahwa harus ada sesuatu yang digabungkan, artinya harus ada lebih dari satu data agar dapat berlangsung proses penggabungan tersebut. Dalam hal pemrograman pun merge biasa diartikan suatu proses menggabungkan dua file data dalam memori external, tapi penggabungan disini bukan berarti kedua file itu dijumlahkan seperti dalam posted sebelumnya. Dalam penggabungan yang satu ini ialah bagaimana dua buah file dapat menjadi satu file baru yang didalamnya terdapat semua komponen dari dua file itu. Dapat diibaratkan seperti saat Anda memiliki 2 buah buku dalam rak yang hanya dapat menampung 2 buah buku tersebut, dan Anda ingin kedua buah buku tersebut disatukan dengan 3 buku lainnya dalam rak yang berbeda dan hanya dapat menampung 3 buah buku pula. Dengan demikian Anda harus memiliki rak buku baru yang mampu menampung 5 buah buku sekaligus, sehingga semua buku tersebut dapat digabungkan dalam rak yang sama. Dalam topik kali ini penulis hanya ingin memberi sebuah contoh program untuk menggabungkan dua buah isi array beserta sedikit penjelasan dari program tersebut. Yang paling penting dalam topik ini ialah logikanya, dimana pada saat Anda ingin membuat sebuah program untuk menggabungkan dua buah data/file, maka perintah apa saja yang harus Anda tuliskan dalam program tersebut. Agar tidak terlalu banyak basa-basi, maka lebih baik jika langsung pada contoh programnya saja:

#include<stdio.h>
main(){
int b, s=0, S[3]={24,1,97}, E[3]={22,1,97},W[6];


printf("\n\t\tDeret yang akan ditempatkan awal:\n\n");


for(b=0; b<3; b++){
if(b==0){printf("\t\t\t    ");}

W[s]=S[b];
s++;
printf("%3i", S[b]);
}


printf("\n\n\n\t Angka yang akan ditempatkan pada indeks berikutnya:\n\n");


for(b=0; b<3; b++){
if(b==0){printf("\t\t\t    ");}

W[s]=E[b];
s++;
printf("%3i", E[b]);
}


printf("\n\n\n\n\t *=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*\n\n");
printf("\n\n\t\t Hasil Penggabungan / MERGE tersebut:\n\n");


for(s=0; s<6; s++){
if(s==0||s==3){printf("\t\t\t    ");}

printf("%3i", W[s]);

if(s==2){
printf("\n");
}
}
}

Mari perhatikan contoh program tersebut, seperti biasa yang dilakukan pertama kali ialah deklarasi dan inisialisasi variabel. Namun dalam contoh program terebut terlihar perbedaan antara variabel b dan s. Variabel b terlihat hanya dideklarasikan saja, sedangkan s sudah diberi nilai awal langsung. Mengapa demikian? Oke mari perhatikan perintah-perintah berikutnya, variabel b hanya digunakan dalam 2 perulangan pertama, dan dalam setiap perulangan tersebut variabel b diberi nilai awal, jadi dengan demikian variabel b dapat tidak diberi nilai awal pada saat deklarasi dilakukan. Sedangkan untuk variabel s, walau dalam perulangan ketiga variabel tersebut diberi nilai awal, namun untuk perulangan pertama dan kedua sendiri variabel tersebut tidak memiliki nilai awal. Maka dengan demikian variabel s harus diberi nilai awal terlebih dahulu sebelum perulangan pertama dan kedua dilaksanakan, itulah perbedaan antara variabel b dan s. Lalu mengapa dengan variabel array S dan E diberi nilai awal sedangkan variabel array W hanya dideklarasikan saja? Oke mari perhatikan kembali perintah-perintah berikutnya. Dalam program tersebut tidak ada perintah untuk input, maka untuk menyatakan informasi dalam percetakan, sebagai bukti bahwa variabel array S dan E sudah digabungkan maka kedua variabel array tersebut diberi nilai awal terlebih dahulu. Sedangkan untuk variabel array W sendiri mengapa ia hanya dideklarasikan saja ialah karena ia nantipun akan terisi oleh deret isi variabel S dan E. Dengan demikian variabel array W tidak perlu lagi diberi nilai awal, kecuali jika memang nilai variabel tersebut dibutuhkan dalam program yang dibuat, dan atau mungkin untuk kesesuaian dengan keinginan bahwa variabel tersebut ingin diberi nilai awal terlebih dahulu, itu tidak menjadi masalah, karena pada akhirnya jika nilai tersebut tidak diberi perintah tambahan (selain perintah dalam contoh program diatas) maka isi dari variabel tersebut akan terganti dengan hasil merge tersebut. Dan mengapa variabel array S dan E hanya memiliki 3 deret indeks sedangkan variabel array W memiliki 6 deret indeks? Karena variabel W hanyalah variabel array yang akan menampung isi dari kedua variabel tersebut (variabel array S dan E), maka untuk deklarasi sendiri variabel array W harus mengandung deret indeks sejumlah deret indeks yang ada dalam variabel array S ditambah dengan jumlah deret indeks variabel array E.

Agar tidak terlalu banyak basa-basi, mari kita langung menuju inti dari program tersebut. Untuk perintah printf() sendiri sebelum perulangan dilakukan ialah hanya untuk memberi keterangan pada proses cetak ke layar. Dan dalam perulangan pertama kita melihat variabel yang digunakan untuk perulangan tersebut ialah variabel b, dimana variabel tersebut harus sesuai dengan tujuan dilakukannya perulangan. Dalam perulangan pertama, variabel b juga digunakan untuk mengindeks variabel array S yang mana variabel array tersebut memiliki 3 indeks, dengan demikian perulanganpun dilakukan sebanyak indeks dalam variabel S. Lalu mengapa tidak digunakan untuk variabel W, mengapa digunakan untuk variabel S? Karena yang akan diproses ialah isi dari variabel B, sedangkan variabel array W hanya akan menampung hasil dari proses tersebut. Lalu untuk apa perintah s++ dibawahnya? Perintah s++ tersebut digunakan untuk memberi perubahan kondisi pada variabel s. Karena pada dasarnya antara variabel b dan s memiliki perintah-perintah yang sama, pada variabel b memiliki nilai awal, kondisi dan perubahan kondisi yang ditulis berderet dalam proses perulangan, sedangkan variabel s nilai awalnya ditulis pada saat deklarasi, perubahan kondisi dilakukan didalam perulangan serta kondisinya diwakilkan oleh variabel b sebagai pembantu proses perulangan. Dan peran variabel s dalam inti program ini ialah untuk membantu proses pengindeksan variabel array W, sehingga pada saat perulangan dilaksanakan, maka perpindahan antar indeks dalam variabel array W menyesuaikan perpindahan dari variabel array S. Untuk kondisi if() sendiri yang berisikan perintah jika b==0 maka diberi jarak (tab) dari pojok kiri layar, sehingga pada saat percetakan dilaksanakan, maka perintah printf() dibawahnya lebih tergeser ke kanan. Dengan kata lain tulisan yang tercetak lebih dikekanankan. Demikianlah proses-proses yang terjadi pada perulangan pertama. Dan pada perulangan kedua pun tidak jauh berbeda dimana isi dari variabel array E akan mengisi indeks berikutnya dari variabel array W. Mengapa bisa mengisi indeks berikutnya? Mengapa tidak dari indeks nol lagi? Sedangkan perulangan sendiri berawal dari nol. Itu disebabkan karena s++ yang ada dalam perulangan sebelumnya tidak diberi nilai awal 0 lagi, sedangkan untuk variabel b, pada perulangan kedua diberi nilai awal kembali. Jadi variabel s untuk mengindeks variabel array W hanya akan melanjutkan dari indeks yang sudah dilakukan sebelumnya. Jadi intinya dalam kedua perulangan tersebut tidak banyak mengandung perbedaan, dan alurnya pun sama saja (terlihat dari perintah-perintah yang diberikan).

Proses yang dijelaskan diatas merupakan proses inti dari merge tersebut, dimana isi kedua variabel array (S dan E) akan digabungkan dalam variabel array baru dengan nama variabel W. Proses tersebut memang terlihat mudah, namun yang harus diperhatikan ialah pengindeksan nya. Dimana pada saat perulangan, perulangan tersebut akan dilakukan untuk mengindeks yang mana (menyesuaikan dengan indeks variabel yang mana), apakah variabel yang diisi atau variabel yang mengisi (variabel yang akan digabungkan atau variabel yang akan menampung hasil penggabungan tersebut). Selain itu, yang harus diperhatikan pula ialah pengindeks variabel yang akan menampung hasil penggabungannya. Untuk variabel tersebut, memberi nilai awal harus dilakukan sebelum proses perulangan dilakukan, dan tidak ketinggalan akan perubahan kondisi pada setiap perulangan yang dilakukan. Untuk if() sendiri sebenarnya tidak disertakan dalam kodinganpun tidak menjadi masalah, karena kondisi if() tersebut tidak lain hanyalah pemberi jarak agar cetakan lebih tergeser ke kanan. Begitupun dengan printf() yang berada dalam perulangan tersebut, itu hanyalah keterangan dari nilai dalam variabel yang akan digabungkan, tidak disertakan dalam program tersebutpun tidak menjadi masalah. Dan yang terakhir ialah pada perulangan ketiga. Sebelum perulangan tersebut kita melihat terdapat 2 buah perintah printf() yang mana perintah kedua sama seperti pada sebelum perulangan yang lalu. Namun ada perintah satu lagi yang isinya tak lain karakter = - * namun karakter tersebut tidak mempengaruhi alur program sedikitpun, karena itu hanya untuk memberi sedikit variasi pada cetakan ke layar, juga untuk pemisah antara keterangan awal dengan keterangan hasil dari program yang sudah diproses lebih lanjut. Dan untuk perulangannya sendiri mengapa perulangan tersebut terjadi 6 kali dan berbeda dengan perulangan sebelumnya (3x perulangan), ialah karena jumlah indeks pada variabel W ialah 6, dan nilai 6 tersebut didapat dari penjumlahan indeks variabel S dan E. Dalam perulangan ketiga yang dilakukan sebenarnya hanyalah pencetakan ke layar untuk isi variabel W, dan program tersebut dapat dijalankan tanpa adanya kedua kondisi if() seperti dalam contoh. Karena kondisi pertama hanyalah bertugas untuk memberi jarak seperti kondisi dalam perulangan sebelumnya, hanya saja pemberian jarak disini dilakukan 3 kali, karena pada kondisi if() kedua diberi baris baru setelah 3 indeks pertama. Dengan diberinya baris baru tersebut, maka jika perintah yang menggeser ke kanan hanya diberikan satu kali, maka 3 indeks berikutnya akan tetap berada di posisi sebelah kiri, maka dengan demikianlah pemberian jarak dari kiri dilakukan sebanyak 2 kali setiap 3 indeks. Dan mengapa dalam kodisi tersebut digunakan logika atau (ditulis || ), ialah karena perulangan dilakukan per indeks, tidak sekaligus, maka jika digunakan logika dan (ditulis && ), maka justru per tiga indeks tersebut tidak ada yang bergeser satupun ke kanan.

No comments:

Post a Comment