• Tidak ada hasil yang ditemukan

MODUL PRAKTIKUM ALGORITMA DAN PEMROGRAMAN 2

N/A
N/A
Syer Time

Academic year: 2023

Membagikan "MODUL PRAKTIKUM ALGORITMA DAN PEMROGRAMAN 2"

Copied!
47
0
0

Teks penuh

(1)

MODUL PRAKTIKUM ALGORITMA DAN PEMROGRAMAN 2

Dosen Pengampu :

Bayu Wijaya Putra, S.Kom., M.Kom.

Disusun Oleh :

09031282025075 Febrina Hedy Anggraini

0903

0903

0903

0903

KELAS SIREG 2 C

JURUSAN SISTEM INFORMASI FAKULTAS ILMU KOMPUTER

UNIVERSITAS SRIWIJAYA

(2)

KATA PENGANTAR

Puji syukur kami panjatkan kehadirat Allah SWT.Atas berkat dan rahmat-Nya,modul Praktikum Algoritma dan Pemrograman 2 dapat diselesaikan dengan baik. Sholawat dan salam semoga senantiasa tercurahkan kepada junjungan besar kita, Nabi Muhammad SAW yang telah menunjukkan kepada kita semua jalan yang lurus berupa ajaran agama islam yang sempurna dan menjadi anugrah terbesar bagi seluruh alam semesta.

Penulis berharap semoga makalah ini dapat menjadi media pengetahuan untuk para pembaca dan membantu dalam memenuhi proses pembelajaran.

Penulis yakin masih banyak kekurangan dalam penyusunan makalah ini karena keterbatasan pengetahuan dan pengalaman yang dimiliki. Untuk itu penulis sangat mengharapkan kritik dan saran yang membangun dari pembaca demi kesempurnaan makalah ini.

Palembang, April 2021

Penulis

(3)

PENGANTAR ALGORITMA DAN PEMROGRAMAN 2

PENDAHULUAN

Materi perkuliahan Algoritma dan Pemrograman 2 merupakan kuliah lanjutan dari perkuliahan Algoritma dan Pemrograman 1. Berikut pengantar untuk mereview kembali materi yang harus sudah dikuasai untuk mengikuti perkuliahan Algoritma dan Pemrograman 2.

ISI

1. Algoritma dan Program

 Algoritma adalah urutan logika langkah kerja untuk menyelesaikan suatu masalah.

 Program adalah logika pemecahan masalah dalam bahasa pemrograman tertentu untuk diproses oleh computer.

 Belajar memrogram berarti belajar strategi pemecahan masalah metodologi dan sistematika pemecahan masalah.

 Belajar bahasa pemrograman berarti belajar memakai suatu bahasa pemrograman tertentu.

 Dasar-dasar setiap algoritma walaupun sekomplek apapun meliputi runtunan, pemilihan dan pengulangan.

 Cara pendekatan Top Down Design sangat bermanfaat dalam membuat algoritma untuk masalah yang cukup rumit dan komplek

2. Notasi Algoritma

Pada dasarnya algoritma selalu disusun berdasarkan 3 bagian, antara lain Judul Algoritma, Deklarasi/kamus dan Deskripsi/algoritma. Agar dapat dilaksanakan oleh computer, maka algoritma harus ditranslasikan ke dalam suatu notasi bahasa pemrograman. Agar notasi algoritma mudah ditranslasikan kedalam notasi bahasa pemrograman, maka sebaliknya notasi algoritmik tersebut berupa pseudo-code yang berkoresponden dengan bahasa pemrograman secara umum.

(4)

3. Operator, identifier dan tipe data

 Operator adalah notasi yang dipakai untuk melaksanakan suatu operasi terhadap data dan identifier.

 Identifier adalah sesuatu yang dipakai sebagai nama pengenal.

 Tipe data pada sebuah objek merupakan himpunan nilai yang dapat dimilikinya dan operasi yang dapat dilakukan pada objek tersebut.

3. Input dan Output

Notasi input dan output sangat penting dalam suatu pemrograman karena merupakan sarana interaksi antara komputer dan manusia dalam berkomunikasi. Banyak format input dan output yang dimiliki bahasa pemrograman C++, tinggal programer yang menentukan format mana yang dipakai sesuai kebutuhan.

4. Statemen Pengendalian

Pada dasarnya ada dua macam statement pengendalian yaitu IF-THEN-ELSE dan CASE-OF. Pada prakteknya dua macam notasi tersebut dapat dimodifikasi sesuai kebutuhan.

5. Statemen Pengulangan

Tiga macam notasi struktur pengulangan :

1. Struktur FOR atau TRAVERSAL ( Pengulangan tanpa kondisi / Unconditional Looping ).

2. Struktur WHILE..DO 3. Struktur REPEAT..UNTIL

( Pengulangan dengan kondisi / Conditional Looping ).

Tiga macam notasi struktur pengulangan dalam bahasa C++ : 1. FOR

2. WHILE

(5)

3. DO..WHILE

(6)

6. Prosedur dan Fungsi

Procedure dan function di dalam algoritma memiliki perbedaan. Tetapi di bahasa pemrograman C++ semua disebut function dengan perbedaan sintak untuk membedakan antara fungsi sebagai procedure dan sebagai function yang dimaksud pada algoritma

Struktur Prosedur :

1. Bagian Judul ( header ).

Terdiri atas Nama prosedur dan deklarasi parameter ( jika ada ).

2. Bagian deklarasi.

Untuk mengumumkan nama-nama.

3. Bagian deskripsi.

Disebut juga badan prosedur.

Adapun bentuk umum definisi sebuah fungsi (dalam bahasa C++) adalah :

Penentu tipe adalah untuk menentukan tipe keluaran fungsi yang dapat berupa satu tipe data C++ yang berlaku, misalnya char atau int. Default tipe fungsi yang tidak disebutkan dianggap sebagai int.

7. Mesin Abstrak

Mesin abstrak adalah mesin yang dianggap ada dan diasumsikan mampu melakukan mekanisme yang didefinisikan untuk mesin tersebut. Mesin gambar adalah abstrak yang terdiri dari 2 unit yaitu pena dan bidang gambar.

8. Tipe Data Array

penentu-tipe nama_fungsi(daftar parameter) {

deklarasi variable lokal tubuh fungsi

}

(7)

Tipe data array adalah salah satu tipe terstruktur dalam pemrograman. Tipe data array ini dapat dipakai untuk salah satu contohnya adalah perhitungan matriks.

(8)

PENUTUP

Materi Algoritma dan Pemrograman 2 memakai semua yang telah diajarkan pada matakuliah Algoritma dan Pemrograman 1, seperti algoritma, tipe data, operator, statement pengendalian, statement pengulangan yang merupakan dasar dari pemrograman.

SOAL-SOAL

1. Apa output/keluaran algoritma atau program pada soal (1), (2), (3) dan (4) berikut (pilih a, b, c, d atau e) :

(1) Algoritma Salam KAMUS

A,B,C : integer S : string ALGORITMA

A100;

B100;

IF (A<B) THEN CB-A;

IF (C=A) THEN S”Hallo”

ELSE S”Apa”

ENDIF

ELSE IF (B>A) THEN S”Khabar”

ELSE S”Disana”

ENDIF ENDIF

Output(S)

a.Hallo b.Apa c.Khabar d.Disana

(2) #include <stdio.h>

int Pilihan;

main() {

Pilihan=8%3;

switch (Pilihan) { case 1 :

printf(”%c”,’A’);

case 2 :

printf(”%c”,’B’);

case 3 :

printf(”%c”,’C’);

default:

printf(”%c”,’$’);

} }

a.$ b.B c.C d.ABC$ e.BC$

(3)Algoritma Looping KAMUS

kondisi : boolean

i : integer

ALGORITMA i 100 REPEAT

i i-30

kondisi (i<0) UNTIL (kondisi) Output(i)

(4) #include <stdio.h>

int A,i;

main() {

A=0;for (i=1;i<=10;i++) {

A=A+i+3;

(9)

a. 0 b.70 c.-20 d.-10

if (A>15) break;

}

printf(”%d”,i);

}

a.1 b.2 c.3 d.4 e.5

(10)

2. Apakah output/keluaran dari program berikut :

2. Ubahlah penggalan algoritma di bawah ini ke dalam bahasa C++ (dengan menggunakan sintaks pengulangan do-while)

#include <iostream.h>

#include <iomanip.h>

main() {

int i;

int x[9]={1,2,3,0,7,0,1,8,5};

for(i=8;i>=0;i--)

for p1 to 4 do for q1 to p do

output(q) endfor

(11)

ARRAY (LARIK)

PENDAHULUAN

Array atau biasa disebut larik adalah koleksi data dimana setiap elemen memakai nama yang sama dan bertipe sama dan setiap elemen diakses dengan membedakan indeks arraynya. Setiap rinci data disebut dengan elemen array. Setiap array dapat dioperasikan menggunakan pemilih elemen yang disebut indeks. Karena itu indeks harus bertipe yang mempunyai keterurutan (ada suksesor dan ada predesor) misal Integre, Boolean, Char.

Jadi array dipakai untuk menyajikan sekumpulan data yang bertipe sama, dan disimpan dengan urutan yang sesuai dengan indeks secara kontinu.

Contoh Array : Untai karakter, daftar nomor telepon, daftar belanja, tabel pajak, vektor, matriks.

ISI

A. Deklarasi Array

Setiap identifier yang akan digunkan harus dipesan dahulu dalam kamus/deklarasi beserta tipe data yang akan ditampungnya. Demikian pula dengan tipe data array beserta tipe elemen-elemen yang akan ditampungnya harus pula dipesan dalam kamus/deklarasi.

Jika kita memesan variabel biasa (tipe data sederhana dan string), maka kita hanya menentukan tipenya, namun jika memesan array, maka harus pula ditentukan banyaknya elemen (misal dari 1..100).

Variabel array dideklarasikan dengan mencantumkan tipe dan nama variable yang diikuti dengan banyaknya lokasi memori yang ingin dibuat.

Contoh :

Dalam Algorima :

c : array[1..5] of integer

Terbentuk 5 variabel c dengan indeks dari 1 smapai dengan 5 bertipe integer.

(12)

Dalam bahasa C++ : int c[5];

C++ secara otomatis akan menyediakan lokasi memori sesuai dengan yang dideklarasikan, dimana nomor indeks selalu dimulai dari 0.

int c[5] = {-12, 0, 20, 85, 1551};

Nilai suatu variabel array dapat juga diinisialisasi secara langsung seperti yang terdapat di dalam tanda kurung kurawal pada saat deklarasi di atas.

int x[5] = [0];

Deklarasi variable array sekaligus mengisi setiap lokasi memorinya dengan nilai 0.

Tipe data yang akan ditampung array bisa sembarang tipe data misal Integer, Boolean, Char, Real, String bahkan yang terstruktur seperti Set, Record atau array lagi.

B. Array Dimensi Satu

Bentuknya (Pseudocode) :

Bentuknya (C++):

Dengan :

tipe : menyatakan jenis elemen array (int, char dan lain-lain)

rangeindeks : menyatakan indeks awal sampai demgan indeks akhir dari var array yang dibuat

ukuran : menyatakan jumlah maksimal elemen array

Nilai indeks awal dan indeks akhir yang dideklarasikan di algoritma tidak diperlukan pada deklarasi bahasa C++. Pada bahasa C++ hanya banyak elemennya saja (ukuran).

Jadi ukuran = indeksakhir – indeksawal + 1.

nama_var : array [rangeindeks] of tipe

tipe nama_var[ukuran];

(13)

Contoh : Algoritma :

Program C++ :

Output :

Algoritma PangkatDua

Deklarasi

square : array [1..100] of integer i,k : integer

Deskripsi

for i  1 to 10 do k  i + 1

square[i]  k * k

output(”Pangkat dari ”,k,” adalah ”, square[i]) endfor

#include<iostream.h>

main() {

int square[100];

int i,k;

for(i=0; i<10; i++) {

Pangkat dari 1 adalah 1 Pangkat dari 2 adalah 4 Pangkat dari 3 adalah 9 Pangkat dari 4 adalah 16 Pangkat dari 5 adalah 25 Pangkat dari 6 adalah 36 Pangkat dari 7 adalah 49 Pangkat dari 8 adalah 64 Pangkat dari 9 adalah 81

(14)

C. Array Dimensi Dua

Array dua dimensi merupakan array yang terdiri dari m buah baris dan n buah kolom.

Bentuknya dapat berupa matriks atau tabel.

Pada prinsipnya matriks hampir sama dengan array. Matriks adalah sekumpulan informasi bertipe sama yang setiap individu elemennya terdefinisi berdasarkan dua indeks (yang biasanya dikonotasikan dengan baris dan kolom).

Indeks pada matriks harus mempunyai batasan dan sifat yang sama dengan indeks pada array satu dimensi.

Sering dikatakan bahwa matriks adalah array dua dimensi, tapi patut diperhatikan bahwa pengertian berdimensi dua (baris dan kolom) adalah dalam pemikiran kita (penyajian logika).

Pengaturan letak elemen matriks dalam memori komputer selalu tetap sebagai deretan

”sel yang linier”. Pengertian dua dimensi ini hanya untuk mempermudah programmer dalam merancang programnya.

Secara umum dimensi dan banyaknya elemen Array/Matriks sebenarnya tidak dibatasi oleh Compiler, tetapi dibatasi oleh keterbatasan RAM yang disediakan.

Karena matriks menggunakan memory internal. Struktur data ini praktis untuk dipakai, namun memori yang dipakai besar.

Contoh matriks yang sering kita lihat sehari-hari adalah tabel.

Deklarasi array (Pseudocode) :

Deklarasi array (C++):

Contoh :

Sebuah matrik A berukuran 2x3 dapat dideklarasikan sebagai berikut : Algoritma :

a : array [1..2,1..3] of integer a1,1  11

nama_var : array [rangeindeks1,rangeindeiks2] of tipe

tipe nama_var[ukuran1][ukuran2];

(15)

a1,2  7 a1,3  4 a2,1  12 a2,2  3 a2,3  9

C++ :

int a[2][3] = {{11, 7, 4},{12, 3, 9}};

yang akan menempati lokasi memori dengan susunan berikut :

0 1 2

0 1

1

7 4

1 1

2 3 9

Dan definisi variabel untuk setiap elemen tersebut adalah :

0 12

0 a[0]

[0] a[0]

[1] a[0]

[2]

1 a[1]

[0]

a[1]

[1]

a[1]

[2]

Contoh Program 1 :

Output :

#include<iostream.h>

main() {

int A[3][3]={{1,2,3},{4,5,6},{7,8,9}};

int i,j;

for(i=0; i<3; i++) {

1 2 3 4 5 6 7 8 9

(16)

Contoh Program 2 :

Output :

Contoh Program 3 :

#include<stdio.h>

void printArray(int [][3]);

main() {

int matrik1 [2][3] = { {1, 2, 3}, {4, 5, 6}};

int matrik2 [2][3] = { {1, 2, 3}, {4, 5}};

int matrik3 [2][3] = { {1, 2}, {4} };

printArray(matrik1);

printArray(matrik2);

printArray(matrik3);

return 0;

}

void printArray(int a[][3])

1 2 3 4 5 6 1 2 3 4 5 0 1 2 0 4 0 0

//program penjumlahan matrik

#include<iostream.h>

main() {

int A[3][2]={{1,2},{3,4},{5,6}};

int B[3][2]={{7,8},{9,10},{11,12}};

int C[3][2];

int i,j;

(17)

D. Array Dimensi Banyak Bentuknya dalam bahasa C++ :

Contoh :

PENUTUP

Array merupakan suatu tipe data terstruktur. Deklarasi tipe ini tidak hanya dapat untuk data satu dimensi tetapi bisa sampai n dimensi. Array dua dimensi biasanya dipakai untuk perhitungan matriks dua dimensi.

for(j=0; j<2 ; j++)

cout<<A[i][j]<<" ";

cout<<endl;

}

cout<<"Matrik B = \n";

for(i=0; i<3 ; i++) {

for(j=0; j<2 ; j++)

cout<<B[i][j]<<" ";

cout<<endl;

}

//penjumlahan matrix for(i=0; i<3 ; i++)

for(j=0; j<2 ; j++) C[i]

[j]=A[i][j] + B[i][j];

tipe nama_var[ukuran1[ukuran2]. . .[ukuranN];

int data_huruf[2][4][6];

(18)

RECORD/STRUCT DAN ARRAY OF RECORD

PENDAHULUAN

Seperti halnya Array, Record/Struct mempunyai sejumlah elemen yang disebut field. Kalau semua elemen array harus mempunyai tipe data yang sama, maka tiap-tiap elemen pada Record/Struct dapat memiliki tipe data yang berbeda.

ISI

A. RECORD/STRUCT

Bentuk umum deklarasi Record/Struct Algoritma :

Atau namavar dapat dipisah dari deklarasi tiperecordnya, sehingga menjadi namaVar : record

< namaField1 : tipeField1 , namaField2 : tipeField2 ,

… …

namaFieldn : tipeFieldn ,

>

Type namaTipeRecord : record

< namaField1 : tipeField1 , namaField2 : tipeField2 ,

… …

namaFieldn : tipeFieldn ,

>

namaVar : namaTipeRecord

(19)

struct namaTipeStruct {

tipeField1 tipeField2

… …

tipeFieldn } namaVar;

namaField1;

namaField2;

namaFieldn;

Bahasa C++ :

Atau namavar dapat dipisah dari deklarasi tiperecordnya, sehingga menjadi :

Catatan : namaVar bisa lebih dari satu

Contoh record/struct : Algoritma :

Deklarasi

Type Mahasiswa : Record < NIM : integer, Nama : string, KodeMK : string, NilaiHuruf : char >

Mhs1,Mhs2 : Mahasiswa

Bahasa C++ :

//deklarasi

typedef struct { int NIM;

typedef struct {

tipefield1 namafield1;

tipefield2 namafield2;

… …

tipefieldn namafieldn;

} namatipestruct;

namatipestruct namavar;

(20)

char Nama[20];

char KodeMK[10];

char NilaiHuruf;

} Mahasiswa;

Mahasiswa Mhs1,Mhs2;

Cara mengakses elemen record/structur : namavar.namafield

Contoh Program :

#include<iostream.h>

#include<string.h>

typedef struct

{ int tanggal, bulan, tahun;

} data_tanggal;

typedef struct

{ char nama[30];

data_tanggal tgl_lahir;

} data_rekan;

data_rekan info_rekan;

main() {

strcpy(info_rekan.nama,"Hanif");

info_rekan.tgl_lahir.tanggal = 30;

info_rekan.tgl_lahir.bulan = 4;

info_rekan.tgl_lahir.tahun = 2002;

cout<<"Nama : "<<info_rekan.nama;

cout<<"\nTanggal lahir :";

cout<<info_rekan.tgl_lahir.tanggal;

cout<<"-"<<info_rekan.tgl_lahir.bulan;

(21)

struct namaTipeStruct {

tipeField1 tipeField2

… … tipeFieldn } namaVar;

namaField1;

namaField2;

namaFieldn;

namaTipeStruct namaVar[ukuran];

struct namaTipeStruct {

tipeField1 tipeField2

… … tipeFieldn } namaVar;

namaField1;

namaField2;

namaFieldn;

namaTipeStruct namaVar[ukuran];

Contoh Variasi program Cara Mendeklarasikan Structur :

B. ARRAY OF RECORD

Algoritma :

#include<iostream.h>

#include<string.h>

main() {

struct data_tanggal

{ int tanggal, bulan, tahun; };

struct data_rekan { char nama[30];

struct data_tanggal tgl_lahir;

};

struct data_rekan info_rekan;

strcpy(info_rekan.nama,"Hanif");

info_rekan.tgl_lahir.tanggal = 30;

info_rekan.tgl_lahir.bulan = 4;

info_rekan.tgl_lahir.tahun = 2002;

cout<<"Nama : "<<info_rekan.nama;

cout<<"\nTanggal lahir :";

cout<<info_rekan.tgl_lahir.tanggal;

cout<<"-"<<info_rekan.tgl_lahir.bulan;

namaVar : record

< namaField1 : tipeField1 , namaField2 : tipeField2 ,

… …

namaFieldn : tipeFieldn ,

>

(22)

Bahasa C++ :

(23)

RECCURENCE RELATION (RELASI BERULANG)

PENDAHULUAN

Pemakaian skema iterasi untuk Persoalan Deret dapat dinyatakan dalam rumus hubungan/relasi berulang, yaitu menyangkut masalah ketelitian penyajian bilangan pada komputer.

ISI Contoh :

Contoh1 :

Barisan : 1,2,3,4,...,n 3,5,7,9,...,n

Deret : 1 + 2 + 3 + 4 + ... + n 3 + 5 + 7 + 9 + ... + n 1,2,3,4,5,...,n

Contoh2 :

S=1+2+3+4+5+...+n Algoritma Contoh1 Deklarasi

i,n : integer Deskripsi

Input(n) i1 s0

while (i<=n) do output(i) ii+1 endwhile

Algoritma Contoh2 Deklarasi

i,s,n : integer Deskripsi

Input(n)

(24)

Contoh3 :

S=2+4+6+8+...+20

i1 2 3 4 5 … n

f(

i) 2 4 6 8 10 2n

 f(i) = 2*i x = 2*i s = s + (2*i) s = s + x

Contoh3 dalam bahasa C : i1

s0

while (i<=n) do output(i) ss+1 ii+1 endwhile output(s)

Algoritma Contoh3 Deklarasi

i,s,x : integer Deskripsi

i1 x0 s0

while (i<=10) do x2*i

ss+x output(x) ii+1 endwhile

#include<stdio.h>

#include<math.h>

main() {

int i=1,s=0,x=0;

printf(“S=”);

while (i<=10)

(25)

Contoh4 :

S=3+5+7+9+...+15

i1 2 3 4 5 … n

f(

i) 3 5 7 9 11 2n+

1

 f(i) = 2*i +1 x = 2*i +1 s = s + (2*i +1) s = s + x

Contoh5 :

S=2+5+10+17+26+...+101

i 1 2 3 4 5 … n

f(i )

2 5 10 17 26 (n*n) +1

 f(i) = i*i +1 x = i2 +1 s = s + (i2 +1) s = s + x

Contoh6 :

S=-3+6-9+12-15+18

i 1 23 4 56 N

f(

i)

-3 6 - 9

12 - 15

1 8

3*n*(- 1)n

 f(i) = 3*i *(-1)i s +=x

printf(“%d+”,x);

i++;

}

printf(“jumlah deret s = %d “,s);

(26)

atau

untuk ganjil  i mod 2 =1 t = -1 untuk genap  i mod 2 = 0

t = 1

(27)

atau

Contoh7 :

S=3-6+9-12+15-18

i 1 23 4 56 n

f(

i)

-3 6 - 9

12 - 15

1 8

3*n*(- 1)n+1

 f(i) = 3*i *(-1)i+1 atau f(i) = -3*i *(-1)i Algoritma Contoh6a

Deklarasi

i,s,x,t : integer Deskripsi

i1 x0 s0 t1

while (i<=6) do x2*i*(-1**i) ss+x

output(x) ii+1 endwhile output(s)

Algoritma Contoh6b Deklarasi

i,s,x,t : integer Deskripsi

i1 x0 s0 t1

while (i<=6) do if (i mod 2)=1 then

t  -1 else t  1 x2*i*t ss+x output(x)

ii+1 endwhile output(s)

(28)

Contoh 8 :

S = 1/2-1/4+1/8-1/16+...-...

atau

Algoritma HitungDeret7 Deklarasi

i,p,q,n : integer S : real

Deskripsi i1 p1 q2 S0.0

while (i<=n) do if (i mod 2=0) then

t  -1 else

t  1 endif p1 q2^i SS+p/q*t output(p,’/’,q) ii+1

Algoritma HitungDeret7 Deklarasi

i,p,q,n : integer S : real

Deskripsi i1 p1 q2 S0.0

while (i<=n) do output(p,’/’,q) SS+p/q p-1*p qq*2 ii+1

(29)

PENUTUP

Konsep relasi berulang dapat digunakan untuk proses yang membutuhkan ketelitian penyajian bilangan pada komputer, seperti perhitungan deret.

SOAL-SOAL

Buatlah Algoritma dan Program untuk menghitung deret berikut : 1. S = 3-6+9-12+15-18

2. S = 1-3+5-7+9-11+...+(2*i-1)*(-1)i-1 3. S = 1-1/2+1/3-1/4+...+1/99-1/100 4. S = 1/2-1/4+1/6-1/8+...-...

5. S = 2/3-4/9+8/27-16/81+...-...

(30)

REKURSIF

PENDAHULUAN

Rekursif merupakan alat untuk memecahkan masalah dalam suatu fungsi atau procedure yang memanggil dirinya sendiri. Definisi menurut Niclaus Wirth : “ An object is said be recursive if it partially consist or is defines in terms of itself”

Mengapa kita memerlukan rekursif? Karena ada beberapa kasus yang akan jauh lebih mudah diselesaikan jika menggunakan rekursif.

Secara teori semua masalah yang dapat dipecahkan dengan rekursif dapat dipecahkan dengan tanpa rekursif. Meskipun dalam kenyataa ini, rekursif sangat bermanfaat sebab beberapa masalah mempunyai solusi yang sulit tanpa menggunakan rekursif.

Penggunaan rekursif kadang-kadang harus mengorbankan efisiensi dan kecepatan, disamping itu ada masalah yang sering muncul dalam rekursif, yaitu eksekusi yang tidak pernah berhenti, akibatnya memori tumpukan akan habis dan computer hank.

Pada dasarnya rekursif sering digunakan dalam perhitungan matematika, sebagai contoh pertimbangan fungsi factorial dan juga bilangan Fibonacci

ISI

Logika Rekursif adalah suatu fungsi berparameter yang memanggil dirinya sendiri dengan harga parameter yang berbeda. Logika ini dipakai sebagai pengganti proses iterasi. Kelebihan logika bentuk ini mudah dipahami alurnya, namun kelemahannya pada penggunaan register stack yang sangat membebani kecepatan jalannya program.

Bentuk dan sifat rekursif adalah sebagai berikut :

- Ada bagian base case dan ada bagian general case

(31)

- Paling sedikit mempunyai general base - Selalu dalam bentuk fungsi-fungsi

(32)

- Selalu menggunakan statement percabangan

Berikut contoh fungsi rekursi, yaitu faktorial dan bilangan Fibonacci.

A. Faktorial

Salah satu contoh yang sering digunakan untuk menjelaskan rekursif adalah fungsi fakorial. Fungsi factorial dari bilangan bulat positif n didefinisikan sebagai berikut:

n!= n.(n-1)!, jika n>1 n!

= 1, jika n=0, 1

contoh : 3!= 3. 2!

3!= 3. 2. 1!

3!= 3. 2. 1 3!= 6

Cara lain untuk mendefiniskan fungsi tersebut sebagai berikut:

 Dalam definisi ini, nilai 3! diekspresikan sebagai 3 x 2!, dengan kata lain untuk menghitung factorial 3, kita harus menghitung factorial lain yaitu factorial 2.

 Jika definisi nilai 2!=2 x 1!

 Factorial 1 didefinisikan dengan nilai 1.

 Jadi jika factorial 3!= 3 x 2 x 1, yang mana secara pasti mempunyai nilai sama yang diperoleh dari definisi tanpa rekursif.

Kita dapat menuliskan fungsi penghitung factorial seperti dibawah ini, Faktorial(n)  hasilnya

n*Faktorial(n-1),

jika

n > 1 {general case}

 hasilnya 1, jika n=1 atau 2

{base case}

Algoritma :

(33)

Function Faktorial (input n: integer)  integer Deklarasi

{tidak ada}

Deskripsi

if (n = 0) or (n = 1) then

(34)

return (1) else

return (n * Faktorial(n-1)) endif

Bahasa C++ :

1.

2.

3.

4.

5.

6.

7.

• Pada baris 3 dari fungsi diatas, nilai n dicek sama dengan 0 atau 1,

jika ya, maka fungsi mengembalikan nilai 1 {baris 4}, jika tidak, fungsi mengembalikan nilai n * Faktorial (n -1)

{baris 6}

• disinilah letak proses rekursif itu, perhatikan fungsi factorial ini memanggil dirinya sendiri tetapi dengan parameter (n-1)

B. Bilangan Fibonacci

Fungsi lain yang dapat diubah kebentuk rekursif adalah perhitungan Fibonacci. Bilangan Fibonacci dapat didefinisikan sebagai berikut:

fn = fn-1 + fn-2 untuk n>1 f0 = 0

f1 = 1

berikut ini adalah barisan bilangan Fibonacci mulai dari n=1 1 1 2 3 5 8 13 21 34

int Faktorial(int n) {

if ((n == 0) || (n == 1 )) return (1);

else

(35)

Algoritma yang dipakai

Function Fibonacci(input n:integer)  integer Deklarasi Lokal

{tidak ada}

Deskripsi

if (n ==1 || n==2) then else

endif

return (l)

return (Fibonacci(n-1)+Fibonacci(n-2)) Contoh,

Untuk ukuran n= 4, proses perhitungan Fibonacci dapat dilakukan sebagai berikut:

f4 = f3+f2

f4 = (f2+f1) + f2

f4 = (1+1) +1 f4 = 3

C. Penerapan faktorial

Kombinasi

Function Kombinasi (input n, r : integer)  real Deklarasi

If (n < r) Then return (0) Else

Endif

return (Faktorial(n)/(Faktorial(r)*Faktorial(n-r)))

Permutasi

Function Permutasi (input n, r : integer)  real Deklarasi

{tidak ada}

Deskripsi

if (n< r) then return (0) else

return (Faktorial(n) / Faktorial(n-r)) endif

(36)

Contoh program menghitung permutasi dengan bahasa C++ (lengkap) :

#include <iostream.h>

int Faktorial(int n);

float Kombinasi(int n, int r);

main() {

cout << ”Kombinasi C(3,2) = ”<< Kombinasi(3,2);

(37)

}

int Faktorial(int n) {

if ((n == 0) || (n == 1 )) return(1);

else

}

return(n * Faktorial(n-1)

float Kombinasi(int n,int r) {

if (n < 1)

return(0);

else

}

return(Faktorial(n)/(Faktorial(r)* Faktorial(n-r)

(38)

PENUTUP

Persoalan yang diselesaikan dengan iterasi dapat juga diselesaikan dengan rekursif.

Definisi rekursif harus tergantung kondisi, yang harus ada keadaan dimana kita dapat menghentikannya.

SOAL-SOAL

1. Buat program untuk menghitung deret S = 1+2+3+4+5 menggunakan function rekursi

2. Buat program untuk menghitung deret S = 2+4+6+8+10 menggunakan function rekursi

(39)

PENCARIAN (SEARCHING) 1

PENDAHULUAN

Pencarian di perlukan untuk mencari informasi khusus dari tabel pada saat lokasi yang pasti dari informasi tersebut sebelumnya tidak diketahui. Pencarian selalu dinyatakan dengan referensi pada adanya sekolompok data yang tersimpan secara terorganisasi, kelompok data tersebut kita sebut tabel.

Array memungkinkan untuk menyimpan nilai yang bertipe sama. Operasi yang umum dalam array adalah Sequential Search dan Binary search. Perbedaan dari kedua teknik ini terletak pada keadaan data.

ISI

Pencarian Sequential (Sequential Search)

Pencarian Sequential digunakan apabila data dalam keadaan acak atau tidak terurut.

Pencarian Sequential atau sering disebut Pencarian Linear menggunakan prinsip sebagai berikut data yang ada dibandingkan satu persatu secara berurutan dengan data yang dicari.

Pencarian Sequential (Sequential Search) :

1. Sequential Search pada Array yang elemen datanya Belum Terurut a. Metode tanpa Sentinel

b. Metode dengan sentinel

2. Sequential Search pada Array yang elemen datanya Sudah Terurut c. Metode Sequential Tanpa Sentinel

d. Metode Sequential Search Dengan Sentinel

A. Proses pencarian sequential data belum terurut tanpa sentinel :

(40)

 pada dasarnya pencarian ini hanya melakukan pengulangan dari elemen ke-1 sampai dengan jumlah data.

 pada setiap pengulangan, dibandingkan data ke-i dengan yang dicari,

 apabila sama berarti data telah ditemukan,

(41)

 sebaliknya apabila sampai akhir pengulangan tidak ada yang sama, berarti data tidak ada.

Contoh Program SeqSearch_BelumUrut_nonSentinel

Cara lain untuk Sequential Search pada data Array X[n], adalah dengan menyediakan satu tempat setelah elemen terakhir, yaitu pada X[n+1] dan menyimpan harga yang dicari (misal y) pada posisi tersebut. Nilai yang dicari pada posisi elemen terakhir tersebut dinamakan sentinel.

B. Proses pencarian sequential data belum terurut dengan sentinel :

 pada dasarnya pencarian ini sama dengan proses pencarian sequential data belum terurut tanpa sentinel yaitu melakukan pengulangan dari elemen ke-1 sampai dengan jumlah data.

 pada setiap pengulangan, dibandingkan data ke-i dengan yang dicari,

 apabila sama berarti data telah ditemukan, /* SeqSearch_BelumUrut_nonSentinel

diasumsikan Array X sudah ada dan berisi data yang belum terurut, nilai yang dicari adalah y dan hanya ada satu */

#include <iostream.h>

typedef enum boolean {false=0,true=1};

main() {

int X[10]={20,50,10,30,90,60,70,80,40,100};

boolean found;

int i,y;

cout << "nilai yang dicari = ";

cin >> y;

found=false;

i=0;

while ((i<10) & (!found)) {

(42)

 perbedaannya dengan yang tanpa sentinel adalah ketika data ditemukan tapi data tersebut adalah sentinel berarti data tidak ada.

Contoh Program SeqSearch_BelumUrut_Sentinel {cara1}

Contoh Program SeqSearch_BelumUrut_Sentinel {cara2}

/* SeqSearch_BelumUrut_Sentinel{cara1}

diasumsikan Array X[0..10] sudah ada dan indeks ke 0..9 telah berisi data yang belum urut, nilai yang dicari adalah y dan hanya ada satu, y diletakkan di index ke-10 */

#include <iostream.h>

main() {

int X[11]={20,50,10,30,90,60,70,80,40,100};

int i,y;

cout << "nilai yang dicari = ";

cin >> y;

X[10]=y;

i=0;

/* SeqSearch_BelumUrut_Sentinel {cara2}

diasumsikan Array X[0..10] sudah ada dan indeks ke 0..9 telah berisi data yang belum terurut,nilai yang dicari adalah y dan hanya ada satu, y diletakkan di index ke-10 */

#include <iostream.h>

typedef enum boolean {false=0,true=1};

main() {

int X[11]={20,50,10,30,90,60,70,80,40,100};

int i,y;

boolean found;

cout << "nilai yang dicari = ";

cin >> y;

(43)

C. Proses pencarian sequential data sudah terurut tanpa sentinel :

Dimulai dari elemen pertama pada Array, dilakukan pembandingan dengan elemen yang dicari. Jika elemen dalam Array masih lebih kecil dari elemen yang dicari maka pencarian diteruskan. Jika sudah lebih besar, pencarian dihentikan, dan bisa dipastikan bahwa elemen yang dicari memang tidak ada.

Contoh Program SeqSearch_Urut_NonSentinel

D. Proses pencarian sequential data sudah terurut dengan sentinel :

Jika digunakan cara pencarian dengan sentinel (elemen yang dicari disisipkan di index setelah data terakhir), dan elemen yang dicari lebih besar dari data terakhir yang

cout << "tidak ada " << y << " dalam Array";

else

cout << y << " ditemukan dalam Array pada index ke-" << i;

/* SeqSearch_SudahUrut_NonSentinel

diasumsikan Array X sudah ada dan berisi data yang sudah terurut, nilai yang dicri adalah y dan hanya ada satu */

#include <iostream.h>

typedef enum boolean {false=0,true=1};

main() {

int X[10]={10,20,30,40,50,60,70,80,90,100};

int i,y;

boolean found;

cout << "nilai yang dicari = ";

cin >> y;

found=false;

i=0;

while ((i<9) & (!found) & (y>=X[i])) { if (X[i]==y)

found=true;

(44)

ada di Array sehingga data yang dicari sama dengan data sentinel maka dapat disimpulkan bahwa data tidak ditemukan.

Contoh Program SeqSearch_Urut_Sentinel {cara1}

Contoh Program SeqSearch_Urut_Sentinel {cara2}

/* SeqSearch_SudahUrut_Sentinel {cara 1}

diasumsikan Array X[1..nmax] sudah ada dan indeks 1..n telah berisi data yang sudah terurut,nilai yang dicari adalah y dan hanya ada satu */

#include <iostream.h>

typedef enum boolean {false=0,true=1};

main() {

int X[11]={10,20,30,40,50,60,70,80,90,100};

int i,y;

boolean found;

cout << "nilai yang dicari = "; cin >> y;

X[10]=y;

found=false;

i=0;

while ((!found) & (X[i]<y))

/* SeqSearch_SudahUrut_Sentinel {cara 2}

diasumsikan Array X [0..10] sudah ada dan indeks 1..9 telah berisi data yang sudah terurut,nilai yang dicri adalah y dan hanya ada satu */

#include <iostream.h>

typedef enum boolean {false=0,true=1};

main() {

int X[11]={10,20,30,40,50,60,70,80,90,100};

int i,y;

(45)

PENUTUP

Sequensial Search mempunyai empat macam metode, dan metode pencarian ini dapat dipakai untuk kelompok data yang urut maupun yang tidak urut.

SOAL-SOAL

Tulislah program untuk mencari data bertipe rekaman menggunakan salah satu metode pencarian. Banyaknya data 10. Tipe rekaman mempunyai empat field, yaitu:

 nomorinduk, bertipe bilangan bulat

 nama, bertipe string

 alamat, bertipe string

 golongan, bertipe char (dapat bernilai ‘A’, …’Z’)

Data dicari melalui nomorinduknya. Ketika data yang dicari ditemukan, tampilkan tiga field lainnya.

{ if (X[i]==y) found=true;

else i=i+1;

}if (i==10)

cout << "tidak ada " << y << " dalam Array"; else if (found)

cout << y << " ditemukan dalam Array pada index ke-" << i; else cout << "tidak ada " << y << " dalam Array";

}

(46)

PENGURUTAN (SORTING) 1

PENDAHULUAN

Sorting adalah suatu proses pengurutan data yang sebelumnya disusun secara acak atau tidak teratur menjadi urut dan teratur menurut suatu aturan tertentu.

Biasanya pengurutan terbagi menjadi dua yaitu :

• ascending (pengurutan dari karakter/angka kecil ke karakter/angka besar).

• descending (pengurutan dari karakter/angka besar ke karakter/angka kecil).

ISI

Untuk melakukan proses pengurutan dapat menggunakan beberapa metode antara lain :

A. Metode pengurutan langsung :

1. Metode Penukaran (Exchange selection) / Gelembung (Bubble Sort) 2. Metode Seleksi (Straight Selection Sort)

3. Metode Penyisipan Langsung (Straight Insertion Sort) B. Metode pengurutan tidak langsung :

1. Shell Sort 2. Quick Sort 3. Merge Sort

A. Metode pengurutan langsung :

1. Metode Penukaran (Exchange selection) / Gelembung (Bubble Sort)

 metode pertama yang paling banyak dipelajari pemrogram.

 Sederhana 

a. bubble sort tidak efisien dan menyita banyak waktu prosessor lebih banyak

(47)

daripada teknik sorting yang lain.

b. tidak lebih dari 30 atau kurang dari 30 elemen, penggunaan bubble sort masih sangat baik

(48)

 Metode gelembung / penukaran adalah metode yang mendasarkan penukaran 2 buah elemen untuk mencapai keadaan urut yang diinginkan

Langkah-langkah :

1 : Baca array elemen yang diurutkan (N) 2 : Kerjakan langkah 3 untuk I=1 s/d N-1 3 : Kerjakan langkah 4 untuk J=1 s/d N-1 4 : Cek apakah A[J]>A[J+1}

5 : Selesai

Ilustrasi Bubble Sort

0 44 33

1 33 44

2 55 22

3 22 55

4 11 11

0 33

1 22

2 44

3 11

4 55

0 1 2 3 4

33 44 22 11 55

33 44 22 11 55

33 22 11 44 55

22 33 11 44 55

22 11 33 44 55

22 11 33 44 55 33

44 55 22 11

33 44 55 22 11

(49)

Program berikut memakai bubble sort untuk mengurutkan data array berisi 30 nilai acak :

2. Metode Penyisipan Langsung (Straight Insertion Sort) Dapat dibagi menjadi 2 bagian

– Bagian sebelah kiri data sudah terurut (tujuan) – Bagian sebelah kanan data belum terurut (sumber) Langkah-langkah :

1 : Baca array elemen yang akan diurutkan (n)

2 : Kerjakan langkah 3 sampai langkah 6 untuk i : 1 s/d n-1 3 : Tentukan elemen yang akan disisipkan (Temp = A [i] ;

j = i-1;)

4 : Kerjakan langkah 5 selama temp <A [j] dan j >= 0;

5 : A [j+1]= A[j] ; j =j-1;

6 : Tempatkan elemen A [j+1] = Temp;

7 : Selesai

/* Bubble Sort */

#include <iostream.h>

#include <stdlib.h>

#include <conio.h>

void bubble_sort(int array[], int size) {

int temp, i, j;

for (i=0; i<size-1; i++)

for (j=0; j<size-1-i; j++)

if (array[j] > array[j+1])

Algoritma Straight Insertion Sort Deklarasi

I,J,K,N : Integer Temp : real

A : array [1..20] of real

(50)

Ilustrasi Insertion Sort

i j=i- 1

Temp

= A[

i ]

A [0]

A [1]

A [2]

A [3]

A [4]

A [5]

4 7 9 5 8 6

1 0 7 4 7 9 5 8 6

2 1 9 4 7 9 5 8 6

3 2 5 4 7 5 9 8 6

1 5 4 5 7 9 8 6

4 3 8 4 5 7 8 9 6

5 4 6 4 5 7 8 6 9

3 6 4 5 7 6 8 9

2 6 4 5 6 7 8 9

3. Metode Seleksi (Straight Selection Sort)

Selection sort dimulai dengan menyelesaikan elemen array (misalnya elemen pertama). Kemudian sorting mencari keseluruhan array hingga menemukan nilai yang

Deskripsi

Input(N) {maksimal N=20}

K traversal [1..N]

Input (Af) {masukkan data sebanyak N}

I traversal [2..N]

Temp  A1 J  I-1

While (temp <Aj) and (J>=1) do Aj+1  Aj

J J-1 Endwhile Aj+1  Temp

(51)

11 22 55

33

55 44

22

11 33 55 44

44

22 33 55 11

33

22 44 55 11

55

33 44 22 11

44

33 55 22 11

terkecil. Sorting menempatkan nilai terkecil pada elemen tersebut, memilih elemen kedua dan mencari elemen terkecil kedua.

Langkah-langkah Straight Selection Sort 1 : Baca array elemen yang diurutkan (n)

2 : Kerjakan langkah-langkah 3 sampai langkah 5 untuk i=1 s/d n-1

3 : Tentukan lokasi awal data terkecil Mindeks

=1; kerjakan langkah 4 untuk j=i+1 s/d n 4 : Cari data terkecil dan catat lokasinya.

Test apakah AMindeks > Aj?

Jika ya, catat Mindeks = j 5 : Tukar nilai Amindeks dengan Aj 6 : Selesai

Ilustrasi Straight Selection Sort 44

33

33

22 55 44

11 22

11 11

44 55 33 22

11 22 33 55 44

11 22 33 44 55

(52)

4. Metode Penyisipan Langsung (Straight Insertion Sort) Dapat dibagi menjadi 2 bagian

– Bagian sebelah kiri data sudah terurut (tujuan) – Bagian sebelah kanan data belum terurut (sumber) Langkah-langkah :

1 : Baca array elemen yang akan diurutkan (n)

2 : Kerjakan langkah 3 sampai langkah 6 untuk i : 1 s/d n-1 3 : Tentukan elemen yang akan disisipkan (Temp = A [i] ;

j = i-1;)

4 : Kerjakan langkah 5 selama temp <A [j] dan j >=

0; 5 : A [j+1]= A[j] ; j =j-1;

6 : Tempatkan elemen A [j+1] = Temp;

7 : Selesai

Algoritma Straight Insertion Sort Deklarasi

I,J,K,N : Integer Temp : real

A : array [1..20] of real Deskripsi

Input(N) {maksimal N=20}

K traversal [1..N]

Input (Af) {masukkan data sebanyak N}

I traversal [2..N]

Temp  A1 J  I-1

While (temp <Aj) and (J>=1) do Aj+1  Aj

J J-1 Endwhile

(53)

Ilustrasi Insertion Sort

i j=i- 1

Temp

= A[

i ]

A [0]

A [1]

A [2]

A [3]

A [4]

A [5]

4 7 9 5 8 6

1 0 7 4 7 9 5 8 6

2 1 9 4 7 9 5 8 6

3 2 5 4 7 5 9 8 6

1 5 4 5 7 9 8 6

4 3 8 4 5 7 8 9 6

5 4 6 4 5 7 8 6 9

3 6 4 5 7 6 8 9

2 6 4 5 6 7 8 9

PENUTUP

Ketiga metode pengurutan langsung yang dibahas pada pertemuan ini hanya beberapa dari metode pengurutan langsung lainnya. Banyak metode lain untuk mengurutkan data. Metode-metode tersebut bertujuan sama yaitu mengurutkan data, yang berbeda hanya cara yang mempengaruhi kecepatan untuk jumlah data tertentu.

SOAL-SOAL

1. Pergunakan ketiga metode pengurutan langsung di atas untuk menampilan data dalam pengolahan data nilai suatu mata kuliah.

Buatlah menu untuk memilih metode yang dipakai, dan pilihan field yang akan dipakai sebagai key juga harus bisa dipilih (misal berdasarkan NIM atau Nilai Akhir).

Struktur Data yang dipakai sebagai berikut : Deklarasi

(54)

TYPE

DataMhs = Record

(55)

< NIM : String Nama : String

UTS,UAS,Prakt,NA : real {0 s/d 100}

>

BykMhs, i, j : integer

Mahasiswa : Array[1..100] of DataMhs

Temp : DataMhs

Nilai Akhir (NA) dihitung dengan rumus : NA = 25%*UTS+50%*UAS+25%*Prakt Proses yang dilakukan dalam program ini :

 memasukkan data,

 sorting, dan

 tampilkan data.

2. Carilah metode pengurutan langsung lainnya selain ketiga metode yang dibahas pada pertemuan ini.

(56)
(57)

PENUTUP

A.Kesimpulan

Berdasarkan pemaparan diatas dapat ditarik kesimpulan bahwa untuk mempelajari bahasa pemrograman C++ yang baik benar dilakukan melalui pemahaman-pemahaman yang terstruktur terdiri dari memahami algoritma pemograman yang baik dan benar,memahami tipe data, fungsi,prosedur,pencarian maupun sorting dan sebagainya.

B.Saran

Demikian modul ini penulis buat.Penulis mempelajari dan mengumpulkan informasiinformasi yang tercantum dari berbagai sumber.Penulis berharap makalah ini dapat bermanfaat untuk menambah wawasan pengetahuan para pembaca.Tak ada gading yang tak retak.Penulis menyadari makalah ini masih memiliki banyak kekurangan.Penulis sangat menerima kritik dan saran dari pembaca.

Gambar

Ilustrasi Bubble Sort
Ilustrasi Insertion Sort
Ilustrasi Straight Selection Sort 44
Ilustrasi Insertion Sort

Referensi

Dokumen terkait

Cabang dari perulangan pertama, Melakukan peroses perulangan untuk menampilkan data-data dalam indeks elemen array, dimana variabel (k) diincremen dan proses akan berhenti

Praktikum ini memuat beberapa bab yang berisi tentang Struktur Program Pascal : Tipe Data, Variabel dan Konstanta; Penyeleksian Kondisi; Pengulangan ( Looping ); Prosedur dan

Namun dari program tersebut sudah dapat diketahui apakah bilangan yang diinputkan ADA atau TIDAK ADA di dalam array satu dimensi yang telah didefinisikan.. Permasalahan

Diketahui suatu Array 3 dimensi yang dideklarasikan dengan A[2][5][6] Pada Bahasa C++.Setiap elemen terdiri dari 4 Byte.. Row Major Order

Dengan menggunakan list yang telah anda buat pada modul I (filmFavoritKu yang telah ditambah 4 elemen), kerjakan method di atas terhadap list tersebut.. Jelaskan

 Dalam Pascal, tipe data string merupakan suatu larik ( array ) khusus, dengan tipe dasar karakter ( char ) karena:..  Unsur data pertama dengan indeks ke-0 digunakan oleh

Definisi array diatas berarti kita mendeklarasikan sebuah variabel dengan tipe array yang mempunyai nama variabel nilai, yang memiliki elemen sejumlah 10 buah

Jika menyimpan angka dengan tipe data char, angka tersebut tidak bisa digunakan dalam proses penjumlahan,pengurangan,perkalian atau pembagian... o Boolean adalah tipe data yang