Modul 1 Array / Larik A. Tujuan : Mahasiswa dapat mendefinisikan array Mahasiswa dapat memahami konsep array 1 dimensi, 2 dimensi dan banyak dimensi Mahasiswa dapat menggunakan operasi pada array Mahasiswa dapat menerapkan konsep array pada studi kasus tertentu B. Dasar Teori Array merupakan struktur data statik yang menyimpan sekumpulan elemen(data) dengan tipe data yang sama. Setiap elemen array dapat diakses langsung melaui indek array. Indek tersebut memiliki tipe data yang menyatakan keterurutan misalnya integer atau karakter. Operasi yang dimiliki oleh array adalah : Operasi untuk menyimpan (Store) nilai Operasi untuk mengambil (Retrieve) nilai Definisi array 1. Sebagai Peubah Contoh : Arr : array[1..25] of integer NamaMhs : array[‘a’..’j’] of string 2. Sebagai tipe baru Contoh : type Arrint : array[1..25] of integer P : Arrint 3. Mendefinisikan ukuran maksimum elemen larik sebagai konstanta Contoh : Const Nmaks = 10 type Larikint : array[1..Nmaks] of integer P : LarikInt Cara menterjemahkan ke bahasa C : #define Nmaks 10 typedef int Larikint[Nmaks+1]; Larikint P; Mengisi elemen array (Operasi Store) data[1]='A'; data[2]='B'; data[3]='C'; Menampilkan data pada array (Operasi Retrieve) printf("%c \n",data[1]); printf("%c \n",data[2]); printf("%c \n",data[3]); C. Praktikum 1. Array 1 dimensi #include <stdio.h> void main() { char data[3]; /* Mengisi elemen array */ data[1]='A'; data[2]='B'; data[3]='C'; /*Menampilkan data dari array */ printf("%c \n",data[1]); printf("%c \n",data[2]); printf("%c \n",data[3]); } #include <stdio.h> #include <conio.h> void main() { int nilai[5],x; printf("Masukkan 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 \n",nilai[x]); } getch(); } #include <stdio.h> #include <conio.h> int main() { int bil[7] = {0}; for (int i=0;i<7;i++) { printf("Elemen ke-%i= %d\talamat: %x\n",i,bil[i],&bil[i]); } getch(); return 0; } void main() { int nilai[10],x,jml,min,max; float avg,total; printf("Masukkan Bilangan : "); scanf("%d",&jml); #include <stdio.h>for (x=0;x<jml;x++) #include <conio.h> { printf("Bilangan ke %d : ",x+1); scanf("%d",&nilai[x]); } printf("\n"); total = 0;max=0; for (x=0;x<jml;x++) { total = total + nilai[x]; if (min < nilai[x]) min = min; else min = nilai[x]; if (max > nilai[x]) max = max; else max = nilai[x]; } avg = total/jml; printf("Min : %d \n",min); printf("Max : %d \n",max); printf("Total : %f \n",total); printf("Rata-rata : %f \n",avg); getch(); } 2. Array 2 dimensi #include <stdio.h> void main() { int arr [2][2]; /* Deklarasi array 2 dimensi */ /* inisialisasi */ arr[0][0] = 5; arr[0][1] = 2; arr[1][0] = 3; arr[1][1] = 9; printf("%d \n",arr[0][0]); printf("%d \n",arr[0][1]); printf("%d \n",arr[1][0]); printf("%d \n",arr[1][1]); } #include <iostream.h> #include <conio.h> main() { int baris, kolom; int n, m,matriksA[15][15],matriksB[15][15],hasil[15][15]; clrscr(); cout << "Silahkan masukkan ordo matrik A dan B (maks 15) \n"; cout << "Ordo baris matrik A dan B = "; cin >> n; cout << "Ordo kolom matrik A dan B = "; cin >> m; cout << "\n"; cout << "Input elemen Array : \n"; for(baris=0; baris<n; baris++) { for(kolom=0; kolom<m; kolom++) { cout << "matriksA["<<(baris+1)<<"]["<<(kolom+1)<<"] = "; cin >> matriksA[baris][kolom]; } } cout << "\n"; /* Matrik B*/ cout << "Input elemen Array : \n"; for(baris=0; baris<n; baris++) { for(kolom=0; kolom<m; kolom++) { cout << "matriksB["<<(baris+1)<<"]["<<(kolom+1)<<"] = "; cin >> matriksB[baris][kolom]; } } /* menampilkan data pada array untuk matrik A*/ cout << "\n"; cout << " Matrik A : \n"; for(baris=0; baris<n; baris++) { for(kolom=0; kolom<m; kolom++) cout << " " << matriksA[baris][kolom]; cout << "\n"; } /* menampilkan data pada array untuk matrik B*/ cout << " Matrik B : \n"; for(baris=0; baris<n; baris++) { for(kolom=0; kolom<m; kolom++) cout << " " << matriksB[baris][kolom]; cout << "\n"; } cout << "Penjumlahan Matrik A dan B adalah :: \n"; for(baris=0; baris<n; baris++) { for(kolom=0; kolom<m; kolom++) { hasil[baris][kolom]=matriksA[baris][kolom] + matriksB[baris][kolom]; cout << " " << hasil[baris][kolom]; } cout << "\n"; } cout << "Pengurangan Matrik A dan B adalah :: \n"; for(baris=0; baris<n; baris++) { for(kolom=0; kolom<m; kolom++) { hasil[baris][kolom]=matriksA[baris][kolom] matriksB[baris][kolom]; cout << " " << hasil[baris][kolom]; } cout << "\n"; } } Kerjakan dan jelaskan progam-program diatas D. Tugas Pendahuluan 1. Jelaskan definisi penulisan array 1 dimensi, 2 dimensi dan banyak dimensi 2. Buatlah program untuk memberikan nilai awal/inisialisasi untuk data ipk mahasiswa(min 10 mahasiswa). Contoh : float ipk[5] = {3.0,3.67,1.34,2.34,3.24}; kemudian tampilkan data tersebut (gunakan loop for dan while) E. Tugas Praktikum : 1. Buatlah program untuk melakukan penjumlahan dua buah bilangan yang melebihi satu triliun. Contoh : Bilangan pertama = 100022233344455566677888999 Bilangan kedua = 2000111222333444555666777888999 Hasil = 2001111444666889111333555777998 2. Setiap bulan di perumahan Permata selalu dilakukan penimbangan Balita. Data berat badan setiap Balita disimpan pada buku monitoring berat badan Balita. Berikut adalah contoh data berat badan tersebut. Bulan Lalu Bulan Sekarang Keterangan Fidela 10 10,2 Naik 0,2 Lavina 6,4 7 Naik 0.6 Nadifa 15 14,8 Turun 0.2 Fatan 11 11,3 Naik 0.3 Aji 8,6 8,6 Tetap …. … … … Anda diminta membuat program untuk mengetahui kenaikan atau penurunan berat badan setiap Balita antara penimbangan bulan sebelumnya dengan bulan sekarang. Input program berupa data nama balita dan data berat badan Balita. input data dijamin tidak lebih dari 1000 balita. Output berupa keterangan naik, turun, Tetap dan nilai penambahan atau penurunannya. Contoh masukan : Fidela 10 10,2 Lavina 6,4 7 Nadifa 15 14,8 Fatan 11 11,3 Aji 8,6 9 Contoh Keluaran : Fidela Lavina Nadifa Fatan Aji Bulan lalu 10 6,4 15 11 8,6 Bulan Sekarang Ket 10,2 Naik 0,2 7 Naik 0,6 14,8 Turun 0,2 11,3 Naik 0,3 8,6 Tetap Modul 2 Record /Rekaman A. Tujuan : Mahasiswa dapat mendefinisikan record Mahasiswa dapat mengakses elemen record Mahasiswa dapat menerapkan record pada suatu studi kasus tertentu. B. Dasar Teori RECORDS digunakan untuk menyimpan element dengan tipe data yang berbeda-beda. Sebagai contoh terdapat record seperti berikut : PNS Mr. Bagus Jl Bayangkari 1 12/2/1966 Rp. 5.000.000 Fields JIka kita perhatikan record diatas terdiri dari fields Status Kepegawaian, Nama, Alamat, Tanggal Lahir dan Gaji. Setiap fields tersebut mempunyai tipe data yang berbeda.Misalkan field Nama bertipe data char dan gaji bertipe data real. Pada Bahasa C++ Record disebut Struct. Fields disebut member. Deklarasi Struct Deklarasi 1 struct nama_struct { tipe_data_1 tipe_data_2 tipe_data_3 …… }; Contoh : struct pegawai { char status[10]; char nama[30]; char alamat[40]; char tgl_lahir[10]; float gaji; }; nama_var_1; nama_var_2; nama_var_3; Deklarasi 2, Menggunakan kata tercadang typedef typedef struct Mahasiswa { char NIM[8]; char nama[50]; float ipk; }; Untuk menggunakan struct Mahasiswa dengan membuat variabel mhs1 dan mhs2 Mahasiswa mh1s,mhs2; Untuk menggunakan struct Mahasiswa dengan membuat variabel array mhs; Mahasiswa mhs[100]; //Pendeklarasian tipe data baru struct Mahasiswa typedef struct Mahasiswa{ char NIM[9]; char nama[30]; float ipk; }; void main(){ //Buat variabel mhs bertipe data Mahasiswa Mahasiswa mhs[100]; ……………… } Mengakses Komponen Record Gunakan nama record nama member yang dipisah dot Contoh : Pegawai.nama; Mhs[i].NIM; C. Praktikum 1. Entri data NIM dan Nama Mahasiswa #include <stdio.h> #include <conio.h> //Pendeklarasian tipe data baru struct Mahasiswa typedef struct Mahasiswa{ char NIM[9]; char nama[30]; float ipk; }; void main(){ //Buat variabel mhs bertipe data Mahasiswa Mahasiswa mhs[2]; int i; clrscr(); for (i=0;i<2;i++) { printf("NIM = ");scanf("%s",mhs[i].NIM); printf("Nama = ");scanf("%s",mhs[i].nama); printf("IPK = ");scanf("%f",&mhs[i].ipk); } for (i=0;i<2;i++) { printf("Data Anda : \n"); printf("NIM : %s\n",mhs[i].NIM); printf("Nama : %s\n",mhs[i].nama); printf("IPK : %f\n",mhs[i].ipk); } getch(); } Kerjakan dan jelaskan progam-program diatas D. Tugas Pendahuluan 1. Jelaskan definisi penulisan record pada bahasa C++ 2. Berikan penjelasan mengenai definisi dan deklarasi Nested Struct, Struct of array dan array of struct. E. Tugas Praktikum 1. Fakultas Teknik informatika membutuhkan suatu aplikasi untuk mencatat data karyawan yang berada dilingkungannya. Adapun fields yang perlu disimpan adalah NIP, Nama, alamat, tgl lahir, agama, telepon dan kepangkatan. Input data karyawan dipastikan tidak lebih dari 500 karyawan. Buatlah program yang dapat menyimpan data tersebut dan menampilkannya kembali. Modul 3 Fungsi A. Tujuan : Mahasiswa dapat memahami funsi Mahasiswa dapat menerapkan fungsi B. Dasar Teori Procedure tidak memberikan nilai balik Function memberikan nilai balik (return value) Membuat Fungsi Tentukan function yang akan dibuat : Return type Nama Tipe Parameter Tubuh fungsi (kode program) Tipe data Nama Fungsi Parameter INT FUNGSI_SATU(INT A, INT B) { … RETURN(A+B); … } Tubuh Fungsi Call-by-value vs Call-by-reference Call-by-value tidak dapat merubah variabel yang memanggilnya secara langsung ◦ Int penjumlahan (int a, int b) Call-by-reference dapat merubah nilai variabel yang memanggilnya secara langsung. Nama altenative variabel/Shortcut harus diinisialisasi Deklarasi : ◦ int &bilangan; ◦ double &total; ◦ char &karakter; Diawali karakter “&” C. Praktikum /*fungsi menampilkan tulisan D3 Manajemen Informatika dengan posisi 5,5 */ #include "stdio.h" #include "conio.h" void cetak(int x, int y, char a[]) /*a juga dapat dideklarasikan dengan *a */ { gotoxy(x,y); printf("%s",a); } void main () { clrscr(); cetak(5,5,"D3 Manajemen Informatika"); getch(); } #include "stdio.h" #include "conio.h" Int penjumlahan (int a, int b) { Int jumlah; jumlah = a + b; Return(jumlah) } Void main { Int j,k,l; cout << “Masukkan 2 angka\n"; cin >> j >> k; l = penjumlahan(j,k); cout << “nilai j = " << j << endl; cout << “nilai k " << k << endl; cout << “hasil l " << l << endl; } Call-by-value vs Call-by-reference #include <stdio.h> int test1(int &a) { a = a+5; return(a); } void main() { int data; data = 10; printf("sebelum memanggil passing by reference nilai a = %d \n",data); test1(data); printf("setelah memanggil passing by reference nilai a = %d \n",data); } Kerjakan dan jelaskan progam-program diatas D. Tugas Pendahuluan 1. Jelaskan apa itu fungsi 2. Jelaskan scope variabel pada fungsi 3. Apa perbedaan cal by value dan call by reference, berikan contohnya E. Tugas Praktikum 1. Buatlah suatu program yang dapat menerima input IPK mahasiswa, kemudian buatlah fungsi MIN untuk mengetahui IPK terkecil, fungsi MAX untuk mendapatkan nilai IPK terbesar dan fungsi average untuk mendapatakan rata-rata IPK mahasiswa. Jumlah input IPK mahasiswa tidak lebih dari 100 orang. 2. Anda diminta untuk membuat program untuk menghitung penjumlahan, pengurangan, pembagian dan perkalian, gunakanlah fungsi untuk menyelesaikan masalah tersebut serta buatlah menu untuk dapat memilih fungsi mana yang ingin digunakan. Modul 4 Rekursife A. Tujuan : Mahasiswa dapat memahami Rekursife Mahasiswa dapat menerapkan Rekursife B. Dasar Teori Rekursife adalah function yang memanggil fungsi itu sendiri. Rekursife sangat memudahkan untuk memecahkan permasalahan yang kompleks Sifat-sifat rekursif Dapat digunakan ketika inti dari masalah terjadi berulang kali Sedikit lebih efisien dari iterasi tapi lebih elegan Method-methodnya dimungkinkan untuk memanggil dirinya sendiri Data yang berada dalam method tersebut seperti argument disimpan sementara kedalam stack sampai method pemanggilnya diselesaikan int factorial( int x ) { if (x == 1) return(1); else return(x * factorial(x-1)); } Rekursive C. Praktikum #include <stdio.h> float factorial(float x) { if(x==1.0) return(1.0); else return(x*factorial(x-1.0)); } void main() { int i; for(i=1;i<10;i++) printf( "%0.0f \n",factorial(i) ); } ai k " << k << endl; cout << “hasil l " << l << endl; } #include <stdio.h> long fibonacci (long n) { if (n==1 || n==2) return 1; else return fibonacci(n-1) + fibonacci(n-2); } main() { int x ; printf("Mencari nilai fibonacci \n"); printf("Masukkan nilai x :");scanf("%d",&x); printf("Nilai fibonacci dari %d=%d\n" ,x,fibonacci(x)); } Kerjakan dan jelaskan progam-program diatas D. Tugas Pendahuluan 1. Jelaskan apa yang dimaksud dengan fungsi rekursif? 2. Jelaskan perbedaan antara iterasi dan rekursife? E. Tugas Praktikum 1. Buatlah program dalam bentuk rekursif untuk mendapatkan nilai permutasi 2. Buatlah program untuk tower of Hanoi dengan menggunakan rekursif Modul 5 Pengurutan/Sorting A. Tujuan : Mahasiswa dapat memahami Pengurutan Mahasiswa dapat menerapkan pengurutan B. Dasar Teori Pengurutan data dapat dilakukan secara menaik (ascending) maupun menurun (descending). Ada beberapa keuntungan yang dapat kita peroleh pada data yang telah terurut, yaitu mudah dalam pencarian data, perbaikan kesalahan data, disisipi data baru atau menghapus data tertentu. Terdapat beberapa metode pada pengurutan, diantaranya adalah : Bubble sort Selction sort Quick sort Merge Sort C. Praktikum // Program bubble sort #include <iostream.h> #include <iomanip.h> void main() { int numlist[8]={5,4,65,27,70,76,11,1}; int swap; cout<<"Data sebelum diurutkan : \n"; for (int i=0;i<8;i++) { cout<< setw(3) <<numlist[i]; } cout<<"\n\n"; for(int j=0;j<7;j++) for(int k=0;k<7;k++) if (numlist[k] > numlist[k+1]) { swap = numlist[k]; numlist[k] = numlist[k+1]; numlist[k+1] = swap; } cout<<"Data setelah diurutkan \n"; for (int ii=0;ii<8;ii++) { cout<< setw(3) <<numlist[ii]; } } // quick #include #include #include sort <stdio.h> <stdlib.h> <string.h> int fungsi_urut(const void *a, const void *b); char data[5][4]={"bus","bas","bin","bli","bon"}; int main(void) { int x; qsort((void *)data,5,sizeof(data[0]),fungsi_urut); for (x=0;x<5;x++) printf("%s\n",data[x]); return 0; } int fungsi_urut(const void *a, const void *b) { return(strcmp((char*)a, (char*)b)); } Kerjakan dan jelaskan progam-program diatas D. Tugas Pendahuluan 1. Jelaskan algortima metode pengurutan bubble sort, selction sort, quick sort dan merge Sort E. Tugas Praktikum 1. Buatlah sebuah program yang dapat menerima input 10 buah data dengan menggunakan metode bubble sort, selction sort, quick sort dan merge Sort. Pengguna dapat memilih pada suatu menu metode pengurutan apa yang akan dipilih. Modul 6 Pencarian/Searching A. Tujuan : Mahasiswa dapat memahami Pencarian Mahasiswa dapat menerapkan Pencarian B. Dasar Teori Pencarian atau searching suatu data pada sekumpulan data merupakan proses yang sangat penting dalam kehidupan nyata. Seperti halnya pengurutan, pencarian juga dapat dilakukan dengan beberapa metode. Terdapat beberapa metode pada pencarian, adalah : Pencarian beruntun (sequential search) Pencarian bagidua (binary search) C. Praktikum // Program sequential search #include <iostream.h> int tabInt[10]= {34,67,23,28,98,15,89,67,28,18}; void main() { int i,bil_cari,ketemu; i=0; bil_cari=89; ketemu = 0; while((i<10) && (ketemu==0)) { if(tabInt[i] == bil_cari) ketemu=1; else i=i+1; } if(ketemu == 1) cout<<"data ada dalam larik"; else cout<<"data tidak ada dalam larik"; } // program binary search #include <iostream.h> int tabInt[10]= {15,18,23,28,28,34,67,67,89,98}; void main() { int i,j,bil_cari,k,ketemu; i=0; j=9; bil_cari=89; ketemu = 0; while((ketemu == 0) && (i<=j)) { k=(i+j)/2; if(tabInt[k] == bil_cari) ketemu = 1; else { if(tabInt[k] > bil_cari) j=k-1; else i=k+1; } } if(ketemu == 1) cout<<"data ada dalam larik"; else cout<<"data tidak ada dalam larik"; } Kerjakan dan jelaskan program-program diatas. D. Tugas Pendahuluan 1. Jelaskan algortima metode pencarian beruntun (sequential search) dan pencarian bagi dua (binary search). E. Tugas Praktikum 1. Buatlah sebuah program pencarian dengan menggunakan metode pencarian bagi dua (binary search) untuk array dari tipe terstruktur mahasiswa. Data mahasiswa terdiri dari nim bertipe string, nama bertipe string, alamat bertipe string, dan nilai bertipe float.Pencarian berdasarkan nim. Modul 7 Pointer A. Tujuan : Mahasiswa dapat memahami Pointer Mahasiswa dapat menerapkan Pointer B. Dasar Teori Pointer adalah variable yang berisi alamat memori sebagai nilainya dan berbeda dengan variabel biasa yang berisi nilai tertentu. Dengan kata lain, pointer berisi alamat dari variabel yang mempunyai nilai tertentu. Adapun bentuk umum dari pernyataan variable pointer dalam C++ adalah : Type *variable_name; Dengan : type adalah tipe dasar pointer. variable_name adalah nama variable pointer. * adalah operator memori yang fungsinya untuk mengembalikan nilai variabel pada alamatnya yang ditentukan oleh operand. C. Praktikum //program pointer1 #include<iostream.h> void main() { int v = 7, *p; p = &v; cout<<"Nilai v = "<<v<<" dan *p = "<<*p<<endl; cout<<"Alamatnya = "<<p; } //program pointer2 #include<iostream.h> #include<stdio.h> void main() { char str[80]; char token[80]; int i, j; cout<<"Masukkan sebuah kalimat : "; gets(str); for (i=0; ; i++) { for (j=0; str[i]!=' ' && str[i]; j++, i++) token[j] = str[i]; token[j] = '\0'; cout<<token<<endl; if (!str[i]) break; } } //program pointer3 #include<iostream.h> #include<stdio.h> void main() { char str[80]; char token[80]; char *str_ptr, *tk_ptr; cout<<"Masukkan sebuah kalimat : "; gets(str); str_ptr = str; while (*str_ptr) { tk_ptr = token; while (*str_ptr != ' ' && *str_ptr) { *tk_ptr = *str_ptr; tk_ptr++; str_ptr++; } if (*str_ptr) str_ptr++; *tk_ptr = '\0'; cout<<token<<endl; } } Kerjakan dan jelaskan program-program diatas. D. Tugas Pendahuluan 1. Jelaskan variabel pointer! 2. Jelaskan perbedaan variabel pointer dengan jenis variabel lainnya! E. Tugas Praktikum 1. Buatlah program untuk merubah huruf besar ke kecil dengan menggunakan pointer! 2. Buatlah program untuk menampilkan kalimat terbalik dari suatu kalimat yang diinputkan menggunakan pointer ! Modul 8 Linked List A. Tujuan : Mahasiswa dapat memahami Linked List. Mahasiswa dapat menerapkan Linked List B. Dasar Teori Linked list atau senarai adalah struktur data berisis kumpulan data / node yang tersusun secara sequential, saling sambung menyambung dan dinamis. Linked list ini mirip array, namun linked list ini bersifat dinamis, penambahan data tidak terbatas, sequential acces, dan penghapusan data mudah. Prinsip linked list dapat kita bandingkan seperti suatu rantai yang matanya dihubungkan satu sama lain. Mata rantai tersebut dapat kita asosiasikan dengan record atau node. Jadi, untuk selanjutnya dalam konteks linked list kita menggunakan terminology NODE untuk pengertian sebuah record. Ciri khas suatu node dalam linked list adalah harus selalu terdapat field, paling sedikit dua bagian, yaitu : 1. Data 2. Pointer. Secara umum linked list dibedakan atas 2 macam, yaitu : 1. Single Linked List dan 2. Double Linked List Single Linked List mempunyai satu pointer untuk setiap node yang menunjuk ke node berikutnya, artinya hanya punya satu arah. * * …… * NIL * * Gambar 8.1 Node yang terakhir selalu menunjuk ke elemen kosong, dan diidentifikasi dengan nilai NIL Pada Gambar 8.1 dapat kita lihat bahwa setiap record mempunyai satu pointer yang menunjuk ke record yang berikutnya, dengan pengecualian untuk record terakhir yang menunjuk ke record yang tidak ada. Record yang tidak ada tersebut kita definisi dengan nilai Nul (NIL) yang artinya juga sebagi akhir suatu list. Double Linked List mempunyai dua pointer yang menunjuk ke node berikutnya dan sebelumnya, artinya punya dua arah. NIL * * * * ……… * * * NIL * Gambar 8.2 Previous pointer Node pertama dan Next pointer Node terakhir menunjuk ke elemen kosong, dan diidentifikasi dengan nilai NULL Double Linked List dapat dilihat pada Gambar 8.2. Pointer Node pertama tidak mempunyai pendahulu, jadi pointer yang menunjuk ke elemen sebelumnya adalah elemen yang tidak ada (NIL) dan analog untuk node terakhir, dimana pointer yang menunjuk ke elemen berikutnya adalah elemen yang tidak ada (NIL). C. Praktikum #include<stdio.h> #include<stdlib.h> #include<iostream.h> #include<malloc.h> struct node { int info; struct node *next; } typedef struct node NODE; typedef NODE* PTRNODE; PTRNODE PtrAwal = NULL, tPtr; /*menambah node di akhir dari list*/ void InsertLast(PTRNODE *Ptr, int Value) { PTRNODE prevPtr = *Ptr, nowPtr = *Ptr, newPtr; newPtr = malloc(sizeof(NODE)); newPtr->info = Value; newPtr->next = NULL; while (nowPtr != NULL) { prevPtr = nowPtr; nowPtr = nowPtr->next; } if(prevPtr == NULL) *Ptr = newPtr; else prevPtr->next = newPtr; } /*menambah node diawal dari list*/ void InsertFirst(PTRNODE *Ptr, int Value) { PTRNODE newPtr; newPtr = malloc(sizeof(NODE)); newPtr->info = Value; newPtr->next = *Ptr; *Ptr = newPtr; } /*menyisipkan node sehingga menjadi list terurut*/ void InsertOrder(PTRNODE *Ptr, int Value) { PTRNODE prevPtr = *Ptr, nowPtr = *Ptr, newPtr; newPtr = malloc(sizeof(NODE)); newPtr->info = Value; newPtr->next = NULL; while(nowPtr != NULL && Value > nowPtr->info) { prevPtr = nowPtr; nowPtr = nowPtr->next; } if (prevPtr == NULL) { newPtr->next = *Ptr; *Ptr = newPtr; } else { prevPtr->next = newPtr; newPtr->next = nowPtr; } } /*mencari node yang mempunyai nilai value tertentu*/ PTRNODE Cari(PTRNODE Ptr, int Value) { PTRNODE cariPtr = Ptr; int Ketemu = 0; while (cariPtr != NULL && Ketemu == 0) { if (cariPtr->info == Value) Ketemu = 1; else cariPtr = cariPtr->next; } return cariPtr; } /*mendapatkan pointer ke node sebelum node yang ditunjuk Ptr*/ PTRNODE PtrSebelum(PTRNODE Head, PTRNODE Ptr) { PTRNODE nowPtr = Head, prevPtr = NULL; while (nowPtr != Ptr) { prevPtr = nowPtr; nowPtr = nowPtr->next; } return prevPtr; } /*menghapus node yang berisi Value*/ void Delete(PTRNODE *Ptr, int Value) { PTRNODE nowPtr, prevPtr, tPtr; nowPtr = Cari(*Ptr, Value); if (nowPtr != NULL) { prevPtr = PtrSebelum(*Ptr, nowPtr); if (prevPtr == NULL) { tPtr = *Ptr; *Ptr = (*Ptr)->next; free(tPtr); } else { prevPtr->next = nowPtr->next; free(nowPtr); } } } /*menyajikan seluruh isi node kelayar*/ void cetak(PTRNODE Ptr) { while (Ptr != NULL) { printf("%4d ",Ptr->info); Ptr = Ptr->next; } printf("\n"); } Program dia atas masih terdapat kesalahan, coba betulkan sehingga dapat digunakan untuk menyisipkan, menghapus dan mencetak linked list. D. Tugas Pendahuluan 1. Jelaskan struktur data linked list! 2. Jelaskan operasi-operasi pada linked list! 3. Jelaskan macam-macam linked list dan gambar dari macam-macam linked list tersebut! E. Tugas Praktikum 1. Buatlah program Double Linked List Non Circular (DLLNC) yang terdiri dari menu yang berisi : 1. Menambah Data Depan 2. Menambah Data Belakang 3. Menambanh Data Tengah 4. Menghapus Data Depan 5. Menghapus Data Belakang 6. Menghapus Data Tengah Modul 9 STACK A. Tujuan : Mahasiswa terminologi yang terkait dengan struktur data stack. Mahasiswa dapat memahami operasi-operasi yang ada dalam stack. Mahasiswa dapat mengidentifikasi permasalahan-permasalahan pemrograman yang harus diselesaikan dengan menggunakan stack, sekaligus menyelesaikannya. B. Dasar Teori Deskripsi Stack Salah satu konsep yang efektif untuk menyimpan dan mengambil data adalah “terakhir masuk sebagai yang pertama keluar” (Last In First Out / LIFO). Dengan konsep ini, pengambilan data akan berkebalikan urutannya dengan penyimpanan data. Stack adalah sebuah kumpulan data dimana data yang diletakkan diatas data yang lain. Dengan demikian stack adalah struktur data yang menggunakan konsep LIFO. Dengan demikian, elemen terakhir yang disimpan dalam stack menjadi elemen pertama yang diambil. Dalam proses komputasi, untuk meletakkan sebuah elemen pada bagian atas dari stack, maka kita melakukan push. Dan untuk memindahkan dari tempat yang atas tersebut, kita melakukan pop. Untuk menjelaskan pengertian diatas kita mengambil contoh sebagai berikut. Misalnya kita mempunyai dua buah kotak yang kita tumpuk, sehingga kotak kita letakkan diatas kotak yang lain. Jika kemudian stack dua buah kotak tersebut kita tambah dengan kotak ketiga dan seterusnya, maka akan kita peroleh sebuah stack kotak, yang terdiri dari N kotak. Secara sederhana, sebuah stack bisa kita ilustrasikan seperti pada Gambar 4.1. Dari gambar tersebut, kita bisa mengatakan bahwa kotak B ada di atas kotak A dan ada di bawah kotak C. Dari gambar tersebut kita dapat melihat bahwa kita hanya bisa menambah atau mengambil kotak lewat satu ujung, yaitu ujung bagian atas. Nampak pula bahwa stack merupakan kumpulan data yang sifatnya dinamis, artinya kita bisa menambah atau mengambil data darinya. Gambar 3.1 Ilustrasi Sebuah Stack Penyajian Stack Ada beberapa cara untuk menyajikan sebuah stack tergantung pada permasalahan yang akan kita selesaikan. Kita dapat menggunakan array untuk menyajikan sebuah stack, dengan anggapan bahwa banyaknya elemen maksimum dari stack tersebut tidak akan melebihi batas maksimum banyaknya elemen dalam array. Pada saat ukuran stack, kalau kita teruskan menambahkan data lagi, akan terjadi overflow. Dengan demikian perlu data tambahan untuk mencatat posisi ujung stack. Dengan kebutuhan seperti itu, kita dapat menyajikan stack dengan menggunakan tipe data struktur (struct) yang terdiri dari dua field. Field pertama bertipe array untuk menyimpan elemen stack, medan kedua bertipe integer untuk mencatat posisi ujung stack. Operasi Pada Stack Operasi-operasi dasar pada stack adalah sebagai berikut : 1. Push : digunakan untuk menambah item pada stack pada tumpukan paling atas 2. Pop : digunakan untuk mengambil item pada stack pada tumpukan paling atas 3. Clear : digunakan untuk mengosongkan stack 4. IsEmpty : fungsi yang digunakan untuk mengecek apakah stack sudah kosong 5. IsFull : fungsi yang digunakan untuk mengecek apakah stack sudah penuh Notasi POLISH Salah satu pemanfaatan stack adalah untuk menulis ungkapan menggunakan notasi tertentu. Seperti kita ketahui, dalam penulisan ungkapan, khususnya ungkapan numeris, kita selalu menggunakan tanda kurung untuk mengelompokkan bagian mana yang akan dikerjakaan lebih dahulu. Sebagai contoh, dalam ungkapan : (A + B) * (C – D) Suku (A + B) akan dikerjakan lebih dahulu, kemudian suku (C – D), dan terakhir mengalikan hasil yang diperoleh dari dua suku tersebut. Cara penulisan ungkapan tersebut sering disebut dengan notasi infix, yang artinya adalah bahwa operator ditulis diantara dua operand. Seorang ahli matematika mengembangkan satu cara penulisan ungkapan numeris yang selanjutnya disebut notasi polish atau notasi prefix, yang artinya adalah operator ditulis sebelum kedua operand yang akan disajikan. Sebagai contoh : Infix Prefix A – B / (C * D ^ E) -A/B*C^DE Notasi lain, yang merupakan kebalikan notasi prefix, adalah notasi postfix atau notasi suffix, atau lebih dikenal dengan notasi Polish Terbalik (Reverse Polish Notation atau RPN). Dalam hal ini operator ditulis sesudah operand. Sebagai contoh : Infix Postfix A – B / (C * D ^ E) ABCDE^*/C. Praktikum #include<iostream.h> #include<stack> #include<string> void main() { stack<string> allwords; string word; while (cin >> word) { allwords.push(word); } cout<<"Number of words = "<<allwords.size()<<endl; while(!allwords.empty()) { cout<<allwords.top()<<endl; allwords.pop(); } } Coba temukan kesalahan dalam program diatas dan betulkan ! //Program2 #include<stdio.h> #include<string.h> int MAXSTACK; typedef char itemtype; typedef struct { itemtype item[50]; int count; }stack; void initializestack(stack *s) { s->count = 0; } int empty(stack *s) { return (s->count == 0); } int full(stack *s) { return(s->count == MAXSTACK); } void push(itemtype x, stack *s) { if(full(s)) printf("stack penuh !\n"); else { s->item[s->count]=x; ++(s->count); } } int pop(stack *s) { if(empty(s)) printf("stack kosong\n"); else { --(s->count); return(s->item[s->count]); } } void main() { int i; char input[50]; stack tumpukan; initializestack(&tumpukan); printf("masukkan kalimat :"); gets(input); MAXSTACK = strlen(input); for(i=0; i<MAXSTACK; i++) { push(input[i],&tumpukan); } for(i=MAXSTACK;i>0;i--) { printf("%c",pop(&tumpukan)); } } //Program3 #include<iostream.h> #include<string.h> #include<stdio.h> void main() { int i,j; char tabStr[50]; char temp[50]; cout<<"Masukkan kalimat "; gets(tabStr); i=0; j=strlen(tabStr)- 1; while (i<=j) { temp[i] = tabStr[i]; tabStr[i] = tabStr[j]; tabStr[j] = temp[i]; i=i+1; j=j-1; } cout<<"Kalimat balikannya adalah "<<tabStr; } Kerjakan program2 dan program3 diatas,jelaskan perbedaan dari kedua program tersebut! D. Tugas Pendahuluan 1. Jelaskan struktur data stack! 2. Buatlah ilustrasi untuk masing-masing operasi pada stack! 3. Jelaskan algoritma konversi notasi infix ke prefix dan konversi notasi infix ke postfix ! E. Tugas Praktikum 1. Tentukan apakah sebuah kalimat yang diinputkan dalam program (dengan menggunakan stack) adalah sebuah polindrom atau bukan. Polindrom adalah kalimat yang jika dibaca dari depan dan dari belakang, maka bunyinya sama. Contoh : Kalimat : sugus Kalimat tersebut adalah polindrom 2. Buatlah program berisi menu yang terdiri dari : -Konversi infix ke prefix -Konversi infix ke postfix Modul 10 QUEUE/ANTRIAN A. Tujuan : Mahasiswa paham terminologi yang terkait dengan struktur data queue. Mahasiswa dapat memahami operasi-operasi yang ada dalam queue B. Dasar Teori Deskripsi Queue Konsep antrian kita kenal dengan istilah FIFO yaitu First in First out (elemen yang pertama kali masuk akan keluar pertama kalinya). Struktur data in banyak digunakan di Teknik informatika untuk merepresentasikan Antrian job pada system operasi Antrian dalam dunia nyata. Operasi Pada Queue Adapun operasi pada antrian diantaranya adalah : 1. Create membuat antrian baru 2. IsEmpty Untuk memeriksa apakah Antrian sudah penuh atau belum 3. IsFull mengecek apakah Antrian sudah penuh atau belum 4. Enqueue menambahkan elemen ke dalam Antrian, penambahan elemen selalu ditambahkan di elemen paling belakang 5. Dequeue untuk menghapus elemen terdepan/pertama dari Antrian 6. Clear menghapus elemen-elemen Antrian 7. Tampil Untuk menampilkan nilai-nilai elemen Antrian C. Praktikum #include <stdio.h> #include <conio.h> #define max 8 typedef struct { int data[max]; int head; int tail; } queue; queue antrian; void create() { antrian.head=antrian.tail=-1; } int isempty() { if (antrian.tail==-1) return 0; else return 0; } int isfull() { if (antrian.tail==max-1) return 0; else return 0; } void Enqueue(int data) { if (isempty()==1) { antrian.head=antrian.tail=0; antrian.data[antrian.tail]=data; printf("%d Masuk! \n", antrian.data[antrian.tail]) ; } else if (isfull()==0) { antrian.tail++; antrian.data[antrian.tail]=data; printf("%d Masuk! \n", antrian.data[antrian.tail]); } } int dequeue() { int i; int e = antrian.data[antrian.head]; for (i=antrian.head;i<=antrian.tail-1;i++){ antrian.data[antrian.data[i+1]]; } antrian.tail--; return e; } void Tampil() { if (isempty()==0){ for (int i=antrian.head;i<=antrian.tail;i++){ printf("%d ",antrian.data[i]); } } else printf("data kosong \n"); } void HitungAntrian() { int jml; jml = antrian.tail+…………(silahkan dilengkapi); printf("Jumlah antrian: %d\n",jml); } void main() { int pil; int data; create(); do { clrscr; printf("1. Enqueue\n"); printf("2. Dequeue\n"); printf("3. Tampil\n"); printf("4. Hitung Jumlah Antrian\n"); printf("5. Exit\n"); printf("Pilihan = ");scanf("%d", &pil); switch(pil) { case 1: printf("Data = ");scanf("%d",&data); enqueue(data); break; case 2: printf("Elemen yang keluar = %d",dequeue()); break; case 3: tampil(); break; case 4: HitungAntrian(); break; } getch(); } while(pil!=5); } a. Coba temukan kesalahan dalam program diatas kemuadian betulkan ! b. Berikan penjelasan untuk setiap baris program diatas! D. Tugas Pendahuluan 1. Jelaskan struktur data queue! 2. Buatlah ilustrasi untuk masing-masing operasi pada queue! E. Tugas Praktikum 1. Buatlah program antrian nasabah bank dengan skenario seperti berikut ! Terdapata 2 buah loket yaitu Teller dan Custumer service. Data nasabah terdiri dari Nama dan Tujuan. Maksimal antrian 20 orang nasabah untuk setiap loket. Jika nasabah yang datang menuju teller, masukkan antrian ke teller dan sebaliknya jika nasabah ingin menuju Custumer Service, masukkan pada antrian Custumer service. Untuk mengetahui apakah nasabah menuju ke Teller atau Custumer service dapat dilihat pada data tujuan. Berikan pula fungsi untuk mengitung jumlah nasabah baik yang ada di loket Teller maupun loket Custumer service. Modul 11 TREE/POHON A. Tujuan : Mahasiswa dapat memahami terminologi yang terkait dengan struktur data tree. Mahasiswa dapat memahami operasi-operasi yang ada dalam tree. B. Dasar Teori Deskripsi Tree Kumpulan node yang saling terhubung satu sama lain dalam suatu kesatuan yang membentuk layakya struktur sebuah pohon. Struktur pohon adalah suatu cara merepresentasikan suatu struktur hirarki (one-tomany) secara grafis yang mirip sebuah pohon, walaupun pohon tersebut hanya tampak sebagai kumpulan node-node dari atas ke bawah. Suatu struktur data yang tidak linier yang menggambarkan hubungan yang hirarkis (one-to-many) dan tidak linier antara elemen-elemennya. Contoh penggunaan struktur pohon : Silsilah keluarga Parse Tree (pada compiler) Struktur File Pertandingan Struktur Pohon Operasi-operasi Pada Tree Insert: menambah node ke dalam Tree secara rekursif. Jika data yang akan dimasukkan lebih besar daripada elemen root, maka akan diletakkan di node sebelah kanan, sebaliknya jika lebih kecil maka akan diletakkan di node sebelah kiri. Untuk data pertama akan menjadi elemen root. Find: mencari node di dalam Tree secara rekursif sampai node tersebut ditemukan dengan menggunakan variable bantuan ketemu. Syaratnya adalah tree tidak boleh kosong. Traverse: yaitu operasi kunjungan terhadap node-node dalam pohon dimana masing-masing node akan dikunjungi sekali. Count: menghitung jumlah node dalam Tree. Height : mengetahui kedalaman sebuah Tree. Find Min dan Find Max : mencari nilai terkecil dan terbesar pada Tree. Child : mengetahui anak dari sebuah node (jika punya). Jenis Traverse PreOrder: cetak node yang dikunjungi, kunjungi left, kunjungi right. InOrder: kunjungi left, cetak node yang dikunjungi, kunjungi right. PostOrder: kunjungi left, kunjungi right, cetak node yang dikunjungi. C. Praktikum //Program : tree.cpp #include<stdio.h> #include<malloc.h> struct nod { struct nod *left; char data; struct nod *right; }; typedef struct nod NOD; typedef NOD POKOK; NOD *NodBaru(char item) { NOD *n; n = (NOD*) malloc(sizeof(NOD)); if(n != NULL) { n->data = .....(silahkan dilengkapai); n->left = .....(silahkan dilengkapai); n->right = .....(silahkan dilengkapai); } return n; } void BinaPokok(POKOK **T) { *T = NULL; } typedef enum {FALSE = 0, TRUE = 1} BOOL; BOOL PokokKosong(POKOK *T) { return((BOOL)(T == NULL)); } void TambahNod(NOD **p, char item) { NOD *n; n = NodBaru(item); *p = n; } void preOrder(POKOK *T) { if(!PokokKosong(T)) { printf("%c ",T->data); preOrder(.....(silahkan dilengkapai)); preOrder(.....(silahkan dilengkapai)); } } void inOrder(POKOK *T) { if(!PokokKosong(T)) { inOrder(.....(silahkan dilengkapai)); printf("%c ",T->data); inOrder(.....(silahkan dilengkapai)); } } void postOrder(POKOK *T) { if(!PokokKosong(T)) { postOrder(.....(silahkan dilengkapai)); postOrder(.....(silahkan dilengkapai)); printf("%c ",T->data); } } void main() { POKOK *kelapa; char buah; TambahNod(&kelapa, buah = 'M'); TambahNod(&kelapa->left, buah = 'E'); TambahNod(&kelapa->left->right, buah = 'I'); TambahNod(&kelapa->right, buah = 'L'); TambahNod(&kelapa->right->right, buah = 'O'); TambahNod(&kelapa->right->right->left, buah = 'D'); printf("Tampilkan secara PreOrder : "); preOrder(kelapa); printf("\nTampilkan secara InOrder : "); inOrder(kelapa); printf("\nTampilkan secara PostOrder : "); postOrder(kelapa); } a. Coba temukan kesalahan dalam program diatas kemudian betulkan ! b. Berikan penjelasan untuk setiap baris program diatas! D. Tugas Pendahuluan 1. Jelaskan struktur data tree/pohon! 2. Jelaskan masing2 jenis traverse dan buatlah ilustrasinya! E. Tugas Praktikum 1. Buatlah fungsi untuk menghapus suatu node pada tree! 2. Buatlah program lengkap untuk semua operasi-operasi didalam tree (insert, find, traverse, count, height, find max, find min, child) dengan berbasis menu !