nav

       HOME    BINUS EVENT   HOW TO   KBP   THOUGHTS

About



Monday, April 6, 2015

Penjumlahan i++ + i++ + ++i + ++i


Pada bulan Oktober 2014 lalu, saya mendapat tugas dari dosen algoritma saya untuk penghitungan pre-increment dan post-increment. Lalu ketika saya browsing, masih banyak kebingungan dan keambiguan mengenai logika pre-increment dan post-increment di website-website maupun forum. Untuk pengertian secara harafiah, sudah benar, bahwa pre-increment menambahkan nilai sebelum melakukan proses sementara post-increment menambahkan nilai sesudah proses. Hal yang serupa juga berlaku pada pre-decrement dan post-decrement. Akan tetapi, saya cukup beruntung diajar oleh seorang dosen algoritma yang bisa dibilang ahli dalam programming DAN banyak maunya... nyebelin sih tapi saya sadar tugas itu berguna untuk menganalisa seberapa jauh pengertian mahasiswanya. Sayang sekali soal yang cukup menarik ini hampir tidak dapat saya temukan jawabannya di internet. Mungkin ada, di halaman terakhir google.. atau diantara halaman-halaman google... pokoknya jawabannya tidak saya temukan sejauh saya menelusuri halaman -halaman pencarian google berdasarkan batas kesabaran saya.. dan semua mahasiswa juga bingung, sampai akhirnya dosen kami pun "berbaik hati" menjelaskan di kelas.

Untuk compiler, kami menggunakan visual studio c++, dan menggunakan bahasa c. Untuk compiler lain mungkin akan berbeda hasilnya.

Soal:

#include<stdio.h>

int main(){
int i=1;

printf("%d", ++i + i++ + i++ + i++ + ++i + ++i + i++);
getchar();
return 0;
}


ketika dijalankan, hasilnya adalah 28. Pertanyaannya, darimanakah nilai i bisa menjadi 28???

Kalau saya search di internet, katanya sebenernya multi-increment seperti ini ga boleh dilakukan karena pada tiap compiler hasilnya bisa berbeda. Lalu ada juga pemikiran karena incrementnya ada 7 buah, jadi 28 itu berasal dari 7x4, jadi tiap nilai i dikali dengan 4. Banyak sekali teori dan hipotesa berlalu-lalang antar mahasiswa kelas algo saya. Mungkin benar, mungkin salah. Namun, untuk logika dalam compiler visual studio yang dijelaskan oleh dosen saya, kira-kira seperti ini cara pengerjaannya:

1. kumpulkan semua i++ ke kiri. total, ada 4 i++. Ingat, i++ adalah bentuk post-increment. Untuk ++i akan kita hitung kemudian, tinggalkan dulu saja ++i nya. Lalu agar tidak bingung, saya tetapkan: nilai eksplisit adalah nilai yang seharusnya berdasarkan definisinya, sedangkan nilai implisit adalah nilai yang menyimpang berdasarkan definisinya.


2. ada 2 nilai pada i, nilai implisit dan nilai eksplisit. Karena i adalah post increment, yaitu melakukan proses barulah menambahkan nilai, dan proses di sini adalah printf, jadi nilai eksplisit dari post-increment harusnya TIDAK BERUBAH dari nilai awal. Yang akan tercetak adalah nilai awal i itu sendiri, yaitu 1. Jadi, nilai eksplisitnya adalah 1 + 1 + 1 + 1 = 4. Kalau nilai awal i adalah 2, berarti nilai eksplisitnya 2 + 2 + 2 + 2 = 8.


diketahui : int i = 1
 
printf("%d", ++i  +  i++  +  i++  +  i++  +  ++i  +  ++i  +  i++);
                            1         1        1                           1        

nilai eksplisit post-increment i = 1 + 1 + 1 + 1 = 4                


Untuk nilai implisit, nilainya bertambah selalu tanpa memperhatikan itu adalah post-increment, jadi tiap menemukan i++, nilai i akan bertambah. Karena nilai awal i adalah 1, jadi nilai implisit i++ adalah 2 → 3 → 4 → 5. Tapi ini nilai implisit, jadi tidak dijumlah ya, yang diambil nilai akhirnya saja sebanyak jumlah i++, sehingga nilai implisit akhir adalah 5. Kalau jumlah i++ nya ada 7 dan nilai awal i adalah 1, berarti nilai implisit i adalah 2 → 3 → 4 → 5 → 6 → 7 → 8, nilai implisit i yang kita pegang adalah 8.


printf("%d", ++i  +  i++  +  i++  +  i++  +  ++i  +  ++i + i++);
                           1→2   2→3    3→4                     4→5        

nilai eksplisit post-increment i = 4 
nilai implisit post-increment i = 5    


3. Nah sekarang kita sudah punya nilai implisit i++ dan nilai eksplisit i++, mari berlanjut ke nilai implisit dan eksplisit ++i. Berbeda dari i++, ++i akan menggunakan nilai awal i dari hasil nilai implisit i++. Jadi nilai awal pada ++i dari soal ini adalah 5, bukan 1. 

Lalu sekarang kita masuk ke pre-increment dimana definisinya adalah melakukan pertambahan nilai sebelum melakukan proses, dan proses yang dimaksud pada soal ini adalah printf. Jadi nilai eksplisit di sini seharusnya SELALU BERTAMBAH TIAP MENEMUKAN ++i.

Mari kita lihat. ++i pada soal di atas, ada 3 buah. Berarti untuk nilai eksplisit ++i, mulai dari 5, menjadi 6 → 7 → 8. Nilai eksplisit akhir ++i adalah 8.

ingat: nilai implisit post-increment i = 5


printf("%d", ++i  +  i++  +  i++  +  i++  +  ++i  +  ++i + i++);
                 5→6                                  6→7   7→8       

nilai eksplisit pre-increment i = 8  



Lalu untuk nilai implisit, karena ++i ada 3 buah, maka memakai nilai eksplisit ++i dikali 3. Jadi nilai implisit ++i adalah 3 x 8 = 24.



ingat:
- nilai implisit post-increment i = 5
- nilai eksplisit pre-increment i = 8  


printf("%d", ++i  +  i++  +  i++  +  i++  +  ++i  +  ++i + i++);
                   8                                       8         8      

nilai implisit pre-increment i = 8 + 8 + 8 = 24  


4. Nilai akhir yang ditunjukkan oleh compiler berasal dari nilai eksplisit i++ ditambah nilai implisit ++i, yaitu 4 + 24, maka hasilnya 28. Nah kalau kamu masih belum begitu mengerti, coba ubah nilai int i=1 menjadi int i=2, jika kamu memakai visual studio c++, harusnya jawabannya adalah 35, berasal dari 8 + 27.


Kira-kira begitu hal yang dapat saya share kali ini, semoga tidak membuat kamu pusing dan bisa bermanfaat jika bertemu dosen sejenis dosen saya :)


Friday, April 3, 2015

Expect the Unexpected?

Oke, sepertinya hal ini harusnya tidak pernah ada dalam pikiran gw. Apalagi sampe gw tulis kayak gini. Tapi, gw sangat ingin menuliskan apa yang ada di otak gw ini. Dan untuk menulis uneg-uneg kayak gini di blog gw yang satu lagi, agaknya hanya membuat followers gw bingung wkwkw karena sebagian besar dari mereka gak ngerti bahasa indonesia. So, gw tulis di sini aja.


Semester 1 berjalan dengan cukup baik. Target gw dapet A di kalkulus dan programming bisa tercapai. IP harapan gw pun tercapai juga, meski gw tau papa gw expect lebih lagi, however I'm glad that he supports what I already choose, padahal jurusan pilihan gw ini gak ada dalam "darah" ortu gw, mereka keduanya bukan IT. Dan mereka udah peringatin dari awal, kalau gw harus hati-hati dalam ambil jurusan karena seem like they will not let me to re-sign up buat pindah jurusan just in case gw salah jurusan. I know that it's just a waste of money kalau gw sampe pindah jurusan, apalagi kampus gw bukan termasuk kampus murah. Memang, brand berpengaruh ke harga, dan branding kampus gw memang udah oke, jadi untuk harga segitu, well, I won't complain.


Gw masuk IT dengan mata bersinar dan full-spirit, ngerasa it will be so much fun to code and to get great result just by coding it. Tapi gw gak sadar bahwa coding yang "sebenernya", gak semudah html. Coding yang "sebenernya",  gak semenarik css dan php. Gw terlarut dalam euforia bahwa gw gak akan bertemu lagi sama yang namanya kimia dan biologi. Duo hapal-hapalan yang menghancurkan nilai rapot gw semasa SMA. Untuk biologi masih mendingan lah, gw masih bisa mengerti walaupun gw sangat mabok dalam hapalinnya. Tapi buat kimia.... white flag abis. Gw ga tau kenapa reaksi itu bisa terjadi, kenapa A hanya bisa bereaksi sama B tapi ga bereaksi sama C. Kenapa rantai C makin banyak, menunjukkan makin oktan suatu bensin dan makin bagus buat dipake? Kenapa Na dan Cl kalau dipisah adalah duo mematikan tapi kalau digabung bisa jadi garam dapur buat pelezat masakan. Hal-hal itu menarik, tapi ga masuk akal. Belum ada penjelasan yang bisa bikin gw mengerti sepenuhnya sama kimia.

Lalu, gw juga kemakan sama gengsi. Gw merasa rugi udah cape cape belajar IPA dan disiksa selama 2 tahun di SMA gw, ujung-ujungnya cuma masuk ekonomi. Di mana temen-temen gw yang cewe pun pada masuk teknik. Jadi... gw masuk teknik informatika. Cukup reasonable karena gw ada ketertarikan di web programming yang udah gw pelajari secara otodidak.

Gw masuk IT juga karena memikirkan pergaulan gw. Gw ga sanggup bergaul sama manusia ips. Sebagian besar manusia ips, menurut gw, gak mementingkan esensi belajar. Mereka dateng ke kampus cuma buat tebar pesona dan hang out, having a good time. Kalo males, mereka cabut. Sementara gw, kalo ke kampus ya jelas tujuannya buat belajar, itu nomer satunya, lalu hang out bareng temen ya prioritas ke sekian dan ga boleh mengganggu belajar. Gw merasa bakal terbawa arus kalau gw selama 4 tahun berada dalam lingkungan buruk kayak gitu. Atau, mungkin gw bakal tetap rajin belajar, namun gw bakal dicap geek dan jadi kurang diterima dalam pergaulan mereka. And that feel really sucks. I've experienced it.


Semua hal itu mengerucutkan pilihan kuliah gw untuk masuk IT.



Di semester 1, gw di nina-bobokan sama nilai nilai oke dan kemampuan gw dalam menangkap pelajaran. Kebetulan juga gw sangat beruntung, punya temen jenius yang sangat baik juga mau ngajarin gw, nge-handle banjir pertanyaan gw, dan membukakan logika gw. Dan di semester 2 ini, walaupun gw masih cukup pede dalam pelajaran, itu karena gw masih keep-in-touch sama temen jenius gw. Gw jadi mulai mikir apa jadinya gw tanpa dia, akankah gw masih bisa meraih nilai bagus? Gw merasa gw udah terlalu ketergantungan sama dia. Dan gak mandiri. Gw mau mulai menjauh dari dia, nyoba mengerti dan usaha sendiri, tapi agaknya hal itu belum bisa terjadi dalam waktu dekat.

Lalu ada dosen gw juga yang ngasih tugas sedikit di luar kemampuan muridnya, well, that's good to encourage us, tapi di sinilah gw melihat, dan merasa, IT bukan masa depan yang gw mau. Gw muak berkutat sama bahasa bahasa coding yang dapat berubah seiring waktu dan berubah seiring tren. Gw pada dasarnya adalah pemalas. Ya, gw malas untuk terus terusan menyesuaikan diri. Gw mau pada suatu titik di masa depan, gw diminta melakukan hal yang gw udah bisa dan ahli di situ, bukannya diminta belajar hal baru. Tapi kalau diterapin dalam kehidupan gw, malas gw ini bisa dibilang pendorong gw untuk rajin. Aneh ya? Gw juga ga ngerti kenapa bisa gitu. Gw malas sama SP. Makanya gw rajin belajar, biar liburan nanti bisa main cookie run sampe mual atau bisa buang buang waktu dengan jadi BC, bukannya belajar. Trus gw malas baca teori di rumah, mendingan kerjain yang lain yang ga bisa dikerjain di kampus, misalnya nonton tv atau ngebuka laptop, makanya pas di kampus gw mau bener bener dengerin penjelasan dosen.


Gw sangat berharap pandangan gw bahwa IT bukan masa depan yang gw mau, bakal berubah secepatnya. Mungkin gw hanya frustasi melihat bahasa baru yang gw ga ngerti cara pakenya dan diharuskan belajar demi nilai pelajaran A, dan ambisi jadi mentor. Dan gw juga berharap gw gak salah jurusan. Masih terlalu dini buat merasa salah jurusan. Kalaupun gw salah jurusan, gw bakal tetap tuntasin kuliah di jurusan ini sih.... meski pada akhirnya mungkin nanti gw ga bekerja di bidang IT.


Gw merasa jurusan di kuliah agak ga adil. Kalau kayak akun, ekonomi, mat, fisika, biologi gitu, udah dipelajarin dari SMA. Mahasiswa di jurusan itu, asal sekolah di sekolah tepat, bakal dapet ilmu dasar yang oke buat di kuliah, Tapi kalo IT? SMA biasa cuma ngajarin penggunaan microsoft office yang gunanya cuma buat bikin laporan/tugas. Bukan bener bener IT nya. Mungkin SMK baru ngajarin IT yang sebenernya. Tapi gw rasa itu juga timpang. Seandainya gw tahu lebih awal mengenai IT yang sebenernya, mungkin, mungkin aja, gw ikut kemauan ortu gw. Dan kalau skrg gw cerita ke ortu gw, gw gak mau bikin mereka merasa "tuh kan mama/papa udah bilang, makanya hrsnya kamu masuk jurusan xx aja". Lalu gw ngerasa ga ada temen yg tepat buat gw ceritain ini.... dan gw terkadang ngerasa lelah sama pikiran gw sendiri, di mana cuma saat tidur doang gw bisa nemu ketenangan. Ckckckc.