LAPORAN PRAKTIKUM ALGORITMA ALGORITMA DAN DAN STRUKTUR STRUKTUR DATA DATA
Semester II Tahun Akademik 2013/2014
Oleh: Nama
: Ahmar Taufik Safaat
NPM
: 137006230
LABORATORIUM INFORMATIKA JURUSAN TEKNIK INFORMATIKA FAKULTAS FAKULTAS TEKNIK TEKNIK UNIVERSIT UNIVERSITAS AS NEGERI NEGERI SILIWANGI SILIWANGI TASIKMALAYA 2014
KATA PENGANTAR
Puji dan dan syuk syukur ur penyusun penyusun panjatka panjatkan n ke hadirat hadirat Allah SWT karena karena atas atas berkat berkat rahmat rahmat dan karun karunia-Ny ia-Nyaa penyusun penyusun dapat dapat menyelesa menyelesaikan ikan praktikum praktikum serta serta laporan laporan akhir akhir mata kuliah kuliah Algoritma Algoritma dan Struktur Struktur Data. Data. Adapun isi dari laporan akhir ini adalah kumpulan dari setiap laporan mingguan selama praktikum berlangsung. Laporan ini merupakan syarat untuk dapat dapat mengikuti mengikuti ujian praktikum. praktikum. Tak lupa lupa penyu penyusun sun ucapka ucapkan n banya banyak k terim terimaka akasih sih kepad kepadaa Dosen Dosen beserta beserta staf staf penga pengajar jar mata kuli kuliah ah Algori Algoritma tma dan dan Strukt Struktur ur Data Data yang yang selal selalu u membimb membimbing ing dan dan mengajari penyusun dalam melaksanakan melaksanakan praktikum dan dan dalam menyusun laporan ini. ini. Ser Serta ta sem semua ua piha pihak k yan yang g tela telah h ban bany yak memb memban antu tu peny penyus usun un dala dalam m hal hal penyusunan penyusunan laporan ini. Tentunya laporan laporan ini masih sangat jauh dari kesempurnaan. kesempurnaan. Oleh karena itu, kriti kritik k serta serta sar saran an yan yang g bers bersif ifat at memb memban angu gun n sang sangat at peny penyus usun un hara harapk pkan an untu untuk k menyempurnakan menyempurnakan laporan akhir ini. Atas perhatian dari semua pihak yang membantu penulisan ini saya ucapkan terimakas terimakasih. ih. Semog Semogaa laporan laporan akhir ini dapat dapat dapat dapat berman bermanfaat faat bagi penyusun penyusun dan bagi pembaca, Amiin.
Tasik Tasikmal malay aya, a, Juni Juni 2014 2014
Ahmar Taufik Safaat
137006230
i
DAFTAR ISI
KATA PENGANTA PENGANTAR R
i
DAFTAR ISI
ii
MODUL I – PENGANTAR BAHASA C
I.
Tu Tujuan Praktikum
I-1
II. Dasar Teori A. Pengantar Bahasa C
I-1
B. Struktur Program dalam Bahasa C
I-2
III. III. Hasil Hasil danPe danPemba mbaha hasan san Program 1-1 – Program Hello
I-3
Program 1-2 – Program Hello1
I-3
Program 1-3 – Program Asign
I-4
Program 1-4 – Program Asgdll
I-4
Program 1-5 – Program Asign1
I-5
Program 1-6 – Program Asign2
I-5
MODUL II – PEMROSESAN FILE
I.
Tujuan Praktikum
II-1
II. Dasar Teori A. Membuka File
II-1
B. Menutup File
II-2
C. Meletakkan Data ke Buffer
II-2
D. Manipulasi File
II-3
1. Mengecek Keberadaan File
II-3
2. M Meengganti Nama File
II-3
3. Menghapus File
II-4
III. Hasil dan Pembahasan
II-4
Program 2-1
II-4
Program 2-2
II-4
Program 2-3
II-5 ii
Program 2-4
II-6
Program 2-5
II-6
Stusi Kasus 2-1
II-7
Stusi Kasus 2-2
II-7
MODUL III – MESIN ABSTRAK
I.
Tujuan Praktikum
III-1
II. Dasar Teori A. Mesin Integer (Pencacah)
III-1
B. Mesin Karakter
III-2
III. III. Hasil Hasil dan dan Pemba Pembahas hasan an Program 3-1
III-4
Program 3-2
III-4
Studi Kasus 3-1
III-5
Studi Kasus 3-2
III-5
Studi Kasus 3-3
III-6
Studi Kasus 3-4
III-7
MODUL IV – REKURSIF
I.
Tujuan Praktikum
IV-1
II. Dasar Teori
IV-1
III. III. Hasil Hasil dan dan Pemba Pembahas hasan an Program 4-1
IV-2
Program 4-2
IV-2
Studi Kasus 4-1
IV-3
Studi Kasus 4-2
IV-4
MODUL ODUL V – ABSTRACT DATA TYPE (ADT)
I.
Tu T ujuan Praktikum
V-1
II. Dasar Teori
V-1
III. Hasil dan Pembahasan
V-2
iii
Program 5-1
V-2
MODUL VI – LINKED LIST
I.
Tujuan Praktikum
VI-1
II. Dasar Teori
VI-1
III. Hasil dan Pembahasan Program 6-1
VI-2
Studi Kasus 6-1
VI-3
Studi Kasus 6-2
VI-6
Studi Kasus 6-3
VI-8
Studi Kasus 6-5
VI-8
Studi Kasus 6-6
VI-9
MODUL VII – STACK
I.
Tujuan Praktikum
VII-1
II. Dasar Teori
VII-1
III. Hasil dan Pembahasan Program 7-1
VII-2
Studi Kasus 7-1
VII-5
MODUL VIII – QUEUE
I.
Tujuan Praktikum
VIII-1
II. Dasar Teori
VIII-1
III. Hasil dan Pembahasan Program 8-1
VIII-3
Studi Kasus 8-1
VIII-5
Studi Kasus 8-2
VIII-8
MODUL IX – TREE
I.
Tujuan Praktikum
IX-1
II. Dasar Teori
IX-1
iv
III. Hasil dan Pembahasan Program 9-1
IX-6
MODUL X – GRAPH
I.
Tujuan Praktikum
X-1
II. Dasar Teori
X-1
III. Hasil dan Pembahasan Program 10-1
X-3
MODUL XI – KESIMPULAN DAN SARAN
I.
Kesimpulan
XI-1
II. Saran
XI-1
DAFTAR PUSTAKA
1
LAMPIRAN
2
v
DAFTAR PUSTAKA
1. Bryon, Goffried. Programming with PASCAL 1986. New York: Schaum Series 2. Inggriani Liem. Dasar Pemrograman (Bagian Pemrograman Prosedural). April 2007. Bandung: STEI – ITB 3. Munir, Rinaldi. 2012. Algoritma dan Pemrograman 2. Bandung : Informatika 4. Pranata, Antony. 2005. Algoritma dan Pemrograman. Yogyakarta : Graha Ilmu 5. Santosa, Insap. Dasar-dasar Pemrograman Pascal Teori dan Program Terapan. Yogyakarta: Andi Offset 6. Wahid, Fathul. 2004. Dasar-dasar Algoritma dan Pemrograman. Yogyakarta: Andi Offset 7. Teknik Informatika. 2013. Panduan Praktikum Algoritma dan Pemrograman. Tasikmalaya : Fakultas Teknik UNSIL
1
JURUSAN TEKNIK INFORMATIKA FAKULTAS TEKNIK UNIVERSITAS SILIWANGI
LEMBAR ASISTENSI PRAKTIKUM
Nama
: Ahmar Taufik Safaat
NPM
: 137006230
Kelompok
: 11
Nama Praktikum
: Algoritma dan Struktur Data
Tahun Akademik
: 2013/2014
Asisten Dosen
: Erna Haerani
No.
Tanggal
Hasil Pemeriksaan
Perbaikan yang perlu
ACC
dilakukan
(Paraf Asisten)
Tasikmalaya, Juni 2014 Dosen Pembina
Heni Sulastri, ST
2
MODUL I – PENGANTAR BAHASA C I.
Tujuan Praktikum
Praktikan diharapkan dapat: 1. Mengenal bahasa C dan struktur program pada bahasa C 2. Mengetahui dan memahami penggunaan komponen-komponen dasar pada bahasa C 3. Menggunakan perintah dasar penulisan dalam membuat program dengan bahasa C
II. Dasar Teori A. Pengantar Bahasa C
Bahasa C dikembangkan oleh Dennis M. Ritchie dan Brian W. Kernighan pada awal tahun 1970. Bahasa C berkembang di lingkungan UNIX (± 90% sistem operasi UNIX ditulis dalam bahasa C). Standar yang ada: •
Definisi Kernighan dan Ritchie (K&R);
•
ANSI-C (X-3.159-1989-);
•
Definisi AT&T (untuk superset C, C++). Versi pada PC misalnya:
•
Lattice C;
•
Microsoft C/ Microsoft QuickC;
•
Turbo C/Borland C++; Pada tahun 1986, dikembangkan superset C (kompatibel dengan C, namun
dilengkapi dengan kemampuan pemrograman berorientasi objek) oleh Bjarne Stroustrup [Stroustrup-86], yaitu bahasa C++ (C with Class). Catatan:
Ringkasan ini memakai standar ANSI C. Contoh-contoh sedapat mungkin dipilih bebas dari implementasi kompilator tertentu. Jika ada contoh yang spesifik terhadap implementasi, implementasi kompilator yang dipakai akan disebutkan.
I-1
Aplikasi dalam bahasa C
Bahasa C banyak dipakai untuk: 1. Membuat sistem operasi dan program-program sistem, 2. Pemrograman yang “dekat” ke perangkat keras (misalnya untuk kontrol peralatan), 3. Membuat tool kit, 4. Menulis program aplikasi (misalnya dBase, WordStar, Lotus 123).
Kelebihan bahasa C, sehingga terpilih untuk aplikasi-aplikasi tersebut adalah kemampuannya untuk membuat kode yang compact, efisien tanpa mengorbankan readability (beda dengan bahasa assembly yang efisien namun sudah dibaca, atau bahasa tingkat tinggi lain yang enak dibaca namun tidak efisien). Walaupun tak dapat diingkari bahwa program dalam bahasa C lebih sulit dibaca (karena compact) dibandingkan dengan bahasa tingkat tinggi yang lain.
B. Struktur Program dalam Bahasa C
Berikut ini adalah struktur sebuah program utama dalam bahasa C. Contoh lengkap dapat dilihat pada contoh program kecil. /* Nama File */ /* Identitas perancang/penulis */ /* Deskripsi ringkas dari program */
main([int argc, char** argv[, char** envp]]) { /* Keterangan program */ /* KAMUS */ /* Algoritma/deretan intruksi yang executable */ Return(); }
I-2
III. Hasil dan Pembahasan
Program 1.1 – Program Hello
Program ini bertujuan untuk menampilkan kata “hello” ke layar (output). Adapun output di atas dibarengi dengan pesan dan beberapa rekomendasi dari aplikasi bahasa C, dan menunjukkan bahwa drive C digunakan untuk direktori penyimpanan file dari bahasa C.
Program 1.2 – Program Hello1
I-3
Program hello1 ini sama dengan program hello (program yang pertama) yakni bertujuan untuk menuliskan kata “hello” ke layar output. Tapi, sintaksnya lebih lengkap.
Program 1.3 – Program Asign
Program Asign ini bertujuan untuk mendeklarasikan variabel i dengan tipe data integer ke dalam program utama. Setelah itu, berfungsi untuk menuliskan “hello” dan “ini nilai i : [nilai i = 5]”. Setelah itu, dikembalikan ke dalam nilai 0 setelah program selesai dirunning.
Program 1.4 – Program Asgdll
Program Asgdll bertujuan untuk mendefinisikan “f” dan “fll” sebagai variabel dengan tipe data yang berbeda ke dalam program. Program ini tidak memberikan perintah apa pun untuk menuliskan data ke layar output.
I-4
Program 1.5 – Program Asign1
Program Asign1 bertujuan untuk menuliskan nilai i dan ii dengan tipe data yang berbeda. Selain itu, program ini bertujuan untuk menampilkan nilai terkecil dan terbesar dari tipe data integer, dan juga nilai terpanjang dari integer. Datanya sudah terdapat pada program. Jadi, kita hanya memanggilnya.
Program 1.6 – Program Asign2
I-5
Program ini berfungsi untuk menginisialisasi karakter dengan karakter, karakter dengan integer (bilangan bulat), dan juga menuliskan beberapa data ke layar output.
Resume:
Menunjukkan bagian sintaks dalam program bahasa C, /*(Kalimat/Nama)*/ atau bisa juga hanya berupa komentar/judul. Bagian ini tidak akan berpengaruh pada program utama. void main( ) { ... } int main( ) { ... }
Struktur
utama
dalam
pemrograman
bahasa
C,
menandakan bahwa pemrograman dimulai. Sintaks ini wajib ada dalam setiap program. Berfungsi untuk menampilkan/menuliskan kata/kalimat
printf(“... \ n”);
ke layar output. \n berfungsi untuk meletakkan kursor di baris berikutnya (garis baru).
return 0; int i; short ks; long kl; char c;
Mengembalikan ke nilai 0 stelah program dijalankan. Mendeklarasikan “ i, ks, kl, c ” sebagai variabel dengan tipe data yang berbeda-beda. Pemanggilan data dengan tipe data yang khsusus. D
%d, %ld, %c, %f
untuk double (bilangan bulat), ld untuk long double (bilangan bulat yang lebih besar), c untuk character
I-6
(huruf/angka/karakter), dan f untuk float (bilangan desimal). #include
Sintaks untuk memasukkan perintah-perintah khusus.
INT_MIN,
Tipe data yang sudah baku, dan nilainya sudah
INT_MAX,
terdefinisikan dalam program bahasa C. Data yang
LONG_MAX \t\t
dimunculkan pun akan otomatis. Berfungsi untuk tab (memberikan jarak).
I.
I-7
MODUL II – PEMROSESAN FILE I.
Tujuan Praktikum
Praktikan diharapkan dapat: 1. Mengenal pemrosesan file pada bahasa C 2. Melakukan proses input/output data dengan bahasa C 3. Mengimplementasikan pemrosesan file untuk melakukan perekaman data pada bahasa C
II. Dasar Teori
Seringkali untuk program-program aplikasi sistem informasi, data perlu disimpan secara permanen utnu keperluan lebih lanjut. Data dapat disimpan di eksternal memory seperti di disk, floppy disk, dan UFD ataupun di internal memory sendiri pada penyimpanan internal memory mempunyai sifat volatile dan relatif lebih kecil dibandingkan dengan external memory. Pada bab ini akan membahas tentang operasi input/output file dan manipulasi file. Operasi i/o file melibatkan pembacaan dari file atau perekaman ke file. Manipulasi file melibatkan operasi pengecekan keberadaan file di disk, mengganti nama, menghapus file, dan lain-lain.
A. Membuka File
Suatu file di disk harus dibuka sebelum digunakan dapat dilakukan dengan fungsi pustaka fopen( ). Hasil dari pembukaan file ini akan didapatkan suatu nilai pointer dengan tipe FILE, berikut ini bentuk operasi buka file: FILE *fopen ( const char*nama_file, const char*mode );
Pada operasi di atas nama_file dan mode ditentukan oleh pembuat program sendiri. Berikut ini contoh mode yang digunakan di bahasa C. Tabel 2.1 – Mode dalam Bahasa C Mode
Arti
“r”
Membuka file yang telah ada untuk dibaca. Jika file belum ada, pembuatan file tidak akan berhasil dan fungsi fopen akan bernilai
II-1
NULL. “w”
Membuat file baru untuk ditulis. Jika file telah ada maka file lama akan dihapus.
“a”
Membuka file yang telah ada untuk ditambah dengan data yang baru yang akan diletakkan di akhir file. Jika file belum ada akan dibuat file baru.
“r+”
Sama dengan “r” tetapi selain file dapat dibaca juga dapat ditulis.
“w+”
Sama dengan “w” tetapi selain file dapat ditulis juga dapat dibaca.
“a+”
Sama dengan “a” tetapi selain file dapat ditulis file juga dapat dibaca.
B. Menutup File
Menutup file umumnya dilakukan untuk tiga tujuan yaitu pertama menutup semua file yang masih terbuka sebelum program berakhir, kedua menutup file tertentu karena tidak diperlukan lagi dan ketiga menutup karena ingin membuka file lain. Fungsi pustaka yang digunakan untuk sebuah file adalah: int fclose(FILE * pointer-file);
C. Meletakkan Data ke Buffer
Bahasa C membedakan lima macam bentuk data untuk diletakkan di penyangga (buffer), yaitu karakter, integer, string, terformat, dan blok data. Untuk masing-masing data ini fugnsi pustaka yang digunakan berbeda yaitu sebagai berikut: Tabel 2.2 – Fungsi Pustaka Fungsi Pustaka fputc( )
Meletakkan sebuah nilai karakter ke buffer untuk direkam ke file.
fgetc( )
Membaca sebuah nilai karakter dari file untuk diletakkan di buffer.
putw( )
Meletakkan sebuah nilai integer ke buffer untuk direkam ke file.
getw( )
Membaca sebuah nilai integer dari file untuk diletakkan di buffer.
fputs( )
Meletakkan sebuah nilai string ke buffer untuk direkam ke file.
fgets( )
Membaca sebuah nilai string dari file untuk diletakkan di buffer.
Deskripsi
II-2
fprintf( )
Meletakkan sebuah data terformat di buffer untuk direkam ke file.
fscanf( )
Membaca sebuah data terformat dari file untuk diletakkan di buffer.
fwrite( )
Meletakkan sebuah blok data ke buffer untuk direkam ke file.
fread( )
Membaca sebuah struktur data dari file untuk diletakkan di buffer.
D. Manipulasi File
Bagian ini akan membahas bagian memanipulasi suatu file yang tidak melibatkan proses I/O seperti: 1. Mengecek Keberadaan File
Seringkali diperlukan jika akan membuat suatu file baru untuk mengetahui file itu sudah ada atau tidak. Fungsi pustakanya adalah: int access ( const char * path, int amode);
const char * path menunjukkan letak file itu berada. Amode berbeda dengan mode operasi file. Di sini terdapat beberapa amode yaitu: •
Amode 0 hanya akan memeriksa keberadaan file di disk.
•
Amode 2 menunjukkan pemeriksaan apakah file dapat ditulis.
•
Amode 4 menunjukkan pemeriksaan apakah file dapat dibaca.
•
Amode 6 menunjukkan pemeriksaan apakah file dapat dibaca dan ditulis.
Fungsi pustaka access terdapat dalam prototype io.h, contoh penggalan programnya adalah: if((access( “c:\coba.txt”,0))= =0) { printf( “file sudah ada” );
}
Pada contoh penggalan program di atas dilakukan pengecekan apakah file yang dimaksud ada atau tidak, jika “ya” aka n dicetak nilai string yang ada dimana kondisinya bernilai 0. 2. Mengganti Nama File
Fungsi rename( ) digunakan untuk mengganti nama suatu file yang sudah ada di disk. Bentuk umumnya: int rename( const char * nama_lama, const char * nama_baru );
II-3
3. Menghapus File
Fungsi menghapus file dapat dilakukan dengan unlink( ). Bentuk lengkapnya adalah: int unlink( const char * path );
Selanjutnya semua fungsi yang telah diberikan dapat dikembangkan untuk membuat suatu program bahasa C dalam operasi file yang lebih lengkap dan utuh.
III. Hasil dan Pembahasan
Program 2-1 #include main() { FILE * PF; PF = fopen( "coba.txt" , "r" ); if(PF==NULL) {printf( "terdapat kesalahan, file tidak dapat dibuka atau tak ada" );} else {printf( "file dapat dibuka" );} return 0; }
Program 2-1 ini bertujuan untuk membaca file dengan nama file “coba.txt”. Jika saat pembukaan file bernilai NULL (kosong) atau file belum ada maka akan ditampilkan di layar “terdapat kesalahan, file tidak dapat dibuka atau tak ada ” jika sudah ada maka maka akan ditampilkan “file dapat dibuka”. Di layar output ditampilkan pilihan yang pertama karena menggunakan fungsi “r” yang hanya berfungsi untuk membaca file yang sudah ada. Karena file belum ada, maka yang ditampilkan adalah yang pertama.
Program 2-2 #include main() { FILE *PF; PF = fopen( "coba.txt" , "r" ); if(PF==NULL) printf( "terdapat kesalahan, file tidak dapat dibuka atau
II-4
tak ada" ); else printf( "file dapat dibuka" ); return 0; if(fclose(PF)==EOF) printf( "tidak dapat menutup file" ); return 0; }
Program 2-2 ini merupakan tindak lanjut dari program 2-1. Setelah file dibuka biasanya file tidak digunakan lagi maka dilakukan penutupan file dengan fungsi pustaka fclose. Karena file belum ada, maka yang ditampilkan sama seperti program 2-1 yakni “terdapat kesalahan, file tidak dapat dibuka atau tak ada”.
Program 2-3 #include #include #include main() { FILE*PF; char C; if((PF=fopen("coba.txt","w"))==NULL) { printf("file tidak dapat dibuka"); exit(1); } while((C=getche())!=' \r') fputc(C,PF); fclose(PF); }
Program 2-3 bertujuan untuk membuat file baru yakni “coba.txt” untuk ditulisi/diisi dengan fungsi “w”. Jika pembuatan file gagal atau bernilai NULL maka akan ditampilkan di layar “file tidak dapat dibuka”. Sedangkan jika berhasil dibuat, maka si user bisa mengetikkan kata atau data apa saja setelah program dirun. Data yang diinputkan oleh user akan disimpan di file “coba.txt”.
II-5
Program 2-4 #include #include #include main() { FILE*PF; char C; if((PF=fopen("coba.txt","r"))==NULL) { printf("file tidak dapat dibuka"); exit(1); } while((C=fgetc(PF))!=EOF) putchar(C); fclose(PF); }
Program 2-4 ini bertujuan untuk membaca file dari program 2-3 yakni file dengan nama “coba.txt”. Sehingga di layar outputan hanya ditampilkan data yang telah diinputkan oleh si user.
Program 2-5 //filedat.c //membaca dan menulis teks file //separator adalah blank //Data berupa string tidak boleh mengandung blank!!! #include int main () {//Kamus int n; char nama[21]; float persen; int retval; FILE *fileku; //Algoritma fileku = fopen ("filedat.txt","r"); retval = fscanf (fileku, "%d %s %f", &n, nama, &persen); while (retval != EOF) { printf("Data : %d %s %f \n", n, nama, persen); retval = fscanf (fileku, "%d %s %f", &n, nama, &persen); } printf ("\nbye..."); fclose (fileku);
II-6
return 0; }
Program 2-5 bertujuan untuk membaca file dengan nama “filedat.txt”. Karena file “filedat.txt” tidak ada atau gagal dibuat maka di layar output hanya ditampilkan tulisan “bye...”.
Studi Kasus 2-1 #include #include #include main() { FILE*PF; char C; if((PF=fopen("filedata.txt","w"))==NULL) { printf("file tidak dapat dibuka"); exit(1); } while((C=getche())!=' \r') fputc(C,PF); fclose(PF); }
Dalam studi kasus 2-1 ini hampir sama dengan program 2-3 yakni membuat file baru dengan nama file “filedata.txt” kemudian diisi oleh user. Di sini user mengisinya dengan data biodata probadinya.
Studi Kasus 2-2 #include #include #include main() { FILE*PF; char C; if((PF=fopen("filebiodata.dat","w"))==NULL) { printf("file tidak dapat dibuka"); exit(1); }
II-7
while((C=getche())!=' \n') fputc(C,PF); fclose(PF); } #include #include #include main() { FILE*PF; char C; if((PF=fopen("filebiodata.dat","r"))==NULL) { printf("file tidak dapat dibuka"); exit(1); } while((C=fgetc(PF))!=EOF) putchar(C); fclose(PF); }
Studi kasus 2-2 ini dibagi menjadi 2 bagian. Bagian pertama yaitu untuk memasukkan data, kemudian yang kedua untuk menampilkan data yang telah dibuat oleh si user. Pada bagian pertama, dibuat file “filebiodata.dat” kemudian diisi dengan biodata teman sekelas user. Kemudian pada bagian kedua, data yang telah diinputkan tadi ditampilkan di layar output.
II.
II-8
MODUL III – MESIN ABSTRAK I.
Tujuan Praktikum
Praktikan diharapkan dapat: 1. Mengenal mesin abstrak dalam program bahasa C 2. Memanfaatkan spesifikasi mesin abstrak untuk memecahkan masalah dalam bahasa C
II. Dasar Teori Mesin: mekanisme yang terdefinisi dan mengerti serta mampu untuk
mengeksekusi aksi-aksi primitif yang terdefinisi untuk mesin tersebut. Mesin abstrak: mesin yang dianggap ada dan diasumsikan mampu
melakukan mekanisme yang didefinisikan untuk mesin tersebut. Mesin abstrak memodelkan suatu semesta (universe) tertentu. Dalam pemrograman, mesin abstrak ini diciptakan pada tahap konseptual dan belum menjadi sesuatu yang riil. Perancang program seringkali harus mendefinisikan mesin-mesin abstrak untuk memecahkan masalah secara bertahap, sehingga pada akhirnya nanti seluruh primitif serta mekanisme dapat terdefinisi dengan baik. Setelah mesin abstrak ini terdefinisi dengan baik (termasuk fungsi dan prosedur yang terlibat), barulah kode-kode program dituliskan untuk menerapkan sesuatu yang abstrak menjadi produk yang nyata (riil) yaitu yang disebut sebagai mesin riil.
A. Mesin Integer (Pencacah)
Merupakan sebuah mesin yang terdiri dari: 1. Satu buah tombol RESET 2. Satu buah tombol INC (singkatan dari increment yang berarti menambahkan) 3. Sebuah jendela yang menunjukkan angka integer yang sedang diingat, oleh karena itu angka yang sedang muncul di jendela disebut sebagai Current Integer (CI).
III-1
B. Mesin Karakter
Merupakan mesin abstrak yang di dalamnya terdiri dari beberapa komponen yaitu: 1. Pita yang berisi deretan karakter dan diakhiri dengan tanda titik ‘.’. 2. Pita yang hanya berisi tanda titik ‘.’ Akan disebut sebagai pita kososng. 3. Pita dalam mesin ini sebagai penggambaran dari array dengan tipe data char (karakter). Dalam lingkungan pemrograman dengan bahasa Pascal, tipe data ‘string’ dapat diperlakukan sama dengan dengan array dengan tipe data karakter. 4. Dua buah tombol yakni tombol START dan ADV (singkatan dari kata advance yang berarti memajukan). 5. Sebuah lampu EOP (End of Position). Lampu ini akan menyala jika tanda titik ‘.’ sudah terbaca, artinya sudah berada pada posisi terakhir. Penggambaran lampu menyala adalah kondisi dimana status pada saat itu bernilai TRUE dan lampu padam adalah FALSE. 6. Sebuah “jendela“ yang ukurannya sebesar satu karakter saja. Hanya kara kter yang sedang berada di jendela disebut sebagai Current Character (CC) dan dapat dibaca sedangkan karakter lain tidak terlihat.
Studi Kasus Mesin Karakter: Palindrom
Palindrom adalah istilah yang digunakan untuk kata atau kalimat yang apabila dibaca dari depan ke belakang atau sebaliknya, memiliki arti yang sama. Contoh palindrom: KATAK KASUR RUSAK KASUR NABABAN RUSAK Untuk memeriksa apakah kata yang dimasukkan merupakan palindrom maka, dapat dibuat sebuah function yang memiliki tipe data boolean. Function ini akan mengembalikan
nilai
TRUE
jika
kata
termasuk
mengembalikan nilai FALSE untuk kondisi sebaliknya.
III-2
palindrom,
dan
akan
Algoritma Palindrom FUNCTION IsPalindrom (kt : string)
boolean
{akan
mengembalikan
palindrom} Kamus Data i, j : integer temp : string BEGIN temp = “ “ {mengisi temporer disingkat temp dengan kosong}
j = length(kt) {mengisi j dengan lebar kata} WHILE (j>0) DO {operasi konkatenasi} temp = temp + kt[j] j = j – 1 ENDWHILE if temp = kt THEN {membandingkan isi temporer dengan kt} return TRUE ELSE Return FALSE Endif ENDFUNCTION
Catatan: Operasi konkatenasi berfungsi untuk menggabungkan dua data bertipe string. Contoh: kata1 dan kata2 bertipe string. Bila kata1 berisi “algo” dan kata2 berisi “ritma” maka operasi kata1+kata2 akan menghasilkan kata “algoritma”.
III-3
III. Hasil dan Pembahasan
Program 3-1 #include #include #include "mesinkar.inc" //Menghitung banyaknya huruf dalam pita karakter int main() { START(); RESET(); while (!EOP) { INC(); ADVN(); } printf("Banyaknya huruf dalam pita = %d\n",ci); getche(); }
Sebelum ke program 3-1 ini, user membuat dulu file “boolean.h” dan kemudian membuat file “mesinkar.inc”. Setelah dibuat kemudian di header program ini diberikan perintah #include “mesinkar.inc” agar file tersebut terbaca oleh program
ini.
Program
ini
bertujuan
untuk
menghitung
banyaknya
huruf/karakter dalam file mesinkar.inc, penghitungan dimulai dari karakter pertama sampai titik (.), jika tanda titik sudah dicapai maka program akan berhenti menghitung. Di layar output ditampilkan banyaknya huruf yang terdapat dalam mesinkar.inc sebanyak 553.
Program 3-2 #include #include #include "mesinkar.inc" //Menghitung banyaknya huruf A dalam pita karakter int main() { START(); RESET(); while (cc!='.') { if (cc=='A') { INC();} ADVN();} printf("Banyaknya huruf A dalam pita = %d\n",ci); getche(); }
III-4
Sama dengan program 3-1, program ini bertujuan untuk menghitung karakter dalam file mesinkar.inc, ditemukan 3 huruf ‘A’ dalam file tersebut.
Studi Kasus 3-1 #include #include #include "mesinkar.inc" //Menghitung banyaknya huruf i dalam pita karakter int main() { START(); RESET(); while (cc!='.') { if (cc=='i') { INC(); } ADVN(); } printf("hari ini hari libur.\n"); printf("Huruf vokal terbanyak yakni i = %d\n",ci); getche(); }
Pada studi kasus 3-1 ini, file mesinkar.inc kembali digunakan. Kalimat yang berada dalam file mesinkar.inc diganti dengan kalimat “hari ini hari libur.” Di layar output ditampilkan hruuf vokal terbanyak yakni i dengan jumlah karakter 5. Program ini sama dengan program 3-2.
Studi Kasus 3-2 #include #include #include void main() { char kata[50]; cout<<"Masukkan Kata Yang Akan Dibalik : "; cin>>kata; cout<<"\n\n"; strrev(kata); cout<<"Kata Setelah Dibalik : "<
III-5
getch(); }
Studi kasus 3-2 ini bertujuan untuk memasukkan kata yang akan dibalik, kemudian kata yang dibalik tersebut dibalik susunannya. Di sini menggunakan header #include untuk mengolah data bertipe data string. Kemudian menggunakan fungsi strrev untuk membalik kata. POLITEKNIK dibalik menjadi KINKETILOP, kemudian DATA dibalik menjadi ATAD.
Studi Kasus 3-3 #include #include int main () { char input[50]; int i,j,status,batascek,panjangkata; printf( "masukan angka atau kata yang dicek : " ); scanf ("%s",&input); panjangkata = strlen(input); batascek = panjangkata/2; status = 0; i = 0; j = panjangkata-1; while (status == 0 && i < batascek) {if(input[i]==input[j]) {i ++; j --;} else {status = 1;} } if (status == 1) {printf("bukan palindrom");} else {printf("palindrom");} return 0; }
III-6
Studi kasus 3-3 ini bertujuan untuk mengimplementasikan fungsi palindrom, yakni mengecek sebuah kata yang jika dibalik urutannya memiliki makna yang sama. Sama dengan studi kasus sebelumnya, di sini menggunakan header #include untuk mengolah kata bertipe data string. Fungsi strlen digunakan untuk membuat palindrom.
Studi Kasus 3-4 #include #include #include int main() { char str1[100],str2[100]; gets(str1); gets(str2); int i,j; int n1=strlen(str1); int n2=strlen(str2); int c=0; if(n1!=n2) { cout<<"\nanagram ! "; return 0; } else { for(i=0;i
III-7
Studi kasus 3-4 ini bertujuan untuk mengecek dua buah kata apakah termasuk anagram atau bukan. Anagram adalah dua buah kata yang beda tetapi komponennya/susunannya
sama.
Masih
menggunakan
header
#include, digunakan untuk mengolah data bertipe string. Contohnya, sebab dengan bebas merupakan anagra; kapas dengan pasak juga merupakan anagram.
III.
III-8
MODUL IV – REKURSIF I.
Tujuan Praktikum
Praktikan diharapkan dapat: 1. Mengenal program rekursif dalam bahasa C 2. Menggunakan program rekursif untuk memecahkan masalah dalam bahasa C 3. Mengimplementasikan cara kerja rekursif ke dalam aplikasi/program dalam bahasa C
II. Dasar Teori
Dalam ilmu komputer, kelas dari objek atau metode memperlihatkan perilaku rekursif bila mereka dapat didefinisikan oleh dua properti berikut: 1. Sebuah kasus (atau beberapa kasus) dasar sederhana 2. Sejumlah aturan yang mengurangi kasus-kasus lainnya sampai ke kasus dasarnya Sebagai contoh berikut ini adalah definisi rekursif dari leluhur seseorang: •
Orangtua seseorang adalah leluhur seseorang (kasus dasar)
•
Orangtua dari suatu leluhur juga merupakan leluhurnya (langkah rekursif) Bilangan Fibbonaci adalah contoh klasik dari rekursif:
•
Fib(0) adalah 0 (kasus dasar)
•
Fib(1) adalah 1 (kasus dasar) Untuk semua integer n > 1: Fib(n) adalah (Fib(n-1) + Fib(n-2)) [definisi rekursif]. Mungkin sebelumnya sudah tidak asing dengan perulangan menggunakan
FOR atau WHILE, selain kedua hal tersebut, masih ada cara lain untuk perulangan yaitu dengan rekursif. Dalam makna yang sederhana: Rekursif adalah suatu proses di mana salah satu langkah dalam prosedur tersebut menjalankan prosedur itu sendiri. Prosedur yang melakukan rekursi disebut dengan “rekursif”. Sehingga rekursif ditulis dalam bentuk fungsi atau prosedur. IV-1
III. Hasil dan Pembahasan
Program 4-1 #include void ulangangka(int batas) {if (batas>0) { printf("%d",batas); ulangangka(batas-1); }} int main(){ ulangangka(5); return 0; }
Program 4-1 ini bertujuan untuk menuliskan sebuah angka jika ditulis secara rekursif. Dalam program ini, digunakan fungsi pengulangan. Jika kita memasukkan angka 5 pada variabel ulangangka maka akan dituliskan di layar output 54321.
Program 4-2 #include #include int x,y; long int pangkat(int x, int y) { if(y==0) {return 1;} else {return x*pangkat(x,y-1);} } int main(){ scanf("%d %d",&x,&y); printf("%d pangkat %d = %ld\n",x,y,pangkat(x,y)); return 0; }
Program 4-2 ini berfungsi untuk menghitung operasi perpangkatan pada suatu bilangan. Saat kita masukkan 2 buah bilangan setelah program di-run, bilangan pertama sebagai angka pokok yang akan dipangkatkan, kemudian beri spasi,
IV-2
dan angka kedua merupakan pangkat yang akan diberikan pada angka yang akan dipangkatkan. Di layar output ditampilkan bahwa 5 pangkat 3 adalah 125. Dan hasilnya valid, berarti programnya berhasil.
Studi Kasus 4-1 #include #include int faktorial (int x); void main() { int n,r, Permutasi; cout<<" Program Menghitung Permutasi(nPr)"; cout<<" Masukkan Nilai n : "; cin>>n; cout<<" Masukkan Nilai r : "; cin>>r; Permutasi = faktorial (n)/faktorial(n-r); cout<<" Permutasinya adalah: "<
Studi Kasus 4-1 ini berfungsi untuk menghitung permutasi dari suatu bilangan. Di sini menggunakan header #include untuk mengolah data angka yakni melakukan proses perhitungan permutasi. Setelah di-run, ditampilkan di layar perintah untuk memasukkan bilangan yang akan dipermutasikan, misalnya 5. Kemudian masukkan nilai r untuk permutasinya. Jadi, n permutasi r (di sini menggunakan angka 5 permutasi 2) hasilnya 20.
IV.
IV-3
Studi Kasus 4-2 #include #include int main() { int kolom, baris, tinggi; printf("***Segitiga Pascal***\n"); printf("Masukkan tinggi segitiga pascal : ");scanf("%d",&tinggi); int jarak1 = tinggi; int nilai[tinggi][tinggi]; for (baris=0;baris=0;jarak-=1) { printf(" "); } for (kolom = 0; kolom <= baris; kolom++) {nilai[baris][kolom]=nilai[baris-1][kolom]+nilai[baris-1][kolom1]; printf("%d",nilai[baris][kolom]); } jarak1-=1; printf("\n"); return 0; }}
Pada studi kasus 4-2 ini bertujuan untuk menuliskan atau menggambarkan urutan perpangkatan pada segitiga pascal. User diminta untuk memasukkan tinggi dari segitiga pascal tersebut, kemudian akan ditampilkan urutan perpangkatan tersebut dalam bentuk segitiga pascal. Semakin tinggi yang kita masukka maka semakin banyak urutannya. Di sini user menggunakan fungsi array dan juga proses pengulangan for untuk menghitung angka-angka pada segitiga pascal.
IV-4
MODUL V – ABSTRACT DATA TYPE (ADT) I.
Tujuan Praktikum
Praktikan diharapkan dapat: 1. Mengenal tipe data abstrak (tidak nyata) dalam bahasa C 2. Menggunakan ADT untuk memecahkan masalah dalam bahasa C 3. Mengimplementasikan cara kerja ADT ke dalam aplikasi/program dalam bahasa C
II. Dasar Teori
Sebuah program dalam bahasa C yang “utuh”, seringkali terdiri dari beberapa modul program. Sebuah modul mungkin mewakili sekumpulan rutin sejenis, ADT (Abstract Data Type: definisi type dan primitifnya), atau mesin (definisi state variabel dari mesin dan primitifnya). Program harus mempunyai sebuah main( ) dan memanfaatkan modul yang lain. Program yang dibagi-bagi menjadi beberapa file seharusnya dapat dikompilasi terpisah (setiap modul membentuk sebuah object code). Dengan demikian, pembuatan sebuah executable code dapat dilakukan dengan melakukan link terhadap sejumlah object code yang sudah dikompilasi (penghematan waktu dan duplikasi usaha, reusability). Supaya dapat dikompilasi dengan benar, modul yang lain dapat dilakukan dengan melakukan include terhadap file header. File header dalam bahasa C adalah sebuah file yang hanya berisi deklarasi type dan prototype fungsi (“tidak boleh” ada deklarasi file). Contoh program lengkap dengan beberapa modul yang diletakkan dalam beberapa file dapat dilihat pada contoh program di bawah ini untuk pemanfaatan ADT JAM yang didefinisikan. Skema program yang dipecah menjadi beberapa file. Pada hakikatnya sebuah program utuh terdiri dari kelompok file sebagai berikut:
V-1
1. File header, dengan nama xxx.h. Untuk setiap type dan primitifnya, ada sebuah file xxx.h, contoh: jika anda memerlukan ADT J AM, DATE dan mesin KATA maka ada 3 buah file header yaitu Jam.h, DATE.h, dan KATA.h. 2. File yang berisi BODY dari file header yang bersangkutan: xxx.c. File ini disebut sebagai file realisasi dari prototype yang didefinisikan pada xxx.h. Akan ada sebuah xxx.c untuk setiap xxx.h. Untuk contohnya, akan ada JAM.c, DATE.c, dan KATA.c 3. File yang berisi main program (dan prosedur/fungsi lain yang hanya dibutuhkan oleh main), missalnya dengan nama main.c. Contoh program dalam beberapa file atau biasa disebut dengan modul. Modul berikut adalah untuk manipulasi jam. File
Deskripsi Isi
jam.h
Type dan prototype jam
jam.c
Realisasi (body) dari jam.h
mjam.c
Main program untuk mentest beberapa fungsi/prosedur pada jam.c
III. Hasil dan Pembahasan
Program 5-1 //File: jam.h //Deklarasi TYPE dan prototype type jam #ifndef jam_H #define jam_H typedef struct { int HH; int MM; int SS; } jam; //prototype void ResetJam (jam*J); //mengisi sebuah jam J dengan 00:00:00 void TulisJam (jam J); //menulis sebuah jam int JamToDetik (jam J); //konversi jam ke detik jam DetikToJam (int d); #endif #include "stdio.h" #include "jam.h" void ResetJam (jam*J)
V-2
{ (*J).HH = 13; (*J).MM = 39; (*J).SS = 10; } void TulisJam (jam J) { //Kamus Lokal //Algoritma printf("Jam : %2d:%2d:%2d\n", J.HH, J.MM, J.SS); } int JamToDetik (jam J) { return (J.HH * 3600 + J.MM * 60 + J.SS); } jam DetikToJam (int d) { jam J; int sisa; J.HH = d/3600; sisa = d % 3600; J.MM = sisa / 60; J.SS = sisa % 60; return J; } //File: mjam.c //Memanfaatkan primitif jam #include "jam.h" int main() { jam J1; jam J2; int dt = 1000; printf("hello\n"); ResetJam(&J1); TulisJam(J1); printf("Konversi jam ke detik: %d\n", JamToDetik(J1)); J2 = DetikToJam(dt); TulisJam(J2); return 0; }
Sebelum ke program jam.c kita harus membuat dulu file jam.h untuk mendeklarasikan prototype dan type jam. Program jam di atas berfungsi untuk menampilkan jam, kemudian untuk mengkonversikan dari jam ke detik, kemudian ditampilkan jamnya.
V.
V-3
MODUL VI – LINKED LIST I.
Tujuan Praktikum
Praktikan diharapkan dapat: 1. Mengenal dan memahami konsep Linked List dalam bahasa C 2. Menggunakan Linked List untuk memecahkan masalah dalam bahasa C 3. Mengimplementasikan cara kerja Linked List ke dalam aplikasi/program dalam bahasa C
II. Dasar Teori
Konsep dasar struktur data dinamis adalah alokasi memori yang dilakukan secara dinamis. Pada konsep ini, terdapat suatu struktur yang disebut dengan struktur referensi diri (self-referential structure), mempunyai anggota pointer yang menunjuk ke struktur yang sama dengan dirinya sendiri. Struktur data dinamis sederhana dapat dibagi menjadi empat jenis, yaitu: 1. Linked list 2. Stack 3. Queue 4. Binary tree Definisi Linked List
Linked list adalah suatu cara untuk menyimpan data dengan struktur sehingga dapat secara otomatis menciptakan suatu tempat baru untuk menyimpan data yang diperlukan. Program akan berisi suati struct atau definisi kelas yang berisi variabel yang memegang informasi yang ada di dalamnya, dan mempunyai suatu pointer yang menunjuk ke suatu struct sesuai dengan tipe datanya. Struktur dinamis ini mempunyai beberapa keuntungan dibanding struktur array yang bersifat statis. Struktur ini lebih dinamis, karena banyaknya elemen dapat dengan mudah untuk ditambah atau dikurangi, berbeda dengan array yang ukurannya bersifat tetap. Manipulasi setiap elemen seperti menyisipkan, menghapus, maupun menambah dapat dilakukan dengan lebih mudah.
VI-1
III. Hasil dan Pembahasan
Program 6-1 #include #include #include typedef struct nod { int data; struct nod *next; } NOD, *NODPTR; void CiptaSenarai (NODPTR*s) { *s = NULL; } NODPTR NodBaru(int m) { NODPTR n; n = (NODPTR) malloc (sizeof(NOD)); if(n!=NULL) { n -> data = m; n -> next = NULL; } return n; } void SisipSenarai (NODPTR*s, NODPTR t, NODPTR p) { if(p==NULL) { t -> next = *s; *s = t; } else { t -> next = p -> next; p -> next = t; }} void CetakSenarai (NODPTR s) { NODPTR ps; for (ps = s; ps != NULL; ps = ps -> next) printf("%d-->",ps->data); printf("NULL\n"); } int main () { NODPTR pel; NODPTR n; CiptaSenarai(&pel); n = NodBaru(55); SisipSenarai(&pel, n, NULL); n = NodBaru(75); SisipSenarai(&pel, n, NULL); CetakSenarai(pel); return 0; }
VI-2
Program di atas bertujuan untuk memasukkan beberapa data dalam sebuah senarai (linked list). Data yang ditampilkan ditampilkan secara terbalik. Dari 75 kemudian 55 kemudian terakhir NULL. Dalam program di atas digunakan beberapa prosedur/fungsi yakni di antaranya CetakSenarai, CiptaSenarai, dan SisipSenarai.
Studi Kasus 6-1 #include #include #include #include #include
int pil; int tdkblhsm(); void pilih(); void buat_baru(); int tambah(); void hapus(); void tampil(); struct simpul { char nama [25]; int nim; struct simpul *next; } mhs, *baru, *awal=NULL, *akhir=NULL,*hps, *bantu; int x=0; int tdkblhsm(int cari) { struct simpul *baru; int ketemu=0; if(awal==NULL) ketemu=0; else { baru=awal; while(baru!=NULL) { if(cari==baru->nim) { ketemu=1;
VI-3
break; } baru=baru->next; } } return ketemu; } int main() { do { clrscr(); cout<<"Menu Single Linked List"<>pil; pilih(); } while(pil!=4); return 0; } void pilih() { if(pil==1) tambah(); else if(pil==2) hapus(); else if(pil==3) tampil(); else cout<<"Selesai"; } int tambah() { baru=(struct simpul *)malloc(sizeof(struct simpul)); cout<<"Masukkan NIM: ";cin>>baru->nim; if(tdkblhsm(baru->nim)!=0) { cout<<"NIM sudah ada, silahkan masukkan NIM yang lain!"; getch(); return 0; } cout<<"Input nama: ";cin>>baru->nama; baru->next=NULL; if(awal==NULL) { awal=baru; akhir=baru;
VI-4
} //jika data hanya 1 else if (baru->nim < awal->nim) { baru->next=awal; awal=baru; } else { bantu=awal; while(bantu->next!=NULL && baru->nim > bantu->next>nim) { bantu=bantu->next; } baru->next=bantu->next; bantu->next=baru; } tampil(); } void hapus() { int nim_cari; struct simpul *bantu1; if (awal==NULL) cout<<"Simpul Kosong"; else { cout<<" Masukan NIM yang akan dihapus: "; cin>>nim_cari; bantu=awal; { while(bantu!=NULL && bantu->nim!=nim_cari) bantu=bantu->next; if (bantu==NULL) cout<<"Data tidak ditemukan!"; else if (bantu==awal) { awal=awal->next; free(bantu); } else if (bantu==akhir) { bantu=awal; while (bantu1->next!=akhir) bantu1=bantu1->next; akhir=bantu1; akhir->next=NULL; free(bantu); } else { bantu1=awal; while(bantu1->next!=bantu) bantu1=bantu1->next; bantu1->next=bantu->next;
VI-5
free (bantu); } } } getch(); } void tampil() { if (awal==NULL) cout<<"Kosong"; else { bantu=awal; while(bantu!=NULL) { cout<<"NIM : "<nim; cout<<"Nama : "<nama; bantu=bantu->next; } } getch(); }
Program di atas merupakan contoh dari penerapan linked list dalam program dalam bahasa C. Dengan program seperti di atas, kita bisa menyimpan data yang kita inginkan secara terstruktur. Program di atas juga merupakan perpaduan dari beberapa fungsi yakni di antaranya fungsi untuk menambahkan data, menghapus data, menampilkan seluruh data yang telah dibuat, kemudian pilihan selesai untuk mengakhiri program. User tinggal memasukkan pilihannya, missalnya 1 untuk menambahkan. Data NIM 22022807 dengan nama Agung telah ditambahkan sebagai node.
Studi Kasus 6-2 int tambah() { baru=(struct simpul *)malloc(sizeof(struct simpul)); cout<<"input nim : ";cin>>baru->nim; if(tdkblhsm(baru->nim)!=0) { cout<<"NIM sudah ada, silahkan input NIM yang lain";
VI-6
getch(); return 0; } cout<<"input nama
: ";cin>>baru->nama;
baru->next=NULL; if(awal==NULL) { awal=baru; akhir=baru; } //jika data hanya 1 else if (baru->nim < awal->nim) { baru->next=awal; awal=baru; } else { bantu=awal; while(bantu->next!=NULL && baru->nim > bantu->next>nim) { bantu=bantu->next; } baru->next=bantu->next; bantu->next=baru; } tampil(); }
Program di atas adalah bagian dari program linked list non circular pada studi
VI-7
kasus 6-1. Fungsi ini menambahkan node single linked list non circular dimana tiap node mengandung informasi NIM dan Nama. Peletakan posisi node urut berdasarkan nim secara ascending, jadi bisa ditambah di depan, belakang maupun tengah.
Studi Kasus 6-3 void tampil() { if (awal==NULL) cout<<"Kosong"; else { bantu=awal; while(bantu!=NULL) { cout<<"nim : "<nim; cout<<" nama : "<nama; bantu=bantu->next; } } getch(); }
Fungsi ini juga merupakan bagian dari program dalam Studi Kasus 6-1. Berfungsi untuk menampilkan data yang telah dibuat oleh si user. User tinggal memilih 3 untuk “menampilkan” data.
Studi Kasus 6-5 void tampil() { if (awal==NULL) cout<<"Kosong"; else { bantu=awal; while(bantu!=NULL) { cout<<"nim : "<nim; cout<<" nama : "<nama; bantu=bantu->next; }
VI-8
} getch(); }
Fungsi ini juga merupakan bagian dari program dalam Studi Kasus 6-1. Berfungsi untuk menghapus data yang telah dibuat oleh si user. User tinggal memilih 2 untuk “menghapus” data. Data yang dihapus sesuai keinginan user, tinggal memasukkan NIM yang akan dihapus.
Studi Kasus 6-6 #include //File Header Iostream #include //File Header Conio typedef struct TNode { //Deklarasi Linked List int data; //data bertipe integer TNode *next; //pointer Next }; //penutup deklarasi TNode *head; //disini menggunakan head sebagai pointer utama dari linked list void init(){ //Fungsi untuk inisialisasi awal linked list head=NULL; //Untuk pertama kali, head bernilai NULL } int IsEmpty(){ //Fungsi untuk mengetahui apakah Linked list kosong atau ada isinya if(head==NULL) // apabila head==NULL, maka return 1 return 1; else return 0; // Selain itu maka Return 0 } void insertdepan(int n){ //Fungsi untuk menambahkan data baru (n didapat dari input di program utama (main)) TNode *baru; //Disini menggunakan baru sebagai pointer TNode nya baru=new TNode; baru->data=n; //pointer baru->data berisi nilai variabel n baru->next=NULL; // pointer baru->next berisi NULL if(IsEmpty()==1){ //periksa apakah linked list bernilai, jika return 1(tidak bernilai), maka akan mengeksekusi perintah hingga ‘}’ head=baru; //Nilai head= Nilai baru head->next=NULL; }
VI-9
else { // Jika return 0(linked list bernilai), maka akan mengeksekusi perintah berikut hingga ‘}’ baru->next=head; head=baru; } cout<<"Data Terisi"; } void insertbelakang(int n){ //Fungsi untuk insert Belakang(Menambahkan data di belakang data lama) TNode *baru,*bantu; //Pointer yang digunakan yaitu baru dan bantu baru=new TNode; baru->data=n; baru->next=NULL; if(IsEmpty()==1){ head=baru; head->next=NULL; } else { bantu=head; while(bantu->next!=NULL){ bantu=bantu->next; } bantu->next=baru; } cout<<"Data Terisi"; } void tampil(){ //Fungsi untuk menampilkan linked list yang telah di input / di delete TNode *bantu; //pointer yang digunakan yaitu bantu bantu=head; // Nilai bantu= Nilai yang ada di head if(IsEmpty()==0){ // periksa apakah return 0(bernilai) while(bantu!=NULL){ //Selama bantu tidak sama dengan NULL, maka di eksekusi cout<data<data bantu=bantu->next; //Nilai bantu= nilai bantu selanjutnya } } else cout<<"Masih Kosong"<data; //nilai dari d = nilai dari hapus->data head=hapus->next; // Nilai head sekarang berisi nilai hapus>next delete hapus; //fungsi untuk menghapus nilai yang ada di
VI-10
pointer hapus } cout<>n; IsEmpty(); insertdepan(n); break; case'2': clrscr(); cout<<"Masukan data :";cin>>n; IsEmpty(); insertbelakang(n); break; case'3': clrscr(); IsEmpty(); tampil(); break; case'4': clrscr(); IsEmpty(); hapusdepan(); break; } getch(); }while(pil!='5'); return 0; }
Tampilan Menu Utama
VI-11
Memasukkan Data
Menampilkan Data
Progra di atas adalah program untuk mengimplementasikan single linked list circular yang fleksibel dan dinamis. Di mana user dapat menambah simpul baru beserta datanya, membaca semua data pada senarai, menghapus simpul dengan data yang ditentukan oleh user dan dapat menghapus semua simpul yang ada. Pertama-tama ditampilkan tampilan menu utamanya. Kemudian user tinggal memilih sesuai pilihan. 1 untuk memasukkan data dari depan, 2 memasukkan data dari belakang, 3 untuk menampilkan data, 4 untuk menghapus data, dan 5 untuk keluar dari program.
VI.
VI-12
MODUL VII – STACK I.
Tujuan Praktikum
Praktikan diharapkan dapat: 1. Mengenal stack (tumpukan) data dalam bahasa C 2. Menggunakan stack untuk memecahkan masalah dalam bahasa C 3. Mengimplementasikan cara kerja stack ke dalam aplikasi/program dalam bahasa C
II. Dasar Teori
Tumpukan dapat diartikan sebagai satu kumpulan data yang seolah-olah terlihat seperti ada data yang diletakkan di atas data yang lain seperti pada gamabr 01. Saat kita ingin mengambil data A, maka data-data yang berada di atasnya haruslah lebih dulu dikeluarkan (di-POP). Hal ini membuat tumpukan/stack memiliki ciri Last In First Out (LIFO) yang berarti data yang masuk terkahir akan keluar pertama.
E D C B A Gambar 01
Penyajian Stack
Stack dapat disajikan baik dengan array maupun dengan struct. Pada array, stack ataupun queue yang disajikan bersifat statis. Ini disebabkan karena jumlah maksimal data pada array sudah ditentukan sejak awal. Contoh deklarasi stack dengan struct: Struct stack { char data;
VII-1
stack*next; };
Operasi pada Stack
Dalam penyajian stack, ada dua proses yang terjadi, yaitu pemasukan data (PUSH) dan pengeluaran data (POP). Seperti yang sudah dijelaskan bahwa array itu memiliki jumlah maksimal, maka pada proses PUSH, perlu pengecekan apakah data yang di-PUSH di stack melebihi jumlah maksimal array atau tidak. Contoh algoritma untuk proses PUSH (stack) adalah sebagai berikut: •
Masukkan inputan (x)
•
Jika variable cek (c) = nilai maksimal array (max), kerjakan langkah 2. Jika tidak, kerjakan langkah 3.
•
Cetak “Tumpukan Penuh”.
•
Selama (c) kurang dari (max), maka
c
+ 1 dan data [c]
x.
Contoh algoritma untuk proses POP pada stack stack adalah sebagai sebagai berikut: •
Jika c = 0, maka kerjakan langkah 2. Jika tidak, lakukan langkah 3.
•
Cetak “Tumpukan Kosong”
•
c c-1
III. Hasil dan Pembahas Pembahasan an
Program 7-1 #include #include #include struct tumpukan { char data; tumpukan*next; }; tumpukan*atas; tumpukan*bawah; tumpukan*baru; tumpukan*hapus; tumpukan*bantu; void push() { baru = new tumpukan; fflush(stdin); printf(" printf("Data Data yang yang ingin ingin dimasukka dimasukkan n -> "); scanf("%c",&baru->data);
VII-2
baru->next=NULL; if(atas==NULL) { atas=baru; bawah=baru; } else { baru->next=atas; atas=baru; }} void pop() { if(atas==bawah) { delete atas; atas=NULL; } else { hapus=atas; atas=atas->next; delete hapus; } { printf("Tumpukan kosong\nTekan enter untuk melanjutkan..."); getch(); }} void show() { bantu=atas; while(bantu!=NULL) { printf("[ %c ]\n",bantu->data); bantu=bantu->next; } printf("\nTekan printf("\nTekan enter untuk melanjutkan...\n"); melanjutkan...\n"); getch(); } void main() { clrscr(); int pil; do { clrscr(); printf("Program Tumpukan\n"); printf("================\n"); printf("1. Push\n"); printf("2. Pop\n"); printf("3. Tampil\n"); printf("4. Keluar\n"); printf("Masukkan printf("Masukkan pilihan: ");scanf("%i",&pil); ");scanf("%i",&pil); switch(pil) {
VII-3
c as e 1: c as e 2: c as e 3:
pu sh () ; break; po p( ); break; sh ow () ; break;
}} while(pil!=4); }
Tampilan Menu Utama
Memasukkan data ke dalam stack stack (tumpukan)
Menampilkan tumpukan data
VII-4
Menghapus data
Tampilan setelah data ada yang dihapus/di-pop
Program stack di atas berfungsi untuk mengimplementasikan cara kerja dari stack (tumpukan) dari sederetan data. Program di atas terdiri dari beberapa fungs fungsii
atau atau
subpro subprogra gram m
yak yakni ni
fungs fungsii
push push
(berfun (berfungs gsii
untu untuk k
memasukkan/menambahkan data ke dalam tumpukan), fungsi pop (berfungsi untuk menghapus data dalam tumpukan), fungsi show (berfungsi untuk menampilkan deretan data yang sudah dibuat). Data yang ditambahkan pertama akan disimpan paling bawah, bawah, dan jika melakukan penghapusan penghapusan (pop) maka data yang dihapus/dihilangkan dihapus/dihilangkan adalah data yang terakhir dimasukkan (paling atas).
Studi Kasus 7-1 #include #include #include void Hanoi(int n, char asal, char bantu, char tujuan) // pindahkan piringan ke n { // dari asal menuju tujuan // melalui bantu if (n == 0) return; Hanoi(n Hanoi(n - 1, asal, asal, tujuan, tujuan, bantu); bantu); //pindah //pindahkan kan piringan piringan ke n-1 // dari asal ke bantu melalui //tonggak tujuan printf("Pindahkan piringan ke %d dari %c ke %c\n", n, asal, tujuan); Hanoi(n Hanoi(n - 1, bantu bantu, , asal, asal, tujuan); tujuan); //pindah //pindahkan kan piringan piringan ke n – 1 // dari bantu menuju tujuan // melalu asal
VII-5
} int main(void) { int n; printf("Selamat datang di Program Piringan Hanoi!!!\n"); printf("Silahkan masukan piringan yang ingin dipindahkan :"); scanf("%d", &n); Hanoi(n, 'a', 'b', 'c'); }
Program di atas bertujuan untuk mengimplementasikan cara kerja/mekanisme untuk memindahkan suatu tumpukan dalam piringan Hanoi. User diberi opsi untuk memasukkan berapa priringan yang akan dipindahkan. Missalnya, kita masukkan 4 piringan maka akan ditampilkan urutan/langkah-langkah yang harus dilakukan untuk memindahkan piringan-piringan tersebut sehingga hasilnya jika digambarkan akan terdapat tumpukan piringan baru.
VII.
VII-6
MODUL VIII – QUEUE I.
Tujuan Praktikum
Praktikan diharapkan dapat: 1. Mengenal queue (antrian) data dalam bahasa C 2. Menggunakan queue untuk memecahkan masalah dalam bahasa C 3. Mengimplementasikan cara kerja queue ke dalam aplikasi/program dalam bahasa C
II. Dasar Teori
QUEUE (antrian) adalah list linier yang dikenali elemen pertama (HEAD) dan elemen terakhirnya (TAIL), aturan penyisipan dan penghapusan elemennya didefinisikan sebagai berikut: •
Penyisipan selalu dilakukan setelah elemen terakhir
•
Penghapusan selalu dilakukan pada elemen pertama
•
Satu elemen dengan yang lain dapat diakses melalui informasi NEXT Struktur data ini banyak dipakai dalam informatika, missalnya untuk
merepresentasi: •
Antrian job yang harus ditangani oleh sistem operasi
•
Antrian dalam dunia nyata Maka secara lojik, sebuah QUEUE dapat digambarkan sebagai list linier yang
setiap elemennya adalah: Type ElmtQ : < Info : InfoType, Next : address >
Dengan InfoType adalah sebuah type terdefinisi yang menentukan informasi yang disimpan pada setiap elemen queue, dan address adalah “alamat” dari elemen. Selain itu alamat elemen pertama (HEAD) dan elemen terakhir (TAIL) dicatat: Maka jika Q adalah Queue dan P adalah address, penulisan untuk Queue adalah Head(Q), Tail(Q), Info(Head(Q)), Infor(Tail(Q)). Queue (antrian) hampir mirip dengan stack, tapi hanya saja, data yang masuk pertama kali akan keluar pertama kali dari Queue. Bisa dilihat pada gambar 02
FIFO (First In First Out)
VIII-1
A
B
C
D
E
Gambar 02
Sama halnya dengan stack, Queue dapat disajikan baik dengan array maupun dengan struct. Pada array, stack ataupun queue yang disajikan bersifat statis. Ini disebabkan karena jumlah maksimal data pada array sudah ditentukan sejak awal. Operasi pada Queue
Dalam penyajian queue, ada 2 proses yang terjadi, yaitu menambahkan elemen (Enqueue) dan mengurangi elemen (Dequeue). Seperti yang sudah dijelaskan bahwa array itu memiliki jumlah maksimal, maka pada proses Enqueue, perlu pengecekan apakah data yang di-enqueue melebihi jumlah maksimal array atau tidak. Implementasi Antrian dengan Array
Seperti halnya pada tumpukan, maka dalam antrian kita juga mengenal ada dua operasi dasar, yaitu menambahkan elemen baru yang akan kita tempatkan di bagian belakang antrian dan menghapus elemen yang terletak di bagian depan antrian. Di samping itu, seringkali kita juga perlu melihat apakah antrian mempunyai isi atau dalam keadaan kosong. Operasi penambahan elemen baru selalu bisa kita lakukan karena tidak ada pembatasan banyaknya elemen dari suatu antrian. Tetapi untuk menghapus elemen, maka kita harus melihat apakah antrian dalam keadaan kosong atau tidak. Tentu saja kita tidak mungkin menghapus elemen dari suatu antrian yang sudah kosong. Untuk menyajikan antrian menggunakan array, maka kita membutuhkan deklarasi antrian, misalnya sebagai berikut: #define MAXQUEUE 100; typedef int ItemType; typedef struct{ int Count; int Front; int Rear; ItemType Item[MAXQUEUE]; } Queue
VIII-2
Front, menunjukkan item yang paling depan, yaitu elemen yang akan dihapus jika dilakukan operasi penghapusan. Setelah kita melakukan penghapusan, kita melakukan increment pada indeks Front, sehingga indeks menunjuk pada posisi berikutnya. Jika indeks ini jatuh pada angka tertinggi, yaitu angka paling maksimum dari array (N), maka kita melakukan setting ulang ke 0. Array Item[0:N-1] berisi N item yang merupakan isi dari antrian. Berada pada posisi 0:N-1 dimana pada posisi ini dapat diindikasikan dua pengenal, yaitu Front dan Rear. Count menunjukkan jumlah item dalam antrian. Rear menunjukkan posisi dimana setelahnya dapat dimasukkan item berikutnya.
III. Hasil dan Pembahasan
Program 8-1 //program guided 1 #include #include #include void main() { char A[10]; int dpn, blk; char cek; int z; dpn=0; blk=-1; do { clrscr(); printf("1. Tambah antrian\n"); printf("2. Hapus antrian\n"); printf("3. Lihat antrian\n"); printf("4. Exit\n"); printf("5. Silahkan berikan pilihan anda : "); cek=getche(); if (cek!='1' && cek!='2' && cek!='3' && cek!='4') printf("\n Anda salah mengetikan inputan!\n"); else { if(cek=='1') { if(blk==9) { printf("\n Maaf antrian penuh\n"); goto error1; } blk++; printf("\n Silahkan masukan inputan : ");
VIII-3
A[blk]=getche(); } else if(cek=='2') { if(dpn>blk) { printf("\n Maaf antrian kosong\n"); goto error1; } for(int v=0; v<=blk; v++) { A[v]=A[v+1]; } blk--; printf("\nProses penghapusan berhasil"); } else if (cek=='3') { if (dpn>blk) { printf("\n Maaf Antrian Kosong\n"); goto error1; } printf("\n\nAda %i antrian\n",(blk+1) dpn); for(z=0; z<=blk; z++) printf("| %c |",A[z]); } } error1: printf("\n Silahkan tekan Enter untuk melanjutkan...\n"); getche(); }while (cek!='4'); }
Proses penambahan data antrian
Menampilkan antrian data yang telah dibuat
VIII-4
Penghapusan data
Tampilan setelah data dihapus
Program queue di atas berfungsi untuk mengimplementasikan cara kerja dari queue (antrian) dari sederetan data. Program di atas terdiri dari beberapa fungsi atau subprogram yakni fungsi enqueue/tambah data (berfungsi untuk memasukkan/menambahkan data ke dalam antrian), fungsi dequeue/hapus data (berfungsi untuk menghapus data dalam antrian), fungsi lihat antrian (berfungsi untuk menampilkan deretan data yang sudah dibuat). Data yang ditambahkan pertama akan disimpan paling awal, dan jika melakukan penghapusan (dequeue) maka data yang dihapus/dihilangkan adalah data yang pertama dimasukkan (paling awal).
Studi Kasus 8-1 #include #include #define MAX 20 struct queue { int queue[MAX]; int front; int rear; }; void insert(struct queue *,int); void del(struct queue *); void display(struct queue*); void main() { int lim,choice,x; char ch; struct queue q;
VIII-5
q.front=-1; q.rear=-1; clrscr(); do { printf("Menu:"); printf("\n1.Memasukkan data ke antrian"); printf("\n2.Menghapus data dari antrian"); printf("\n3.Menampilkan antrian data"); printf("\nMasukkan pilihan anda:"); scanf("%d",&choice); switch(choice) { case 1: printf("\nMasukkan data ke antrian: "); scanf("%d",&x); insert(&q,x); break; case 2: del(&q); break; case 3: display(&q); break; default: printf("\nMasukkan pilihan anda: "); break; } printf("\nApakah anda akan melanjutkan (y/n)? "); fflush(stdin); scanf("%c",&ch); }while(ch=='y'); if(ch=='n') printf("\nTerima kasih"); getch(); } //function for insertion void insert(struct queue *q,int x) { if(q->rear==MAX-1) printf("\n\n\tQueue overflow"); else { q->rear++; q->queue[q->rear]=x; if(q->front==-1) q->front=0; } } //function for deletion
VIII-6
void del(struct queue *q) { if(q->front==-1) printf("\nAntrian kosong"); else printf("\nItem yang terhapus: %d",q->queue[q->front]);
if(q->front==q->rear) { q->front=-1; q->rear=-1; } else q->queue[q->front++]; } //function for display void display(struct queue *q) { int f,i; if(q->front==-1) printf("\nAntrian kosong"); else { f=q->front; { printf("\n\n\t%d",q->queue[f]); f++; } } }
VIII-7
Program di atas merupakan pengimplementasian program antrian (queue) dengan menggunakan struct. Isinya sama, yakni memuat fungsi penambahan data (enqueue), penghapusan data (dequeue), dan menampilkan data.
Studi Kasus 8-2 #include #include #include struct node { int info; struct node *link; }*front = NULL, *rear = NULL; void insert(); void delet(); void display(); int item; main() { int ch; do { printf("\nMenu Queue (Linked List)\n1.Insert\n2.Delete\n3.Display\n4.Exit"); printf("\nMasukkan pilihan anda: "); scanf("%d", &ch); switch(ch) { case 1: insert(); break; case 2: delet(); break; case 3: display(); break; case 4: exit(0); default: printf("\nPilihan salah, coba lagi!\n");
VIII-8
} } while(1); getch(); } void insert() { printf("Masukkan angka ke antrian: "); scanf("%d", &item); if(rear == NULL) { rear = (struct node *)malloc(sizeof(struct node)); rear->info = item; rear->link = NULL; front = rear; } else { rear->link = (struct node *)malloc(sizeof(struct node)); rear = rear->link; rear->info = item; rear->link = NULL; } } void delet() { struct node *ptr; if(front == NULL) printf("\nAntrian kosong\n"); else { ptr = front; item = front->info; front = front->link; free(ptr); printf("\nAngka yang terhapus: %d\n", item); if(front == NULL) rear = NULL; } } void display() { struct node *ptr = front; if(rear == NULL) printf("\nAntrian kosong\n"); else { printf("\n\n"); while(ptr != NULL) { printf("%d\t",ptr->info); ptr = ptr->link; } } }
VIII-9
Program di atas merupakan pengimplementasian program antrian (queue) dengan menggunakan linked list. Isinya sama, yakni memuat fungsi penambahan data (enqueue), penghapusan data (dequeue), dan menampilkan data.
VIII.
VIII-10
MODUL IX – TREE I.
Tujuan Praktikum
Praktikan diharapkan dapat: 1. Mengenal tree (pohon berakar) pada struktur data dalam bahasa C 2. Menggunakan struktur data tree untuk memecahkan masalah dalam bahasa C 3. Mengimplementasikan cara kerja struktur data tree ke dalam aplikasi/program dalam bahasa C
II. Dasar Teori
Dalam ilmu komputer, tree adalah sebuah struktur data yang secara bentuk menyerupai sebuah pohon, yang terdiri dari serangkaian node (simpul) yang saling berhubungan. Node-node tersebut dihubungkan oleh sebuah vektor. Setiap node dapat memiliki nol atau lebih node anak (child). Sebuah node yang memiliki node anak disebut node induk (parent). Sebuah node anak hanya memiliki satu node induk. Sesuai konvernsi ilmu komputer, tree bertumbuh ke bawah, tidak seperti pohon di dunia nyata yang tumbuh ke atas. Dengan demikian node anak akan digambarkan berada di bawah node induknya. Node yang berada di pangkal tree disebut node root (akar), sedangkan node yang berada paling ujung pada piramida tree disebut node leaf (d aun).
Binary Tree (Pohon Biner)
Dalam mata kuliah struktur data, secara khusus akan dipelajari mengenai pohon biner. Pohon biner adalah sebuah tree yang pada masing-masing simpulnya hanya dapat memiliki maksimum 2 (dua) simpul anak. Tidak boleh lebih. Pada pohon biner, umumnya kedua node anak disebut dengan posisinya, yaitu kiri dan kanan. Beberapa istilah pada pohon biner: •
Size (ukuran) jumlah total node yang terdapat pada pohon biner tesebut.
•
Depth (kedalaman)
panjang jalur yang menghubungkan sebuah node
sampai ke node anaknya yang paling ujung (leaf). Depth biasa juga disebut height.
IX-1
Full Binary Tree (Pohon Biner Penuh) adalah pohon biner yang setiap
nodenya pasti memiliki 0 atau 2 node anak. Perfect Binary Tree (Pohon Biner Sempurna) adalah pohon biner yang
semua ndoe leafnya berada pada kedalaman yang sama dari node root. Juga disebut sebagai Complete Binary Tree (Pohon Biner Lengkap). Almost Complete Binary Tree (Pohon Biner Hampir Lengkap) adalah pohon
biner yang setiap nodenya dapt memiliki 0 node anak, atau memiliki kiri, atau jika memiliki kana harus memiliki kiri. Tidak boleh memiliki kanan saja.
Implementasi
Implementasi dalam pemrograman, dalam pokok bahasan ini akan dibicarakan untuk pohon biner saja. Asumsi awal adalah data yang hendak dimasukkan ke dalam node, bertipe data integer.
Deklarasi Tree
Karena tree tersusun oleh node-node, maka yang perlu dideklarasikan adalah komponen node itu sendiri. Dalam contoh di bawah, akan kita namai Node. Sebelumnya perlu kita lihat bahwa untuk mewujudkan implementasi node ke dalam bahasa pemrograman, diperlukan sebuah struktur yang memiliki susunan berikut ini: kiri
data
kanan
pointer
int
pointer
typedef struct Node{ int data; Node*kiri; Node*kanan; typedef struct Node};
Variabel data digunakan untuk menyimpan nilai angka node tersebut, sedangkan kiri dan kanan, bertipe pointer, masing-masing mewakili vektor yang akan menunjuk ke node anak kiri dan kanan.
IX-2
Inisialisasi Tree
Untuk pertama kali, saat kita akan membuat sebuah pohon biner, asumsi awal adalah pohon itu belum bertumbuh, bekum memiliki node sama sekali, sehingga masih kosong. Oleh karena itu perlu kita tambahkan kode berikut pada baris awal prosedur Main: Node*pohon; Pohon = NULL;
Kita mendeklarasikan sebuah pointer yang akan menunjuk ke akar pohon yang kita buat, dengan nama *pohon. Pointer ini ditujukan untuk menunjuk struktur bertipe Node, yang telah dibuat pada bagian 1. Karena pohon tersebut belum sama sekali memiliki node, maka pointer *pohon ditunjuk ke NULL.
Menambahkan Node Pada Tree
Karena pohon yang kita buat merupakan sebuah pohon biner, maka untuk menambahkan sebuah node, secara otomatis penambahan tersebut mengikuti aturan penambahan node pada pohon biner: 1. Jika pohon kosong, maka node baru ditempatkan sebagai akar pohon. 2. Jika pohon tidak kosong, maka dimulai dari node akar, dilakukan proses pengecekan berikut: a. Jika nilai node baru lebih kecil dari nilai node yang sedang dicek, maka lihat ke kiri node tersebut. Jika kiri node tersebut kosong (belum memiliki kiri), maka node baru menjadi kiri node yang sedang dicek. Seandainya kiri node sudah terisi, lakukan kembali pengecekan a dan b terhadap node kiri tersebut. Pengecekan ini dilakukan seterusnya hingga node baru dapat ditempatkan. b. Jika nilai node baru lebih besar dari nilai node yang sedang dicek, maka lihat ke kanan node tersebut. Jika kanan node terebut kosong (belum memiliki kanan), maka node baru menjadi kanan node yang sedang dicek. Seandainya kanan node sudah terisi, lakukan kembali pengecekan a dan b terhadap node kanan tersebut. Pengecekan ini dilakukan seterusnya hingga node baru dapat ditempatkan.
IX-3
Proses penambahan ini diimplementasikan secara rekursif pada prosedur berikut ini: void tambah(node**root, int databaru){ if((*root) == NULL){ node*baru; baru = new node; baru->data = databaru; baru->kiri = NULL; baru->kanan = NULL; (*root) = baru; (*root)->kiri = NULL; (*root)->kanan = NULL; printf("Data bertambah!"); } else if(databaru<(*root)->data) tambah(&(*root)->kiri, databaru); else if(databaru > (*root)->data) tambah(&(*root)->kanan, databaru); else if(databaru == (*root)->data) printf("Data sudah ada!"); }
Variabel **root menunjukkan node mana yang sedang dicek saat ini, untuk itu saat pemanggilan prosedur ini, variabel **root kita beri nilai pointer yang menunjuk ke node akar, yaitu pohon. Tambah(&pohon, data);
Untuk selengkapnya dapat dilihat pada bagian 5, kode program lengkap.
Membaca dan Menampilkan Node pada Tree
Untuk membaca dan menampilkan seluruh node yang terdapat pada pohon biner, terdapat 3 macam cara, atau biasa disebut kunjungan (visit). Semua kunjungan diawali dengan mengunjungi akar pohon. Karena proses kunjungan ini memerlukan perulangan proses yang sama namun untuk depth yang berbeda, maka ketiganya diimplementasikan dengan prosedur rekursif. 1.
Kunjungan Pre-Order
Kunjungan pre-order dilakukan mulai dari akar pohon, dengan urutan: a.
Cetak isi (data) node yang sedang dikunjungi.
b.
Kunjungi kiri node tersebut,
•
Jika kiri bukan kosong (NULL) mulai lagi dari langkah pertama, terapkan untuk kiri tersebut.
•
Jika kiri kosong (NULL), lanjut ke langkah ketiga. IX-4
c.
Kunjungi kanan node tersebut,
•
Jika kanan bukan kosong (NULL) mulai lagi dari langkah pertama, terapkan untuk kanan tersebut.
•
Jika kanan kosong (NULL), proses untuk node ini selesai, tuntaskan proses yang sama untuk node yang dikunjungi sebelumnya. void preOrder(node*root){ if(root!=NULL){ printf("%d",root->data); preOrder(root->kiri); preOrder(root->kanan); }}
2.
Kunjungan In-Order
a.
Kunjungi kiri node tersebut,
•
Jika kiri bukan kosong (NULL) mulai lagi dari langkah pertama, terapkan untuk kiri tersebut.
•
Jika kiri kosong (NULL), lanjut ke langkah kedua.
b.
Cetak isi (data) node yang sedang dikunjungi.
c.
Kunjungi kanan node tersebut,
•
Jika kanan bukan kosong (NULL) mulai lagi dari langkah pertama, terapkan untuk kanan tersebut.
•
Jika kanan kosong (NULL), proses untuk node ini selesai, tuntaskan proses yang sama untuk node yang dikunjungi sebelumnya. void inOrder(node*root){ if(root!=NULL){ inOrder(root->kiri); printf("%d",root->data); inOrder(root->kanan); }}
3.
Kunjungan Post-Order
a.
Kunjungi kiri node tersebut,
•
Jika kiri bukan kosong (NULL) mulai lagi dari langkah pertama, terapkan untuk kiri tersebut.
•
Jika kiri kosong (NULL), lanjut ke langkah kedua.
b.
Kunjungi kanan node tersebut,
IX-5
Jika kanan bukan kosong (NULL) mulai lagi dari langkah pertama, terapkan
•
untuk kanan tersebut. •
Jika kanan kosong (NULL), lanjut ke langkah ketiga.
c.
Cetak isi (data) node yang sedang dikunjungi. Proses untuk node ini selesai, tuntaskan proses yang sama untuk node yang dikunjungi sebelumnya. void postOrder(node*root){ if(root!=NULL){ postOrder(root->kiri); postOrder(root->kanan); printf("%d",root->data); }}
Variabel **root pada setiap fungsi di atas menunjukkan node mana yang sedang dikunjungi saat ini, untuk itu saat pemanggilan, variabel **root kita beri nilai pointer yang menunjuk ke node akar, yaitu pohon. preOrder(pohon); inOrder(pohon); postOrder(pohon);
III. Hasil dan Pembahasan
Program 9-1 #include #include typedef struct node{ int data; node*kiri; node*kanan;}; void tambah(node**root, int databaru){ if((*root) == NULL){ node*baru; baru = new node; baru->data = databaru; baru->kiri = NULL; baru->kanan = NULL; (*root) = baru; (*root)->kiri = NULL; (*root)->kanan = NULL; printf("Data bertambah!"); } else if(databaru<(*root)->data) tambah(&(*root)->kiri, databaru); else if(databaru > (*root)->data) tambah(&(*root)->kanan, databaru); else if(databaru == (*root)->data) printf("Data sudah ada!"); } void preOrder(node*root){
IX-6
if(root!=NULL){ printf("%d",root->data); preOrder(root->kiri); preOrder(root->kanan); }} void inOrder(node*root){ if(root!=NULL){ inOrder(root->kiri); printf("%d",root->data); inOrder(root->kanan); }} void postOrder(node*root){ if(root!=NULL){ postOrder(root->kiri); postOrder(root->kanan); printf("%d",root->data); }} void main(){ int pil, c; node*pohon,*t; pohon = NULL; do{ clrscr(); int data; printf("MENU\n"); printf("1.Tambah\n"); printf("2.Lihat pre-order\n"); printf("3.Lihat in-order\n"); printf("4.Lihat post-order\n"); printf("5.Exit\n"); printf("Pilihan: ");scanf("%d",&pil); switch (pil){ case 1: printf("Data baru: ");scanf("%d",&data); tambah(&pohon,data); break; case 2: if(pohon!=NULL) preOrder(pohon); else printf("Masih kosong!"); break; case 3: if(pohon!=NULL) inOrder(pohon); else printf("Masih kosong!"); break; case 4: if(pohon!=NULL) postOrder(pohon); else printf("Masih kosong!"); break;} getch(); }while(pil!=5);}
Tampilan Menu Utama
IX-7
Proses penambahan data (node)
Tampilan Pre-order
Tampilan In-order
Tampilan Post-order
Program 9-1 di atas merupakan pengimplementasian dari cara kerja struktur data tree pada bahasa C. Terdapat 4 fungsi dalam program di atas yakni program penambahan data (data berupa bilangan bulat/integer), lalu lihat dalam bentuk pre-order, lihat dalam bentuk in-order, dan lihat dalam bentuk post order. Program akan berhenti saat kita memasukkan pilihan yang ke-5 yakni pilihan exit.
IX.
IX-8
MODUL X – GRAPH I.
Tujuan Praktikum
Praktikan diharapkan dapat: 1. Mengenal graph pada struktur data dalam bahasa C 2. Menggunakan struktur data graph guna memecahkan masalah dalam bahasa C 3. Mengimplementasikan
cara
kerja
struktur
data
graph
ke
dalam
aplikasi/program dalam bahasa C
II. Dasar Teori
Graph adalah kumpulan noktah (simpul) di dalam bidang dua dimensi yang dihubungkan dengan sekumpulan garis (sisi). Graph dapat digunakan untuk merepresentasikan objek-objek diskrit dan hubungan antara objek-objek tersebut. Representasi visual dari graph adalah dengan menyatakan objek sebagai noktah, bulatan atau titik (vertex), sedangkan hubungan antara objek dinyatakan dengan garis (edge). G = (V, E)
G = Graph V = Simpul atau vertex, atau node, atau titik E = Busur atau edge, atau arc Ada beberapa cara untuk menyimpan graph di dalam sistem komputer. Struktur data bergantung pada struktur graph dan algortima yang digunakan untuk memanipulasi graph. Secara teori salah satu dari keduanya dapat dibedakan antara struktur list dan matriks, tetapi dalam penggunaannya struktur terbaik yang sering digunakan adalah kombinasi keduanya. •
Graph tak berarah (undirected graph atau non-directed graph)
•
Graph berarah (directed graph)
•
Graph berbobot (weighted graph) Adapun perbedaan graph dengan tree sebagai berikut:
1.
Pada tree tidak terdapat cycle
2.
Pada graph tidak memiliki root X-1
Istilah-istilah pada Graph
Kemudian terdapat istilah-istilah yang berkaitan dengan graph yaitu: 1.
Vertex adalah himpunan node/titik pada sebuah graph.
2.
Edge adalah himpunan garis yang menghubungkan tiap node/vertex.
3.
Adjacen adalah dua buah titik dikatakan berdekatan (adjacent) jika dua buah titik tersebut terhubung dengan sebuah sisi.
4.
Weight adalah sebuah graph G = (V, E) disebut sebuah graph berbobot (weight graph), apabila terdapat sebuah fungsi bobot bernilai real W pada himpunan E.
5.
Path adalah Walk dengan setiap vertex berbeda.
6.
Cycle adalah siklus (cycle) atau sirkuit (circuit) lintasan yang berawal dan berakhir pada simpul yang sama.
Kaitan Shortest Path Problem dalam Graph
Lintasan terpendek merupakan salah satu dari masalah yang dapat diselesaikan dengan graph. Jika diberikan sebuah graph berbobot, masalah lintasan terpendek adalah bagaimana kita mencari sebuah jalur pada graph yang meminimalkan jumlah bobot sisi pembentuk jalur tersebut. Terdapat beberapa macam persoalan lintasan terpendek antara lain: 1.
Lintasan terpendek antara dua buah simpul tertentu (a pair shortest path).
2.
Lintasan terpendek antara semua pasangan simpul (all pairs shortest path).
3.
Lintasan terpendek dari simpul tertentu ke semua simpul yang lain (singlesource shortest path).
4.
Lintasan terpendek antara dua buah simpul yang melalui beberapa simpul tertentu (intermediate shortest path). Jalur terpendek adalah suatu jaringan pengarahan perjalanan dimana seorang
pengarah jalan ingin menentukan jalur terpendek antara dua buah kota, berdasarkan beberapa jalur alternatif yang tersedia, dimana titik tujuan hanya satu.
X-2
Pathing Algorhitm
Pathing Algorhitm adalah sebuah algoritma yang digunakan untuk mencari suatu solusi dalam menentukan lintasan terpendek dari suatu graph. Saat ini terdapat banyak sekali algoritma yang digunakan untuk menyelesaikan persoalan lintasan terpendek di antaranya Algortima Djikstra (djikstra algorhitm) dan Algortima Bellman-Ford (bellman-ford algorhitm).
III. Hasil dan Pembahasan
Program 10-1 #include #include #include int main() { char kata1,kata2,kata3,kata4; int hasil1,hasil2,hasil3,hasil4,hasil5,hasil6,x; cout<<"Program Mencari Rute Terpendek\n"; cout<<"Graph 4 simpul\n"; cout<<"Simpul Pertama: "; cin>>kata1; cout<<"Simpul Kedua : "; cin>>kata2; cout<<"Simpul Ketiga : "; cin>>kata3; cout<<"Simpul Keempat: "; cin>>kata4; cout<<"Sisi-sisnya adalah: "; cout<
ke ke ke ke ke ke
"<
: : : : : :
";cin>>hasil1; ";cin>>hasil2; ";cin>>hasil3; ";cin>>hasil4; ";cin>>hasil5; ";cin>>hasil6;
cout<<"panjang jarak pada graf totalnya = "<>x;
X-3
if(x==1){ cout<<"Alternatif ke-1: "<
Program 10-1 di atas merupakan implementasi dari cara kerja struktur data graph. Dengan menggunakan 4 simpul, user diminta untuk memasukkan nama simpul missalnya A, B, C, dan D. Kemudian kita masukkan jarak dari A ke B, kemudian jarak A ke C, jarak A ke D, jarak B ke C, jarak B ke D, jarak C ke D
X-4
sehingga semua simpul terhubung darn memiliki jarak satu sama lain. Kemudian semua jarak tersebut dijumlahkan sehingga didapatkan total panjangnya 70. Kemudian kita diberi 2 alternatif, missalnya kita pilih AD. Didapatkan jarak terpendek AD yakni 22.
X.
X-5