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
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
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.
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
3. DO..WHILE
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
}
Tipe data array adalah salah satu tipe terstruktur dalam pemrograman. Tipe data array ini dapat dipakai untuk salah satu contohnya adalah perhitungan matriks.
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;
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
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 p1 to 4 do for q1 to p do
output(q) endfor
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.
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];
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
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];
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
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;
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];
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
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;
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;
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 ,
>
Bahasa C++ :
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) i1 s0
while (i<=n) do output(i) ii+1 endwhile
Algoritma Contoh2 Deklarasi
i,s,n : integer Deskripsi
Input(n)
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 : i1
s0
while (i<=n) do output(i) ss+1 ii+1 endwhile output(s)
Algoritma Contoh3 Deklarasi
i,s,x : integer Deskripsi
i1 x0 s0
while (i<=10) do x2*i
ss+x output(x) ii+1 endwhile
#include<stdio.h>
#include<math.h>
main() {
int i=1,s=0,x=0;
printf(“S=”);
while (i<=10)
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);
atau
untuk ganjil i mod 2 =1 t = -1 untuk genap i mod 2 = 0
t = 1
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
i1 x0 s0 t1
while (i<=6) do x2*i*(-1**i) ss+x
output(x) ii+1 endwhile output(s)
Algoritma Contoh6b Deklarasi
i,s,x,t : integer Deskripsi
i1 x0 s0 t1
while (i<=6) do if (i mod 2)=1 then
t -1 else t 1 x2*i*t ss+x output(x)
ii+1 endwhile output(s)
Contoh 8 :
S = 1/2-1/4+1/8-1/16+...-...
atau
Algoritma HitungDeret7 Deklarasi
i,p,q,n : integer S : real
Deskripsi i1 p1 q2 S0.0
while (i<=n) do if (i mod 2=0) then
t -1 else
t 1 endif p1 q2^i SS+p/q*t output(p,’/’,q) ii+1
Algoritma HitungDeret7 Deklarasi
i,p,q,n : integer S : real
Deskripsi i1 p1 q2 S0.0
while (i<=n) do output(p,’/’,q) SS+p/q p-1*p qq*2 ii+1
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+...-...
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
- Paling sedikit mempunyai general base - Selalu dalam bentuk fungsi-fungsi
- 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 :
Function Faktorial (input n: integer) integer Deklarasi
{tidak ada}
Deskripsi
if (n = 0) or (n = 1) then
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
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
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);
}
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)
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
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 :
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,
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)) {
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;
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;
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;
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";
}
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
daripada teknik sorting yang lain.
b. tidak lebih dari 30 atau kurang dari 30 elemen, penggunaan bubble sort masih sangat baik
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
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
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
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
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
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
TYPE
DataMhs = Record
< 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.
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.