460 likes | 756 Views
Bab 2. Jenis Data. Jenis Data. Data – suatu koleksi bit-bit Objek data – atau pembolebubah atau pencam mempunyai 4 komponen berikut: L – lokasi yang menyimpan nilai suatu objek data. Tindakan yang mengumpukkan lokasi kepada suatu objek data dipanggil pengumpulan (allocation) .
E N D
Bab 2 Jenis Data
Jenis Data • Data –suatu koleksi bit-bit • Objek data – atau pembolebubah atau pencam mempunyai 4 komponen berikut: • L – lokasi yang menyimpan nilai suatu objek data. Tindakan yang mengumpukkan lokasi kepada suatu objek data dipanggil pengumpulan (allocation). • Pengumpukan statik – pengumpukan sebelum perlaksanaan • Pengumpukan dinamik – pengumpukan semasa larian • N – Nama yang digunakan untuk merujuk objek data • V – nilai objek data dan diwakilkan dalam bentuk kod pada lokasi yang diumpukkan • T - jenis data, yang mewakilkan bentuk nilai yang boleh disimpan oleh objek data
Klasifikasi Data • Dari pandangan pengguna, jenis data atau maklumat boleh diklasifikasikan kepada: • Jenis data Built-in - yang sedia terkandung dalam definasi bahasa dan boleh digunakan melalui pengisytiharan objek data • Jenis data takrifan pengguna (user-defined) – didefinasikan menggunakan pengisytiharan jenis sebelum boleh digunakan pada pengisytiharan objek data
Jenis Data Built-in • Boleh diklasifikasikan lagi kepada: • Jenis data primitif - nilainya dalam bentuk yang paling asas dan tidak boleh dipermudahkan lagi. - kadangkala juga dipanggil jenis data tidak berstruktur - Contohnya: integer, nyata (real), Boolean, dan aksara • Jenis data komposit – nilainya terdiri dari gabungan beberapa nilai asas - kadangkala juga dipanggil jenis data berstruktur - Contohnya: tatasusunan, rekod, rentetan, timbunan, dll. • Jenis data rekursif – nilainya terdiri dari gabungan beberapa nilai lain yang berjenis sama, contohnya: senarai
Jenis Data Primitif - Integer • Jenis integer (int) mempunyai julat set integer yang boleh diwakilkan pada komputer • Julat ini bergantung kepada pengimplementasiannya pada komputer. • Komputer bersaiz kecil – menggunakan 2 bait untuk menyimpan setiap integer, maka julat integer yang boleh digunakan adalah dari -32,768 kepada 32,767. Kenapa? • Hint: Gunakan 1 bait = 8 bit Bit yang paling kiri digunakan untuk tanda -/+ Notasi “2’s complement”
Jenis Data Primitif – Nyata (real) • Digunakan untuk nombor yang mempunyai titik perpuluhan • Boleh ditulis dalam dua bentuk: • Bahagian integer.bahagian pecahan : contohnya 10.45 • Eksponen : contohnya 2.3E4 yang bersamaan dengan 23,400 • Nombor nyata biasanya diwakilkan sebagai real atau float • Ada bahasa yang menyediakan perwakilan nombor nyata yang mempunyai ketepatan lebih tinggi seperti double dan long double
Jenis Data Primitif – Boolean • Jenis data untuk mewakilkan nilaibenar dan palsu • Juga dipanggil jenis data logikal • Pengoperasi jenis data ini adalah pengoperasi logikal, termasuk DAN(AND), ATAU (OR), dan TIDAK (NOT). • Kebiasaanya, ruang yang diumpukkan untuk menyimpan jenis data boolean adalah 1 bait. • Contoh implementasi dalam Java : boolean flag=true; boolean flag = false • Bahasa C tiada jenis boolean, tetapi menggunakan perwakilan 0 bagi palsu, dan 1 bagi benar.
Jenis Data Primitif – Aksara • Aksara boleh terdiri daripada abjad, digit, dan aksara istimewa • Data aksara disimpan dalam bentuk kod numerik • Ada dua jenis kod numerik yang popular: • ASCII – American Standard Code Information Interchange • Unicode • Dalam kebanyakan bahasa pengaturcaraan misalnya C, setiap aksara disimpan di dalam 1 bait • Pada kebanyakan komputer 1 bait = 8 bit, maka sebanyak 28 = 256 perwakilan aksara boleh digunakan • Java menggunakan kod numeric Unicode yang menggunakan 16 bit untuk setiap perwakilan aksara lebih banyak simbol boleh diwakilkan
Jenis Data Komposit • Terdiri daripada gabungan beberapa jenis data primitif • Boleh diklasifikasikan kepada dua jenis: • Heterogeneous – elemennya terdiri dari jenis data berbeza • Homogeneous – elemennya terdiri dari jenis data yang sama • Contoh jenis heterogeneous: rekod (Pascal) dan struktur (C) • Contoh jenis homogeneous : tatasusunan dan rentetan • Terdapat dua bentuk komposit: • Fixed-size – jenis data yang mana saiznya adalah tetap sepanjang perlaksanaan aturcara, seperti tatasusunan, rentetan, penunjuk, struktur, fungsi dan senarai • Dynamic-size – jenis data yang mana saiznya boleh berubah-ubah sepanjang perlaksanaan aturcara, bergantung kepada keperluan, seperti senarai terpaut, timbunan, dan giliran.
Jenis Data Komposit - Tatasusunan • Suatu koleksi 2 atau lebih sel ingatan yang bersebelahan, yang dipanggil elemen tatasusunan, yang dikaitkan dengan suatu nama simbolik untuk menyimpan suatu set data berjenis sama • Setiap elemen tatasusunan dirujuk menggunakan nama tatasusunan dan indeks atau subskrip seperti berikut: nama_tts[nilai_indeks] elemen • Contoh implementasi: Fortran : REAL class(8) C dan C++ : int class[5]; • Indeks di dalam Fortran bermula dengan 1, bermakna class(1) merujuk elemen yang pertama, manakala indeks di dalam C bermula dengan 0, bermakna class[0] merujuk elemen pertama.
Jenis Data Komposit - Rentetan • Jenis data yang mempunyai nilai suatu jujukan aksara • Disokong oleh kebanyakan bahasa pengaturcaraan moden • Terdapat beberapa pendekatan: • sebagai rentetan yang tiada had panjang - bahasa ML • Sebagai tatasusunan aksara yang membolehkan setiap aksara dalam rentetan dirujuk – C dan C++ • Sebagai senarai aksara, yang membenarkan operasi yang sama seperti di dalam senarai – Miranda dan Prolog • Biasanya, beberapa operasi asas juga disediakan: seperti mencipta rentetan, mengekstrak subrentetan, menyambungkan rentetan, dsb.
Jenis Data Komposit – Terangkaan • Suatu set pemalar integer yang diwakilkan oleh pencam • Contoh : type hari (isnin, selasa, rabu, khamis, jumaat, sabtu, ahad) yang mana: isnin = 1, selasa = 2, rabu = 3 , … dan seterusnya • Di dalam C, nilai integer bermula dengan 0, dan pernyataan yang setara adalah: enum hari {isnin, selasa, rabu … } • Nilai boleh bermula dengan suatu nilai lain jika dinyatakan, contohnya : enum hari {isnin=1, selasa, rabu, … }
Jenis Data Komposit – Penunjuk • Suatu pembolehubah berjenis penunjuk mengandungi alamat lokasi suatu pembolehubah yang lain. • Penunjuk boleh digunakan untuk merujuk kepada nilai suatu pembolehubah secara tidak langsung • Alamat boleh dioperasikan seperti entiti aritmetik yang lain; ia boleh ditambah, ditolak, dibahagi dan didarab. • Manipulasi keatas alamat ini boleh menimbulkan masalah seperti ruang ingatan yang tidak boleh digunakan, menyebabkannya rosak, dan membawa kepada crash • Pembolehubah data berjenis penunjuk perlu diisytiharkan seperti pembolehubah lain
Jenis Data Komposit – Penunjuk • Contoh dalam C: int *pjk; bermaksud bahawa suatu pembolehubah bernama pjk mengandungi alamat lokasi suatu pembolehubah lain yang berjenis integer. • Nilai awal kepada pembolehubah penunjuk boleh diumpukkan menggunakan pernyataan umpukan. • Contohnya, jika pengisytiharan adalah: int nom=3, *pjk; Maka pernyataan umpukan pjk = &nom; akan menyebabkan alamat lokasi bagi pembolehubah nom disimpan sebagai nilai kepada pjk
Jenis Data Komposit – Penunjuk • Suatu data objek penunjuk boleh menunjuk kepada suatu data objek penunjuk yang lain yang menunjuk kepada integer. • Contoh: int **pjkpjk; • Setiap * mewakili setiap paras rujukan • Contoh implementasi dalam C: int nom=10, **pjkpjk; int *pjk = &nom; pjkpjk = &pjk • Penunjuk tidak digunakan dalam Java
Jenis Data Komposit – Struktur • Suatu jenis data terbitan – dibina menggunakan objek-objek data dari jenis yang berlainan • Selalunya digunakan untuk menakrifkan rekod untuk disimpan ke dalam fail. • Contoh implementasi dalam C: struct kursus { int kod; char gred; }; struct - pengenalan kepada definisi kursus – penanda nama kepada struktur • Penanda nama digunakan untuk pengisytiharan pembolehubah berjenis struktur tersebut.
Jenis Data Komposit – Struktur • Contoh pengisytiharan pembolehubah: struct kursus pengaturcaraan; • Pembolehubah pengaturcaraan mempunyai 2 ahli: kod dan gred. • Setiap ahli boleh dicapai dengan menyelitkan titik di antara nama pembolehubah dan nama ahli seperti berikut: kursus.kod • Implementasi dalam Pascal dan Cobol menggunakan perkataan record • Cobol menyediakan kemudahan operasi rekod, seperti menyalin keseluruhan rekod secara terus: MOVE CORRESPONDING INPUT-RECORD TO OUTPUT-RECORD
Jenis Data Komposit – Senarai • Mengandungi suatu susunan objek-objek yang boleh dirujuk sebagai unsur pertama, unsur kedua, dan seterusnya. • Kriteria senarai: • Panjang senarai boleh berubah-ubah. Senari biasanya mengecil dan berkembang di sepanjang perlaksanaan aturcara. Senarai yang tiada komponen (ahli) dipanggil senarai kosong • Senarai boleh berbentuk homogeneous atau hetergeneous • Kemasukan pada senarai boleh samada satu objek, atau suatu senarai lain • Operasi biasa bagi senarai adalah penyelitan, penghapusan, penentuan panjang senarai dan penentuan samada senarai adalah kosong.
Jenis Data Komposit – Senarai • Senarai adalah struktur data yang penting dalam bahasa fungsian, seperti LISP, ML, dan Prolog • Unsur senarai dalam ML dan Prolog ditulis di antara [ dan ], dan dipisahkan oleh , : [1, 2, 3, 4] [“ab”, “cd”, “ef”]; • Unsur senarai dalam Scheme dan LISP ditulis di antara ( dan ): ( x y z ) (x (a b c) () )
Jenis Data Komposit – Senarai Terpaut • Suatu koleksi struktur yang saling merujuk antara satu sama lain dan berbentuk linear. • Unsur-unsur struktur dipanggil nod dan suatu nod dihubungkan dengan nod yang lain oleh pautan • Setiap nod mengandungi satu ahli penunjuk yang menunjuk kepada suatu nod berjenis struktur yang sama • Setiap senarai terpaut boleh dicapai melalui suatu penunjuk yang menunjuk kepada nod pertama • Pautan pada nod terakhir disetkan sebagai NULL • Data disimpan ke dalam senarai terpaut secara dinamik
Jenis Data Komposit – Senarai Terpaut • Contoh implementasi dalam C: struct nod { int kod; char gred; struct nod *nextpjk; }; • Seperti senarai, senarai terpaut mempunyai beberapa operasi asas: • Penciptaan senarai terpaut • Penciptaan nod baru • Penyelitan nod ke dalam senarai terpaut • Penghapusan nod dari senarai • Penyemakan samada senarai terpaut kosong
Jenis Data Komposit – Senarai Terpaut • Ruang ingatan untuk setiap nod dalam senarai terpaut diumpukkan secara dinamik menggunakan fungsi malloc • Contoh: nodbaru = malloc(sizeof(struct nod)); • Setiap kali sebuah nod baru ingin dicipta, ruang ingatan perlu diumpukkan • Begitu juga, setiap kali suatu nod dihapuskan, runga ingatan yang telah diumpukkan kepadanya perlu dibebaskan, menggunakan fungsi free • Contoh : free(nodbaru);
Jenis Data Komposit – Timbunan • Struktur data berbentuk linear yang hanya boleh dicapai dari atas (LIFO) • Mempunyai beberapa operasi asas: • Clear() – mengosongkan timbunan • IsEmpty() – menyemak samada timbunan kosong • IsFull() – menyemak samada timbunan penuh • Push(unsur) – memasukkan unsur ke atas timbunan • Pop() mengeluarkan unsur teratas timbunan
Pengikatan Jenis (Type Binding) • Pengikatan – suatu hubungan, spt di antara atribut dengan entiti atau di antara operasi dan simbol • Masa pengikatan – masa berlakunya proses pengikatan • Contoh : suatu pengisytiharan akan menghasilkan suatu hubungan atau pengikatan di antara pencam yang diisytiharkan dengan entity (objek data) yang diwakilkannya. int A; • Diterjemahkan sebagai : Suatu lokasi yang boleh memegang suatu nombor integer akan dicipta dan dirujuk menggunakan nama A Pencam A diikat kepada lokasi tertentu ( yang hanya diketahui oleh pengkompil) dan jenis Integer
Pengikatan Jenis (Type Binding) • Setiap objek data mempunyai pengikatan berikut: • Pengikatan nama – hubungan di antara objek data dengan nama pencam yang telah diisytiharkan • Pengikatan jenis – hubungan di antara objek data dengan jenis yang telah diisytiharkan • Pengikatan nilai – hubungan di antara objek data dengan nilai yang diumpukkan kepadanya • Pengikatan lokasi – hubungan di antara objek data dengan lokasi yang memegang nilai objek data tersebut • Terdapat 3 jenis pengikatan, yang berdasarkan kepada masa pengikatan: • Pengikatan masa-kompil • Pengikatan masa-muat • Pengikatan masa -larian
Pengikatan masa-kompil • Juga dikenali sebagai pengikatan statik, atau pengikatan awal • Berlaku apabila aturcara diterjemahkan kepada bahasa mesin semasa kompilasi • Pengikatan nama dan jenis adalah beberapa contoh pengikatan masa-kompil
Pengikatan masa-muat • Berlaku apabila kod mesin yang telah diterjemahkan oleh pengkompil disimpan ke dalam lokasi-okasi ingatan • Pengikatan lokasi adalah tergolong dalam jenis ini • Bergantung kepada bahasa, proses pengikatan ini boleh berlaku secara statik, atau dinamik
Pengikatan masa-larian • Juga dikenali sebagai pengikatan dinamik atau pengikatan lewat. • Ia berlaku semasa aturcara sedang dilarikan. • Pengikatan nilai adalah tergolong dalam jenis ini
Pengikatan Jenis (Type Binding) • Secara umumnya, lebih lambat berlakunya pengikatan itu, lebih fleksibel suatu bahasa itu. • Manakala, lebih awal pengikatan berlaku, lebih efisen suatu bahasa itu. • Setiap bahasa pengaturcaraan adalah berbeza dari segi atribut yang mana diikat secara statik dan atribut yang mana diikat secara dinamik. • Bahasa fungsian misalnya, mengimplimenkan lebih banyak pengikatan dinamik berbanding bahasa imperatif • Contoh pengikatan statik: int x = 2; Nilai 2 dan jenis integer diikat secara static kepada objek data bernama x
Pengikatan Jenis (Type Binding) • Contoh pengikatan dinamik: main() { int x; x = 10; } Pernyataan umpukan x = 10 menyebabkan nilai 10 diikat secara dinamik kepada objek data bernama x.
Penyemakan Jenis (Type Checking) • Suatu proses di mana penterjemah menyemak atau menentukan samada semua pengumpukan pemalar, pembolehubah, fungsian dan sebagainya di dalam aturcara adalah sah dari segi jenisnya. • Contoh: Z = X + 5 * Y; Y mestilah suatu jenis yang membenarkan pendaraban dengan suatu integer, (5 * Y) • Proses penyemakan jenis melibatkan suatu pengujian kesamaan yang mengandungi petua-petua tertentu untuk menentukan samada dua jenis yang diuji adalah sama.
Penyemakan Jenis (Type Checking) • Ujian ini digunakan untuk mengesan dan mengelak ralat masa larian. • Jika ujian ini tidak dilakukan, adalah menjadi tanggungjawab pengaturcara sendiri untuk melakukan penyemakan jenis • Penyemakan jenis terdiri dari dua kategori, bergantung kepada masa berlakunya penyemakan tersebut: • Penyemakan masa-kompil • Penyemakan masa-larian
Penyemakan Masa-kompil • Jenis disemak semasa kompilasi • Ianya dilakukan oleh pengkompil yang menyemak berdasarkan kepada pernyataan pengisytiharan setiap objek data. • Ia juga boleh dianggap sebagai penyemakan jenis statik, yang mana maklumat mengenai jenis suatu objek data ditentukan dan disemak semasa penterjemahan • Penyemakan jenis ini mudah diimplimenkan dan tidak memerlukan ruang ingatan dan masa yang banyak, tetapi menggunakan petua yang kompleks dan terhad
Penyemakan Masa-larian • Jenis disemak semasa aturcara dilarikan, iaitu setiap kali suatu objek data dalam aturcara dicapai. • Ia juga boleh dianggap sebagai penyemakan jenis dinamik. • Kaedah ini memerlukan masa dan runag ingatan yang tinggi kerana pengujian perlu dilakukan setiap kali suatu objek data dirujuk.
Penyemakan Jenis (Type Checking) • Suatu bahasa pengaturcaraan dikatakan ‘sangat berjenis’ (strongly typed) jika kesemua pengujian jenis yang boleh dilaksana dilakukan semasa kompilasi manaka selebihnya disemak semasa aturcara dilarikan. • Dalam kes ini, kesemua objek data mesti mempunyai jenis yang ditakrifkan dengan baik, beserta dengan suatu set petua yang lengkap untuk membolehkan penyemakan jenis dilakukan semasa larian. • Secara amnya, penyemakan jenis boleh menjamin keselamatan data • Ada adalah satu contoh bahasa pengaturcaraan ayng ‘sangat berjenis’, manakala C adalah satu contoh bahasa pengaturcaraan yang ‘tidak begitu berjenis’.
Penyemakan Jenis (Type Checking) • Pascal juga boleh dikategorikan sebagai suatu bahasa yang ‘sangat berjenis’ • Salah satu proses yang penting dalam penyemakan jenis adalan inferens jenis. • Dalam proses ini, jenis bagi suatu ungkapan ditentukan atau disimpulkan (inferred) berdasarkan kepada jenis subungkapannya. • Contoh: Jenis bagi ungkapan (A + B) adalah sama dengan jenis A, dan jenis B, sekiranya kedua-duanya sama.
Penukaran Jenis (Type Conversion) • Dalam kes ini, kedua-dua jenis data boleh digabungkan untuk menghasilkan ourput yang masih lagi betul. Inilah yang dikatakan jenis yang serasi (compatible) • Dalam penyataan di atas,selepas suatu nilai nyata diperolehi daripada B+3.15, nilai ini dipangkas untuk membentuk nilai integer yang akan diumpukkan kepada A. • Dalam suatu bahasa yang sangat berjenis seperti Modula-2, nombor-nombor nyata dan intger tidak boleh digabungkan dalam satu ungkapan aritmetik yang sama. • Jika di dalam Modula-2, pernyataan di atas akan menghasilkan ralat jenis. • Untuk itu, ia perlu ditulis sebegini: A = TRUNC (FLOAT(B) + 3.15);
Penukaran Jenis (Type Conversion) • Penukaran jenis berlaku apabila jenis bagi dua objek data yang dinilai adalah berbeza. • Contoh : A = B + 3.15; • Dalam pernyataan umpukan di atas, ungkapan di sebelah kanan iaiatu B + 3.15 perlu dinilai dan nilai yang diperolehi perlu diumpukkan ke sebelah kiri iaitu kepada A. • Andaikan A berjenis nyata, manakala B berjenis integer. • Suatu nombor integer biasanya boleh diwakilkan dalam bentuk nombor nyata. Oleh itu, jika nilai bagi B diungkapkan dalam bentuk nyata, hasil penilaian yang betul boleh diumpukkan kepada A.
Penukaran Jenis Implisit • Sesetengah bahasa pengaturcaraan melakukan penukaran jenis secara implisit. • Contoh dalam Pascal : x := y • Ungkapan adalah sah sekiranya y berjenis integer, dan x berjenis nyata • Nilai y akan ditukar ke bentuk nyata dan diumpukkan kepada x
Penukaran Jenis Implisit • Contoh dalam Java : Byte A, B, C; A = B + C; • Jenis byte, short dan char dalam Java adalah lebih kecil daripada int, maka ketiga-tiga jenis ini boleh ditukarkan kepada int. • B dan C ditukarkan kepada int, dan jumlah (B + C) kemudiannya ditukarkan semula kepada byte untuk disimpan di dalam A
Penukaran Jenis Implisit • Contoh dalam C: x = y + 2.5; • x dan y berjenis int. • y ditukarkan ke bentuk nyata, hasil ( y + 2.5) kemudiannya dipangkas untuk memberntuk int yang seterusnya disimpan di dalam x.
Penukaran Jenis Implisit • Penukaran jenis secara implicit ini juga dirujuk sebagai (coercion) ‘pemaksaan’. • Satu kelebihan penukara secara implicit adalah kemudahan kepada pengaturcara yang tidak perlu menulis kod tambahan untuk melakukan penukaran jenis. • Kelemahannya pula, kesilapan mungkin berlaku secara tidak sedar. • Contoh dalam PL/1: 1/3 + 15 akan menghasilkan 5.33333333333333 pada sistem yang mempunyai ketepatan sehingga 15 digit. Ini adalah kerana berlaku limpahan yang disebabkan oleh kejituan yang mesti diutamakan.
Penukaran Jenis Implisit • Contoh dalam C avg = sum / count; • Andaikan avg berjenis nyata, manakala sum dan countberjenis int. • Jika sum bernilai 15, manakala count bernilai 2, hasil (sum / count) yang diumpukkan kepada avg adalah 7.0 dan bukannya 7.5. • Ini adalah kerana hasil pembahagian dipangkas dahulu untuk membentuk integer, keranan suatu integer dibahgai dengan integer menghasilkna integer juga. • Apabila bentuk ini ditukarkan kepada nyata, nilai yang diberikan tidak lagi tepat.
Penukaran Jenis Data Eksplisit • Penukaran yang dilakukan dengan menaggil fungsi yang dikhaskan untuk menukarkan jenis satu objek data kepada satu jenis yang lain. • Contoh dalam Pascal: trunc dan round • Contoh dalam Modula-2 TRUNC dan FLOAT • Bahasa C menggunakan konsep acu, contohnya: int a; float b = 12.5; a = (int) b;
Tugasan 1 • Adalah bahasa C dan Java mempunyai sistem penyemakan yang kuat atau lemah ? • Bagi setiap bahasa C dan Java, berikan contoh-contoh di mana penyemakan dilakukan secara statik dan dinamik.