Senin, 25 Oktober 2010
KONSEP DASAR JARINGAN
Sistem pemasangan jaringan dapat dibedakan menjadi dua macam, yaitu :
1. Jaringan Terpusat
Adalah jaringan yang terdiri dari beberapa node (workstation) yang terhubung dengan sebuah komputer pusat atau disebut Server. Pada jaringan ini sistem kerja workstation tergantung dari komputer pusat. Dan komputer pusat tugasnya melayani permintaan akses dari workstation.
2. Jaringan Peer-to-Peer
Adalah jaringan yang terdiri dari beberapa komputer yang saling berhubungan antara satu dengan lainnya tanpa komputer pusat (server base). Pada masing-masing komputer workstation terdapat media penyimpanan (hard disk) yang berfugsi sebagai server individu.
Pemanfaatan Jaringan Komputer
Pembentukan sebuah jaringan komputer sangan erat dengan manfaat yang dapat diperoleh dengan adanya jaringan tersebut.
1. Bagi pakai (sharing) peralatan (resources)
Dengan adanya jaringan komputer, maka pemakain beberapa peralatan komputer seperti printer, hard disk, disket, scanner, CD-ROM dan lainnya dapat dilakukan bersama-sama saling bergantian tanpa harus memindahkan posisi peralatan yang terpasang tersebut.
2. Bagi pakai software
Hampir dalam setiap organisasi, kemampuan dalam melakukan bagi pakai berkas atau file data diperlukan setiap hari. Beberapa tipe software PC, khususnya program manajemen basis data atau database, didesain disamping agar bisa dipakai oleh satu pemakai, juga dimungkinkan untuk dipakai bersama-sama dengan pemakai lain dalam waktu yang bersamaan. Atau dengan kata lain, untuk mengakses dan meng-update file-file tadi. Paket yang lain, seperti program pengolah data (word processor) dan spreadsheet, kebanyakan didesaian hanya untuk satu pemakai yang dapat meng-update file.
3. Komunikasi
Kominikasi antar pemakai dalam suatu jaringan dapat dilakukan dengan menggunakan e-mail atau tele conference. Sehingga kebutuhan akan komunikasi antar pemakai dapat dipenuhi tanpa harus pindah dari tempat kerjanya. Selain itu pemakai e-mail dapat menekan pemakaian pulsa telepon.
4. Pemrosesan terpusat (terdistribusi)
Didalam suatu jaringan komputer, data dapat diolah secara terpusat atau secara terdistribusi. Pemrosesan secara terpusat dilakukan apabila sebuah data yang dibuat oleh tiap pemakai jaringan dikehendaki untuk disatukan dalam komputer pusat. Sebaliknya, pemrosesan terdistribusi dilakukan apabila suatu pekerjaan pengolahan data dari komputer pusat dapat dikerjakan oleh tiap pemakai berdasarkan spesialisasi bidang kerjanya.
5. Keamanan data
Keamanan data dapat diatur oleh supervisor (administrator) dengan pemberian hak akses, pembatasan waktu akses dan pemberian password untuk melindungi pemakaian komputer pusat.
6. Akses internet bersama-sama
Jika ada salah satu komputer berhubungan ke internet dan komputer tersebut memberikan izin untuk akses ke internet, maka para pengguna jaringan dapat melakukan aktivitas di internet hanya dengan menggunakan satu buah akun di ISP, satu buah modem. Hal ini sangat menghemat dana yang cukup besar.
Komponen Perangkat Keras
Tidak peduli apakah anda sudah memiliki sebuah network atau berniat menginstalasi network baru, anda perlu mengetahui komponen-komponen perangkat keras yang digunakan.
Server
Komputer yang menjalankan sistem operasi jaringan yang berfungsi sebagai server. Server menyediakan file, printer dan pelayanan lain untuk client. Ada dua buah jenis server, yaitu :
* Server dedicated, server yang tidak memiliki fungsi lain. Ia tidak bisa digunakan sebagai workstation. Untuk melihat jenis dari server tersebut dapat diketahui melalui sistem operasi jaringan yang dijalankannya, misalnya Novell Netware.
* Server Non-Dedicated, server yang juga bisa berfungsi sebagai workstation. Contohnya : Microsoft Windows NT Server, Mocrosoft Windows NT Workstation, Microsoft Windows 95/98, Unix, Linux, Mac OS/2.
Dari fungsinya, server dapat digunakan :
* Menyimpan file-file yang digunakan bersama-sama pada hard disk-nya
* Mengatur komunikasi (seperti pesan e-mail) antar workstation
* Mengkoordinasikan pencetakan kepada printer yang dipakai bersama-sama
* Server juga dapat menyimpan CD-ROM yang dapat dipakai oleh para pemakai network
* Bisa menyimpan tape drive atau drive lain yang digunakan untuk menyimpan hard disk server atau hard disk pada workstation
* Dengan perangkat lunak dan keras tambahan, server bisa mengarahkan e-mail dari dan ke internet. Server juga bisa mengirimkan fax ke luar jaringan ke mesin-mesin fax yang ada di luar. Kenyataannya server hampir dapat melakukan semua pekerjaan yang mencakup pengiriman data.
Workstation
Komputer yang terhubung ke server dan dapat mengakses data dari server. Workstation menjalankan beragam sistem operasi dan merupakan bagian dari network yang ada. Pada kenyataannya workstation digunakan oleh pemakai secara langsung.
Network Interface Card (NIC)
NIC atau adapter network adalah sebuah komputer hardware yang mutlak dibutuhkan jika kita menginginkan merakit jaringan komputer menggunakan media penghubung kabel. NIC berfungsi menghubungkan server ke sistem pengkabelan network. Berdasarkan tipe slot pada motherboard dibedakan menjadi dua jenis:
* Tipe slot ISA (slot warna hitam/coklat, lebih panjang)
* Tipe slot PCI (slot warna putih, lebih pendek)
Switch/Hub (Concentrator/Repeater)
Sistem pengkabelan yang paling populer untuk Network Ethernet menggunakan kabel Unshielded Twisted Pair (UTP) atau kabel terpilin yang terbuka dengan konektor yang mirip dengan konektor telepon. Ini disebut dengan 10BaseT. Untuk setiap adapter network pada setiap server atau workstation, salah satu dari kabel-kabel ini berhubungan ke Hub/Switch atau pusat pengkabelan.
Bridge, Router Dan Gateway
Bridge berfungsi menghubungkan dua network dengan mentransfer data diantara network tersebut. Sebagai contoh, bridge bisa menghubungkan segmen kabel dari arsitektur Token Ring dengan arsitektur Ethernet, atau menghubungkan dua segmen Ethernet menjadi satu. Bridge mampu mengurangi lalu lintas dengan hanya mengirimkan data yang benar-benar diniatkan untuk komputer tujuan. Bridge pintar (intelligent bridge) bisa berbuat lebih baik lagi dengan menyaring atau hanya mengirimkan paket-paket tertentu ke tujuan.
Uninterrutible Power Supply (UPS)
Sudah jelas UPS tidak hanya digunakan oleh network. Anda bisa juga menggunakannya pada setiap alat yang membutuhkan aliran listrik alternatif. UPS adalah alat yang sangat penting bagi perusahaan yang menggunakan komputer untuk produktifitasnya dan tidak ingin kehilangan data atau waktu kerja pegawai. Pada setiap keadaan yang bisa dibayangkan, melalui UPS adalah investasi yang menguntungkan untuk setiap workstation, hub, dan server pada network.
Printer Dan Peripheral Lain
Printer adalah salah satu alasan utama kenapa ada network. Karena printer tidak selalu digunakan oleh setiap pemakai, akan lebih ekonomis jika memakai satu printer bersama-sama. Printer bisa dihubungkan langsung pada workstation atau ke server.
Anda juga bisa memasang scanner, CD-ROM eksternal dan peralatan lain yang berguan dan dapat digunakan secara bersama-sama pada network. Sama seperti yang lainnya, hal ini membutuhkan perangkat lunak dan perangkat keras yang tepat.
JARINGAN KOMPUTER
Jaringan komputer adalah sebuah kumpulan komputer, printer dan peralatan lainnya yang terhubung dalam satu kesatuan. Informasi dan data bergerak melalui kabel-kabel atau tanpa kabel sehingga memungkinkan pengguna jaringan komputer dapat saling bertukar dokumen dan data, mencetak pada printer yang sama dan bersama-sama menggunakan hardware/software yang terhubung dengan jaringan. Setiap komputer, printer atau periferal yang terhubung dengan jaringan disebut node. Sebuah jaringan komputer dapat memiliki dua, puluhan, ribuan atau bahkan jutaan node.
Daftar Isi:
SEJARAH JARINGAN KOMPUTER
Konsep jaringan komputer lahir pada tahun 1940-an di Amerika dari sebuah proyek pengembangan komputer MODEL I di laboratorium Bell dan group riset Harvard University yang dipimpin profesor H. Aiken. Pada mulanya proyek tersebut hanyalah ingin memanfaatkan sebuah perangkat komputer yang harus dipakai bersama. Untuk mengerjakan beberapa proses tanpa banyak membuang waktu kosong dibuatlah proses beruntun (Batch Processing), sehingga beberapa program bisa dijalankan dalam sebuah komputer dengan dengan kaidah antrian.
Ditahun 1950-an ketika jenis komputer mulai membesar sampai terciptanya super komputer, maka sebuah komputer mesti melayani beberapa terminal (lihat Gambar 1) Untuk itu ditemukan konsep distribusi proses berdasarkan waktu yang dikenal dengan nama TSS (Time Sharing System), maka untuk pertama kali bentuk jaringan (network) komputer diaplikasikan. Pada sistem TSS beberapa terminal terhubung secara seri ke sebuah host komputer. Dalam proses TSS mulai nampak perpaduan teknologi komputer dan teknologi telekomunikasi yang pada awalnya berkembang sendiri-sendiri.
Gambar 1 Jaringan komputer model TSS
Memasuki tahun 1970-an, setelah beban pekerjaan bertambah banyak dan harga perangkat komputer besar mulai terasa sangat mahal, maka mulailah digunakan konsep proses distribusi (Distributed Processing). Seperti pada Gambar 2, dalam proses ini beberapa host komputer mengerjakan sebuah pekerjaan besar secara paralel untuk melayani beberapa terminal yang tersambung secara seri disetiap host komputer. Dala proses distribusi sudah mutlak diperlukan perpaduan yang mendalam antara teknologi komputer dan telekomunikasi, karena selain proses yang harus didistribusikan, semua host komputer wajib melayani terminal-terminalnya dalam satu perintah dari komputer pusat.
Gambar 2 Jaringan komputer model distributed processing
Selanjutnya ketika harga-harga komputer kecil sudah mulai menurun dan konsep proses distribusi sudah matang, maka penggunaan komputer dan jaringannya sudah mulai beragam dari mulai menangani proses bersama maupun komunikasi antar komputer (Peer to Peer System) saja tanpa melalui komputer pusat. Untuk itu mulailah berkembang teknologi jaringan lokal yang dikenal dengan sebutan LAN. Demikian pula ketika Internet mulai diperkenalkan, maka sebagian besar LAN yang berdiri sendiri mulai berhubungan dan terbentuklah jaringan raksasa WAN.
JENIS JARINGAN KOMPUTER
Secara umum jaringan komputer dibagi atas lima jenis, yaitu;
1. Local Area Network (LAN)
Local Area Network (LAN), merupakan jaringan milik pribadi di dalam sebuah gedung atau kampus yang berukuran sampai beberapa kilometer. LAN seringkali digunakan untuk menghubungkan komputer-komputer pribadi dan workstation dalam kantor suatu perusahaan atau pabrik-pabrik untuk memakai bersama sumberdaya (misalnya printer) dan saling bertukar informasi.
2. Metropolitan Area Network (MAN)
Metropolitan Area Network (MAN), pada dasarnya merupakan versi LAN yang berukuran lebih besar dan biasanya menggunakan teknologi yang sama dengan LAN. MAN dapat mencakup kantor-kantor perusahaan yang letaknya berdekatan atau juga sebuah kota dan dapat dimanfaatkan untuk keperluan pribadi (swasta) atau umum. MAN mampu menunjang data dan suara, bahkan dapat berhubungan dengan jaringan televisi kabel.
3. Wide Area Network (WAN)
Wide Area Network (WAN), jangkauannya mencakup daerah geografis yang luas, seringkali mencakup sebuah negara bahkan benua. WAN terdiri dari kumpulan mesin-mesin yang bertujuan untuk menjalankan program-program (aplikasi) pemakai.
4. Internet
Sebenarnya terdapat banyak jaringan didunia ini, seringkali menggunakan perangkat keras dan perangkat lunak yang berbeda-beda. Orang yang terhubung ke jaringan sering berharap untuk bisa berkomunikasi dengan orang lain yang terhubung ke jaringan lainnya. Keinginan seperti ini memerlukan hubungan antar jaringan yang seringkali tidak kampatibel dan berbeda. Biasanya untuk melakukan hal ini diperlukan sebuah mesin yang disebut gateway guna melakukan hubungan dan melaksanakan terjemahan yang diperlukan, baik perangkat keras maupun perangkat lunaknya. Kumpulan jaringan yang terinterkoneksi inilah yang disebut dengan internet.
5. Jaringan Tanpa Kabel
Jaringan tanpa kabel merupakan suatu solusi terhadap komunikasi yang tidak bisa dilakukan dengan jaringan yang menggunakan kabel. Misalnya orang yang ingin mendapat informasi atau melakukan komunikasi walaupun sedang berada diatas mobil atau pesawat terbang, maka mutlak jaringan tanpa kabel diperlukan karena koneksi kabel tidaklah mungkin dibuat di dalam mobil atau pesawat. Saat ini jaringan tanpa kabel sudah marak digunakan dengan memanfaatkan jasa satelit dan mampu memberikan kecepatan akses yang lebih cepat dibandingkan dengan jaringan yang menggunakan kabel.
MODEL REFERNSI OSI DAN STANDARISASI
Untuk menyelenggarakan komunikasi berbagai macam vendor komputer diperlukan sebuah aturan baku yang standar dan disetejui berbagai fihak. Seperti halnya dua orang yang berlainan bangsa, maka untuk berkomunikasi memerlukan penerjemah/interpreter atau satu bahasa yang dimengerti kedua belah fihak. Dalam dunia komputer dan telekomunikasi interpreter identik dengan protokol. Untuk itu maka badan dunia yang menangani masalah standarisasi ISO (International Standardization Organization) membuat aturan baku yang dikenal dengan nama model referensi OSI (Open System Interconnection). Dengan demikian diharapkan semua vendor perangkat telekomunikasi haruslah berpedoman dengan model referensi ini dalam mengembangkan protokolnya.
Model referensi OSI terdiri dari 7 lapisan, mulai dari lapisan fisik sampai dengan aplikasi. Model referensi ini tidak hanya berguna untuk produk-produk LAN saja, tetapi dalam membangung jaringan Internet sekalipun sangat diperlukan. Hubungan antara model referensi OSI dengan protokol Internet bisa dilihat dalam Tabel 1.
Tabel 1. Hubungan referensi model OSI dengan protokol Internet
MODEL OSI TCP/IP PROTOKOL TCP/IP
NO. LAPISAN NAMA PROTOKOL KEGUNAAN
7 Aplikasi Aplikasi DHCP (Dynamic Host Configuration Protocol) Protokol untuk distribusi IP pada jaringan dengan jumlah IP yang terbatas
DNS (Domain Name Server) Data base nama domain mesin dan nomer IP
FTP (File Transfer Protocol) Protokol untuk transfer file
HTTP (HyperText Transfer Protocol) Protokol untuk transfer file HTML dan Web
MIME (Multipurpose Internet Mail Extention) Protokol untuk mengirim file binary dalam bentuk teks
NNTP (Networ News Transfer Protocol) Protokol untuk menerima dan mengirim newsgroup
POP (Post Office Protocol) Protokol untuk mengambil mail dari server
SMB (Server Message Block) Protokol untuk transfer berbagai server file DOS dan Windows
6 Presentasi SMTP (Simple Mail Transfer Protocol) Protokol untuk pertukaran mail
SNMP (Simple Network Management Protocol) Protokol untuk manejemen jaringan
Telnet Protokol untuk akses dari jarak jauh
TFTP (Trivial FTP) Protokol untuk transfer file
5 Sessi NETBIOS (Network Basic Input Output System) BIOS jaringan standar
RPC (Remote Procedure Call) Prosedur pemanggilan jarak jauh
SOCKET Input Output untuk network jenis BSD-UNIX
4 Transport Transport TCP (Transmission Control Protocol) Protokol pertukaran data berorientasi (connection oriented)
UDP (User Datagram Protocol) Protokol pertukaran data non-orientasi (connectionless)
3 Network Internet IP (Internet Protocol) Protokol untuk menetapkan routing
RIP (Routing Information Protocol) Protokol untuk memilih routing
ARP (Address Resolution Protocol) Protokol untuk mendapatkan informasi hardware dari nomer IP
RARP (Reverse ARP) Protokol untuk mendapatkan informasi nomer IP dari hardware
2 Datalink LLC Network Interface PPP (Point to Point Protocol) Protokol untuk point ke point
SLIP (Serial Line Internet Protocol) Protokol dengan menggunakan sambungan serial
MAC Ethernet, FDDI, ISDN, ATM
1 Fisik
Standarisasi masalah jaringan tidak hanya dilakukan oleh ISO saja, tetapi juga diselenggarakan oleh badan dunia lainnya seperti ITU (International Telecommunication Union), ANSI (American National Standard Institute), NCITS (National Committee for Information Technology Standardization), bahkan juga oleh lembaga asosiasi profesi IEEE (Institute of Electrical and Electronics Engineers) dan ATM-Forum di Amerika. Pada prakteknya bahkan vendor-vendor produk LAN bahkan memakai standar yang dihasilkan IEEE. Kita bisa lihat misalnya badan pekerja yang dibentuk oleh IEEE yang banyak membuat standarisasi peralatan telekomunikasi seperti yang tertera pada Tabel 2.
Tabel 2. Badan pekerja di IEEE
WORKING GROUP BENTUK KEGIATAN
IEEE802.1 Standarisasi interface lapisan atas HILI (High Level Interface) dan Data Link termasuk
MAC (Medium Access Control) dan LLC (Logical Link Control)
IEEE802.2 Standarisasi lapisan LLC
IEEE802.3 Standarisasi lapisan MAC untuk CSMA/CD (10Base5, 10Base2, 10BaseT, dll.)
IEEE802.4 Standarisasi lapisan MAC untuk Token Bus
IEEE802.5 Standarisasi lapisan MAC untuk Token Ring
IEEE802.6 Standarisasi lapisan MAC untuk MAN-DQDB (Metropolitan Area Network-Distributed
Queue Dual Bus.)
IEEE802.7 Grup pendukung BTAG (Broadband Technical Advisory Group) pada LAN
IEEE802.8 Grup pendukung FOTAG (Fiber Optic Technical Advisory Group.)
IEEE802.9 Standarisasi ISDN (Integrated Services Digital Network) dan IS (Integrated Services ) LAN
IEEE802.10 Standarisasi masalah pengamanan jaringan (LAN Security.)
IEEE802.11 Standarisasi masalah wireless LAN dan CSMA/CD bersama IEEE802.3
IEEE802.12 Standarisasi masalah 100VG-AnyLAN
IEEE802.14 Standarisasi masalah protocol CATV
TOPOLOGI JARINGAN KOMPUTER
Topologi adalah suatu cara menghubungkan komputer yang satu dengan komputer lainnya sehingga membentuk jaringan. Cara yang saat ini banyak digunakan adalah bus, token-ring, star dan peer-to-peer network. Masing-masing topologi ini mempunyai ciri khas, dengan kelebihan dan kekurangannya sendiri.
1. Topologi BUS
Topologi bus terlihat pada skema di atas. Terdapat keuntungan dan kerugian dari tipe ini yaitu:
Keuntungan: Kerugian:
- Hemat kabel - Deteksi dan isolasi kesalahan sangat kecil
- Layout kabel sederhana - Kepadatan lalu lintas
- Mudah dikembangkan - Bila salah satu client rusak, maka jaringan tidak bisa berfungsi.
- Diperlukan repeater untuk jarak jauh
2. Topologi TokenRING
Topologi TokenRING terlihat pada skema di atas. Metode token-ring (sering disebut ring saja) adalah cara menghubungkan komputer sehingga berbentuk ring (lingkaran). Setiap simpul mempunyai tingkatan yang sama. Jaringan akan disebut sebagai loop, data dikirimkan kesetiap simpul dan setiap
informasi yang diterima simpul diperiksa alamatnya apakah data itu untuknya atau bukan. Terdapat keuntungan dan kerugian dari tipe ini yaitu:
Keuntungan: Kerugian:
- Hemat kabel - Peka kesalahan
- Pengembangan jaringan lebih kaku
3. Topologi STAR
Merupakan kontrol terpusat, semua link harus melewati pusat yang menyalurkan data tersebut kesemua simpul atau client yang dipilihnya. Simpul pusat dinamakan stasium primer atau server dan lainnya dinamakan stasiun sekunder atau client server. Setelah hubungan jaringan dimulai oleh server maka setiap client server sewaktu-waktu dapat menggunakan hubungan jaringan tersebut tanpa menunggu perintah dari server. Terdapat keuntungan dan kerugian dari tipe ini yaitu:
Keuntungan:
- Paling fleksibel
- Pemasangan/perubahan stasiun sangat mudah dan tidak mengganggu bagian jaringan lain
- Kontrol terpusat
- Kemudahan deteksi dan isolasi kesalahan/kerusakan
- Kemudahaan pengelolaan jaringan
Kerugian:
- Boros kabel
- Perlu penanganan khusus
- Kontrol terpusat (HUB) jadi elemen kritis
4. Topologi Peer-to-peer Network
Peer artinya rekan sekerja. Peer-to-peer network adalah jaringan komputer yang terdiri dari beberapa komputer (biasanya tidak lebih dari 10 komputer dengan 1-2 printer). Dalam sistem jaringan ini yang diutamakan adalah penggunaan program, data dan printer secara bersama-sama. Pemakai komputer bernama Dona dapat memakai program yang dipasang di komputer Dino, dan mereka berdua dapat mencetak ke printer yang sama pada saat yang bersamaan.
Sistem jaringan ini juga dapat dipakai di rumah. Pemakai komputer yang memiliki komputer ‘kuno’, misalnya AT, dan ingin memberli komputer baru, katakanlah Pentium II, tidak perlu membuang komputer lamanya. Ia cukup memasang netword card di kedua komputernya kemudian dihubungkan dengan kabel yang khusus digunakan untuk sistem jaringan. Dibandingkan dengan ketiga cara diatas, sistem jaringan ini lebih sederhana sehingga lebih mudah dipelajari dan dipakai.
ETHERNET
Ethernet adalah sistem jaringan yang dibuat dan dipatenkan perusahaan Xerox. Ethernet adalah implementasi metoda CSMA/CD (Carrier Sense Multiple Access with Collision Detection) yang dikembangkan tahun 1960 pada proyek wireless ALOHA di Hawaii University diatas kabel coaxial. Standarisasi sistem ethernet dilakukan sejak tahun 1978 oleh IEEE. (lihat Tabel 2.) Kecepatan transmisi data di ethernet sampai saat ini adalah 10 sampai 100 Mbps. Saat in yang umum ada dipasaran adalah ethernet berkecepatan 10 Mbps yang biasa disebut seri 10Base. Ada bermacam-macam jenis 10Base diantaranya adalah: 10Base5, 10Base2, 10BaseT, dan 10BaseF yang akan diterangkan lebih lanjut kemudian.
Pada metoda CSMA/CD, sebuah host komputer yang akan mengirim data ke jaringan pertama-tama memastikan bahwa jaringan sedang tidak dipakai untuk transfer dari dan oleh host komputer lainnya. Jika pada tahap pengecekan ditemukan transmisi data lain dan terjadi tabrakan (collision), maka host komputer tersebut diharuskan mengulang permohonan (request) pengiriman pada selang waktu berikutnya yang dilakukan secara acak (random). Dengan demikian maka jaringan efektif bisa digunakan secara bergantian.
Untuk menentukan pada posisi mana sebuah host komputer berada, maka tiap-tiap perangkat ethernet diberikan alamat (address) sepanjang 48 bit yang unik (hanya satu di dunia). Informasi alamat disimpan dalam chip yang biasanya nampak pada saat komputer di start dalam urutan angka berbasis 16, seperti pada Gambar 3.
Gambar 3. Contoh ethernet address.
48 bit angka agar mudah dimengerti dikelompokkan masing-masing 8 bit untuk menyetakan bilangan berbasis 16 seperti contoh di atas (00 40 05 61 20 e6), 3 angka didepan adalah kode perusahaan pembuat chip tersebut. Chip diatas dibuat oleh ANI Communications Inc. Contoh vendor terkenal bisa dilihat di Tabel 3, dan informasi lebih lengkap lainnya dapat diperoleh di http://standards.ieee.org/regauth/oui/index.html
Tabel 3. Daftar vendor terkenal chip ethernet
NOMOR KODE NAMA VENDOR
00:00:0C Sisco System
00:00:1B Novell
00:00:AA Xerox
00:00:4C NEC
00:00:74 Ricoh
08:08:08 3COM
08:00:07 Apple Computer
08:00:09 Hewlett Packard
08:00:20 Sun Microsystems
08:00:2B DEC
08:00:5A IBM
Dengan berdasarkan address ehternet, maka setiap protokol komunikasi (TCP/IP, IPX, AppleTalk, dll.) berusaha memanfaatkan untuk informasi masing-masing host komputer dijaringan.
A. 10Base5
Sistem 10Base5 menggunakan kabel coaxial berdiameter 0,5 inch (10 mm) sebagai media penghubung berbentuk bus seperti pad Gambar 4. Biasanya kabelnya berwarna kuning dan pada kedua ujung kebelnya diberi konsentrator sehingga mempunyai resistansi sebesar 50 ohm. Jika menggunakan 10Base5, satu segmen jaringan bisa sepanjang maksimal 500 m, bahkan jika dipasang penghubung (repeater) sebuah jaringan bisa mencapai panjang maksimum 2,5 km.
Seperti pada Gambar 5, antara NIC (Network Interface Card) yang ada di komputer (DTE, Data Terminal Equipment) dengan media transmisi bus (kabel coaxial)-nya diperlukan sebuah transceiver (MAU, Medium Attachment Unit). Antar MAU dibuat jarak minimal 2,5 m, dan setiap segment hanya mampu menampung sebanyak 100 unit. Konektor yang dipakai adalah konektor 15 pin.
Gambar 4. Jaringan dengan media 10Base5.
Gambar 5. Struktur 10Base5.
B. 10Base2
Seperti pada jaringan 10Base5, 10Base2 mempunyai struktur jaringan berbentuk bus. (Gambar 6). Hanya saja kabel yang digunakan lebih kecil, berdiameter 5 mm dengan jenis twisted pair. Tidak diperlukan MAU kerena MAU telah ada didalam NIC-nya sehingga bisa menjadi lebih ekonomis. Karenanya jaringan ini dikenal juga dengan sebutan CheaperNet. Dibandingkan dengan jaringan 10Base5, panjang maksimal sebuah segmennya menjadi lebih pendek, sekitar 185 m, dan bisa disambbung sampai 5 segmen menjadi sekitar 925 m. Sebuah segmen hanya mampu menampung tidak lebih dari 30 unit komputer saja. Pada jaringan ini pun diperlukan konsentrator yang membuat ujung-ujung media transmisi busnya menjadi beresistansi 50 ohm. Untuk jenis konektor dipakai jenis BNC.
Gambar 6. Jaringan dengan media 10Base5.
Gambar 7. Struktur 10Base2.
C. 10BaseT
Berbeda dengan 2 jenis jaringan diatas, 10BaseT berstruktur bintang (star) seperti terlihat di Gambar 8. Tidak diperlukan MAU kerena sudah termasuk didalam NIC-nya. Sebagai pengganti konsentrator dan repeater diperlukan hub karena jaringan berbentuk star. Panjang sebuah segmen jaringan maksimal 100 m, dan setiap hub bisa dihubungkan untuk memperpanjang jaringan sampai 4 unit sehingga maksimal komputer tersambung bisa mencapai 1024 unit.
Gambar 8. Jaringan dengan media 10BaseT.
Gambar 9. Struktur 10BaseT.
Menggunakan konektor modular jack RJ-45 dan kabel jenis UTP (Unshielded Twisted Pair) seperti kabel telepon di rumah-rumah. Saat ini kabel UTP yang banyak digunakan adalah jenis kategori 5 karena bisa mencapai kecepatan transmisi 100 Mbps. Masing-masing jenis kabel UTP dan kegunaanya bisa dilihat di Table 4.
Tabel 4. Jenis kabel UTP dan aplikasinya.
KATEGORI APLIKASI
Category 1 Dipakai untuk komunikasi suara (voice), dan digunakan untuk kabel telepon di rumah-rumah
Category 2 Terdiri dari 4 pasang kabel twisted pair dan bisa digunakan untuk komunikasi data sampai
kecepatan 4 Mbps
Category 3 Bisa digunakan untuk transmisi data dengan kecepatan sampai 10 Mbps dan digunakan
untuk Ethernet dan TokenRing
Category 4 Sama dengan category 3 tetapi dengan kecepatan transmisi sampai 16 Mbps
Category 5 Bisa digunakan pada kecepatan transmisi sampai 100 Mbps, biasanya digunakan untuk
FastEthernet (100Base) atau network ATM
D. 10BaseF
Bentuk jaringan 10BaseF sama dengan 10BaseT yakni berbentuk star. Karena menggunakan serat optik (fiber optic) untuk media transmisinya, maka panjang jarak antara NIC dan konsentratornya menjadi lebih panjang sampai 20 kali (2000 m). Demikian pula dengan panjang total jaringannya. Pada 10BaseF, untuk transmisi output (TX) dan input (RX) menggunakan kabel/media yang berbeda.
Gambar 10. Struktur 10BaseF.
Gambar 11. Foto NIC jenis 10Base5, 10Base2, dan 10BaseT.
E. Fast Ethernet (100BaseT series)
Selai jenis NIC yang telah diterangkan di atas, jenis ethernet chip lainnya adalah seri 100Base. Seri 100Base mempunyai beragam jenis berdasarkan metode akses datanya diantaranya adalah: 100Base-T4, 100Base-TX, dan 100Base-FX. Kecepatan transmisi seri 100Base bisa melebihi kecepatan chip pendahulunya (seri 10Base) antara 2-20 kali (20-200 Mbps). Ini dibuat untuk menyaingi jenis LAN berkecepatan tinggi lainnya seperti: FDDI, 100VG-AnyLAN dan lain sebagainya.
Rabu, 26 Mei 2010
Pointer adalah suatu variabel penunjuk yang menunjuk pada suatu alamat memori komputer tertentu. Pointer merupakan variabel level rendah yang dapat digunakan untuk menunjuk nilai integer, character, float, double, atau single, dan bahkan tipe-tipe data lain yang didukung oleh bahasa C. Variabel biasa, sifatnya statis dan sudah pasti, sedangkan pada pointer sifatnya dinamis dan dapat lebih fleksibel. Variabel pointer yang tidak menunjuk pada nilai apapun berarti memiliki nilai NULL, dan disebut sebagai dangling pointer karena nilainya tidak diinisialisasi dan tidak dapat diprediksi.
Pendeklarasian variabel pointer menggunakan tanda * sebelum nama variabelnya, sedangkan untuk menampilkan nilai yang ditunjuk oleh suatu variabel pointer, juga digunakan operator * (tanda asterisk). Jika diinginkan untuk menampilkan alamat tempat penyimpanan nilai yang ditunjuk oleh suatu variabel pointer, digunakan operator & (tanda ampersand).
Pada suatu tipe data array, variabel pointer hanya perlu menunjuk pada nama variabel arraynya saja tanpa perlu menggunakan tanda ampersand, atau menunjuk pada nama variabel array pada indeks yang ke nol nya. Untuk lebih jelasnya, silahkan lihat contoh berikut:
Pendeklarasian variabel biasa dan pointer:
//variabel biasa
int nilai1 = 4;
float nilai2 = 3.5;
char nama[10] = “anton”; //array of char (string)
//variabel pointer
int *nilai_p1; //dangling pointer
int *nilai_p2 = &nilai1; //menunjuk ke tipe data int
char *nilai_p3 = nama; //menunjuk ke tipe data array of char
char *nilai_p4 = &nama[0];
Ilustrasi Pointer:
Contoh program untuk dicoba:
#include
#include
int main(){
int nilai1 = 4;
int nilai2 = 5;
float nilai3 = 3.5;
char nama[11] = "abcdefghij";
int *nilai_p1 = &nilai1;
int *nilai_p2 = &nilai2;
char *nilai_p4 = nama;
float *nilai_p3= &nilai3;
printf("nilai 1=%d, alamat1=%p, ukuran %d\n",*nilai_p1,&nilai_p1, sizeof(nilai1));
printf("nilai 2 = %d, alamat2 = %p, ukuran %d\n",*nilai_p2,&nilai_p2,sizeof(nilai2));
printf("nilai 3 = %f, alamat3 = %p, ukuran %d\n",*nilai_p3,&nilai_p3,sizeof(nilai3));
printf("nilai 4 = %s, alamat4 = %p, ukuran %d\n",nama,&nilai_p4,sizeof(nama));
getch();
return 0;
}
Operasi pointer.
1.
Operasi Pemberian nilai
Contoh 1:
#include
#include
int main(){
float nilai,*p1,*p2;
nilai = 14.54;
printf("nilai = %2.2f, alamatnya %p\n",nilai,&nilai);
p1 = &nilai;
printf("nilai p1 = %2.2f, p1 menunjuk alamat %p\n",*p1,p1);
//pada awalnya p2 masih dangling pointer
printf("mula-mula nilai p2 = %2.2f, p2 menunjuk alamat %p\n",*p2,p2);
p2 = p1; //operasi pemberian nilai, berarti alamat x2 sama dengan x1
printf("sekarang nilai p2 = %2.2f, p2 menunjuk alamat %p\n",*p2,p2);
getch();
}
Contoh 2:
#include
#include
int main(){
int *p,a=25,b;
//p masih dangling
printf("nilai a = %d di alamat a = %p,\n",a,&a);
printf("nilai p di alamat = %p\n",p);
p = &a;
printf("nilai p = %d di alamat %p\n",*p,p);
//b diisi dengan nilai yang berasal dari nilai
//variabel a yang ditunjuk oleh pointer p
b = *p;
printf("nilai b = %d di alamat %p\n",b,&b);
getch();
}
Contoh 3:
#include
#include
int main(){
int a=25,b=12,t;
int *p,*q;
p = &a;
q = &b;
printf("nilai yang ditunjuk p = %d di alamat %p\n",*p,p);
printf("nilai yang ditunjuk q = %d di alamat %p\n",*q,q);
//Contoh kasus, penukaran nilai 2 variabel dengan pointer
t = *p;
*p = *q;
*q = t;
printf("nilai yang ditunjuk p sekarang = %d di alamat %p\n",*p,p);
printf("nilai yang ditunjuk q sekarang = %d di alamat %p\n",*q,q);
getch();
}
Contoh 4:
#include
#include
int main(){
int a,*p;
p=&a;
*p=25;
printf("nilai a = %d",a);
}
2.
Operasi Aritmatika
#include
#include
int main(){
int a,b=10,*p,*q;
p=&a;
*p=25;
printf("nilai a = %d\n",a);
printf("alamat p = %p\n",p);
q=&b;
printf("alamat q = %p\n",q);
printf("nilai a + b = %d\n",(*p+*q));
//posisi alamat p menjadi bergeser, nilai berubah
p=p+1;
printf("nilai p = %d, alamat = %p\n",*p,&p);
q=q-1;
printf("nilai q = %d, alamat = %p\n",*q,&q);
getch();
}
Pointer pada array 1 dimensi:
#include
#include
int main(){
char S[] = "anton";
char *p;
//cara 1
//langsung menunjuk nama array.
p=S;
for(int i=0;i<5;i++){
printf("%c",*p);
p++;
}
printf("\n");
//cara 2
p=&S[0];
for(int i=0;i<5;i++){
printf("%c",*p);
p++;
}
printf("\n");
//Membalik kalimat
p--;
for(int i=0;i<5;i++){
printf("%c",*p);
p--;
}
printf("\n");
getch();
}
Pointer pada Struct:
#include
#include
typedef struct{
int nim;
int umur;
float ipk;
} Mahasiswa;
Mahasiswa m;
Mahasiswa *p = &m;
int main(){
//struct biasa
m.nim=123;
m.ipk=3.2;
m.umur=23;
printf("nim = %d\n",m.nim);
printf("ipk = %f\n",m.ipk);
printf("umur = %d\n",m.umur);
//struct pointer
p->ipk = 3.5;
p->nim = 321;
p->umur = 32;
printf("nim = %d\n",p->nim);
printf("ipk = %f\n",p->ipk);
printf("umur = %d\n",p->umur);
//mengacu pada variabel aslinya
printf("nim = %d\n",m.nim);
printf("ipk = %f\n",m.ipk);
printf("umur = %d\n",m.umur);
getch();
}
Pengembangan:
Buatlah sebuah program untuk mengecek apakah suatu kata palindrom atau bukan, tanpa memperhatikan spasi dan huruf besar/kecilnya. Program dibuat dengan menggunakan template struct sebagai berikut:
typedef struct{
char elemen[30];
int jml_kata;
} Kata;
Kata kata;
Kata *p_kata=&kata;
Lanjutkanlah program berikut agar hasilnya sesuai dengan soal di atas:
#include
#include
typedef struct{
char elemen[30];
int jml_kata;
} Kata;
Kata kata;
Kata *p_kata=&kata;
int main(){
char kalimat[30];
p_kata->jml_kata=0;
char *p = p_kata->elemen;
printf("Masukkan kata : ");gets(kalimat);
fflush(stdin);
printf("Kalimat : %s\n",kalimat);
for(int i=0;i
*p=kalimat[i];
p_kata->jml_kata++;
p++;
}
p=p_kata->elemen;
//tampilkan kembali kalimat tersebut
for(int i=0;i<=p_kata->jml_kata;i++){
printf("%c ",*p);
p++;
}
//kembangkan….
getch();
}
Soal:
Buatlah program data KTP, dengan menggunakan pointer pada struct KTP sebagai berikut:
typedef struct
{
int tgl;
int bln;
int th;
}Tanggal;
typedef struct
{
char noID[5];
char nama[30];
char jenis_kelamin; //’L’ atau ‘P’
Tanggal t;
}KTP;
typedef struct
{
KTP ktp;
int jml;
}Data_KTP;
Data_KTP data_ktp;
Data_KTP *p;
Buatlah fungsi untuk:
1.
Menambah data
2.
Mencari data berdasarkan tahun kelahiran tertentu
3.
Menampilkan data berdasarkan L dan P
4.
Mengedit data
Semua pengaksesan dilakukan dengann menggunakan pointer.
Sorting
PENDAHULUAN
Pengurutan data dalam struktur data sangat penting terutama untuk data yang bertipe data numerik ataupun karakter. Pengurutan dapat dilakukan secara ascending (urut naik) dan descending (urut turun). Pengurutan (Sorting) adalah proses pengurutan data yang sebelumnya disusun secara acak sehingga tersusun secara teratur menurut aturan tertentu
Contoh:
Data Acak : 5, 6, 8, 1, 3, 25, 10
Ascending : 1, 3, 5, 6, 8, 10, 25
Descending : 25, 10, 8, 6, 5, 3, 1
Deklarasi Array Untuk Sorting
Deklarasikan secara global:
int data[100];
int n; //untuk jumlah data
Prosedur Tukar 2 Buah Data
void tukar(int a,int b){
int tmp;
tmp = data[a];
data[a] = data[b];
data[b] = tmp;
}
BUBBLE SORT
Metode sorting termudah. Diberi nama “Bubble” karena proses pengurutan secara berangsur-angsur bergerak/berpindah ke posisinya yang tepat, seperti gelembung yang keluar dari sebuah gelas bersoda. Bubble Sort mengurutkan data dengan cara membandingkan elemen sekarang dengan elemen berikutnya. Jika elemen sekarang lebih besar dari elemen berikutnya maka kedua elemen tersebut ditukar, jika pengurutan ascending. Jika elemen sekarang lebih kecil dari elemen berikutnya, maka kedua elemen tersebut ditukar, jika pengurutan descending. Algoritma ini seolah-olah menggeser satu per satu elemen dari kanan ke kiri atau kiri ke kanan, tergantung jenis pengurutannya. Ketika satu proses telah selesai, maka bubble sort akan mengulangi proses, demikian seterusnya. Kapan berhentinya? Bubble sort berhenti jika seluruh array telah diperiksa dan tidak ada pertukaran lagi yang bisa dilakukan, serta tercapai perurutan yang telah diinginkan.
Proses 1
22 10 15 3 8 2
22 10 15 3 2↔ 8
22 10 15 2↔ 3 8
22 10 2↔15 3 8
22 2↔10 15 3 8
2 ↔22 10 15 3 8
Pada proses diatas, pegecekan dimulai dari data yang paling akhir, kemudian dibandingkan dengan data di depannya, jika data di depannya lebih besar maka akan ditukar.
Proses 2
2 22 10 15 3 8 à Tidak ada penukaran, karena 3 <8
2 22 10 15 3 8
2 22 10 3↔15 8
2 22 3↔10 15 8
2 3↔22 10 15 8 à Pengurutan berhenti di sini!
2 3 22 10 15 8
Pada proses kedua, pengecekan dilakukan sampai dengan data ke-2 karena data pertama pasti sudah paling kecil.
Proses 3
2 3 22 10 15 8
2 3 22 10 8↔15
2 3 22 8↔10 15
2 3 8↔22 10 15 à Pengurutan berhenti di sini!
2 3 8 22 10 15
2 3 8 22 10 15
Proses 4
2 3 8 22 10 15 à Tidak ada penukaran, karena 10 < 15
2 3 8 22 10 15
2 3 8 10↔22 15 à Pengurutan berhenti di sini!
2 3 8 10 22 15
2 3 8 10 22 15
2 3 8 10 22 15
Proses 5
2 3 8 10 22 15
2 3 8 10 15↔22 à Pengurutan berhenti di sini!
2 3 8 10 15 22
2 3 8 10 15 22
2 3 8 10 15 22
2 3 8 10 15 22
Prosedur Bubble Sort
void bubble_sort(){
for(int i=1;i
for(int j=n-1;j>=i;j--){
if(data[j]
}
}
}
Dengan prosedur diatas, data terurut naik (ascending), untuk urut turun (descending), silahkan ubah bagian:
if (data[j]
Menjadi:
if (data[j]>data[j-1]) tukar(j,j-1);
“The bubble sort is an easy algorithm to program, but it is slower than many other sorts”
EXCHANGE SORT
Sangat mirip dengan Bubble Sort. Banyak yang mengatakan Bubble Sort sama dengan Exchange Sort.
Pebedaannya adalah dalam hal bagaimana membandingkan antar elemen-elemennya. Exchange sort membandingkan suatu elemen dengan elemen-elemen lainnya dalam array tersebut, dan melakukan pertukaran elemen jika perlu. Jadi ada elemen yang selalu menjadi elemen pusat (pivot). Sedangkan Bubble sort akan membandingkan elemen pertama/terakhir dengan elemen sebelumnya/sesudahnya, kemudian elemen sebelum/sesudahnya itu akan menjadi pusat (pivot) untuk dibandingkan dengan elemen sebelumnya/sesudahnya lagi, begitu seterusnya.
Contoh Data :
84, 69, 76, 86, 94, 91
Pivot (Pusat)
Proses 1
84 69 76 86 94 91
84 69 76 86 94 91
84 69 76 86 94 91
86 69 76 84 94 91
94 69 76 84 86 91
84 69 76 86 94 91
Pivot (Pusat)
Proses 2
94 69 76 84 86 91
94 76 69 84 86 91
94 84 69 76 86 91
94 86 69 76 84 91
94 91 69 76 84 86
Pivot (Pusat)
Proses 3
94 91 69 76 84 86
94 91 76 69 84 86
94 91 84 69 76 86
94 91 86 69 76 84
Pivot (Pusat)
Proses 4
94 91 86 69 76 84
94 91 86 76 69 84
94 91 86 84 69 76
Pivot (Pusat)
Proses 5
94 91 86 84 69 76
94 91 86 84 76 69
Prosedur Exchange Sort
void exchange_sort() {
for (int i=0; i
for(int j=(i+1); j
if (data[i]
}
}
}
SELECTION SORT
Merupakan kombinasi antara sorting dan searching .Untuk setiap proses, akan dicari elemen-elemen yang belum diurutkan yang memiliki nilai terkecil atau terbesar akan dipertukarkan ke posisi yang tepat di dalam array. Misalnya untuk putaran pertama, akan dicari data dengan nilai terkecil dan data ini akan ditempatkan di indeks terkecil (data[0]), pada putaran kedua akan dicari data kedua terkecil, dan akan ditempatkan di indeks kedua (data[1]). Selama proses, pembandingan dan pengubahan hanya dilakukan pada indeks pembanding saja, pertukaran data secara fisik terjadi pada akhir proses.
Proses 1
0 1 2 3 4 5
32 75 69 58 21 40
Pembanding Posisi
32 < 75 0
32 < 69 0
32 < 58 0
32 > 21 (tukar idx) 4
21 < 40 4
Tukar data ke-0 (32) dengan data ke-4 (21)
0 1 2 3 4 5
21 75 69 58 32 40
Proses 2
0 1 2 3 4 5
21 75 69 58 32 40
Pembanding Posisi
75 > 69 (tukar idx) 2
69 > 58 (tukar idx) 3
58 > 32 (tukar idx) 4
32 < 40 4
Tukar data ke-1 (75) dengan data ke-4 (32)
0 1 2 3 4 5
21 32 69 58 75 40
Proses 3
0 1 2 3 4 5
21 32 69 58 75 40
Pembanding Posisi
69 > 58 (tukar idx) 3
58 < 75 3
58 > 40 5
Tukar data ke-2 (69) dengan data ke-5 (40)
0 1 2 3 4 5
21 32 40 58 75 69
Proses 4
0 1 2 3 4 5
21 32 40 58 75 69
Pembanding Posisi
58 < 75 3
58 < 69 3
Tukar data ke-3 (58) dengan data ke-3 (58)
0 1 2 3 4 5
21 32 40 58 75 69
Proses 5
0 1 2 3 4 5
21 32 40 58 75 69
Pembanding Posisi
75 > 69 5
Tukar data ke-4 (75) dengan data ke-5 (69)
0 1 2 3 4 5
21 32 40 58 69 75
Prosedur Selection Sort
void selection_sort(){
for(int i=0;i
pos = i;
for(int j=i+1;j
if(data[j] < data[pos]) pos = j; //ascending
}
if(pos != i) tukar(pos,i);
}
}
INSERTION SORT
Mirip dengan cara orang mengurutkan kartu, selembar demi selembar kartu diambil dan disisipkan (insert) ke tempat yang seharusnya. Pengurutan dimulai dari data ke-2 sampai dengan data terakhir, jika ditemukan data yang lebih kecil, maka akan ditempatkan (diinsert) diposisi yang seharusnya. Pada penyisipan elemen, maka elemen-elemen lain akan bergeser ke belakang.
Proses 1
0 1 2 3 4 5
22 10 15 3 8 2
Temp Cek Geser
10 Temp<22? Data ke-0 ke posisi 1
Temp menempati posisi ke -0
0 1 2 3 4 5
10 22 15 3 8 2
Proses 2
0 1 2 3 4 5
10 22 15 3 8 2
Temp Cek Geser
15 Temp<22 Data ke-1 ke posisi 2
15 Temp>10 -
Temp menempati posisi ke-1
0 1 2 3 4 5
10 15 22 3 8 2
Proses 3
0 1 2 3 4 5
10 15 22 3 8 2
Temp Cek Geser
3 Temp<22 Data ke-2 ke posisi 3
3 Temp<15 Data ke-1 ke posisi 2
3 Temp<10 Data ke-0 ke posisi 1
Temp menempati posisi ke-0
0 1 2 3 4 5
3 10 15 22 8 2
Proses 4
0 1 2 3 4 5
3 10 15 22 8 2
Temp Cek Geser
8 Temp<22 Data ke-3 ke posisi 4
8 Temp<15 Data ke-2 ke posisi 3
8 Temp<10 Data ke-1 ke posisi 2
8 Temp>3 -
Temp menempati posisi ke-1
0 1 2 3 4 5
3 8 10 15 22 2
Proses 5
0 1 2 3 4 5
3 8 10 15 22 2
Temp Cek Geser
2 Temp<22 Data ke-4 ke posisi 5
2 Temp<15 Data ke-3 ke posisi 4
2 Temp<10 Data ke-2 ke posisi 3
2 Temp<8 Data ke-1 ke posisi 2
2 Temp<3 Data ke-0 ke posisi 1
Temp menempati posisi ke-0
0 1 2 3 4 5
2 3 8 10 15 22
Prosedur Insertion Sort
void insertion_sort(){
int temp;
for(int i=1;i
temp = data[i];
j = i -1;
while(data[j]>temp && j>=0){
data[j+1] = data[j];
j--;
}
data[j+1] = temp;
}
}
Program Lengkapnya :
#include
#include
int data[10],data2[10];
int n;
void tukar(int a,int b){
int t;
t = data[b];
data[b] = data[a];
data[a] = t;
}
void bubble_sort(){
for(int i=1;i
for(int j=n-1;j>=i;j--){
if(data[j]
}
}
printf("bubble sort selesai!\n");
}
void exchange_sort(){
for (int i=0; i
for(int j = (i+1); j
if (data [i] > data[j]) tukar(i,j);
}
}
printf("exchange sort selesai!\n");
}
void selection_sort(){
int pos,i,j;
for(i=0;i
pos = i;
for(j = i+1;j
if(data[j] < data[pos]) pos = j;
}
if(pos != i) tukar(pos,i);
}
printf("selection sort selesai!\n");
}
void insertion_sort(){
int temp,i,j;
for(i=1;i
temp = data[i];
j = i -1;
while(data[j]>temp && j>=0){
data[j+1] = data[j];
j--;
}
data[j+1] = temp;
}
printf("insertion sort selesai!\n");
}
void Input(){
printf("Masukkan jumlah data = ");scanf("%d",&n);
for(int i=0;i
printf("Masukkan data ke-%d = ",
(i+1));scanf("%d",&data[i]);
data2[i] = data[i];
}
}
void AcakLagi(){
for(int i=0;i
data[i] = data2[i];
}
Printf("Data sudah teracak!\n");
}
void Tampil(){
printf("Data : ");
for(int i=0;i
printf("%d ",data[i]);
}
printf("\n");
}
void main(){
clrscr();
int pil;
do{
clrscr();
printf("1. Input Data\n");
printf("2. Bubble Sort\n");
printf("3. Exchange Sort\n");
printf("4. Selection Sort\n");
printf("5. Tampilkan Data\n");
printf("6. Acak\n");
printf("7. Exit\n");
printf("Pilihan = ");scanf("%d",&pil);
switch(pil){
case 1:Input();break;
case 2:bubble_sort();break;
case 3:exchange_sort();break;
case 4:selection_sort();break;
case 5:Tampil();break;
case 6:AcakLagi();break;
}
getch();
}while(pil!=7);
}
Tabel Perbandingan Kecepatan Metode Pengurutan Data
Untuk data sejumlah 10.000 data pada komputer Pentium II 450 MHz
Metode Waktu (detik)
Data Acak Data Ascending Data Descending
Bubble Sort 11,2 1,32 19,77
Insertion Sort 1,09 0,00 2,25
Selection Sort 1,32 1,32 19,77
SEARCHING
Binary Search
Adalah teknik pencarian data dalam array dengan cara membagi array menjadi dua bagian setiap kali terjadi proses pengurutan. Prinsip pencarian biner adalah:
· Data diambil dari posisi 1 sampai posisi akhir N
· Kemudian cari posisi data tengah dengan rumus (posisi awal + posisi akhir) / 2
· Kemudian data yang dicari dibandingkan dengan data yang di tengah, apakah sama atau lebih kecil, atau lebih besar?
· Jika lebih besar, maka proses pencarian dicari dengan posisi awal adalah posisi tengah + 1
· Jika lebih kecil, maka proses pencarian dicari dengan posisi akhir adalah posisi tengah – 1
· Jika data sama, berarti ketemu.
Contoh Data:
Misalnya data yang dicari 17
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A B C
Karena 17 > 15 (data tengah), maka: awal = tengah + 1
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A B C
Karena 17 < 23 (data tengah), maka: akhir = tengah – 1
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A=B=C
Karena 17 = 17 (data tengah), maka KETEMU!
Programnya:
int binary_search(int cari){
int l,r,m;
l = 0;
r = n-1;
int ktm = 0;
while(l<=r && ktm==0){
m = (l+r)/2;
if(data[m] == cari) ktm=1;
else if (cari < data[m]) r=m-1;
else l=m+1;
}
if(ktm==1) return 1; else return 0;
}
Operasi File
Operasi“dasar“file“pada“prinsipnya“terbagi“menjadi“I“tahap+“yaituJ membuka“atau“mengaktifkan“file melaksanakan“pemrosesan“file menutup“dile
A.(Membuka(file
Sebelum“suatu“file“dapat“diproses+“file“harus“dibuka“terlebih“dahuluF“Sebelum“file
ibuka+“terlebih“dahulu“obyek“file“harus“didefinisikanF“SintaksnyaJ
ofstream{nama_obyek;
erintah“ofstream“dapat“dijalankan“dengan“menyertakan“file“header“fstream.h
Setelah“itu+“suatu“file“dapat“dibuka“dengan“perintah
nama_obyekwopen,ìnama{file{dan{pathî-;
B.(Menulis(ke(File
Salah“satu“jenis“pemrosesan“pada“file“adalah“menulis“atau“merekam“data“ke“fileF
SintaknyaJ
nama_obyek{<<{www{;
C.(Menutup(File
Setelah“pemrosesan“file“selesai+“file“dapat“ditutup“menggunakan“perintah
nama_obyekwclose,-;
Xontoh“5Frogram“berikut“ini“untuk“menulis“teks“ke“dalam“file
/include
/include
void{main,-
{
{ofstream{fileteks;
{filetekswopen,ìC:zalgowtxtî-;
{fileteks{<<{ìUntuk{mencapai{tujuan{yg{besarA{maka{tujuan{ituî
{{{{{{{{{{<<{endl;
{fileteks{<<{ìharus{dibagiKbagi{menjadi{tujuan{kecilî<<{endl;
{fileteks{<<{ìsampai{tujuan{itu{merupakan{tujuan{yg{dapat{ì
{{{{{{{{{{<<{ìdicapaiî{<<{endl;
{fileteks{<<{ìberdasarkan{kondisi{dan{potensi{yg{dimiliki{saat{ì
{{{{{{{{{{<<{itu{ì{<<{endl;
{filetekswclose,-;
}
perintah“fileteksFopencìXJMalgoFtxtî2K“akan“membuka“file“algoFtxt“yang“ada“di“XJ\“
Vpabila“file“tersebut“belum“ada“maka“akan“dibuat“secara“otomatis+“dan“apabila
sudah“ada“isi“file“algoFtxt“akan“terhapusF
D.(Menambah(Data(pada(File
Suatu“file“yang“sudah“ada“sebelumnya“dapat“ditambah“data“yang“baru“ctidak
menghapus“data“lama2F““Xaranya“dengan“menambahkan“perintah“ios::app“pada
openc2F
nama_obyekwopen,ìnama{fileîA{ios::app-;
Xontoh“BF
/include
/include
void{main,-
{
{ofstream{fileteks;
{filetekswopen,ìC:zalgowtxtîA{ios::app-;
{fileteks{<<{endl;
{fileteks{<<{ìOleh:{Al{Khowarizmi{<<{endl;
{filetekswclose,-;
}
E.(Memeriksa(Keberhasilan(Operasi(File
Tidak“selamanya“jalan“yang“mulus“ditemuiF“Vda“kemungkinan“terjadi“saat“file
dibuka+“ternyata“file“tidak“adaF“Yalam“XDD“tersedia“function“untuk“memeriksa
kondisi-kondisi “ pada “ operasi “ file+ “ sehingga “ kesalahan “ saat “ eksekusi “ dapa
dikendalikanF
Function“yang“dimaksud“adalah“fail()F
Xontoh“IJ
/include
/include
void{main,-
{
{ifstream{fileteks;{{{ifstream{digunakan{uz{membaca{file{}
{filetekswopen,ìC:zalgowtxtî-;
{if{,filetekswfail,--{cout{<<{ìMaaf{file{takdapat{dibukazî{{
{{{{{{{{{{{{{{{{{{{{{{{{{{{<<{ìtidak{ditemukanî;
{filetekswclose,-;
}
F.(Operasi(Berbasis(Karakter
Operasi “ file “ dapat “ dilakukan “ dalam “ bentuk “ karakterF “ Misalnya “ proses
penyimpanan“data“ke“file“dilakukan“setiap“karakter+“atau“membaca“data“file
karakter“per“karakterF“Operasi“ini“didukung“oleh“function“put()“dan“get()F
Xontoh“‘J
Program“untuk“menyimpan“data“karakter“per“karakter“ke“dalam“fileF
/include
/include
void{main,-
{
{ofstream{fileteks;
{filetekswopen,ìC:zcontohwtxtî-;
{filetekswput,ëAí-;
{filetekswput,ëBí-;
{filetekswput,ëCí-;
{filetekswclose,-;
}
Xontoh“’F
Program“untuk“membaca“file“karakter“per“karakter
/include
/include
void{main,-
{
{{char{karakter;
{{ifstream{fileteks;{{}
{{filetekswopen,ìC:zcontohwtxtî-;
{
{{while,Cfileteksweof,--{
{{{
{{{{filetekswget,karakter-;
{{{{cout{<<{karakter;
{{}
{{filetekswclose,-;
}
Latihan.
5F Wuatlah“program“XDD“untuk“menghitung“jumlah“karakter“dalam“suatu“fileF
Inputnya“adalah“nama“file“dan“pathnyaF
BF Wuatlah“program“XDD“untuk“menghitung“jumlah“karakter“tertentu+“misalnya
karakter“ëVíF“Input“berupa“nama“file“dan“karakter“yang“akan“dihitungF
IF Misalkan“suatu“file“teks“berisi“listing“program“XDDF“Wuatlah“program“untuk
menghitung“pasangan“kurung“kurawal“yang“ada“pada“file“teks“tersebutF
‘F Wuatlah“program“XDD“untuk“melakukan“enkripsi“shift“chiper“suatu“file“teks
cdengan“asumsi“semua“karakter“huruf“adalah“huruf“kapital2F“Inputnya“adalah
file“teks“yang“akan“dienkripsi“dan“besar“pergeseran“cinteger2F“Outputnya
adalah“file“teks“hasil“enkripsiF
HintJ
Ide“dasar“shift“chiper“adalah“mengubah“setiap“karakter“huruf“ke“karakter
huruf“lainF“Misalkan“pergeserannya“B+“maka“berikut“ini“karakter“hasil“enkripsi
awal V W X Y Z F G H I J K L M N O P Q R S T U V W X Y Z
hasil X Y Z F G H I J K L M N O P Q R S T U V W X Y Z V W
Sehingga“misal“diberikan“suatu“teks“XDD“IS“ZVSY+“maka“hasil“enkripsinya
adalah“ZDD“KU“GXUV
Search
1. Linear search
Syarat
Tabel : Sort / bebas
Data masukan banyak : sort / bebas
Tabel Data
A D
C B
D
B
E
Ciri : Selalu kembali keasal pencarian untuk data berikutnya.
2. Sequential search
Syarat
Tabel : Sort
Data masukan banyak : Sort
Tabel Data
A B
B D
C
D
E
Ciri : pencarian data kedua mulai dari data pertama yang telah dite
Misal:
3. Binary search
Batas bawah = 0
Syarat
Batas atas = 7, jika ganjil + 1
Tabel : Sort
Indeks = (BB + BA)/2=4
Data masukan banyak : Bebas
Lanjut……..
Tabel Data
Batas bawah = 4
A D
Batas atas = tetap
B B
Indeks = (BB + BA)/2=6……t
C
bagi sampai ketemu
D
E
Ciri : pencarian data memba
F
menjadi dua, kemudian mem
G
hasil baginya terus sampai k
Potongan Algor binary
Array tabel[8], Input(data)
nt kiri=1, kanan=n, Cari=0;
While (cari <> 0 and kiri<=kanan)
Lokasi=(kiri+kanan)/2;
F tabel[lokasi]=cari then
Cari=1;
ELSE
If tabel[lokasi] <>
Kiri = lokasi + 1;
Else
Kanan = lokasi -1;
Endif
Endif
IF Cari=1 then
Idx=lokasi;
Else
Output(tidak ditemukan);
Endif
#include
#include
int BinarySearch(int [], int, int);
int main()
{
clrscr();
const int NUMEL = 10;
int nums[NUMEL] = {5,10,22,32,45,67,73,98,99,101};
int item, location;
cout << "Enter the item you are searching for: ";
cin >> item;
location = BinarySearch(nums, NUMEL, item);
if (location > -1)
cout << "The item was found at index location "<< location <<
endl;
else
cout << "The item was not found in the list\n";
getch();
return 0;
}
// this function returns the location of key in the list
// a -1 is returned if the value is not found
int BinarySearch(int list[], int size, int key)
{
int left, right, midpt;
left = 0;
right = size - 1;
while (left <= right)
{
midpt = (int) ((left + right) / 2);
if (key == list[midpt])
{
return midpt; //data is found
}
D:\My Documents\algor\algor2\Search.doc Created by Yokivox
else if (key > list[midpt])
left = midpt + 1;
else
right = midpt - 1;
}
return -1; //return indicate that data is’t found
}
Function Parameter
REFRESH!
- Function yang telah kita pelajari adalah kumpulan instruksi yang digunakan untuk
melaksanakan suatu maksud tertentu dan diberi nama yang unik.
- Function ada yang mengembalikan nilai (non-void) dan ada yang tidak mengembalikan
nilai (void)
Contoh:
int Kali(int a,int b){
return a*b;
}
Atau seperti ini:
void ShowError(){
printf(“Error on line %d: %s”,Error.line,Error.message);
}
- Variabel-variabel yang ada di dalam function bersifat lokal untuk fungsi tersebut saja,
sedangkan nilai kembalian fungsi akan dikenal pada fungsi yang memanggil fungsi
tersebut.
#include
#include
int d=3,e=1;
void coba_lokal(int a,int b){
int c = 0;
int d = 10;
int e;
e = (a+b) * (c+d);
printf("lokal a = %d\n",a);
printf("lokal b = %d\n",b);
printf("lokal c = %d\n",c);
printf("lokal d = %d\n",d);
printf("lokal e = %d\n",e);
}
void main(){
int a=2;
int b;
b = 4;
int c=0;
printf("main a = %d\n",a);
printf("main b = %d\n",b);
coba_lokal(a,b);
printf("main c = %d\n",c);
printf("global d = %d\n",d);
printf("global e = %d\n",e);
getch();
}
- Function boleh memiliki parameter ataupun tidak memiliki parameter satupun
- Parameter dalam function terdiri dari 2 jenis:
o Parameter Formal: yaitu parameter yang tertulis dalam definisi fungsi.
o Parameter Aktual: yaitu parameter yang merupakan inputan langsung pada
saat penggunakan fungsi tersebut. Dapat berupa variabel maupun langsung
berupa value.
Contoh:
#include
int JUMLAH(int X, int Y);
X, Y disebut parameter formal
void main(){
int A,B,T;
Variabel A,B,C lokal dalam main
A=5; B=2;
T = JUMLAH(A,B);
A dan B disebut parameter aktual
printf(“%d”,T);
}
X, Y disebut parameter formal
int JUMLAH(int X, int Y){
int H;
Variabel X,Y lokal dalam JUMLAH
H = X + Y;
return(H);
}
Pengiriman Parameter ke suatu Function secara nilai (By Value)
- Yang dikirimkan ke fungsi adalah nilainya, bukan alamat memori letak dari datanya
- Fungsi yang menerima kiriman nilai ini akan menyimpannya di alamat terpisah dari
nilai aslinya yang digunakan oleh program yang memanggil fungsi tersebut
- Karena itulah pengubahan nilai di dalam fungsi tidak akan berpengaruh pada nilai
asli di program yang memanggil fungsi walaupun keduanya menggunakan nama
variabel yang sama
Contoh
#include
#include
int a=4;
void getAGlobal(){
printf("A Global adalah %d alamatnya %p\n",a,&a);
}
void fungsi_by_value(int a){
a = a * 3;
printf("A by value adalah = %d alamatnya adalah %p\n",a,&a);
}
Pengiriman
satu arah
void main(){
int a = 5;
getAGlobal();
printf("A main adalah = %d alamatnya adalah %p\n",a,&a);
fungsi_by_value(a);
printf("A main setelah fungsi dipanggil adalah = %d
alamatnya adalah %p\n",a,&a);
getch();
}
Hasil:
Di dalam Memori:
a di global a di main a di a di main after
nilai 4 nilai 5
fungsi_by_value function
nilai 15 nilai 5
alamat 252F:0076 alamat 252F:2294
alamat alamat
252F:2292 252F:2294
- Pengiriman by value adalah pengiriman searah, dari program pemanggil fungsi ke
fungsi yang dipanggilnya
- Pengiriman by value dapat dilakukan untuk suatu statement, tidak hanya untuk suatu
variabel, value, array atau konstanta saja.
...
void fungsi_by_value(int a){
a = a * 3;
printf("A by value adalah = %d alamatnya adalah %p\n",a,&a);
}
void main(){
int a = 5;
getAGlobal();
printf("A main adalah = %d alamatnya adalah %p\n",a);
fungsi_by_value(5*a+1);
Statement
getch();
}
...
- Secara default, C menggunakan parameter by value untuk pembuatan fungsi-
fungsinya.
Contoh lain:
#include
#include
void Secara_Nilai(float a,float b,char c){
float *Alamat_A;
Alamat_A = &a;
a = 7;
printf("Lokal A = %f, alamat A = %p\n",a,Alamat_A);
printf("Lokal B = %f\n",b);
printf("Lokal C = %c\n",c);
}
void main(){
float a=25,*Alamat_A;
char c = 'a';
Alamat_A = &a;
Secara_Nilai(a,a/3,c);
printf("Main A = %f, alamat A = %p\n",a,Alamat_A);
printf("Main A/3 = %f\n",(a/3));
printf("Main C = %c\n",c);
getch();
}
Hasil:
Dapat disimpulkan sebagai berikut:
1. Parameter aktual yang dikirimkan adalah datanya, yaitu Secara_Nilai(a,a/3,c)
2. Alamat nilai a pada main dan a pada fungsi Secara_Nilai berbeda, yaitu
2447:2456 dan 2447:2466
3. Perubahan nilai a dalam fungsi Secara_Nilai menjadi 7 tidak mengubah nilai a
pada main yaitu tetap 25
4. Pengirimannya satu arah
Secara_Nilai(a,a/3,c)
Secara_Nilai(float a,float b,char c)
5. Pengiriman parameter dapat berupa ungkapan (statement) yaitu a/3
Pengiriman Parameter secara Acuan (by Reference)
1. Yang dikirimkan adalah alamat memori letak dari nilai datanya, bukan nilai datanya
2. Fungsi yang menerima parameter ini akan menggunakan alamat yang sama dengan
alamat nilai datanya
3. Karena itulah pengubahan nilai di fungsi akan mengubah juga nilai asli di program
pemanggil fungsi tersebut
4. Pengiriman parameter by reference adalah pengiriman dua arah, yaitu dari program
pemanggil fungsi ke fungsi dan sebaliknya dari fungsi ke program pemanggilnya
5. Pengiriman parameter by reference tidak dapat digunakan untuk suatu ungkapan,
hanya bisa untuk variabel, konstanta atau elemen array saja
Contoh1:
#include
#include
int a=4;
void getAGlobal(){
printf("A Global adalah %d alamatnya %p\n",a,&a);
}
Menggunakan
void fungsi_by_ref(int *a){
asteris/bintang (*)
*a = *a * 3;
printf("A by ref adalah = %d alamatnya adalah %p\n",*a,a);
}
Menggunakan
void main(){
asteris/bintang (*)
int a = 5;
getAGlobal();
printf("A main adalah = %d alamatnya adalah %p\n",a,&a);
fungsi_by_ref(&a);
printf("A main setelah fungsi dipanggil adalah = %d alamatnya
adalah %p\n",a,&a);
getch();
}
Hasil1:
Di dalam Memori:
a di global a di main a di a after
nilai 4 nilai 5
fungsi_by_value fungsi_by_ref
nilai 15 nilai 15
alamat 2487:0076 alamat 2487:2292
alamat alamat
2487:2292 2487:2292
Contoh lain:
Menggunakan
#include
asteris/bintang (*)
#include
void Secara_Acuan(float *a,float b,char *c){
float *Alamat_A;
Tanpa
Alamat_A = a;
asteris/bintang (*)
*a = 7;
printf("Lokal A = %f, alamat A = %p\n",*a,Alamat_A);
printf("Lokal B = %f\n",b);
printf("Lokal C = %c\n",*c);
}
void main(){
float a=25,*Alamat_A;
char c = 'a';
Alamat_A = &a;
Secara_Acuan(&a,a/3,&c);
printf("Main A = %f, alamat A = %p\n",a,Alamat_A);
printf("Main A/3 = %f\n",(a/3));
printf("Main C = %c\n",c);
getch();
}
Hasil:
Kesimpulan:
1. Operator pada pengiriman parameter by reference adalah menggunakan operator ‘&’
yang berarti mengacu pada alamat memori dari variabel tersebut.
2. Parameter aktual yang dikirimkan adalah alamat memori, yaitu
Secara_Acuan(&a,a/3,&c)
3. Alamat nilai a pada main dan a pada fungsi Secara_Acuan sama, yaitu 23C7:2466
4. Perubahan nilai a dalam fungsi Secara_Acuan menjadi 7 juga mengubah nilai a pada
main yang semula 25 menjadi 7
5. Pengirimannya dua arah
Secara_Acuan (&a,a/3,&c)
Secara_Nilai(float *a,float b,char *c)
6. Pengiriman parameter tidak dapat berupa ungkapan (statement), sehingga untuk
statement a/3 harus berupa parameter by value
Pengiriman Parameter berupa Array berdimensi satu
- Pengiriman ini adalah pengiriman by reference, karena yang dikirimkan sebenarnya
adalah alamat dari elemen pertama array yang digunakan sebagai parameter, bukan
seluruh nilai elemen-elemennya.
- Alamat elemen pertama array dapat ditulis dengan menyebutkan nama array tanpa
menuliskan indeksnya.
Contoh1:
#include
#include
Tanpa parameter
void Cetak_Mundur(char S[]){
int n;
//menghitung panjang string dimasukkan ke n
for(n=0;S[n]!='\0';n++);
for(int i=n-1;i>=0;i--) printf("%c",S[i]);
}
void main(){
char S[] = "universitas kristen duta wacana";
printf("String mula-mula = %s\n",S);
printf("String terbalik = ");
Parameter aktual
Cetak_Mundur(S);
getch();
}
Hasil:
Contoh2:
#include
#include
void Balik_Huruf(char S[]){
int n;
//menghitung panjang string dimasukkan ke n
for(n=0;S[n]!='\0';n++);
for(int i=0;i
if(S[i]>='a' && S[i]<='z') S[i] = S[i] - 'a' + 'A';
//diubah menjadi huruf besar
else if(S[i]>='A' && S[i]<='Z') S[i] = S[i] - 'A' + 'a';
//diubah menjadi huruf kecil
}
}
void main(){
char S[] = "UniVersiTas KriSteN DutA WaCanA";
printf("String mula-mula = %s\n",S);
printf("String hasil = ");
Balik_Huruf(S);
printf("%s",S);
getch();
}
Hasil:
Contoh3:
#include
#include
void Masukkan_Data(int data[],int jml){
for(int i=0;i
printf("Masukkan data ke-%d = ",i+1);scanf("%d",&data[i]);
}
}
int Hitung_Total(int data[],int jml){
int t = 0;
for(int i=0;i
t += data[i];
}
return t;
}
void main(){
int n;
int total;
int data[10];
printf("Jumlah data = ");scanf("%d",&n);
Masukkan_Data(data,n);
total = Hitung_Total(data,n);
printf("Total data = %d",total);
getch();
}
Hasil:
Pengiriman Parameter berupa Array dua dimensi
- Pengiriman parameter berupa array 2 dimensi hampir sama dengan pengiriman
parameter array satu dimensi
- Perbedaannya: menyebutkan baris dan kolom array dimensi dua tersebut
- Mendeklarasikan MAX_ROWS dan MAX_COLS yang digunakan untuk pengiriman
parameter array dua dimensi
- Pada saat pengiriman parameter formal array dua dimensi, kita harus menyebutkan
banyaknya dimensi array untuk kolom, sehingga ukuran kolom dapat diketahui. Hal ini
berkaitan dengan pemesanan variabel array di memori
Contoh:
#include
#include
#define MAX_COLS 10
#define MAX_ROWS 10
void Masukkan_Data(int data[][MAX_COLS],int m,int n){
for(int i=0;i
for(int j=0;j
printf("Masukkan Matriks [%d,%d] =
",i+1,j+1);scanf("%d",&data[i][j]);
}
}
}
int Hitung_Total(int data[][MAX_COLS],int m,int n){
int t = 0;
for(int i=0;i
for(int j=0;j
t += data[i][j];
}
}
return t;
}
void main(){
int m,n;
int total;
int data[MAX_ROWS][MAX_COLS];
printf("Jumlah baris = ");scanf("%d",&m);
printf("Jumlah kolom = ");scanf("%d",&n);
Masukkan_Data(data,m,n);
total = Hitung_Total(data,m,n);
printf("Total data = %d",total);
getch();
}
SEARCHING ARRAY
REFRESH ARRAY
- Selama ini kita menggunakan satu variabel untuk menyimpan 1 buah nilai
dengan tipe data tertentu.
- Misalnya :
int a1, a2, a3, a4, a5;
Deklarasi variabel diatas digunakan untuk menyimpan 5 data integer
dimana masing-masing variabel diberi nama a1, a2, a3, a4, dan a5.
- Jika kita memiliki 10 data, 100 data integer bahkan mungkin data yang
ingin kita proses tidak kita ketahui atau bersifat dinamis? Kita tidak
mungkin menggunakan variabel seperti diatas.
- Di dalam C dan pemrograman yang lain, terdapat suatu fasilitas untuk
menyimpan data-data yang bertipe data sama dengan suatu nama
tertentu.
DEFINISI ARRAY
- Array adalah suatu tipe data terstuktur yang berupa sejumlah data sejenis
(bertipe data sama) yang jumlahnya bisa statis ataupu dinamis dan diberi
suatu nama tertentu.
- Elemen-elemen array tersusun secara berderet dan sekuensial di dalam
memori sehingga memiliki alamat yang besebelahan/berdampingan.
- Array dapat berupa array 1 dimensi, 2 dimensi, bahkan n-dimensi.
- Elemen-elemen array bertipe data sama tapi bisa bernilai sama atau
berbeda-beda.
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
0 1 2 3 4 5 6 7
indeks
8 10 6 -2 11 7 1 100
value
alamat
ffea ffeb ffec ffed ffef fffa fffb fffc
CARA PENGAKSESAN ELEMEN ARRAY
- Elemen-elemen array dapat diakses oleh program menggunakan suatu
indeks tertentu
- Pengaksesan elemen array dapat dilakukan berurutan atau random
berdasarkan indeks tertentu secara langsung.
- Pengisian dan pengambilan nilai pada indeks tertentu dapat dilakukan
dengan mengeset nilai atau menampilkan nilai pada indeks yang
dimaksud.
- Dalam C, tidak terdapat error handling terhadap batasan nilai indeks,
apakah indeks tersebut berada di dalam indeks array yang sudah
didefinisikan atau belum. Hal ini merupakan tanggung jawab programmer.
Sehingga jika programmer mengakses indeks yang salah, maka nilai yang
dihasilkan akan berbeda atau rusak karena mengakses alamat memori
yang tidak sesuai.
DEKLARASI ARRAY 1 DIMENSI
tipe_data nama_var_array[ukuran];
tipe_data : menyatakan jenis tipe data elemen larik (int, char, float, dll)
nama_var_array : menyatakan nama variabel yang dipakai.
ukuran : menunjukkan jumlah maksimal elemen larik.
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Contoh:
char huruf[9];
int umur[10];
int kondisi[2] = {0,1}
int arr_dinamis[] = {1,2,3}
char huruf[9]: berarti akan memesan tempat di memori komputer sebanyak 9 tempat
dengan indeks dari 0-8, dimana semua elemennya bertipe data karakter
semuanya. Kalau satu karakter berukuran 1 byte, berarti membutuhkan
memori sebesar 9 byte.
int umur[10]: berarti akan memesan tempat di memori komputer sebanyak 10 tempat
dengan indeks dari 0-9, dimana semua elemennya bertipe data integer
semuanya. Kalau satu integer berukuran 4 bytes, berarti membutuhkan
memori sebesar 4 x 10 = 20 bytes.
int kondisi[2]: berarti akan memesan tempat di memori komputer sebanyak 2 tempat
dengan indeks 0-1, dimana semua elemennya bertipe data integer
semuanya. Dan pada contoh di atas isi elemen-elemennya yang
sebanyak 2 buah diisi sekaligus (diinisialisasi) yaitu pada elemen
kondisi[0] bernilai 0, dan elemen kondisi[1] bernilai 1.
int arr_dinamis[]:berarti mendeklarasikan array dengan ukuran maksimum array tidak
diketahui, namun ukuran tersebut diketahui berdasarkan inisialisasi yaitu
sebanyak 3 elemen, yang isinya 1,2, dan 3.
Kita tidak dapat mendeklarasikan array dinamis tanpa inisialisasi!
PENJELASAN ARRAY 1 DIMENSI
- Tanda [] disebut juga “elemen yang ke- ... Misalnya kondisi[0] berarti
elemen yang ke nol.
- Array yang sudah dipesan, misalnya 10 tempat tidak harus diisi
semuanya, bisa saja hanya diisi 5 elemen saja, baik secara berurutan
maupun tidak. Namun pada kondisi yang tidak sepenuhnya terisi
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
tersebut, tempat pemesanan di memori tetap sebanyak 10 tempat, jadi
tempat yang tidak terisi tetap akan terpesan dan dibiarkan kosong.
Contoh 1 (variabel array dan variabel biasa)
//Dengan variabel biasa:
int x1=3,x2=5,x3=2,x4=7,x5=9;
//Dengan larik:
int x[5]={3,5,2,7,9};
Bagaimana jika kita ingin menghitung total dari variabel biasa?
total = x1 + x2 + x3 + x4 + x5;
Contoh 2 (menginputkan dan menampilkan array)
#include
#include
void main()
{ int nilai[5], x;
clrscr();
printf(“Memasukkan nilai :\n”);
for(x=0;x<5;x++)
{
printf(“Nilai Angka : “); scanf(“%d”,&nilai[x]);
}
printf(“\n”);
printf(“Membaca nilai :\n”);
for(x=0;x<5;x++)
{
printf(“Nilai Angka : %d“,nilai[x]);
}
getch();
Hasilnya
}
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Contoh 3 (manipulasi array 1 dimensi)
#include
#include
int main(){
int bil[7],i;
printf("elemen 1 ? ");scanf("%d",&bil[0]);
bil[1] = 5;
bil[2] = bil[1] + 20;
for(i=4;i<7;i++) bil[i] = i*10;
bil[3] = bil[bil[1]];
for(i=0;i<7;i++) printf("bil[%d] = %d dan alamatnya: %X\n",i,bil[i],&bil[i]);
getch();
return 0;
}
Hasilnya:
Terlihat bahwa alamat array berurutan dengan jarak antar alamat adalah 4
bytes (integer berukuran 4 bytes)
Contoh 4 (tanpa inisialisasi langsung ditampilkan)
#include
#include
int main(){
int bil[7]; //tanpa inisialisasi
for(int i=0;i<7;i++){
printf("Elemen ke-%i = %d\n",i,bil[i]);
}
getch();
return 0;
}
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Hasilnya:
Contoh 5 (inisialisasi dengan 0)
#include
#include
int main(){
int bil[7] = {0}; //inisialisasi 0
for(int i=0;i<7;i++){
printf("Elemen ke-%i = %d\n",i,bil[i]);
}
getch();
return 0;
}
Hasilnya:
Contoh 6 (inisialisasi hanya 2 elemen pertama)
#include
#include
int main(){
int bil[7] = {2,5};
for(int i=0;i<7;i++){
printf("Elemen ke-%i = %d\n",i,bil[i]);
}
getch();
return 0;
}
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Hasilnya:
Contoh 7 (karakter yang tidak diinisialisasi)
#include
#include
int main(){
char h[5];
for(int i=0;i<5;i++){
printf("Elemen ke-%i = %c\n",i,h[i]);
}
getch();
return 0;
}
Hasilnya:
Operasi Elemen-elemen Array
- Penambahan elemen array
- Menampilkan elemen array
- Pencarian elemen array
o Jika ditemukan, katakan KETEMU!
- Penghapusan elemen array
o Cari, jika ditemukan baru dihapus.
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
o Penghapusan elemen array pada dasarnya tidak ada!
o Yang ada adalah pe-replace-an isi elemen array yang akan dihapus
oleh elemen-elemen berikutnya.
Ilustrasi penghapusan data 11 (elemen ke-4), n = 8:
0 1 2 3 4 5 6 7
indeks
8 10 6 -2 11 7 1 100
value
alamat
ffea ffeb ffec ffed ffef fffa fffb fffc
Pengeseran elemen, n = 7:
0 1 2 3 4 5 6 7
indeks
value
alamat
ffea ffeb ffec ffed ffef fffa fffb fffc
- Pengeditan elemen array
o Cari, jika ditemukan baru diedit dengan elemen yang baru.
o Pengisian elemen baru sama saja melakukan pe-replace-an data
pada indeks elemen yang diedit.
Pengertian Searching
- Pada suatu data seringkali dibutuhkan pembacaan kembali informasi
(retrieval information) dengan cara searching.
- Searching adalah pencarian data dengan menelusuri tempat pencarian
data tersebut.
- Tempat pencarian data tersebut dapat berupa array dalam memori, bisa
juga pada file pada external storage.
Teknik-teknik Searching
1. Sequential Search
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
2. Binary Search
3. Interpolation Search
4. Quick Search
Sequential Search
- Adalah suatu teknik pencarian data dalam array ( 1 dimensi ) yang akan
menelusuri semua elemen-elemen array dari awal sampai akhir, dimana
data-data tidak perlu diurutkan terlebih dahulu.
- Kemungkinan terbaik (best case) adalah jika data yang dicari terletak di
indeks array terdepan (elemen array pertama) sehingga waktu yang
dibutuhkan untuk pencarian data sangat sebentar (minimal).
- Kemungkinan terburuk (worst case) adalah jika data yang dicari terletak di
indeks array terakhir (elemen array terakhir) sehingga waktu yang
dibutuhkan untuk pencarian data sangat lama (maksimal).
Misalnya terdapat array satu dimensi sebagai berikut:
0 1 2 3 4 5 6 7
indeks
8 10 6 -2 11 7 1 100
value
alamat
ffea ffeb ffec ffed ffef fffa fffb fffc
Kemudian program akan meminta data yang akan dicari, misalnya 6.
Jika ada maka akan ditampilkan tulisan “ADA”, sedangkan jika tidak ada
maka akan ditampilkan tulisan “TIDAK ADA”.
#include
#include
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
void main(){
clrscr();
int data[8] = {8,10,6,-2,11,7,1,100};
int cari;
int flag=0;
printf("masukkan data yang ingin dicari = ");scanf("%d",&cari);
for(int i=0;i<8;i++){
if(data[i] == cari) flag=1;
}
if(flag==1) printf("Data ada!\n");
else printf("Data tidak ada!\n");
- Dari program diatas, terlihat bahwa dilakukan perulangan untuk
mengakses semua elemen array data satu persatu berdasarkan
indeksnya.
- Program menggunakan sebuah variabel flag yang berguna untuk menadai
ada atau tidaknya data yang dicari dalam array data. Hanya bernilai 0
atau 1.
- Flag pertama kali diinisialiasasi dengan nilai 0.
- Jika ditemukan, maka flag akan diset menjadi 1, jika tidak ada maka flag
akan tetap bernilai 0.
- Semua elemen array data akan dibandingkan satu persatu dengan data
yang dicari dan diinputkan oleh user.
Question: Bagaimana jika data yang dicari ditemukan maka data tersebut
ditampilkan terletak di indeks ke berapa?
Hint: Gunakan indeks array!
Problem: Apakah cara di atas efisien? Jika datanya ada 10000?
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Solution: Untuk meningkatkan efisiensi, seharusnya jika data yang dicari sudah
ditemukan maka perulangan harus dihentikan!
Hint: Gunakan break!
Question: Bagaimana cara menghitung ada berapa data dalam array yang
nilainya sama dengan data yang dicari oleh user?
Hint: Gunakan variabel counter yang nilainya akan selalu bertambah jika ada
data yang ditemukan!
Penggunaan Sentinel (Penjaga)
Perhatikan array data berikut ini:
indeks
0 1 2 3 4 5 6
value
3 12 9 -4 21 6
alamat
ffea ffeb ffec ffed ffef fffa fffb
- Terdapat 6 buah data dalam array (dari indeks 0 s/d 5) dan terdapat 1
indeks array tambahan (indeks ke 6) yang belum berisi data (disebut
sentinel)
- Array pada indeks ke 6 berguna untuk menjaga agar indeks data berada
pada indeks 0 s/d 5 saja. Bila pencarian data sudah mencapai array
indeks yang ke-6 maka berarti data TIDAK ADA, sedangkan jika
pencarian tidak mencapai indeks ke-6, maka data ADA.
#include
#include
void main(){
clrscr();
int data[7] = {3,12,9,-4,21,6};
int cari,i;
printf("masukkan data yang ingin dicari = ");scanf("%d",&cari);
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
data[6] = cari;
i=0;
while(data[i] != cari) i++;
if(i<6) printf("Data ada!\n"); else printf("Data tidak ada!\n");
}
KESIMPULAN: sangat efisien!
Binary Search
- Data yang ada harus diurutkan terlebih dahulu berdasarkan suatu urutan
tertentu yang dijadikan kunci pencarian.
- Adalah teknik pencarian data dalam dengan cara membagi data menjadi
dua bagian setiap kali terjadi proses pengurutan.
- Prinsip pencarian biner adalah:
o Data diambil dari posisi 1 sampai posisi akhir N
o Kemudian cari posisi data tengah dengan rumus (posisi awal +
posisi akhir) / 2
o Kemudian data yang dicari dibandingkan dengan data yang di
tengah, apakah sama atau lebih kecil, atau lebih besar?
o Jika lebih besar, maka proses pencarian dicari dengan posisi awal
adalah posisi tengah + 1
o Jika lebih kecil, maka proses pencarian dicari dengan posisi akhir
adalah posisi tengah – 1
o Jika data sama, berarti ketemu.
Contoh Data:
Misalnya data yang dicari 17
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A B C
Karena 17 > 15 (data tengah), maka: awal = tengah + 1
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A B C
Karena 17 < 23 (data tengah), maka: akhir = tengah – 1
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A=B=C
Karena 17 = 17 (data tengah), maka KETEMU!
Programnya:
int binary_search(int cari){
int l,r,m;
l = 0;
r = n-1;
int ktm = 0;
while(l<=r && ktm==0){
m = (l+r)/2;
if(data[m] == cari) ktm=1;
else if (cari < data[m]) r=m-1;
else l=m+1;
}
if(ktm==1) return 1; else return 0;
}
Interpolation Search
- Teknik ini dilakukan pada data yang sudah terurut berdasarkan kunci
tertentu
- Teknik searching ini dilakukan dengan perkiraan letak data.
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
o Contoh ilustrasi: jika kita hendak mencari suatu nama di dalam buku
telepon, misal yang berawalan dengan huruf T, maka kita tidak akan
mencarinya dari awal buku, tapi kita langsung membukanya pada
2/3 atau ¾ dari tebal buku.
- Jadi kita mencari data secara relatif terhadap jumlah data.
- Rumus posisi relatif kunci pencarian dihitung dengan rumus:
lowdatakunci - ][
lowlowhighxPosisi +-= )(
lowdatahighdata - ][][
Misal terdapat data sebagai berikut:
Kode Judul Buku Pengarang
025 The C++ Programming James Wood
034 Mastering Delphi 6 Marcopolo
041 Professional C# Simon Webe
056 Pure JavaScript v2 Michael Bolton
063 Advanced JSP & Servlet David Dunn
072 Calculus Make it Easy Gunner Christian
088 Visual Basic 2005 Express Antonie
096 Artificial Life : Volume 1 Gloria Virginia
Kunci Pencarian ? 088
Low ? 0
High ? 7
Posisi = (088 - 025) / (096 - 025) * (7 - 0) + 0 = [6]
Kunci[6] = kunci pencarian, data ditemukan : Visual Basic 2005
Kunci Pencarian ? 060
Low ? 0
High ? 7
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Posisi = (060 – 025) / (096 – 025) * (7 – 0) + 0 = [3]
Kunci[3] < kunci pencarian, maka teruskan
Low = 3 + 1 = 4
High = 7
Ternyata Kunci[4] adalah 063 yang lebih besar daripada 060.
Berarti tidak ada kunci 060.
Programnya:
int interpolationsearch(int key,int n){
int low,high,pos,i;
low=0;
high=n-1;
do{
pos = (key – data[low]) * (high – low) / data[high] –
data[low] + low;
if (data[pos] == key] return pos;
if (data[pos] > key) high = pos-1;
else
if (data[pos] < key) low = pos + 1;
} while(key >= data[low] && key <= data[high]);
return -1
}
Class
AlassbmiripbdenganbstructHbSalahbsatubperbedaaannyabadalahbìsifatbdasarîbdaribclassb
adalahbprivateHbPrivatebadalahbjenisbaksesbdaribsebuahbstrukturbdatab“sepertibstructbdanb
class”HbPembagianbtingkatbaksesbinibdibagibmenjadibBbbagianJ
? Public:bmemberbbisablangsungbdiaksesbdaribluarbolehbobjectnya
? Private:bmemberbhanyabbisabdiaksesbdaribmemberblainnyabdalambclassbdanbdarib
friendnya
? Protected:bsepertibprivate:btapibjugabbisabdibaksesbdaribmemberbdaribturunanbclassb
tersebut
Untukbmenentukanbjenisbñbjenisbaksesbinibdapatbjugabdibuatbsendiribdenganb
menuliskanbkeywordnya:bmasingbñbmasingbsesuaibdenganbnamanyaHbEefaultbdaribsebuahb
classbadalahbbersifatbprivateHbAontohJ
class(my_class({
((int(aW
((int(bW
((void(my_function(\int(arg~3(int(arg0f({
yydefinisi(fungsi
((}
}W
Jikabdefinisibdaribclassbsepertibdibatas:bmakabsemuabmembernyabbersifatbprivateHb
&edakanbdenganbcontohbdibbawahbiniJ
class(my_class({
((void(my_function(\int(arg~3(int(arg0f({
yydefinisi(fungsi
((}
((public:
((int(aW
((int(bW
}W
Eefinisibdibatasbbisabdiartikanbbahwabfungsibmy_functionbbersifatbprivateb
sedangkanbvariabelbabdanbbbyangbbersifatbpublicH
Constructor
Kegunaanbdaribconstructorbadalahbuntukbmelaksanakanbhalbñbhalbtertentubketikab
objectbdaribsebuahbclassbdideklarasikanHbNamabdaribconstructorbharusbsamabdenganbnamab
classnyaH
Destructor
EestructorbadalahbkebalikanbdaribconstructorHbKalaubconstructorbdipanggilbpadab
waktubobjectbdaribsuatubclassbdideklarasikan:bmakabdestructorbdipanggilbketikabobjectbdarib
classbtersebutbìdihancurkanî:bscopebpadabsebuahbfungsibsudahbberakhirb“misalnyabfungsib
tempatbobjectbitubdigunakanbtelahbsampaibpadabbatasbscopenya”HbEestructorbditandaib
denganbtandabì~îb“tilde”bdanbnamabdaribdestructorbharusbsamabdenganbnamabclassnyaH
Aonstructorbdanbdestructor:btidakbmengembalikanbnilaibapapunbjuga:bbahkanbvoidHb
Mengambilbcontohbdaribkodebyangbtelahbkitabgunakanbdibatas:bmakabcontohbdarib
constructorbdanbdestructorbadalahJ
=include(Ciostream>
using(namespace(stdW
=
KomunitasbeLearningbIlmuKomputerHAom
Aopyrightb©bO11BwO11=bIlmuKomputerHAom
class(my_class({
((((int(umurW
((((publicA
((((my_class}*intj;(yyconstructor
((((int(show_age\f({
((((((((return(umurW
((((}
((((~my_class*j;(yydestructor
((((
}W
my_classAAmy_class(\int(agef({
(((((yydefinisi
(((((umur(=(ageW
}
my_classAA~my_class\f({
((((yydefinisi
((((umur(=(!W
}
void(main(\f({
((((my_class(first\*&fW
((((cout(CC(first6show_age\f(CC(.\n.W
}
POINTER
Pointer adalah suatu variabel penunjuk yang menunjuk pada suatu alamat memori komputer tertentu. Pointer merupakan variabel level rendah yang dapat digunakan untuk menunjuk nilai integer, character, float, double, atau single, dan bahkan tipe-tipe data lain yang didukung oleh bahasa C. Variabel biasa, sifatnya statis dan sudah pasti, sedangkan pada pointer sifatnya dinamis dan dapat lebih fleksibel. Variabel pointer yang tidak menunjuk pada nilai apapun berarti memiliki nilai NULL, dan disebut sebagai dangling pointer karena nilainya tidak diinisialisasi dan tidak dapat diprediksi.
Pendeklarasian variabel pointer menggunakan tanda * sebelum nama variabelnya, sedangkan untuk menampilkan nilai yang ditunjuk oleh suatu variabel pointer, juga digunakan operator * (tanda asterisk). Jika diinginkan untuk menampilkan alamat tempat penyimpanan nilai yang ditunjuk oleh suatu variabel pointer, digunakan operator & (tanda ampersand).
Pada suatu tipe data array, variabel pointer hanya perlu menunjuk pada nama variabel arraynya saja tanpa perlu menggunakan tanda ampersand, atau menunjuk pada nama variabel array pada indeks yang ke nol nya. Untuk lebih jelasnya, silahkan lihat contoh berikut:
Pendeklarasian variabel biasa dan pointer:
//variabel biasa
int nilai1 = 4;
float nilai2 = 3.5;
char nama[10] = “anton”; //array of char (string)
//variabel pointer
int *nilai_p1; //dangling pointer
int *nilai_p2 = &nilai1; //menunjuk ke tipe data int
char *nilai_p3 = nama; //menunjuk ke tipe data array of char
char *nilai_p4 = &nama[0];
Ilustrasi Pointer:
Contoh program untuk dicoba:
#include
#include
int main(){
int nilai1 = 4;
int nilai2 = 5;
float nilai3 = 3.5;
char nama[11] = "abcdefghij";
int *nilai_p1 = &nilai1;
int *nilai_p2 = &nilai2;
char *nilai_p4 = nama;
float *nilai_p3= &nilai3;
printf("nilai 1=%d, alamat1=%p, ukuran %d\n",*nilai_p1,&nilai_p1, sizeof(nilai1));
printf("nilai 2 = %d, alamat2 = %p, ukuran %d\n",*nilai_p2,&nilai_p2,sizeof(nilai2));
printf("nilai 3 = %f, alamat3 = %p, ukuran %d\n",*nilai_p3,&nilai_p3,sizeof(nilai3));
printf("nilai 4 = %s, alamat4 = %p, ukuran %d\n",nama,&nilai_p4,sizeof(nama));
getch();
return 0;
}
Operasi pointer.
Operasi Pemberian nilai
Contoh 1:
#include
#include
int main(){
float nilai,*p1,*p2;
nilai = 14.54;
printf("nilai = %2.2f, alamatnya %p\n",nilai,&nilai);
p1 = &nilai;
printf("nilai p1 = %2.2f, p1 menunjuk alamat %p\n",*p1,p1);
//pada awalnya p2 masih dangling pointer
printf("mula-mula nilai p2 = %2.2f, p2 menunjuk alamat %p\n",*p2,p2);
p2 = p1; //operasi pemberian nilai, berarti alamat x2 sama dengan x1
printf("sekarang nilai p2 = %2.2f, p2 menunjuk alamat %p\n",*p2,p2);
getch();
}
Contoh 2:
#include
#include
int main(){
int *p,a=25,b;
//p masih dangling
printf("nilai a = %d di alamat a = %p,\n",a,&a);
printf("nilai p di alamat = %p\n",p);
p = &a;
printf("nilai p = %d di alamat %p\n",*p,p);
//b diisi dengan nilai yang berasal dari nilai
//variabel a yang ditunjuk oleh pointer p
b = *p;
printf("nilai b = %d di alamat %p\n",b,&b);
getch();
}
Contoh 3:
#include
#include
int main(){
int a=25,b=12,t;
int *p,*q;
p = &a;
q = &b;
printf("nilai yang ditunjuk p = %d di alamat %p\n",*p,p);
printf("nilai yang ditunjuk q = %d di alamat %p\n",*q,q);
//Contoh kasus, penukaran nilai 2 variabel dengan pointer
t = *p;
*p = *q;
*q = t;
printf("nilai yang ditunjuk p sekarang = %d di alamat %p\n",*p,p);
printf("nilai yang ditunjuk q sekarang = %d di alamat %p\n",*q,q);
getch();
}
Contoh 4:
#include
#include
int main(){
int a,*p;
p=&a;
*p=25;
printf("nilai a = %d",a);
}
Operasi Aritmatika
#include
#include
int main(){
int a,b=10,*p,*q;
p=&a;
*p=25;
printf("nilai a = %d\n",a);
printf("alamat p = %p\n",p);
q=&b;
printf("alamat q = %p\n",q);
printf("nilai a + b = %d\n",(*p+*q));
//posisi alamat p menjadi bergeser, nilai berubah
p=p+1;
printf("nilai p = %d, alamat = %p\n",*p,&p);
q=q-1;
printf("nilai q = %d, alamat = %p\n",*q,&q);
getch();
}
Pointer pada array 1 dimensi:
#include
#include
int main(){
char S[] = "anton";
char *p;
//cara 1
//langsung menunjuk nama array.
p=S;
for(int i=0;i<5;i++){
printf("%c",*p);
p++;
}
printf("\n");
//cara 2
p=&S[0];
for(int i=0;i<5;i++){
printf("%c",*p);
p++;
}
printf("\n");
//Membalik kalimat
p--;
for(int i=0;i<5;i++){
printf("%c",*p);
p--;
}
printf("\n");
getch();
}
Pointer pada Struct:
#include
#include
typedef struct{
int nim;
int umur;
float ipk;
} Mahasiswa;
Mahasiswa m;
Mahasiswa *p = &m;
int main(){
//struct biasa
m.nim=123;
m.ipk=3.2;
m.umur=23;
printf("nim = %d\n",m.nim);
printf("ipk = %f\n",m.ipk);
printf("umur = %d\n",m.umur);
//struct pointer
p->ipk = 3.5;
p->nim = 321;
p->umur = 32;
printf("nim = %d\n",p->nim);
printf("ipk = %f\n",p->ipk);
printf("umur = %d\n",p->umur);
//mengacu pada variabel aslinya
printf("nim = %d\n",m.nim);
printf("ipk = %f\n",m.ipk);
printf("umur = %d\n",m.umur);
getch();
}
Pengembangan:
Buatlah sebuah program untuk mengecek apakah suatu kata palindrom atau bukan, tanpa memperhatikan spasi dan huruf besar/kecilnya. Program dibuat dengan menggunakan template struct sebagai berikut:
typedef struct{
char elemen[30];
int jml_kata;
} Kata;
Kata kata;
Kata *p_kata=&kata;
Lanjutkanlah program berikut agar hasilnya sesuai dengan soal di atas:
#include
#include
typedef struct{
char elemen[30];
int jml_kata;
} Kata;
Kata kata;
Kata *p_kata=&kata;
int main(){
char kalimat[30];
p_kata->jml_kata=0;
char *p = p_kata->elemen;
printf("Masukkan kata : ");gets(kalimat);
fflush(stdin);
printf("Kalimat : %s\n",kalimat);
for(int i=0;i
*p=kalimat[i];
p_kata->jml_kata++;
p++;
}
p=p_kata->elemen;
//tampilkan kembali kalimat tersebut
for(int i=0;i<=p_kata->jml_kata;i++){
printf("%c ",*p);
p++;
}
//kembangkan….
getch();
}
Soal:
Buatlah program data KTP, dengan menggunakan pointer pada struct KTP sebagai berikut:
typedef struct
{
int tgl;
int bln;
int th;
}Tanggal;
typedef struct
{
char noID[5];
char nama[30];
char jenis_kelamin; //’L’ atau ‘P’
Tanggal t;
}KTP;
typedef struct
{
KTP ktp;
int jml;
}Data_KTP;
Data_KTP data_ktp;
Data_KTP *p;
Buatlah fungsi untuk:
Menambah data
Mencari data berdasarkan tahun kelahiran tertentu
Menampilkan data berdasarkan L dan P
Mengedit data
Semua pengaksesan dilakukan dengann menggunakan pointer.
PENDAHULUAN
Pengurutan data dalam struktur data sangat penting terutama untuk data yang bertipe data numerik ataupun karakter. Pengurutan dapat dilakukan secara ascending (urut naik) dan descending (urut turun). Pengurutan (Sorting) adalah proses pengurutan data yang sebelumnya disusun secara acak sehingga tersusun secara teratur menurut aturan tertentu
Contoh:
Data Acak : 5, 6, 8, 1, 3, 25, 10
Ascending : 1, 3, 5, 6, 8, 10, 25
Descending : 25, 10, 8, 6, 5, 3, 1
Deklarasi Array Untuk Sorting
Deklarasikan secara global:
int data[100];
int n; //untuk jumlah data
Prosedur Tukar 2 Buah Data
void tukar(int a,int b){
int tmp;
tmp = data[a];
data[a] = data[b];
data[b] = tmp;
}
BUBBLE SORT
Metode sorting termudah. Diberi nama “Bubble” karena proses pengurutan secara berangsur-angsur bergerak/berpindah ke posisinya yang tepat, seperti gelembung yang keluar dari sebuah gelas bersoda. Bubble Sort mengurutkan data dengan cara membandingkan elemen sekarang dengan elemen berikutnya. Jika elemen sekarang lebih besar dari elemen berikutnya maka kedua elemen tersebut ditukar, jika pengurutan ascending. Jika elemen sekarang lebih kecil dari elemen berikutnya, maka kedua elemen tersebut ditukar, jika pengurutan descending. Algoritma ini seolah-olah menggeser satu per satu elemen dari kanan ke kiri atau kiri ke kanan, tergantung jenis pengurutannya. Ketika satu proses telah selesai, maka bubble sort akan mengulangi proses, demikian seterusnya. Kapan berhentinya? Bubble sort berhenti jika seluruh array telah diperiksa dan tidak ada pertukaran lagi yang bisa dilakukan, serta tercapai perurutan yang telah diinginkan.
Proses 1
22 10 15 3 8 2
22 10 15 3 2↔ 8
22 10 15 2↔ 3 8
22 10 2↔15 3 8
22 2↔10 15 3 8
2 ↔22 10 15 3 8
Pada proses diatas, pegecekan dimulai dari data yang paling akhir, kemudian dibandingkan dengan data di depannya, jika data di depannya lebih besar maka akan ditukar.
Proses 2
2 22 10 15 3 8 à Tidak ada penukaran, karena 3 <8
2 22 10 15 3 8
2 22 10 3↔15 8
2 22 3↔10 15 8
2 3↔22 10 15 8 à Pengurutan berhenti di sini!
2 3 22 10 15 8
Pada proses kedua, pengecekan dilakukan sampai dengan data ke-2 karena data pertama pasti sudah paling kecil.
Proses 3
2 3 22 10 15 8
2 3 22 10 8↔15
2 3 22 8↔10 15
2 3 8↔22 10 15 à Pengurutan berhenti di sini!
2 3 8 22 10 15
2 3 8 22 10 15
Proses 4
2 3 8 22 10 15 à Tidak ada penukaran, karena 10 < 15
2 3 8 22 10 15
2 3 8 10↔22 15 à Pengurutan berhenti di sini!
2 3 8 10 22 15
2 3 8 10 22 15
2 3 8 10 22 15
Proses 5
2 3 8 10 22 15
2 3 8 10 15↔22 à Pengurutan berhenti di sini!
2 3 8 10 15 22
2 3 8 10 15 22
2 3 8 10 15 22
2 3 8 10 15 22
Prosedur Bubble Sort
void bubble_sort(){
for(int i=1;i
if(data[j]}
}
}
Dengan prosedur diatas, data terurut naik (ascending), untuk urut turun (descending), silahkan ubah bagian:
if (data[j]
Menjadi:
if (data[j]>data[j-1]) tukar(j,j-1);
“The bubble sort is an easy algorithm to program, but it is slower than many other sorts”
EXCHANGE SORT
Sangat mirip dengan Bubble Sort. Banyak yang mengatakan Bubble Sort sama dengan Exchange Sort.
Pebedaannya adalah dalam hal bagaimana membandingkan antar elemen-elemennya. Exchange sort membandingkan suatu elemen dengan elemen-elemen lainnya dalam array tersebut, dan melakukan pertukaran elemen jika perlu. Jadi ada elemen yang selalu menjadi elemen pusat (pivot). Sedangkan Bubble sort akan membandingkan elemen pertama/terakhir dengan elemen sebelumnya/sesudahnya, kemudian elemen sebelum/sesudahnya itu akan menjadi pusat (pivot) untuk dibandingkan dengan elemen sebelumnya/sesudahnya lagi, begitu seterusnya.
Contoh Data :
84, 69, 76, 86, 94, 91
Pivot (Pusat)
Proses 1
84 69 76 86 94 91
84 69 76 86 94 91
84 69 76 86 94 91
86 69 76 84 94 91
94 69 76 84 86 91
84 69 76 86 94 91
Pivot (Pusat)
Proses 2
94 69 76 84 86 91
94 76 69 84 86 91
94 84 69 76 86 91
94 86 69 76 84 91
94 91 69 76 84 86
Pivot (Pusat)
Proses 3
94 91 69 76 84 86
94 91 76 69 84 86
94 91 84 69 76 86
94 91 86 69 76 84
Pivot (Pusat)
Proses 4
94 91 86 69 76 84
94 91 86 76 69 84
94 91 86 84 69 76
Pivot (Pusat)
Proses 5
94 91 86 84 69 76
94 91 86 84 76 69
Prosedur Exchange Sort
void exchange_sort() {
for (int i=0; i
}
}
SELECTION SORT
Merupakan kombinasi antara sorting dan searching .Untuk setiap proses, akan dicari elemen-elemen yang belum diurutkan yang memiliki nilai terkecil atau terbesar akan dipertukarkan ke posisi yang tepat di dalam array. Misalnya untuk putaran pertama, akan dicari data dengan nilai terkecil dan data ini akan ditempatkan di indeks terkecil (data[0]), pada putaran kedua akan dicari data kedua terkecil, dan akan ditempatkan di indeks kedua (data[1]). Selama proses, pembandingan dan pengubahan hanya dilakukan pada indeks pembanding saja, pertukaran data secara fisik terjadi pada akhir proses.
Proses 1
0 1 2 3 4 5
32 75 69 58 21 40
Pembanding Posisi
32 < 75 0
32 < 69 0
32 < 58 0
32 > 21 (tukar idx) 4
21 < 40 4
Tukar data ke-0 (32) dengan data ke-4 (21)
0 1 2 3 4 5
21 75 69 58 32 40
Proses 2
0 1 2 3 4 5
21 75 69 58 32 40
Pembanding Posisi
75 > 69 (tukar idx) 2
69 > 58 (tukar idx) 3
58 > 32 (tukar idx) 4
32 < 40 4
Tukar data ke-1 (75) dengan data ke-4 (32)
0 1 2 3 4 5
21 32 69 58 75 40
Proses 3
0 1 2 3 4 5
21 32 69 58 75 40
Pembanding Posisi
69 > 58 (tukar idx) 3
58 < 75 3
58 > 40 5
Tukar data ke-2 (69) dengan data ke-5 (40)
0 1 2 3 4 5
21 32 40 58 75 69
Proses 4
0 1 2 3 4 5
21 32 40 58 75 69
Pembanding Posisi
58 < 75 3
58 < 69 3
Tukar data ke-3 (58) dengan data ke-3 (58)
0 1 2 3 4 5
21 32 40 58 75 69
Proses 5
0 1 2 3 4 5
21 32 40 58 75 69
Pembanding Posisi
75 > 69 5
Tukar data ke-4 (75) dengan data ke-5 (69)
0 1 2 3 4 5
21 32 40 58 69 75
Prosedur Selection Sort
void selection_sort(){
for(int i=0;i
for(int j=i+1;j
}
if(pos != i) tukar(pos,i);
}
}
INSERTION SORT
Mirip dengan cara orang mengurutkan kartu, selembar demi selembar kartu diambil dan disisipkan (insert) ke tempat yang seharusnya. Pengurutan dimulai dari data ke-2 sampai dengan data terakhir, jika ditemukan data yang lebih kecil, maka akan ditempatkan (diinsert) diposisi yang seharusnya. Pada penyisipan elemen, maka elemen-elemen lain akan bergeser ke belakang.
Proses 1
0 1 2 3 4 5
22 10 15 3 8 2
Temp Cek Geser
10 Temp<22? Data ke-0 ke posisi 1
Temp menempati posisi ke -0
0 1 2 3 4 5
10 22 15 3 8 2
Proses 2
0 1 2 3 4 5
10 22 15 3 8 2
Temp Cek Geser
15 Temp<22 Data ke-1 ke posisi 2
15 Temp>10 -
Temp menempati posisi ke-1
0 1 2 3 4 5
10 15 22 3 8 2
Proses 3
0 1 2 3 4 5
10 15 22 3 8 2
Temp Cek Geser
3 Temp<22 Data ke-2 ke posisi 3
3 Temp<15 Data ke-1 ke posisi 2
3 Temp<10 Data ke-0 ke posisi 1
Temp menempati posisi ke-0
0 1 2 3 4 5
3 10 15 22 8 2
Proses 4
0 1 2 3 4 5
3 10 15 22 8 2
Temp Cek Geser
8 Temp<22 Data ke-3 ke posisi 4
8 Temp<15 Data ke-2 ke posisi 3
8 Temp<10 Data ke-1 ke posisi 2
8 Temp>3 -
Temp menempati posisi ke-1
0 1 2 3 4 5
3 8 10 15 22 2
Proses 5
0 1 2 3 4 5
3 8 10 15 22 2
Temp Cek Geser
2 Temp<22 Data ke-4 ke posisi 5
2 Temp<15 Data ke-3 ke posisi 4
2 Temp<10 Data ke-2 ke posisi 3
2 Temp<8 Data ke-1 ke posisi 2
2 Temp<3 Data ke-0 ke posisi 1
Temp menempati posisi ke-0
0 1 2 3 4 5
2 3 8 10 15 22
Prosedur Insertion Sort
void insertion_sort(){
int temp;
for(int i=1;i
j = i -1;
while(data[j]>temp && j>=0){
data[j+1] = data[j];
j--;
}
data[j+1] = temp;
}
}
Program Lengkapnya :
#include
#include
int data[10],data2[10];
int n;
void tukar(int a,int b){
int t;
t = data[b];
data[b] = data[a];
data[a] = t;
}
void bubble_sort(){
for(int i=1;i
if(data[j]}
}
printf("bubble sort selesai!\n");
}
void exchange_sort(){
for (int i=0; i
}
}
printf("exchange sort selesai!\n");
}
void selection_sort(){
int pos,i,j;
for(i=0;i
for(j = i+1;j
}
if(pos != i) tukar(pos,i);
}
printf("selection sort selesai!\n");
}
void insertion_sort(){
int temp,i,j;
for(i=1;i
j = i -1;
while(data[j]>temp && j>=0){
data[j+1] = data[j];
j--;
}
data[j+1] = temp;
}
printf("insertion sort selesai!\n");
}
void Input(){
printf("Masukkan jumlah data = ");scanf("%d",&n);
for(int i=0;i
(i+1));scanf("%d",&data[i]);
data2[i] = data[i];
}
}
void AcakLagi(){
for(int i=0;i
}
Printf("Data sudah teracak!\n");
}
void Tampil(){
printf("Data : ");
for(int i=0;i
}
printf("\n");
}
void main(){
clrscr();
int pil;
do{
clrscr();
printf("1. Input Data\n");
printf("2. Bubble Sort\n");
printf("3. Exchange Sort\n");
printf("4. Selection Sort\n");
printf("5. Tampilkan Data\n");
printf("6. Acak\n");
printf("7. Exit\n");
printf("Pilihan = ");scanf("%d",&pil);
switch(pil){
case 1:Input();break;
case 2:bubble_sort();break;
case 3:exchange_sort();break;
case 4:selection_sort();break;
case 5:Tampil();break;
case 6:AcakLagi();break;
}
getch();
}while(pil!=7);
}
Tabel Perbandingan Kecepatan Metode Pengurutan Data
Untuk data sejumlah 10.000 data pada komputer Pentium II 450 MHz
Metode Waktu (detik)
Data Acak Data Ascending Data Descending
Bubble Sort 11,2 1,32 19,77
Insertion Sort 1,09 0,00 2,25
Selection Sort 1,32 1,32 19,77
SEARCHING
Binary Search
Adalah teknik pencarian data dalam array dengan cara membagi array menjadi dua bagian setiap kali terjadi proses pengurutan. Prinsip pencarian biner adalah:
· Data diambil dari posisi 1 sampai posisi akhir N
· Kemudian cari posisi data tengah dengan rumus (posisi awal + posisi akhir) / 2
· Kemudian data yang dicari dibandingkan dengan data yang di tengah, apakah sama atau lebih kecil, atau lebih besar?
· Jika lebih besar, maka proses pencarian dicari dengan posisi awal adalah posisi tengah + 1
· Jika lebih kecil, maka proses pencarian dicari dengan posisi akhir adalah posisi tengah – 1
· Jika data sama, berarti ketemu.
Contoh Data:
Misalnya data yang dicari 17
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A B C
Karena 17 > 15 (data tengah), maka: awal = tengah + 1
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A B C
Karena 17 < 23 (data tengah), maka: akhir = tengah – 1
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A=B=C
Karena 17 = 17 (data tengah), maka KETEMU!
Programnya:
int binary_search(int cari){
int l,r,m;
l = 0;
r = n-1;
int ktm = 0;
while(l<=r && ktm==0){
m = (l+r)/2;
if(data[m] == cari) ktm=1;
else if (cari < data[m]) r=m-1;
else l=m+1;
}
if(ktm==1) return 1; else return 0;
}
Operasi“dasar“file“pada“prinsipnya“terbagi“menjadi“I“tahap+“yaituJ membuka“atau“mengaktifkan“file melaksanakan“pemrosesan“file menutup“dile
A.(Membuka(file
Sebelum“suatu“file“dapat“diproses+“file“harus“dibuka“terlebih“dahuluF“Sebelum“file
ibuka+“terlebih“dahulu“obyek“file“harus“didefinisikanF“SintaksnyaJ
ofstream{nama_obyek;
erintah“ofstream“dapat“dijalankan“dengan“menyertakan“file“header“fstream.h
Setelah“itu+“suatu“file“dapat“dibuka“dengan“perintah
nama_obyekwopen,ìnama{file{dan{pathî-;
B.(Menulis(ke(File
Salah“satu“jenis“pemrosesan“pada“file“adalah“menulis“atau“merekam“data“ke“fileF
SintaknyaJ
nama_obyek{<<{www{;
C.(Menutup(File
Setelah“pemrosesan“file“selesai+“file“dapat“ditutup“menggunakan“perintah
nama_obyekwclose,-;
Xontoh“5Frogram“berikut“ini“untuk“menulis“teks“ke“dalam“file
/include
/include
void{main,-
{
{ofstream{fileteks;
{filetekswopen,ìC:zalgowtxtî-;
{fileteks{<<{ìUntuk{mencapai{tujuan{yg{besarA{maka{tujuan{ituî
{{{{{{{{{{<<{endl;
{fileteks{<<{ìharus{dibagiKbagi{menjadi{tujuan{kecilî<<{endl;
{fileteks{<<{ìsampai{tujuan{itu{merupakan{tujuan{yg{dapat{ì
{{{{{{{{{{<<{ìdicapaiî{<<{endl;
{fileteks{<<{ìberdasarkan{kondisi{dan{potensi{yg{dimiliki{saat{ì
{{{{{{{{{{<<{itu{ì{<<{endl;
{filetekswclose,-;
}
perintah“fileteksFopencìXJMalgoFtxtî2K“akan“membuka“file“algoFtxt“yang“ada“di“XJ\“
Vpabila“file“tersebut“belum“ada“maka“akan“dibuat“secara“otomatis+“dan“apabila
sudah“ada“isi“file“algoFtxt“akan“terhapusF
D.(Menambah(Data(pada(File
Suatu“file“yang“sudah“ada“sebelumnya“dapat“ditambah“data“yang“baru“ctidak
menghapus“data“lama2F““Xaranya“dengan“menambahkan“perintah“ios::app“pada
openc2F
nama_obyekwopen,ìnama{fileîA{ios::app-;
Xontoh“BF
/include
/include
void{main,-
{
{ofstream{fileteks;
{filetekswopen,ìC:zalgowtxtîA{ios::app-;
{fileteks{<<{endl;
{fileteks{<<{ìOleh:{Al{Khowarizmi{<<{endl;
{filetekswclose,-;
}
E.(Memeriksa(Keberhasilan(Operasi(File
Tidak“selamanya“jalan“yang“mulus“ditemuiF“Vda“kemungkinan“terjadi“saat“file
dibuka+“ternyata“file“tidak“adaF“Yalam“XDD“tersedia“function“untuk“memeriksa
kondisi-kondisi “ pada “ operasi “ file+ “ sehingga “ kesalahan “ saat “ eksekusi “ dapa
dikendalikanF
Function“yang“dimaksud“adalah“fail()F
Xontoh“IJ
/include
/include
void{main,-
{
{ifstream{fileteks;{{{ifstream{digunakan{uz{membaca{file{}
{filetekswopen,ìC:zalgowtxtî-;
{if{,filetekswfail,--{cout{<<{ìMaaf{file{takdapat{dibukazî{{
{{{{{{{{{{{{{{{{{{{{{{{{{{{<<{ìtidak{ditemukanî;
{filetekswclose,-;
}
F.(Operasi(Berbasis(Karakter
Operasi “ file “ dapat “ dilakukan “ dalam “ bentuk “ karakterF “ Misalnya “ proses
penyimpanan“data“ke“file“dilakukan“setiap“karakter+“atau“membaca“data“file
karakter“per“karakterF“Operasi“ini“didukung“oleh“function“put()“dan“get()F
Xontoh“‘J
Program“untuk“menyimpan“data“karakter“per“karakter“ke“dalam“fileF
/include
/include
void{main,-
{
{ofstream{fileteks;
{filetekswopen,ìC:zcontohwtxtî-;
{filetekswput,ëAí-;
{filetekswput,ëBí-;
{filetekswput,ëCí-;
{filetekswclose,-;
}
Xontoh“’F
Program“untuk“membaca“file“karakter“per“karakter
/include
/include
void{main,-
{
{{char{karakter;
{{ifstream{fileteks;{{}
{{filetekswopen,ìC:zcontohwtxtî-;
{
{{while,Cfileteksweof,--{
{{{
{{{{filetekswget,karakter-;
{{{{cout{<<{karakter;
{{}
{{filetekswclose,-;
}
Latihan.
5F Wuatlah“program“XDD“untuk“menghitung“jumlah“karakter“dalam“suatu“fileF
Inputnya“adalah“nama“file“dan“pathnyaF
BF Wuatlah“program“XDD“untuk“menghitung“jumlah“karakter“tertentu+“misalnya
karakter“ëVíF“Input“berupa“nama“file“dan“karakter“yang“akan“dihitungF
IF Misalkan“suatu“file“teks“berisi“listing“program“XDDF“Wuatlah“program“untuk
menghitung“pasangan“kurung“kurawal“yang“ada“pada“file“teks“tersebutF
‘F Wuatlah“program“XDD“untuk“melakukan“enkripsi“shift“chiper“suatu“file“teks
cdengan“asumsi“semua“karakter“huruf“adalah“huruf“kapital2F“Inputnya“adalah
file“teks“yang“akan“dienkripsi“dan“besar“pergeseran“cinteger2F“Outputnya
adalah“file“teks“hasil“enkripsiF
HintJ
Ide“dasar“shift“chiper“adalah“mengubah“setiap“karakter“huruf“ke“karakter
huruf“lainF“Misalkan“pergeserannya“B+“maka“berikut“ini“karakter“hasil“enkripsi
awal V W X Y Z F G H I J K L M N O P Q R S T U V W X Y Z
hasil X Y Z F G H I J K L M N O P Q R S T U V W X Y Z V W
Sehingga“misal“diberikan“suatu“teks“XDD“IS“ZVSY+“maka“hasil“enkripsinya
adalah“ZDD“KU“GXUV
1. Linear search
Syarat
Tabel : Sort / bebas
Data masukan banyak : sort / bebas
Tabel Data
A D
C B
D
B
E
Ciri : Selalu kembali keasal pencarian untuk data berikutnya.
2. Sequential search
Syarat
Tabel : Sort
Data masukan banyak : Sort
Tabel Data
A B
B D
C
D
E
Ciri : pencarian data kedua mulai dari data pertama yang telah dite
Misal:
3. Binary search
Batas bawah = 0
Syarat
Batas atas = 7, jika ganjil + 1
Tabel : Sort
Indeks = (BB + BA)/2=4
Data masukan banyak : Bebas
Lanjut……..
Tabel Data
Batas bawah = 4
A D
Batas atas = tetap
B B
Indeks = (BB + BA)/2=6……t
C
bagi sampai ketemu
D
E
Ciri : pencarian data memba
F
menjadi dua, kemudian mem
G
hasil baginya terus sampai k
Potongan Algor binary
Array tabel[8], Input(data)
nt kiri=1, kanan=n, Cari=0;
While (cari <> 0 and kiri<=kanan)
Lokasi=(kiri+kanan)/2;
F tabel[lokasi]=cari then
Cari=1;
ELSE
If tabel[lokasi] <>
Kiri = lokasi + 1;
Else
Kanan = lokasi -1;
Endif
Endif
IF Cari=1 then
Idx=lokasi;
Else
Output(tidak ditemukan);
Endif
#include
#include
int BinarySearch(int [], int, int);
int main()
{
clrscr();
const int NUMEL = 10;
int nums[NUMEL] = {5,10,22,32,45,67,73,98,99,101};
int item, location;
cout << "Enter the item you are searching for: ";
cin >> item;
location = BinarySearch(nums, NUMEL, item);
if (location > -1)
cout << "The item was found at index location "<< location <<
endl;
else
cout << "The item was not found in the list\n";
getch();
return 0;
}
// this function returns the location of key in the list
// a -1 is returned if the value is not found
int BinarySearch(int list[], int size, int key)
{
int left, right, midpt;
left = 0;
right = size - 1;
while (left <= right)
{
midpt = (int) ((left + right) / 2);
if (key == list[midpt])
{
return midpt; //data is found
}
D:\My Documents\algor\algor2\Search.doc Created by Yokivox
else if (key > list[midpt])
left = midpt + 1;
else
right = midpt - 1;
}
return -1; //return indicate that data is’t found
}
REFRESH!
- Function yang telah kita pelajari adalah kumpulan instruksi yang digunakan untuk
melaksanakan suatu maksud tertentu dan diberi nama yang unik.
- Function ada yang mengembalikan nilai (non-void) dan ada yang tidak mengembalikan
nilai (void)
Contoh:
int Kali(int a,int b){
return a*b;
}
Atau seperti ini:
void ShowError(){
printf(“Error on line %d: %s”,Error.line,Error.message);
}
- Variabel-variabel yang ada di dalam function bersifat lokal untuk fungsi tersebut saja,
sedangkan nilai kembalian fungsi akan dikenal pada fungsi yang memanggil fungsi
tersebut.
#include
#include
int d=3,e=1;
void coba_lokal(int a,int b){
int c = 0;
int d = 10;
int e;
e = (a+b) * (c+d);
printf("lokal a = %d\n",a);
printf("lokal b = %d\n",b);
printf("lokal c = %d\n",c);
printf("lokal d = %d\n",d);
printf("lokal e = %d\n",e);
}
void main(){
int a=2;
int b;
b = 4;
int c=0;
printf("main a = %d\n",a);
printf("main b = %d\n",b);
coba_lokal(a,b);
printf("main c = %d\n",c);
printf("global d = %d\n",d);
printf("global e = %d\n",e);
getch();
}
- Function boleh memiliki parameter ataupun tidak memiliki parameter satupun
- Parameter dalam function terdiri dari 2 jenis:
o Parameter Formal: yaitu parameter yang tertulis dalam definisi fungsi.
o Parameter Aktual: yaitu parameter yang merupakan inputan langsung pada
saat penggunakan fungsi tersebut. Dapat berupa variabel maupun langsung
berupa value.
Contoh:
#include
int JUMLAH(int X, int Y);
X, Y disebut parameter formal
void main(){
int A,B,T;
Variabel A,B,C lokal dalam main
A=5; B=2;
T = JUMLAH(A,B);
A dan B disebut parameter aktual
printf(“%d”,T);
}
X, Y disebut parameter formal
int JUMLAH(int X, int Y){
int H;
Variabel X,Y lokal dalam JUMLAH
H = X + Y;
return(H);
}
Pengiriman Parameter ke suatu Function secara nilai (By Value)
- Yang dikirimkan ke fungsi adalah nilainya, bukan alamat memori letak dari datanya
- Fungsi yang menerima kiriman nilai ini akan menyimpannya di alamat terpisah dari
nilai aslinya yang digunakan oleh program yang memanggil fungsi tersebut
- Karena itulah pengubahan nilai di dalam fungsi tidak akan berpengaruh pada nilai
asli di program yang memanggil fungsi walaupun keduanya menggunakan nama
variabel yang sama
Contoh
#include
#include
int a=4;
void getAGlobal(){
printf("A Global adalah %d alamatnya %p\n",a,&a);
}
void fungsi_by_value(int a){
a = a * 3;
printf("A by value adalah = %d alamatnya adalah %p\n",a,&a);
}
Pengiriman
satu arah
void main(){
int a = 5;
getAGlobal();
printf("A main adalah = %d alamatnya adalah %p\n",a,&a);
fungsi_by_value(a);
printf("A main setelah fungsi dipanggil adalah = %d
alamatnya adalah %p\n",a,&a);
getch();
}
Hasil:
Di dalam Memori:
a di global a di main a di a di main after
nilai 4 nilai 5
fungsi_by_value function
nilai 15 nilai 5
alamat 252F:0076 alamat 252F:2294
alamat alamat
252F:2292 252F:2294
- Pengiriman by value adalah pengiriman searah, dari program pemanggil fungsi ke
fungsi yang dipanggilnya
- Pengiriman by value dapat dilakukan untuk suatu statement, tidak hanya untuk suatu
variabel, value, array atau konstanta saja.
...
void fungsi_by_value(int a){
a = a * 3;
printf("A by value adalah = %d alamatnya adalah %p\n",a,&a);
}
void main(){
int a = 5;
getAGlobal();
printf("A main adalah = %d alamatnya adalah %p\n",a);
fungsi_by_value(5*a+1);
Statement
getch();
}
...
- Secara default, C menggunakan parameter by value untuk pembuatan fungsi-
fungsinya.
Contoh lain:
#include
#include
void Secara_Nilai(float a,float b,char c){
float *Alamat_A;
Alamat_A = &a;
a = 7;
printf("Lokal A = %f, alamat A = %p\n",a,Alamat_A);
printf("Lokal B = %f\n",b);
printf("Lokal C = %c\n",c);
}
void main(){
float a=25,*Alamat_A;
char c = 'a';
Alamat_A = &a;
Secara_Nilai(a,a/3,c);
printf("Main A = %f, alamat A = %p\n",a,Alamat_A);
printf("Main A/3 = %f\n",(a/3));
printf("Main C = %c\n",c);
getch();
}
Hasil:
Dapat disimpulkan sebagai berikut:
1. Parameter aktual yang dikirimkan adalah datanya, yaitu Secara_Nilai(a,a/3,c)
2. Alamat nilai a pada main dan a pada fungsi Secara_Nilai berbeda, yaitu
2447:2456 dan 2447:2466
3. Perubahan nilai a dalam fungsi Secara_Nilai menjadi 7 tidak mengubah nilai a
pada main yaitu tetap 25
4. Pengirimannya satu arah
Secara_Nilai(a,a/3,c)
Secara_Nilai(float a,float b,char c)
5. Pengiriman parameter dapat berupa ungkapan (statement) yaitu a/3
Pengiriman Parameter secara Acuan (by Reference)
1. Yang dikirimkan adalah alamat memori letak dari nilai datanya, bukan nilai datanya
2. Fungsi yang menerima parameter ini akan menggunakan alamat yang sama dengan
alamat nilai datanya
3. Karena itulah pengubahan nilai di fungsi akan mengubah juga nilai asli di program
pemanggil fungsi tersebut
4. Pengiriman parameter by reference adalah pengiriman dua arah, yaitu dari program
pemanggil fungsi ke fungsi dan sebaliknya dari fungsi ke program pemanggilnya
5. Pengiriman parameter by reference tidak dapat digunakan untuk suatu ungkapan,
hanya bisa untuk variabel, konstanta atau elemen array saja
Contoh1:
#include
#include
int a=4;
void getAGlobal(){
printf("A Global adalah %d alamatnya %p\n",a,&a);
}
Menggunakan
void fungsi_by_ref(int *a){
asteris/bintang (*)
*a = *a * 3;
printf("A by ref adalah = %d alamatnya adalah %p\n",*a,a);
}
Menggunakan
void main(){
asteris/bintang (*)
int a = 5;
getAGlobal();
printf("A main adalah = %d alamatnya adalah %p\n",a,&a);
fungsi_by_ref(&a);
printf("A main setelah fungsi dipanggil adalah = %d alamatnya
adalah %p\n",a,&a);
getch();
}
Hasil1:
Di dalam Memori:
a di global a di main a di a after
nilai 4 nilai 5
fungsi_by_value fungsi_by_ref
nilai 15 nilai 15
alamat 2487:0076 alamat 2487:2292
alamat alamat
2487:2292 2487:2292
Contoh lain:
Menggunakan
#include
asteris/bintang (*)
#include
void Secara_Acuan(float *a,float b,char *c){
float *Alamat_A;
Tanpa
Alamat_A = a;
asteris/bintang (*)
*a = 7;
printf("Lokal A = %f, alamat A = %p\n",*a,Alamat_A);
printf("Lokal B = %f\n",b);
printf("Lokal C = %c\n",*c);
}
void main(){
float a=25,*Alamat_A;
char c = 'a';
Alamat_A = &a;
Secara_Acuan(&a,a/3,&c);
printf("Main A = %f, alamat A = %p\n",a,Alamat_A);
printf("Main A/3 = %f\n",(a/3));
printf("Main C = %c\n",c);
getch();
}
Hasil:
Kesimpulan:
1. Operator pada pengiriman parameter by reference adalah menggunakan operator ‘&’
yang berarti mengacu pada alamat memori dari variabel tersebut.
2. Parameter aktual yang dikirimkan adalah alamat memori, yaitu
Secara_Acuan(&a,a/3,&c)
3. Alamat nilai a pada main dan a pada fungsi Secara_Acuan sama, yaitu 23C7:2466
4. Perubahan nilai a dalam fungsi Secara_Acuan menjadi 7 juga mengubah nilai a pada
main yang semula 25 menjadi 7
5. Pengirimannya dua arah
Secara_Acuan (&a,a/3,&c)
Secara_Nilai(float *a,float b,char *c)
6. Pengiriman parameter tidak dapat berupa ungkapan (statement), sehingga untuk
statement a/3 harus berupa parameter by value
Pengiriman Parameter berupa Array berdimensi satu
- Pengiriman ini adalah pengiriman by reference, karena yang dikirimkan sebenarnya
adalah alamat dari elemen pertama array yang digunakan sebagai parameter, bukan
seluruh nilai elemen-elemennya.
- Alamat elemen pertama array dapat ditulis dengan menyebutkan nama array tanpa
menuliskan indeksnya.
Contoh1:
#include
#include
Tanpa parameter
void Cetak_Mundur(char S[]){
int n;
//menghitung panjang string dimasukkan ke n
for(n=0;S[n]!='\0';n++);
for(int i=n-1;i>=0;i--) printf("%c",S[i]);
}
void main(){
char S[] = "universitas kristen duta wacana";
printf("String mula-mula = %s\n",S);
printf("String terbalik = ");
Parameter aktual
Cetak_Mundur(S);
getch();
}
Hasil:
Contoh2:
#include
#include
void Balik_Huruf(char S[]){
int n;
//menghitung panjang string dimasukkan ke n
for(n=0;S[n]!='\0';n++);
for(int i=0;i
//diubah menjadi huruf besar
else if(S[i]>='A' && S[i]<='Z') S[i] = S[i] - 'A' + 'a';
//diubah menjadi huruf kecil
}
}
void main(){
char S[] = "UniVersiTas KriSteN DutA WaCanA";
printf("String mula-mula = %s\n",S);
printf("String hasil = ");
Balik_Huruf(S);
printf("%s",S);
getch();
}
Hasil:
Contoh3:
#include
#include
void Masukkan_Data(int data[],int jml){
for(int i=0;i
}
}
int Hitung_Total(int data[],int jml){
int t = 0;
for(int i=0;i
}
return t;
}
void main(){
int n;
int total;
int data[10];
printf("Jumlah data = ");scanf("%d",&n);
Masukkan_Data(data,n);
total = Hitung_Total(data,n);
printf("Total data = %d",total);
getch();
}
Hasil:
Pengiriman Parameter berupa Array dua dimensi
- Pengiriman parameter berupa array 2 dimensi hampir sama dengan pengiriman
parameter array satu dimensi
- Perbedaannya: menyebutkan baris dan kolom array dimensi dua tersebut
- Mendeklarasikan MAX_ROWS dan MAX_COLS yang digunakan untuk pengiriman
parameter array dua dimensi
- Pada saat pengiriman parameter formal array dua dimensi, kita harus menyebutkan
banyaknya dimensi array untuk kolom, sehingga ukuran kolom dapat diketahui. Hal ini
berkaitan dengan pemesanan variabel array di memori
Contoh:
#include
#include
#define MAX_COLS 10
#define MAX_ROWS 10
void Masukkan_Data(int data[][MAX_COLS],int m,int n){
for(int i=0;i
",i+1,j+1);scanf("%d",&data[i][j]);
}
}
}
int Hitung_Total(int data[][MAX_COLS],int m,int n){
int t = 0;
for(int i=0;i
}
}
return t;
}
void main(){
int m,n;
int total;
int data[MAX_ROWS][MAX_COLS];
printf("Jumlah baris = ");scanf("%d",&m);
printf("Jumlah kolom = ");scanf("%d",&n);
Masukkan_Data(data,m,n);
total = Hitung_Total(data,m,n);
printf("Total data = %d",total);
getch();
}
REFRESH ARRAY
- Selama ini kita menggunakan satu variabel untuk menyimpan 1 buah nilai
dengan tipe data tertentu.
- Misalnya :
int a1, a2, a3, a4, a5;
Deklarasi variabel diatas digunakan untuk menyimpan 5 data integer
dimana masing-masing variabel diberi nama a1, a2, a3, a4, dan a5.
- Jika kita memiliki 10 data, 100 data integer bahkan mungkin data yang
ingin kita proses tidak kita ketahui atau bersifat dinamis? Kita tidak
mungkin menggunakan variabel seperti diatas.
- Di dalam C dan pemrograman yang lain, terdapat suatu fasilitas untuk
menyimpan data-data yang bertipe data sama dengan suatu nama
tertentu.
DEFINISI ARRAY
- Array adalah suatu tipe data terstuktur yang berupa sejumlah data sejenis
(bertipe data sama) yang jumlahnya bisa statis ataupu dinamis dan diberi
suatu nama tertentu.
- Elemen-elemen array tersusun secara berderet dan sekuensial di dalam
memori sehingga memiliki alamat yang besebelahan/berdampingan.
- Array dapat berupa array 1 dimensi, 2 dimensi, bahkan n-dimensi.
- Elemen-elemen array bertipe data sama tapi bisa bernilai sama atau
berbeda-beda.
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
0 1 2 3 4 5 6 7
indeks
8 10 6 -2 11 7 1 100
value
alamat
ffea ffeb ffec ffed ffef fffa fffb fffc
CARA PENGAKSESAN ELEMEN ARRAY
- Elemen-elemen array dapat diakses oleh program menggunakan suatu
indeks tertentu
- Pengaksesan elemen array dapat dilakukan berurutan atau random
berdasarkan indeks tertentu secara langsung.
- Pengisian dan pengambilan nilai pada indeks tertentu dapat dilakukan
dengan mengeset nilai atau menampilkan nilai pada indeks yang
dimaksud.
- Dalam C, tidak terdapat error handling terhadap batasan nilai indeks,
apakah indeks tersebut berada di dalam indeks array yang sudah
didefinisikan atau belum. Hal ini merupakan tanggung jawab programmer.
Sehingga jika programmer mengakses indeks yang salah, maka nilai yang
dihasilkan akan berbeda atau rusak karena mengakses alamat memori
yang tidak sesuai.
DEKLARASI ARRAY 1 DIMENSI
tipe_data nama_var_array[ukuran];
tipe_data : menyatakan jenis tipe data elemen larik (int, char, float, dll)
nama_var_array : menyatakan nama variabel yang dipakai.
ukuran : menunjukkan jumlah maksimal elemen larik.
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Contoh:
char huruf[9];
int umur[10];
int kondisi[2] = {0,1}
int arr_dinamis[] = {1,2,3}
char huruf[9]: berarti akan memesan tempat di memori komputer sebanyak 9 tempat
dengan indeks dari 0-8, dimana semua elemennya bertipe data karakter
semuanya. Kalau satu karakter berukuran 1 byte, berarti membutuhkan
memori sebesar 9 byte.
int umur[10]: berarti akan memesan tempat di memori komputer sebanyak 10 tempat
dengan indeks dari 0-9, dimana semua elemennya bertipe data integer
semuanya. Kalau satu integer berukuran 4 bytes, berarti membutuhkan
memori sebesar 4 x 10 = 20 bytes.
int kondisi[2]: berarti akan memesan tempat di memori komputer sebanyak 2 tempat
dengan indeks 0-1, dimana semua elemennya bertipe data integer
semuanya. Dan pada contoh di atas isi elemen-elemennya yang
sebanyak 2 buah diisi sekaligus (diinisialisasi) yaitu pada elemen
kondisi[0] bernilai 0, dan elemen kondisi[1] bernilai 1.
int arr_dinamis[]:berarti mendeklarasikan array dengan ukuran maksimum array tidak
diketahui, namun ukuran tersebut diketahui berdasarkan inisialisasi yaitu
sebanyak 3 elemen, yang isinya 1,2, dan 3.
Kita tidak dapat mendeklarasikan array dinamis tanpa inisialisasi!
PENJELASAN ARRAY 1 DIMENSI
- Tanda [] disebut juga “elemen yang ke- ... Misalnya kondisi[0] berarti
elemen yang ke nol.
- Array yang sudah dipesan, misalnya 10 tempat tidak harus diisi
semuanya, bisa saja hanya diisi 5 elemen saja, baik secara berurutan
maupun tidak. Namun pada kondisi yang tidak sepenuhnya terisi
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
tersebut, tempat pemesanan di memori tetap sebanyak 10 tempat, jadi
tempat yang tidak terisi tetap akan terpesan dan dibiarkan kosong.
Contoh 1 (variabel array dan variabel biasa)
//Dengan variabel biasa:
int x1=3,x2=5,x3=2,x4=7,x5=9;
//Dengan larik:
int x[5]={3,5,2,7,9};
Bagaimana jika kita ingin menghitung total dari variabel biasa?
total = x1 + x2 + x3 + x4 + x5;
Contoh 2 (menginputkan dan menampilkan array)
#include
#include
void main()
{ int nilai[5], x;
clrscr();
printf(“Memasukkan nilai :\n”);
for(x=0;x<5;x++)
{
printf(“Nilai Angka : “); scanf(“%d”,&nilai[x]);
}
printf(“\n”);
printf(“Membaca nilai :\n”);
for(x=0;x<5;x++)
{
printf(“Nilai Angka : %d“,nilai[x]);
}
getch();
Hasilnya
}
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Contoh 3 (manipulasi array 1 dimensi)
#include
#include
int main(){
int bil[7],i;
printf("elemen 1 ? ");scanf("%d",&bil[0]);
bil[1] = 5;
bil[2] = bil[1] + 20;
for(i=4;i<7;i++) bil[i] = i*10;
bil[3] = bil[bil[1]];
for(i=0;i<7;i++) printf("bil[%d] = %d dan alamatnya: %X\n",i,bil[i],&bil[i]);
getch();
return 0;
}
Hasilnya:
Terlihat bahwa alamat array berurutan dengan jarak antar alamat adalah 4
bytes (integer berukuran 4 bytes)
Contoh 4 (tanpa inisialisasi langsung ditampilkan)
#include
#include
int main(){
int bil[7]; //tanpa inisialisasi
for(int i=0;i<7;i++){
printf("Elemen ke-%i = %d\n",i,bil[i]);
}
getch();
return 0;
}
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Hasilnya:
Contoh 5 (inisialisasi dengan 0)
#include
#include
int main(){
int bil[7] = {0}; //inisialisasi 0
for(int i=0;i<7;i++){
printf("Elemen ke-%i = %d\n",i,bil[i]);
}
getch();
return 0;
}
Hasilnya:
Contoh 6 (inisialisasi hanya 2 elemen pertama)
#include
#include
int main(){
int bil[7] = {2,5};
for(int i=0;i<7;i++){
printf("Elemen ke-%i = %d\n",i,bil[i]);
}
getch();
return 0;
}
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Hasilnya:
Contoh 7 (karakter yang tidak diinisialisasi)
#include
#include
int main(){
char h[5];
for(int i=0;i<5;i++){
printf("Elemen ke-%i = %c\n",i,h[i]);
}
getch();
return 0;
}
Hasilnya:
Operasi Elemen-elemen Array
- Penambahan elemen array
- Menampilkan elemen array
- Pencarian elemen array
o Jika ditemukan, katakan KETEMU!
- Penghapusan elemen array
o Cari, jika ditemukan baru dihapus.
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
o Penghapusan elemen array pada dasarnya tidak ada!
o Yang ada adalah pe-replace-an isi elemen array yang akan dihapus
oleh elemen-elemen berikutnya.
Ilustrasi penghapusan data 11 (elemen ke-4), n = 8:
0 1 2 3 4 5 6 7
indeks
8 10 6 -2 11 7 1 100
value
alamat
ffea ffeb ffec ffed ffef fffa fffb fffc
Pengeseran elemen, n = 7:
0 1 2 3 4 5 6 7
indeks
value
alamat
ffea ffeb ffec ffed ffef fffa fffb fffc
- Pengeditan elemen array
o Cari, jika ditemukan baru diedit dengan elemen yang baru.
o Pengisian elemen baru sama saja melakukan pe-replace-an data
pada indeks elemen yang diedit.
Pengertian Searching
- Pada suatu data seringkali dibutuhkan pembacaan kembali informasi
(retrieval information) dengan cara searching.
- Searching adalah pencarian data dengan menelusuri tempat pencarian
data tersebut.
- Tempat pencarian data tersebut dapat berupa array dalam memori, bisa
juga pada file pada external storage.
Teknik-teknik Searching
1. Sequential Search
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
2. Binary Search
3. Interpolation Search
4. Quick Search
Sequential Search
- Adalah suatu teknik pencarian data dalam array ( 1 dimensi ) yang akan
menelusuri semua elemen-elemen array dari awal sampai akhir, dimana
data-data tidak perlu diurutkan terlebih dahulu.
- Kemungkinan terbaik (best case) adalah jika data yang dicari terletak di
indeks array terdepan (elemen array pertama) sehingga waktu yang
dibutuhkan untuk pencarian data sangat sebentar (minimal).
- Kemungkinan terburuk (worst case) adalah jika data yang dicari terletak di
indeks array terakhir (elemen array terakhir) sehingga waktu yang
dibutuhkan untuk pencarian data sangat lama (maksimal).
Misalnya terdapat array satu dimensi sebagai berikut:
0 1 2 3 4 5 6 7
indeks
8 10 6 -2 11 7 1 100
value
alamat
ffea ffeb ffec ffed ffef fffa fffb fffc
Kemudian program akan meminta data yang akan dicari, misalnya 6.
Jika ada maka akan ditampilkan tulisan “ADA”, sedangkan jika tidak ada
maka akan ditampilkan tulisan “TIDAK ADA”.
#include
#include
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
void main(){
clrscr();
int data[8] = {8,10,6,-2,11,7,1,100};
int cari;
int flag=0;
printf("masukkan data yang ingin dicari = ");scanf("%d",&cari);
for(int i=0;i<8;i++){
if(data[i] == cari) flag=1;
}
if(flag==1) printf("Data ada!\n");
else printf("Data tidak ada!\n");
- Dari program diatas, terlihat bahwa dilakukan perulangan untuk
mengakses semua elemen array data satu persatu berdasarkan
indeksnya.
- Program menggunakan sebuah variabel flag yang berguna untuk menadai
ada atau tidaknya data yang dicari dalam array data. Hanya bernilai 0
atau 1.
- Flag pertama kali diinisialiasasi dengan nilai 0.
- Jika ditemukan, maka flag akan diset menjadi 1, jika tidak ada maka flag
akan tetap bernilai 0.
- Semua elemen array data akan dibandingkan satu persatu dengan data
yang dicari dan diinputkan oleh user.
Question: Bagaimana jika data yang dicari ditemukan maka data tersebut
ditampilkan terletak di indeks ke berapa?
Hint: Gunakan indeks array!
Problem: Apakah cara di atas efisien? Jika datanya ada 10000?
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Solution: Untuk meningkatkan efisiensi, seharusnya jika data yang dicari sudah
ditemukan maka perulangan harus dihentikan!
Hint: Gunakan break!
Question: Bagaimana cara menghitung ada berapa data dalam array yang
nilainya sama dengan data yang dicari oleh user?
Hint: Gunakan variabel counter yang nilainya akan selalu bertambah jika ada
data yang ditemukan!
Penggunaan Sentinel (Penjaga)
Perhatikan array data berikut ini:
indeks
0 1 2 3 4 5 6
value
3 12 9 -4 21 6
alamat
ffea ffeb ffec ffed ffef fffa fffb
- Terdapat 6 buah data dalam array (dari indeks 0 s/d 5) dan terdapat 1
indeks array tambahan (indeks ke 6) yang belum berisi data (disebut
sentinel)
- Array pada indeks ke 6 berguna untuk menjaga agar indeks data berada
pada indeks 0 s/d 5 saja. Bila pencarian data sudah mencapai array
indeks yang ke-6 maka berarti data TIDAK ADA, sedangkan jika
pencarian tidak mencapai indeks ke-6, maka data ADA.
#include
#include
void main(){
clrscr();
int data[7] = {3,12,9,-4,21,6};
int cari,i;
printf("masukkan data yang ingin dicari = ");scanf("%d",&cari);
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
data[6] = cari;
i=0;
while(data[i] != cari) i++;
if(i<6) printf("Data ada!\n"); else printf("Data tidak ada!\n");
}
KESIMPULAN: sangat efisien!
Binary Search
- Data yang ada harus diurutkan terlebih dahulu berdasarkan suatu urutan
tertentu yang dijadikan kunci pencarian.
- Adalah teknik pencarian data dalam dengan cara membagi data menjadi
dua bagian setiap kali terjadi proses pengurutan.
- Prinsip pencarian biner adalah:
o Data diambil dari posisi 1 sampai posisi akhir N
o Kemudian cari posisi data tengah dengan rumus (posisi awal +
posisi akhir) / 2
o Kemudian data yang dicari dibandingkan dengan data yang di
tengah, apakah sama atau lebih kecil, atau lebih besar?
o Jika lebih besar, maka proses pencarian dicari dengan posisi awal
adalah posisi tengah + 1
o Jika lebih kecil, maka proses pencarian dicari dengan posisi akhir
adalah posisi tengah – 1
o Jika data sama, berarti ketemu.
Contoh Data:
Misalnya data yang dicari 17
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A B C
Karena 17 > 15 (data tengah), maka: awal = tengah + 1
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A B C
Karena 17 < 23 (data tengah), maka: akhir = tengah – 1
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A=B=C
Karena 17 = 17 (data tengah), maka KETEMU!
Programnya:
int binary_search(int cari){
int l,r,m;
l = 0;
r = n-1;
int ktm = 0;
while(l<=r && ktm==0){
m = (l+r)/2;
if(data[m] == cari) ktm=1;
else if (cari < data[m]) r=m-1;
else l=m+1;
}
if(ktm==1) return 1; else return 0;
}
Interpolation Search
- Teknik ini dilakukan pada data yang sudah terurut berdasarkan kunci
tertentu
- Teknik searching ini dilakukan dengan perkiraan letak data.
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
o Contoh ilustrasi: jika kita hendak mencari suatu nama di dalam buku
telepon, misal yang berawalan dengan huruf T, maka kita tidak akan
mencarinya dari awal buku, tapi kita langsung membukanya pada
2/3 atau ¾ dari tebal buku.
- Jadi kita mencari data secara relatif terhadap jumlah data.
- Rumus posisi relatif kunci pencarian dihitung dengan rumus:
lowdatakunci - ][
lowlowhighxPosisi +-= )(
lowdatahighdata - ][][
Misal terdapat data sebagai berikut:
Kode Judul Buku Pengarang
025 The C++ Programming James Wood
034 Mastering Delphi 6 Marcopolo
041 Professional C# Simon Webe
056 Pure JavaScript v2 Michael Bolton
063 Advanced JSP & Servlet David Dunn
072 Calculus Make it Easy Gunner Christian
088 Visual Basic 2005 Express Antonie
096 Artificial Life : Volume 1 Gloria Virginia
Kunci Pencarian ? 088
Low ? 0
High ? 7
Posisi = (088 - 025) / (096 - 025) * (7 - 0) + 0 = [6]
Kunci[6] = kunci pencarian, data ditemukan : Visual Basic 2005
Kunci Pencarian ? 060
Low ? 0
High ? 7
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Posisi = (060 – 025) / (096 – 025) * (7 – 0) + 0 = [3]
Kunci[3] < kunci pencarian, maka teruskan
Low = 3 + 1 = 4
High = 7
Ternyata Kunci[4] adalah 063 yang lebih besar daripada 060.
Berarti tidak ada kunci 060.
Programnya:
int interpolationsearch(int key,int n){
int low,high,pos,i;
low=0;
high=n-1;
do{
pos = (key – data[low]) * (high – low) / data[high] –
data[low] + low;
if (data[pos] == key] return pos;
if (data[pos] > key) high = pos-1;
else
if (data[pos] < key) low = pos + 1;
} while(key >= data[low] && key <= data[high]);
return -1
}
AlassbmiripbdenganbstructHbSalahbsatubperbedaaannyabadalahbìsifatbdasarîbdaribclassb
adalahbprivateHbPrivatebadalahbjenisbaksesbdaribsebuahbstrukturbdatab“sepertibstructbdanb
class”HbPembagianbtingkatbaksesbinibdibagibmenjadibBbbagianJ
? Public:bmemberbbisablangsungbdiaksesbdaribluarbolehbobjectnya
? Private:bmemberbhanyabbisabdiaksesbdaribmemberblainnyabdalambclassbdanbdarib
friendnya
? Protected:bsepertibprivate:btapibjugabbisabdibaksesbdaribmemberbdaribturunanbclassb
tersebut
Untukbmenentukanbjenisbñbjenisbaksesbinibdapatbjugabdibuatbsendiribdenganb
menuliskanbkeywordnya:bmasingbñbmasingbsesuaibdenganbnamanyaHbEefaultbdaribsebuahb
classbadalahbbersifatbprivateHbAontohJ
class(my_class({
((int(aW
((int(bW
((void(my_function(\int(arg~3(int(arg0f({
yydefinisi(fungsi
((}
}W
Jikabdefinisibdaribclassbsepertibdibatas:bmakabsemuabmembernyabbersifatbprivateHb
&edakanbdenganbcontohbdibbawahbiniJ
class(my_class({
((void(my_function(\int(arg~3(int(arg0f({
yydefinisi(fungsi
((}
((public:
((int(aW
((int(bW
}W
Eefinisibdibatasbbisabdiartikanbbahwabfungsibmy_functionbbersifatbprivateb
sedangkanbvariabelbabdanbbbyangbbersifatbpublicH
Constructor
Kegunaanbdaribconstructorbadalahbuntukbmelaksanakanbhalbñbhalbtertentubketikab
objectbdaribsebuahbclassbdideklarasikanHbNamabdaribconstructorbharusbsamabdenganbnamab
classnyaH
Destructor
EestructorbadalahbkebalikanbdaribconstructorHbKalaubconstructorbdipanggilbpadab
waktubobjectbdaribsuatubclassbdideklarasikan:bmakabdestructorbdipanggilbketikabobjectbdarib
classbtersebutbìdihancurkanî:bscopebpadabsebuahbfungsibsudahbberakhirb“misalnyabfungsib
tempatbobjectbitubdigunakanbtelahbsampaibpadabbatasbscopenya”HbEestructorbditandaib
denganbtandabì~îb“tilde”bdanbnamabdaribdestructorbharusbsamabdenganbnamabclassnyaH
Aonstructorbdanbdestructor:btidakbmengembalikanbnilaibapapunbjuga:bbahkanbvoidHb
Mengambilbcontohbdaribkodebyangbtelahbkitabgunakanbdibatas:bmakabcontohbdarib
constructorbdanbdestructorbadalahJ
=include(Ciostream>
using(namespace(stdW
=
KomunitasbeLearningbIlmuKomputerHAom
Aopyrightb©bO11BwO11=bIlmuKomputerHAom
class(my_class({
((((int(umurW
((((publicA
((((my_class}*intj;(yyconstructor
((((int(show_age\f({
((((((((return(umurW
((((}
((((~my_class*j;(yydestructor
((((
}W
my_classAAmy_class(\int(agef({
(((((yydefinisi
(((((umur(=(ageW
}
my_classAA~my_class\f({
((((yydefinisi
((((umur(=(!W
}
void(main(\f({
((((my_class(first\*&fW
((((cout(CC(first6show_age\f(CC(.\n.W
}