· Web viewModul 1 Array / Larik Tujuan : Mahasiswa dapat mendefinisikan array Mahasiswa dapat...

34
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;

Transcript of · Web viewModul 1 Array / Larik Tujuan : Mahasiswa dapat mendefinisikan array Mahasiswa dapat...

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 TeoriArray 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 array1. Sebagai Peubah Contoh :

Arr : array[1..25] of integerNamaMhs : array[‘a’..’j’] of string

2. Sebagai tipe baru Contoh :

type Arrint : array[1..25] of integerP : Arrint

3. Mendefinisikan ukuran maksimum elemen larik sebagai konstanta Contoh :

Const Nmaks = 10type Larikint : array[1..Nmaks] of integerP : LarikInt

Cara menterjemahkan ke bahasa C :#define Nmaks 10typedef 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 : ");

#include <iostream.h>#include <conio.h>main()

{int baris, kolom;int n, m,matriksA[15][15],matriksB[15][15],hasil[15][15];

#include <stdio.h>#include <conio.h>

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]);}

void main(){

int nilai[10],x,jml,min,max;float avg,total;

printf("Masukkan Bilangan : ");

#include <iostream.h>#include <conio.h>main()

{int baris, kolom;int n, m,matriksA[15][15],matriksB[15][15],hasil[15][15];

/* 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];

Kerjakan dan jelaskan progam-program diatas

D. Tugas Pendahuluan1. Jelaskan definisi penulisan array 1 dimensi, 2 dimensi dan banyak dimensi2. 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 :

/* 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];

Bilangan pertama = 100022233344455566677888999Bilangan kedua = 2000111222333444555666777888999Hasil = 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 KeteranganFidela 10 10,2 Naik 0,2 Lavina 6,4 7 Naik 0.6Nadifa 15 14,8 Turun 0.2Fatan 11 11,3 Naik 0.3Aji 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 : Contoh Keluaran :

Fidela1010,2Lavina6,47Nadifa1514,8Fatan1111,3Aji8,69

Bulan lalu Bulan Sekarang KetFidela 10 10,2 Naik 0,2Lavina 6,4 7 Naik 0,6Nadifa 15 14,8 Turun 0,2Fatan 11 11,3 Naik 0,3Aji 8,6 8,6 Tetap

Modul 2Record /Rekaman

A. Tujuan : Mahasiswa dapat mendefinisikan recordMahasiswa dapat mengakses elemen recordMahasiswa dapat menerapkan record pada suatu studi kasus tertentu.

B. Dasar TeoriRECORDS 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

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 StructDeklarasi 1

Contoh :

Fields

struct nama_struct { tipe_data_1 nama_var_1; tipe_data_2 nama_var_2; tipe_data_3 nama_var_3; ……

};

struct pegawai {char status[10];char nama[30];char alamat[40];char tgl_lahir[10];float gaji;

};

Deklarasi 2, Menggunakan kata tercadang typedef

Mengakses Komponen Record

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 Mahasiswatypedef struct Mahasiswa{char NIM[9];char nama[30];float ipk;};void main(){

//Buat variabel mhs bertipe data MahasiswaMahasiswa mhs[100];………………}

Gunakan nama record nama member yang dipisah dot

Contoh :

Pegawai.nama;

Mhs[i].NIM;

C. Praktikum1. Entri data NIM dan Nama Mahasiswa

Kerjakan dan jelaskan progam-program diatas

D. Tugas Pendahuluan1. 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 Praktikum1. 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.

#include <stdio.h>#include <conio.h>//Pendeklarasian tipe data baru struct Mahasiswatypedef struct Mahasiswa{char NIM[9];char nama[30];float ipk;};void main(){//Buat variabel mhs bertipe data MahasiswaMahasiswa 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();}

Modul 3Fungsi

A. Tujuan : Mahasiswa dapat memahami funsiMahasiswa dapat menerapkan fungsi

B. Dasar TeoriProcedure à tidak memberikan nilai balik Function à memberikan nilai balik (return value)

Membuat FungsiTentukan function yang akan dibuat :

Return type Nama Tipe Parameter Tubuh fungsi (kode program)

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;

INT FUNGSI_SATU(INT A, INT B) {…RETURN(A+B);…

}

Tipe data Nama Fungsi Parameter

Tubuh Fungsi

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

Kerjakan dan jelaskan progam-program diatas

D. Tugas Pendahuluan1. Jelaskan apa itu fungsi2. Jelaskan scope variabel pada fungsi3. Apa perbedaan cal by value dan call by reference, berikan contohnya

E. Tugas Praktikum1. 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.

#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);}

Modul 4Rekursife

A. Tujuan : Mahasiswa dapat memahami RekursifeMahasiswa dapat menerapkan Rekursife

B. Dasar TeoriRekursife adalah function yang memanggil fungsi itu sendiri. Rekursife sangat memudahkan untuk memecahkan permasalahan yang kompleksSifat-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

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;}

int factorial( int x ) {if (x == 1)return(1);elsereturn(x * factorial(x-1));}

Rekursive

Kerjakan dan jelaskan progam-program diatas

D. Tugas Pendahuluan1. Jelaskan apa yang dimaksud dengan fungsi rekursif?2. Jelaskan perbedaan antara iterasi dan rekursife?

E. Tugas Praktikum1. Buatlah program dalam bentuk rekursif untuk mendapatkan nilai permutasi2. Buatlah program untuk tower of Hanoi dengan menggunakan rekursif

#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));

}

Modul 5Pengurutan/Sorting

A. Tujuan : Mahasiswa dapat memahami PengurutanMahasiswa 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];

}}

Kerjakan dan jelaskan progam-program diatas

D. Tugas Pendahuluan1. Jelaskan algortima metode pengurutan bubble sort, selction sort, quick sort dan

merge SortE. 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.

// quick sort#include <stdio.h>#include <stdlib.h>#include <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));}

Modul 6Pencarian/Searching

A. Tujuan : Mahasiswa dapat memahami PencarianMahasiswa dapat menerapkan Pencarian

B. Dasar TeoriPencarian 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;

elsei=i+1;

}

if(ketemu == 1)cout<<"data ada dalam larik";

elsecout<<"data tidak ada dalam larik";

}

Kerjakan dan jelaskan program-program diatas.

D. Tugas Pendahuluan1. Jelaskan algortima metode pencarian beruntun (sequential search) dan pencarian

bagi dua (binary search).

E. Tugas Praktikum1. 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.

// 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;

elsei=k+1;

}}if(ketemu == 1)

cout<<"data ada dalam larik";else

cout<<"data tidak ada dalam larik";}

Modul 7Pointer

A. Tujuan : Mahasiswa dapat memahami PointerMahasiswa dapat menerapkan Pointer

B. Dasar TeoriPointer 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;}

}

Kerjakan dan jelaskan program-program diatas.

D. Tugas Pendahuluan1. Jelaskan variabel pointer!2. Jelaskan perbedaan variabel pointer dengan jenis variabel lainnya!

E. Tugas Praktikum1. 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 !

//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;

}}

Modul 8Linked List

A. Tujuan : Mahasiswa dapat memahami Linked List.Mahasiswa dapat menerapkan Linked List

B. Dasar TeoriLinked 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. Data2. Pointer.Secara umum linked list dibedakan atas 2 macam, yaitu :1. Single Linked List dan2. Double Linked ListSingle Linked List mempunyai satu pointer untuk setiap node yang menunjuk ke node berikutnya, artinya hanya punya satu arah.

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.

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

* * * * NIL……

**

**

**

NIL **

……… NIL

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;elseprevPtr->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;

elsecariPtr = 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 Pendahuluan1. 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 Praktikum1. Buatlah program Double Linked List Non Circular (DLLNC) yang terdiri dari menu yang

berisi :1. Menambah Data Depan2. Menambah Data Belakang3. Menambanh Data Tengah4. Menghapus Data Depan5. Menghapus Data Belakang6. 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 TeoriDeskripsi 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 StackAda 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 StackOperasi-operasi dasar pada stack adalah sebagai berikut :1. Push : digunakan untuk menambah item pada stack pada tumpukan paling atas2. Pop : digunakan untuk mengambil item pada stack pada tumpukan paling atas3. Clear : digunakan untuk mengosongkan stack4. IsEmpty : fungsi yang digunakan untuk mengecek apakah stack sudah kosong5. IsFull : fungsi yang digunakan untuk mengecek apakah stack sudah penuh

Notasi POLISHSalah 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 PrefixA – 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 PostfixA – 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 Pendahuluan1. 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 Praktikum1. 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 : sugusKalimat tersebut adalah polindrom

2. Buatlah program berisi menu yang terdiri dari :-Konversi infix ke prefix-Konversi infix ke postfix