Uploaded by User44935

materi algoritma dan pemograman 1 dan 2

advertisement
Disusun Oleh
Atang Susila
Jl. Surya Kencana No. 1 Pamulang Telp (021)7412566, Fax. (021)7412566
Tangerang Selatan – Banten
2
DAFTAR ISI
Hal
Daftar Isi.....................................................................................................................
2
Pertemuan 1................................................................................................................
3
Pertemuan 2................................................................................................................
9
Pertemuan 3................................................................................................................
11
Pertemuan 4................................................................................................................
16
Pertemuan 5................................................................................................................
18
Pertemuan 6................................................................................................................
28
Pertemuan 7................................................................................................................
33
Pertemuan 8................................................................................................................
39
Pertemuan 9................................................................................................................
46
Pertemuan 10..............................................................................................................
52
Pertemuan 11..............................................................................................................
55
Pertemuan 12..............................................................................................................
59
Pertemuan 13..............................................................................................................
65
Pertemuan 14..............................................................................................................
74
Pertemuan 15..............................................................................................................
75
Pertemuan 16..............................................................................................................
80
Pertemuan 17..............................................................................................................
85
Pertemuan 18..............................................................................................................
91
Pertemuan 19..............................................................................................................
100
Pertemuan 20..............................................................................................................
104
Pertemuan 21..............................................................................................................
109
Pertemuan 22..............................................................................................................
115
3
PERTEMUAN I
4
RENCANA PERKULIAHAN
Prasyarat :
Telah lulus mata kuliah :
1. Pengantar Aplikasi Komputer
2. Pengantar Teknologi Informasi
3. Sistim Digital
4. Logika Matematika
Bobot : 4 SKS
Jumlah pertemuan : 24 kali
Penilaian :
1. Kehadiran : 10%
2. Tugas : 20%
3. UTS : 30%
4. UAS : 40%
Program yang digunakan : Microsoft Visual C++ 2008 Express Edition
Tugas : 2 buah (1 tugas sebelum UTS dan 1 tugas sebelum UAS)
Referensi :
1. Abdul kadir, Panduan Pemrograman Visual C++, Penerbit Andi Yogyakarta
2. Rinaldi Munir, Algoritma dan Pemrograman, Edisi-3, Informatika Bandung
3. M. Sjukani, Algoritma dan Struktur Data dengan C, C++, dan Java, Mitra Wacana Media
4. H.M. Deitel, C How To Program, 3rd, Prentice Hall
5. Bacaan lain dari Internet
5
PENGERTIAN DASAR
Algoritma :
 Rangkaian langkah-langkah/alur pikiran untuk menyelesaikan suatu masalah/tugas
yang sifatnya logis dan sistimatis
Sifat-sifat Algoritma :
 Mudah dibaca/jelas maksudnya (tiap langkah jelas uraiannya)
 Berawal dan berakhir
 Tidak harus ada data masukan yang dimasukkan dari luar
 Paling tidak ada satu keluaran
 Tiap instruksi harus efektif
Bahasa pemrograman :
 Bahasa komputer yang digunakan dalam penulisan program
Pemrogram/Programmer :
 Orang yang membuat program komputer
Pemrograman :
 Kegiatan merancang atau menulis program komputer
PERANGKAT UTAMA KOMPUTER
TAHAP PELAKSANAAN PROGRAM OLEH KOMPUTER
6
STRUKTUR DASAR DAN NOTASI ALGORITMA
Algoritma berupa langkah-langkah penyelesaian suatu masalah/tugas. Langkah-langkah
tersebut dapat berupa :
1. Runtunan (Sequence)
2. Pimilihan (Selection)
3. Pengulangan (Repetition)
Notasi Algoritmik bukan notasi bahasa pemrograman sehingga siapapun dapat membuat
notasi algoritmik yang berbeda. Namun demikian ketaatan atas notasi perlu diperhatikan
untuk menghindari kekeliruan.
Beberapa notasi yang digunakan untuk menulis algoritma :
a. Untaian kalimat deskriptif
Setiap langkah dinyatakan dengan bahasa yang gamblang/jelas
b. Menggunakan diagram alir (flow chart)
c. Menggunakan pseudo-code
Pseudo : semu, tidak sebenarnya, pura-pura; adalah notasi yang menyerupai
notasi bahasa pemrograman tingkat tinggi
Suatu algoritma yang ditulis menggunakan diagram alir menggunakan simbol-simbol sebagai
berikut :
Simbol
Maksud
Simbol
Maksud
Terminal (START, END)
Titik sambungan pada halaman
yang sama
Input/Output (READ,
WRITE)
Titik konektor yang berada
pada halaman lain
Proses (menyatakan
assignment statement)
Call (Memanggil subprogram)
Decision (YES, NO)
Dokumen
Display
Stored Data
Alur proses
Preparation (Pemberian nilai
awal suatu variabel)
7
Penulisan algoritma menggunakan pseudo code dapat menggunakan notasi-notasi sebagai
berikut :
Pernyataan
Penulisan
Pembacaan
Penugasan
Notasi algoritmik
write(x)
write(x,y)
write(“Hello”)
read(a)
read(a,b)
bilx
Maksud
Nilai x dicetak di piranti keluaran
Nilai x dan y dicetak di piranti keluaran
Text Hello dicetak di piranti keluaran
Baca nilai a
Baca nilai a,b
Isikan nilai variabel x kedalam variabel bil
Teks algoritma (pseudo-code) terdiri dari :
 Head(Judul) : memberikan nama pada algoritma; umumnya nama sudah dapat
memberi gambaran pada prosedur penyelesaian masalah atau masalah yang akan
diselesaikan
 Deklarasi : menyatakan jenis dari setiap elemen data (variabel) yang akan digunakan
dalam algoritma.
 Deskripsi : merupakan inti prosedur penyelesaian masalah; meliputi pernyataan/
operasi, fungsi, penjelasan, dll.
CONTOH ALGORITMA :
a.Untaian kalimat deskriftif
ALGORITMA Penjumlahan
Diberikan dua buah bilangan bulat positif A dan B. Algoritma Penjumlahan menjumlahakan
nilai dua variabel A dan B, hasilnya disimpan pada variabel C
DESKRIPSI :
1. Baca nilai A dan B
2. Jumlahkan A dengan B, hasilnya berikan ke C
3. Cetak C
8
b. Flow Chart
c. Pseudo-code
ALGORITMA Eucledian
Program mencari pbt, m dan n bil bulat positif
DEKLARASI :
A, B : integer {input}
C : integer {hasil}
DESKRIPSI :
read(A,B)
C←A+B
write(C)
Latihan :
1. Buat flow chart untuk menghitung luas segitiga
9
PERTEMUAN II
10
STUDI KASUS
MEMBUAT FLOW CHART DARI CONTOH SEDERHANA
1. Buat flow chart untuk menghitung luas, keliling, diagonal persrgi panjang
2. Buat flow chart untuk konversi waktu dari detik ke jam menit detik
3. Buatlah flow chart untuk menghitung luas lingkaran
11
PERTEMUAN III
12
STRUKTUR BAHASA C++
Struktur Bahasa C++ terdiri dari :
 Compiler directive (preprocessor)
 Deklarasi (variabel, fungsi)
 Tubuh program
 Baris komentar
Contoh program :
ELEMEN-ELEMEN DASAR C++
 Identifier/pengenal : suatu nama yang dipakai dalam pemrograman, umumnya
diberikan kepada nama :
 Variabel : suatu lokasi dalam memori komputer yang digunakan untuk
menyimpan nilai
 Konstanta bernama
 Tipe data
 Fungsi
 Obyek
 Tipe data dasar
 Data Obyek
 Ekspresi aritmetika
 Statemen kontrol
 Fungsi
Ketentuan pemberian nama :

Terdiri dari huruf A sampai Z, atau a sampai z, atau underscore ( _ ), atau 0 sampai 9
13

Karakter pertama suatu identifier harus huruf atau underscore

Tidak boleh sama dengan kata kunci (keyword) dalam bahasa C++

Tidak boleh ada spasi

Case sensitive : hurup kapital dan hurup kecil diperlakukan beda
Karakter :
Elemen terkecil pada pemrograman C++ adalah karakter. Karakter dapat berupa :
o Huruf (A sampai Z, a sampai z)
o Angka ( 0 sampai 9)
o Simbol (*, !, dll)
o Kode kontrol (misal newline)
Keywords :
asm, auto, break, case, char, class, const, continue, default, delete, do, double, else,
enum, extern, float, for, friends, goto, if, inline, int, long, new, operator, private,
protected, public, register, return, short, signed, sizeof, static, struct, switch, template,
this, typedef, union, unsigned, virtual, void, volatile, while.
Kode escape :
kode karakter yang penulisannya diawali dengan simbol \.
Kode
Ket.
\0
Karakter Null
\a
Karakter audio
(bel)
\b
Backspace
\f
Formfeed
Kode
Ket.
\n
New line
\r
Cariage return
Kode
\’
\”
Ket.
Petik tunggal
Petik ganda
\t
\v
\xdd
\\
Hexadesimal (dd:0 sd FF)
Menampilkan \
Tab
Tab vertikal
14
TIPE DATA
TIPE DATA DASAR
Tipe
Ukuran
char,unsigned char, signed char
1 byte
short, unsigned short
2 byte
int, unsigned int
4 byte
long, unsigned long
4 byte
float
4 byte
double
8 byte
long double
8 byte
JANGKAUAN NILAI
Tipe
Nilai
char
-128 sd 127
unsigned char
0 sd 255
short
-32.768 sd 32.767
unsigned short
0 sd 65.535
-2.147.483.648 sd
long
2.147.483.647
unsigned long
0 sd 4.294.967.295
-2.147.483.648 sd
int
2.147.483.647
unsigned int
0 sd 4.294.967.295
float
1,2.10-38 sd 3,4.1038
double
2,2.10-308 sd 1,8.10308
Literal Karakter
Literal Karakter digunakan untuk menyatakan sebuah karakter. Karakter ditulis dalam
tanda petik tunggal.
Contoh :
‘a’ : karakter huruf a
‘#’ : karakter simbol #
‘8’ : karakter angka 8
‘\n’ : karakter newline
Literal String
String berarti deretan atau kombinasi sejumlah karakter. Literal String ditulis dalam
tanda petik ganda.
Contoh :
“Rudy Hartono”
15
“4 x 4 = 16”
“” : string kosong
“abc\ndef” : antara abc dan def terdapat newline
“abc\tdef” : antara abc dan def terdapat tab
Konstanta Bernama
Contoh :
const double PI=3.14;
menyatakan bahwa PI adalah literal bertipe double dengan nilai 3,14. kata kunci const
menyatakan bahwa PI tak dapat diubah setelah didefinisikan.
Variabel
Menyatakan suatu lokasi dalam memori komputer yang digunakan untuk menyimpan
suatu nilai dan nilai yang ada didalamnya bisa diubah.
Deklarasi variabel :
int a;
int a, b;
int a=30;
cin>>usia;
Pernyataan
Pernyataan adalah suatu instruksi lengkap yang berdiri sendiri dan ditunjukan untuk
melaksanakan suatu tugas tertentu. Sebuah pernyataan selalu diakhiri oleh tanda titik
koma.
Contoh :
luas=panjang*lebar;
const double PI=3.14;
Latihan
1. Jika diketahui nilai A=5, B=2, T=4. Berapa isi A, B, dan T jika dikenai instruksi sbb :
a. T=A
b. T=T+A
c. T=T+A*B d. T=A%B e. T=B%A f. T=A-B/2
2. Jika diketahui A=5, B=2, berapa isi A dan B jika dikenai instruksi :
T=A
A=B
B=T
16
PERTEMUAN IV
17
STUDI KASUS
MEMBUAT PROGRAM SEDERHANA DARI FLOW CHART PADA PERTEMUAN
KE II
18
PERTEMUAN V
19
TIPE DATA dan MEMBACA-MENCETAK NILAI KONSTANTA
I.Instruksi Baca – Tulis dalam bahasa C/C++
Cetak ke layar monitor
Baca dari keyboard
printf(“format”,var)
gets(var)
var=getch()
puts(“string”)
var=getche()
scanf(“format”,&var)
cout<<var
var=getchar()
II.Mencetak sebuah kalimat (literal String) pada program C.
Kode program
Tercetak di monitor
//mencetak_string.cpp
#include<stdio.h>
void main(void)
{
printf("Jakarta\n");
Jakarta
puts("Jakarta");
Jakarta
printf("%s","Jakarta\n"); Jakarta
}
III.Mencetak sebuah karakter pada program C.
Sebuah karakter disimpan dalam satu BYTE (8 bit)
printf(“%c”,data);
data
‘AB’
‘a’
65
97
49
50
66-1
35*2
41
297
172
171
Hasil
tercetak
A
a
A
a
1
2
A
F
)
)
¼
½
Keterangan
kode ASCII 65 adalah karakter A
kode ASCII 97 adalah karakter a
kode ASCII 49 adalah karakter 1
kode ASCII 50 adalah karakter 2
kode ASCII 65 adalah karakter A
kode ASCII 70 adalah karakter F
kode ASCII 41 adalah karakter )
kode ASCII 41 (297-256) adalah karakter )
kode ASCII 172 adalah karakter ¼
kode ASCII 171 adalah karakter ½
Catatan :
Yang dimaksud dengan karakter diatas adalah karakter ASCII (American
Standard Code for Information Interchange)
Perhatikan program berikut :
Statement
printf(“%i”,’A’)
printf(“%i”,’a’)
printf(“%d”,’A’)
printf(“%d”,’a’)
Tercetak
65
97
65
97
Keterangan
Nilai ASCII dari karakter ‘A’ adalah 65
Nilai ASCII dari karakter ‘a’ adalah 97
Nilai ASCII dari karakter ‘A’ adalah 65
Nilai ASCII dari karakter ‘a’ adalah 97
20
IV.Mencetak karakter escape pada program C.
Kode Program
//mencetak_escape.cpp
#include<stdio.h>
void main(void)
{
printf("Jakarta\nBali\n");
printf("Jakarta\bBali\n");
printf("Jakarta\rBali\n");
printf("Jakarta\\Bali\n");
printf("Jakarta\'Bali\n");
printf("Jakarta\t\tBali\n");
printf("Jakarta\"Bali\n");
}
Hasil
Jakarta
Bali
JakartBali
Balirta
Jakarta\Bali
Jakarta’Bali
Jakarta
Bali
Jakarta”Bali
V. Mencetak konstanta numerik pada program C
printf(“format”,var);
Format yang dapat digunakan :
Kode format
%i atau %d
%u
%li atau %ld
%lu
%f
%e
%le atau %lE
%Le atau %LE
%c
%x atau %X
%o
Kode program
//cetak_numerik1.cpp
#include<stdio.h>
void main(void)
{
short a,b,c,d;
//-32768 s/d 32767
a=-32768;
b=-32769;
c=32767;
d=32768;
printf("a = %i\n",a);
printf("b = %i\n",b);
printf("c = %i\n",c);
printf("d = %i\n",d);
}
Hasil yang tercetak
Numerik integer bertanda
Numerik integer tak bertanda
Numerik long integer bertanda
Numerik unsigned long integer
Numerik floating point
Numerik floating point
Numerik floating point double precission
Numerik floating point long double precission
Karakter ASCII
Hexadesimal Integer
Octal Integer
Hasil
a = -32768
b = 32767
c = 32767
d = -32768
Kode program
//cetak_numerik2.cpp
#include<stdio.h>
void main(void)
{
unsigned short a,b,c,d;
//0 s/d 65535
a=0;
b=-1;
c=65535;
d=65536;
printf("a = %u\n",a);
printf("b = %u\n",b);
printf("c = %u\n",c);
printf("d = %u\n",d);
}
Hasil
a=0
b = 65535
c = 65535
d=0
21
0
1
short:
1
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
Kode program
//cetak_float1.cpp
#include<stdio.h>
void main(void)
{
float a,b,c,d;
a=25;
b=25.25;
c=25.123456;
d=25.123456789;
printf("a = %f\n",a);
printf("b = %f\n",b);
printf("c = %f\n",c);
printf("d = %f\n",d);
printf("\n");
printf("a = %7.2f\n",a);
printf("b = %7.3f\n",b);
printf("c = %7.0f\n",c);
printf("d = %7.4f\n",d);
}
//cetak_float1.cpp
#include<stdio.h>
void main(void)
{
float a,b,c,d;
a=25;
b=25.25;
c=25.123456;
d=25.123456789;
printf("a = %e\n",a);
printf("b = %E\n",b);
printf("c = %e\n",c);
printf("d = %E\n",d);
printf("\n");
printf("a = %7e\n",a);
printf("b = %5e\n",b);
printf("c = %7.0E\n",c);
printf("d = %10.2E\n",d);
}
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
Hasil
25.000000
25.250000
25.123455
25.123457
25.00
25.250
25
25.1235
2.500000e+001
2.525000E+001
2.512346e+001
2.512346E+001
2.500000e+001
2.525000e+001
3E+001
2.51E+001
1
0
0
1
1
0
0
1
1
0
1
1
=
=
=
=
32767
-32768
-32767
-1
22
VI. Menginput data melalui keyboard pada program C
//baca_keyboard1.cpp
#include<stdio.h>
void main(void)
{
char S[6];
printf("Inputkan String : ");
gets(S);
printf("%s\n",S);
}
//baca_keyboard3.cpp
#include<stdio.h>
void main(void)
{
char C;
printf("Masukan sebuah karakter : ");
C=getchar();
printf("%c\n",C);
}
//baca_keyboard5.cpp
#include<stdio.h>
void main(void)
{
char C,D;
printf("Inputkan dua karakter : ");
scanf("%c",&C);
scanf("%c",&D);
printf("%c %c\n",C,D);
}
//baca_keyboard2.cpp
#include<stdio.h>
#include<conio.h>
void main(void)
{
char C;
printf("Inputkan sebuah karakter : ");
C=getche();
printf("\n%c\n",C);
}
//baca_keyboard4.cpp
#include<stdio.h>
#include<conio.h>
void main(void)
{
char C;
printf("Masukan sebuah karakter : ");
C=getch();
printf("\n%c\n",C);
}
//baca_keyboard6.cpp
#include<stdio.h>
void main(void)
{
int C,D,E;
printf("Inputkan bilangan ke-1 : ");
scanf("%i",&C);
printf("Inputkan bilangan ke-2 : ");
scanf("%i",&D);
E=C*D;
printf("%i * %i = %i\n",C,D,E);
}
23
MASALAH TIPE DATA
1. Char
Bila isinya diperlakukan sebagai nilai
numerik, maka bit sign :
0 : berarti nilai positif
1 : berarti nilai negatif
Nilai yang dapat ditampung berkisar dari
//char1.cpp
#include<iostream>
using namespace std;
void main(void)
{
char a,b,c,d;
a=127;
b=-128;
c=128;
d=-129;
cout<<(int)a<<endl;
cout<<(int)b<<endl;
cout<<(int)c<<endl;
cout<<(int)d<<endl;
}
Hasilnya :
127
-128
-128
127
Analisis :
a = 127, masih dalam jangkauannya
b = -128, masih dalam jangkauannya
c = 128, diluar jangkauannya.
128 = 1000 0000, karena dideklarasikan
sebagai char maka bit MSB memiliki nilai
negatif yaitu -128
d = -129, diluar jangkauannya
129 = 1000 0001
-129 = 0111 1111, karena dideklarasikan
sebagai char maka nilai biner tersebut sama
dengan 127
2. unsigned char
Bila isinya diperlakukan sebagai nilai
numerik, maka nilai yang dapat ditampung
berkisar antara 0 sampai dengan 255
24
//char2.cpp
#include<iostream>
using namespace std;
void main(void)
{
unsigned char a,b,c,d;
a=0;
b=255;
c=-1;
d=256;
cout<<(int)a<<endl;
cout<<(int)b<<endl;
cout<<(int)c<<endl;
cout<<(int)d<<endl;
}
Hasilnya :
Analisis :
a = 0, masih dalam jangkauannya
b = 255, masih dalam jangkauannya
c = -1, diluar jangkauannya
1 = 0000 0001
-1 = 1111 1111 sama dengan 255
d = 256, diluar jangkauannya
256 = 1 0000 0000, karena hanya 8 bit
maka bit paling kiri diabaikan sehingga
nilainya menjadi 0
0
255
255
0
3. short
bit sign :
0 : berarti nilai positif
1 : berarti nilai negatif
Nilai yang dapat ditampung berkisar dari
//short1.cpp
#include<iostream>
using namespace std;
void main(void)
{
short a,b,c,d;
a=-32768 ;
b=32767;
c=-32769;
d=32769;
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
cout<<d<<endl;
}
Hasilnya :
-32768
32767
32767
-32768
Jelaskan!!!!!!!
25
4. unsigne short
nilai yang dapat ditampung berkisar antara
0 sampai dengan 65.535
//short2.cpp
#include<iostream>
using namespace std;
void main(void)
{
unsigned short a,b,c,d;
a=0;
b=65535;
c=-1;
d=65536;
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
cout<<d<<endl;
}
Hasilnya :
Jelaskan!!!!!!!!!!!!!!!!!!
0
65535
65535
0
5. int
bit sign :
0 : berarti nilai positif
1 : berarti nilai negatif
Nilai yang dapat ditampung berkisar dari
26
//int1.cpp
#include<iostream>
using namespace std;
void main(void)
{
int a,b,c,d;
a=-2147483648;
b=2147483647;
c=-2147483649;
d=2147483648;
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
cout<<d<<endl;
}
Hasilnya :
Jelaskan!!!!!!!!!!
-2.147.483.648
2.147.483.647
2.147.483.647
-2.147.483.648
6. unsigned int
nilai yang dapat ditampung berkisar antara 0
sampai dengan 4.294.967.295
//int2.cpp
#include<iostream>
using namespace std;
void main(void)
{
unsigned int a,b,c,d;
a=0;
b=4294967295;
c=-1;
d=4294967296;
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
cout<<d<<endl;
}
Hasilnya :
0
4294967295
4294967295
0
Jelaskan!!!!!!!!!!!!!!!!
27
TUGAS
1. Buat algoritma (dalam bentuk flow chart dan pseudo-code) dan program bahasa C
untuk menghitung luas lingkaran
2. Buat algoritma (dalam bentuk flow chart dan pseudo-code) dan program bahasa C
untuk menghitung nilai-nilai x dari persamaan
ax 2  bx  c  0
x 
1
x2 
b
b
b 2  4ac
2a
b 2  4ac
2a
inputnya a,b,c
3. Jika diketahui nilai A=5, B=2, T=4. Berapa isi A, B, dan T jika dikenai instruksi sbb :
a. T=A b. T=T+A c. T=T+A*B d. T=A%B e. T=B%A f. T=A-B/2
4. Jika diketahui A=5, B=2, berapa isi A dan B jika dikenai instruksi :
T=A
A=B
B=T
28
PERTEMUAN VI
29
OPERATOR DAN EKSPRESI
Operand
3
+
3
*
Ekspresi
6
Operator
Ekspresi/ungkapan : Suatu bentuk yang
menghasilkan suatu nilai.
Operator : simbol atau karakter khusus (mis. +,*)
yang digunakan dalam suatu ekspresi untuk
menghasilkan suatu nilai.
Operator :
 Operator Aritmetika
 Operator penambahan (increment) dan pengurangan (decrement)
 Operator penugasan
 Operator pembandingan
 Operator logika
 Operator bit
Menurut jumlah operand yang dilibatkan, operator diklasifikasikan menjadi menjadi :
 Operator unary, yaitu operator yang hanya melibatkan satu buah operand
 Operator binary, yaitu operator yang melibatkan dua buah operand
 Operator tertiary, yaitu operator yang melibatkan tiga buah operand
Operator Aritmetika:
Operator
+
*
/
%
Keterangan
Penjumlahan
Tanda plus
Pengurangan
Tanda minus
Perkalian
Pembagian
Sisa pembagian(Modulus)
Urutan pelaksanaan operator aritmetika :
Kode sumber
Hasil
//aritmetika.cpp
#include<iostream>
using namespace std;
void main(void)
{
int a=11; int b=3;
cout<<a+b<<endl;
14
cout<<a*b<<endl;
33
cout<<a-b<<endl;
8
cout<<a/b<<endl;
3
cout<<a%b<<endl;
2
}
30
Operator
Urutan
Dievaluasi pertama. Jika berkalang maka kalang paling dalam dievaluasi
paling pertama. Jika ada beberapa pasangan kurung dalam satu level maka
dievaluasi dari kiri ke kanan
Dievaluasi kedua. Jika ada beberapa maka dievaluasi dari kiri ke kanan
Dievaluasi terakhir. Jika ada beberapa maka dievaluasi dari kiri ke kanan
()
*, /, atau %
+ atau -
Contoh : Aljabar : z=pr%q+w/x-y
z
=
6
p
*
r
1
%
2
q
+
w
4
/
3
x
-
y
;
5
Tentukan urutan operasi aritmetika dari persamaan berikut :
y=a(b+c)+c(a-b(d+a)(a%b)), jika a=20, b=10, c=7, d=2
Operator Penambahan dan
Pengurangan :
x = x + 1  x++ atau ++x
x = x – 1  x-- atau --x
x semula
5
5
5
5
Pernyataan
y = x++;
y = ++x;
y = x-y = --x
Hasil y
5
6
5
4
Hasil x
6
6
4
4
31
Operator Bit
C++ mendukung 6 buah operator yang beroperasi pada level bit (0 dan 1), yaitu :
 & (AND)
 | (OR)
 ^ (XOR)
 ~ (NOT)
 << (Geser Kiri)
 >> (Geser Kanan)
Operator &
Bit 1
Bit 2
0
0
0
1
1
0
1
1
Hasil
0
0
0
1
Contoh :
9 & 10 memberikan
hasil 8
1
1
1
0
0
0
0
1
0
1
0
0



9
10
8
Bit 2
0
1
0
1
Hasil
0
1
1
1
Contoh :
9 | 10 memberikan
hasil 11
1
1
1
0
0
0
0
1
1
1
0
1



9
10
11
Operator ^
Bit 1
Bit 2
0
0
0
1
1
0
1
1
Hasil
0
1
1
0
Contoh :
9 ^ 10 memberikan
hasil 3
1
1
0
0
0
0
0
1
1
1
0
1



9
10
3
Operator |
Bit 1
0
0
1
1
Operator ~
~185 memberikan hasil -186
0
1
0
1
1
1






1
0
1
0
0
0
Operator <<
x << n identik dengan x*2n
29 << 1 memberikan hasil 58
0

1
0

1
1

0

185

-186
Operator >>
x >> n identik dengan x/2n
29 >> 1 memberikan hasil 14
32
Tentukan output dari program berikut?
//Operasi Bit
#include<iostream>
using namespace std;
void main(void)
{
int x=185;
int y=5;
cout<<"~" << x <<" = "<<~x<<endl;
cout<<x<<" | "<<y<<" = "<<(x|y)<<endl;
cout<<x<<" & "<<y<<" = "<<(x&y)<<endl;
cout<<x<<" ^ "<<y<<" = "<<(x^y)<<endl;
cout<<x<<" << "<<y<<" = "<<(x<<y)<<endl;
cout<<x<<" >> "<<y<<" = "<<(x>>y)<<endl;
}
Operator Penugasan
Operator
=
+=
-=
*=
/=
%=
Keterangan
Pemberian nilai
Penambahan bilangan
Pengurangan bilangan
Pengalian bilangan
Pembagian bilangan
Pemerolehan sisa bagi
a += 2 sama dengan a = a + 2
a -= 2 sama dengan a = a - 2
a *= 2 sama dengan a = a * 2
a /= 2 sama dengan a = a / 2
a %= 2 sama dengan a = a % 2
Operator
&=
^=
|=
<<=
>>=
Keterangan
Pemberian nilai
Penambahan bilangan
Pengurangan bilangan
Pengalian bilangan
Pembagian bilangan
Contoh
a &= x sama dengan a = a & x
a ^= x sama dengan a = a ^ x
a |= x sama dengan a = a | x
a <<= x sama dengan a = a << x
a >>= x sama dengan a = a >> x
Tentukan nilai a dan b dari pernyataan berikut:
a=b=6
a += 5
b -=2
a %=b
Contoh
33
PERTEMUAN VII
34
TYPE CASTING
Operasi perhitungan pada C++ dilakukan dengan menggunakan tipe data yang sama. Jika
dalam suatu ekspresi terdapat operand dengan tipe yang berbeda, C++ akan mengkonversikan
salah satu tipe sehingga kedua tipe menjadi sama dengan aturan :
1. Jika salah satu operand bertipe long double, yg lain dikonversikan menjadi long double
2. Jika salah satu operand bertipe double, yg lain dikonversikan menjadi double
3. Jika salah satu operand bertipe float, yg lain dikonversikan menjadi float
4. Jika salah satu operand bertipe char, signed char, unsigned char, atau unsigned short, yg
lain dikonversikan menjadi int
5. Tipe enumerasi akan dikonversikan ke int, unsigned int, long, atau unsigned long dengan
mengakomodasikan jangkauan tipe enumerasi
6. Jika salah satu operand bertipe unsigned long, yg lain dikonversikan menjadi unsigned long
7. Jika salah satu operand bertipe long dan yang lain bertipe unsigned int, kedua operand
dikonversikan menjadi unsigned long
8. Jika salah satu operand bertipe long , yg lain dikonversikan menjadi long
Type casting : proses mengubah suatu tipe ke tipe yang lain. Bentung pengarah tipe
sbb :
(tipe_data)data
tipe_data(data)
static_cast<tipe_data>(data)
Code Program
//Type casting
#include<iostream>
using namespace std;
void main(void)
{
double fa,fb,fc;
fa=3.14;
fb=5.23;
fc=10.25;
cout<<fa<<endl;
cout<<fb<<endl;
cout<<fc<<endl;
cout<<(int)fa<<endl;
cout<<int(fb)<<endl;
cout<<static_cast<int>(fc)<<endl;
}
Output
3.14
5.23
10.25
3
5
10
35
FILE I/O
Untuk dapat mengakses file menggunakan C, dapat dilakukan dengan menggunakan pointer
FILE.
Contoh :
FILE *fp;
Untuk membuka sebuah file :
FILE *fopen(const char *filename, const char *mode);
mode :
r
: open for reading
w
: open for writing (file need not exist)
a
: open for appending(file need not exist)
r+
: open for reading and writing, start at beginning
w+
: open for reading and writing (overwrite file)
a+
: open for reading and writing (overwrite file)
Contoh sederhana :
FILE *fp;
fp=fopen("c:\\test.txt", "w");
fprintf(fp, "Testing...\n");
fclose(fp);
Code Program
//Create a sequential file
#include<stdio.h>
void main(void)
{
int akun;
char nama[30];
FILE *fp;
fp=fopen("d:\\kampus\\program\\c++\\data1.dat","w");
printf("Masukan akun, nama\n");
scanf("%d%s",&akun,nama);
fprintf(fp,"%d %s\n",akun,nama);
fclose(fp);
}
Hasil
Input :
100 Heri [Enter]
Output :
File yang bernama
data1.dat akan berisi
data :
100 Heri
36
Code Program
#include<stdio.h>
void main(void)
{
int akun;
char nama[30];
FILE *fp;
fp=fopen("d:\\kampus\\program\\c++\\data1.dat","r");
fscanf(fp,"%d %s\n",&akun,nama);
fclose(fp);
printf("%d %s\n",akun,nama);
}
Hasil
Akan tercetak di layar :
100 Heri
FORMAT KELUARAN PADA C++
Manipulator dalam C++
Manipulator
Fungsi
endl
end line. Kursos berpindah ke posisi awal baris berikutnya sama dg
ends
\n
flush
Menyisipkan karakter NULL
Mencetak isi buffer
dec
Mengkonversi ke bilangan desimal
hex
Mengkonversi ke bilangan hexadesimal
oct
Mengkonversi ke bilangan oktal
setbase(n)
Mengkonversi ke bilangan berbasis n
setw(n)
Mengatur lebar cetakan selebar n
setfill(n)
Mengisi leading field dengan karakter n
setprecision(n)
Membuat lebar desimal point=n
setiosflags(lf)
Menset format yang diatur dengan tanda format ios:
resetiosflags(lf)
Mereset format yang diset oleh setioflags()
Setiap menggunakan manipulator setxxxxx() atau resetxxxxxx() harus menggunakan :
#include<iomanip.h>
Code Program
//Penggunaan setw
#include<iostream>
using namespace std;
#include<iomanip.h>
void main(void)
{
int x;
x=64;
cout<<123456789<<endl;
cout<<setw(9)<<123<<endl;
cout<<123<<endl;
cout<<hex<<x<<endl;
cout<<oct<<x<<endl;
cout<<dec<<x<<endl;
Hasil
123456789
123
123
40
100
64
setw() hanya berlaku
untuk satu elemen cetak
berikutnya
37
cout<<setfill('.');
cout<<setw(10)<<x<<endl;
cout<<x<<endl;
........64
64
}
Code Program
//Penggunaan setprecision()
#include<iostream.h>
#include<iomanip.h>
void main(void)
{
double x=123.456789;
cout<<x<<endl;
cout<<setprecision(0)<<x<<endl;
cout<<setprecision(1)<<x<<endl;
cout<<setprecision(2)<<x<<endl;
cout<<setprecision(3)<<x<<endl;
cout<<setprecision(4)<<x<<endl;
cout<<setprecision(5)<<x<<endl;
cout<<setprecision(6)<<x<<endl;
cout<<setprecision(7)<<x<<endl;
cout<<setprecision(8)<<x<<endl;
cout<<setprecision(9)<<x<<endl;
cout<<setprecision(10)<<x<<endl;
Hasil
123.457
1e+002
1e+002
1.2e+002
123
123.5
123.46
123.457
123.4568
123.45679
123.456789
123.456789
}
Tanda Format
Untuk mengatur format cetakan diperlukan tanda format yang diset dengan
menggunakan manipulator setiosflags() dan direset dengan menggunakan manipulator
resetiosflags().
Tanda Format
ios::left
ios::right
ios::scientific
ios::fixed
ios::dec
ios::hex
ios::oct
ios::uppercase
ios::showbase
ios::showpoint
ios::showpos
Fungsi
Keluaran yang diatur oleh setw() dicetak rata kiri
Keluaran yang diatur oleh setw() dicetak rata kanan
Keluaran dicetak dalam bentuk scientific
Keluaran dicetak dalam bentuk fixed point
Keluaran dicetak dalam bentuk desimal
Keluaran dicetak dalam bentuk hexadesimal
Keluaran dicetak dalam bentuk oktal
Keluaran yang dicetak dalam bentuk hexadesimal dicetak dengan hurup
besar
Menambahkan 0x diawal hasil cetakan yang berbentuk hexademal atau 0
(nol) pada cetakan yang berbentuk oktal
Menampilkan desimal point pada hasil cetakan yang mengandung
pecahan
Menambahkan tanda + pada hasil cetakan yang bernilai positip
38
Code Program
//Penggunaan setiosflags()
#include<iostream>
#include<iomanip.h>
using namespace std;
void main(void)
{
int x=255;
double y=123.44;
cout<<setiosflags(ios::showbase);
cout<<setiosflags(ios::left)<<setw(10)<<x<<endl;
cout<<resetiosflags(ios::left);
cout<<setiosflags(ios::right)<<setw(10)<<x<<endl;
cout<<setiosflags(ios::hex)<<x<<endl;
cout<<resetiosflags(ios::hex);
cout<<setiosflags(ios::oct)<<x<<endl;
cout<<resetiosflags(ios::oct);
cout<<setiosflags(ios::dec)<<x<<endl;
cout<<setiosflags(ios::fixed)<<setprecision(5)<<y<<endl;
cout<<resetiosflags(ios::fixed);
cout<<setiosflags(ios::scientific)<<setprecision(5)<<y<<endl;
}
Hasil
255
255
oxff
0377
255
123.44000
1.23440e+00 2
Soal :
1. Carilah nilai j dan terangkan bagaimana nilai j diperoleh, jika diketahui :
int m=24, k=21;
a. j=m|k
b. j=m%k
c. j=m&k
d. j=m+ ++k
e. j=m+ --k
f. j=m- --k
g. j=m>>2
h. j=k+=m
i. j=--m + k++
j. j=--m*5
2. Buatlah program untuk konversi suhu dengan rumus :
Fahrenheit=(9/5)C+32
Reamur=(4/9)C+32
C dalam derajat celcius, Hasilnya disimpan dalam file suhu.dat dengan bentuk :
C F R
… … …
3. Pak Budi menyimpan uangnya di BCA sebesar M rupiah dengan bunga B% per tahun
selama 5 tahun. Buatlah program dan simpan hasilnya dalam file bank.dat untuk menghitung
uang Pak Buda pada akhir tahun ke 5. (Inputnya M, B)
Rumus :
U=M(1+B)n
U : uang pada akhir tahun ke-n
M : uang pada awal tahun
B : bunga per tahun
39
PERTEMUAN VIII
40
I. RUNTUNAN(SEQUENCE)
Algoritma runtunan (sequence) :
 Tiap instruksi dikerjakan satu per satu
 Tiap instruksi dilaksanakan tepat sekali, tidak ada instruksi yang diulang
 Urutan instruksi yang dilaksanakan pemroses sama dengan urutan instruksi
sebagaimana yang tertulis didalam teks algoritmanya
 Akhir dari instruksi terakhir merupakan akhir algoritma
ALGORITMA Bola
{Menghitung Luas, Keliling,
Volume Bola}
DEKLARASI
R,K,L,V : float
DESKRIPSI
read(R)
PI3.14
K2*PI*R
L4*PI*R*R
V4*PI*R*R*R/4
write(K,L,V)
#include<iostream>
using namespace std;
void main(void)
{
float PI=3.14,R,L,K,V;
cout<<”Masukan harga R
:”<<endl;
cin>>R;
K=2*PI*R;
L=4*PI*R*R;
V=4*PI*R*R*R/4;
cout<<”Keliling : “<<K<<endl;
cout<<”Luas : “<<L<<endl;
cout<<”Volume : “<<V<<endl;
}
Buat Algoritma dan program untuk mempertukarkan dua buah nilai variabel A dan B.
II. PEMILIHAN/PENGAMBILAN KEPUTUSAN
Ekspresi Boolean adalah ekspresi yang menghasilkan nilai yang dapat berupa :
 Benar (true) atau salah (false)
 Bukan nol atau nol
Kondisi : suatu pernyataan atau ungkapan atau ekspresi yang mengandung nilai benar
(TRUE) atau salah(FALSE).
41
1. Operator Pembanding/relasional dalam C/C++
Operator
Makna
Contoh
==
Kesamaan
a==b
9 > 5 contoh ungkapan yg bernilai TRUE
!=
Ketidaksamaan
a!=b
0
contoh ungkapan yg bernilai FALSE
>
Lebih dari
a>b
5
contoh ungkapan yg bernilai TRUE
<
Kurang dari
a<b
N > 60 dapat bernilai TRUE atau FALSE
>=
Lebih dari atau
a>=b
sama dengan
<=
Kurang dari
a<=b
atau sama
dengan
2. Operator Logika dalam C/C++
Operator Makna
Contoh
&&
dan
a==b&&c!=d
||
atau
a==b||c!=d
!
bukan
!(a==b)
3. Pemilihan 1 kasus (IF-THEN)
Pseudo-code
if kondisi then
pernyataan 1
pernyataan 2
endif
opr_1 && opr_2
opr_1 opr_2 Hasil
salah salah salah
salah benar salah
benar salah salah
benar benar benar
Flow chart
opr_1 || opr_2
opr_1 opr_2 Hasil
salah salah salah
salah benar benar
benar salah benar
benar benar benar
C/C++
if(kondisi)
{
//blok pernyataan
yang
//dijalankan jika
kondisi benar
}
Contoh :
Buatlah algoritma dan program C++ yang membaca sebuah bilangan bulat dari keyboard, lalu
mencetak pesan “genap” jika bilangan tersebut merupakan bilangan genap
Jawab :
Untuk mengetahui suatu bilangan itu genap atau bukan dapat dilakukan dengan cara membagi
bilangan tersebut dengan 2. Jika sisa pembagiannya sama dengan 0 maka bilangan tersebut
adalah genap. Algoritma dan code programnya sbb:
42
Pseudo-code
ALGORITMA bilGenap
{mencetak pesan genap jika
bilangan yang dimasukan dari
keyboard merupakan bilangan
genap}
DEKLARASI
x : integer
DESKRIPSI
read(x)
if x mod 2 = 0 then
write(‘genap’)
endif
Flow chart
4. Pemilihan 2 kasus(IF-THEN-ELSE)
Pseudo-code
Flow chart
if kondisi then
pernyataan 1
else
pernyataan 2
endif
Kode C++
//Penggunaan if
#include<iostream>
using namespace std;
void main(void)
{
int x,s;
cout<<"Masukan
bilangan bulat : ";
cin>>x;
s=x%2;
if(s==0)
cout<<"Bilangan
Genap"<<endl;
}
C/C++
if(kondisi)
{
blok pernyataan yang
dijalankan jika kondisi
benar
}
else
{
blok pernyataan yang
dijalankan jika
kondisi
salah
}
Contoh :
Buatlah algoritma dan code C++ untuk menentukan kelulusan suatu mata ujian. Dinyatakan
Lulus jika nilai ujian lebih besar atau sama dengan 60.
43
Jawab :
Pseudo-code
ALGORITMA Lulus
{mencetak pesan
Lulus jika nilai ujian
>=60}
DEKLARASI
x : integer
DESKRIPSI
read(x)
if x >= 60 then
write(‘Lulus’)
else
write(‘Tidak
Lulus’)
endif
Flow chart
Kode C++
//Penggunaan if-else
#include<iostream>
using namespace std;
void main(void)
{
int NilaiUjian;
cout<<"Masukan Nilai :
";
cin>>NilaiUjian;
if(NilaiUjian >= 60)
cout<<"Lulus"<<endl;
else
cout<<"Tidak
Lulus"<<endl;
}
5. Pemilihan tiga kasus atau lebih/Pernyataan IF bersarang (nested IF)
Merupakan pernyataan IF dalam IF.
Contoh penggunaan IF bersarang yaitu untuk menentukan nilai suatu ujian tergolong sebagai
A, B, C, D. E dengan kriteria sebagai berikut :
Nilai
Nilai  90
80  Nilai < 90
60  Nilai < 80
50  Nilai < 60
Nilai < 50
Skor
A
B
C
D
E
44
Flow chart :
45
Program :
#include<iostream>
using namespace std;
void main(void)
{
double NilaiUjian;
char skor;
Jika salah satu if sudah
cout<<”Masukan Nilai Ujian : “;
terpenuhi maka program
cin>>NilaiUjian;
akan langsung
if(NilaiUjian >= 90)
mengeksekusi cout.
{
if pertama
skor=’A’;
}
else
{
if(NilaiUjian >= 70)
{
if kedua
skor=’B’;
}
else
{
if(NilaiUjian >= 60)
{
if ketiga
skor=’C’;
}
else
{
if(NilaiUjian >= 50)
{
if keempat
skor=’D’;
}
else
{
skor=’E’;
}
}
}
}
cout<<”Skor : “<<skor<<endl;
}
46
PERTEMUAN IX
47
Flow chart
Struktur C/C++
if(kond1)
{
//awal kond1 TRUE
s1;
if(kond2)
{
//awal kond2 TRUE
s2;
}
//akhir kond2 TRUE
else
{
//awal kond2 FALSE
s3;
}
// akhir kond2 FALSE
}
//akhir kond1 TRUE
else
{
//awal kond1 FALSE
if(kond3)
{
//awal kond3 TRUE
s4;
}
//akhir kond3 TRUE
else
{
//awal kond3 FALSE
s5;
}
//akhir kond3 FALSE
s6;
}
//akhir kond1 FALSE
Flow chart
Struktur C/C++
if(kond1)
{
//awal kond1 TRUE
if(kond2)
{
//awal kond2 TRUE
if(kond3)
{
//awal kond3 TRUE
if(kond4)
{
//awal kond4 TRUE
s1;
}
//akhir kond4 TRUE
}
//akhir kond3 TRUE
}
//akhir kond2 TRUE
}
//akhir kond1 TRUE
48
Flow chart
Struktur C/C++
if(kond1)
{
//awal kond1 TRUE
s1;
} //akhir kond1 TRUE
else
{ //awal kond1 FALSE
if(kond2)
{ //awal kond2 TRUE
s2;
} //akhir kond2 TRUE
else
{ //awal kond2 FALSE
if(kond3)
{ //awal kond3 TRUE
s3;
} //akhir kond3 TRUE
else
{ //awal kond3 FALSE
if(kond4)
{ //awal kond4 TRUE
s4;
} //akhir kond4 TRUE
else
{ //awal kond4 FALSE
s5;
} //akhir kond4 FALSE
} //akhir kond3 FALSE
} //akhir kond2 FALSE
} //akhir kond1 FALSE
6. Operator berkondisi(?:)
Disebut juga operator ternary karena melibatkan 3 buah argumen.
//Terbesar.cpp
#include<iostream>
using namespace std;
void main(void)
{
int x,y,maks;
cout<<”Masukan sebuah bilangan : “;
cin>>x;
cout<<”Masukan lagi sebuah bilangan : ”;
cin>>y;
maks = x > y ? x : y;
cout<<”Terbesar adalah : “<<maks;endl;
}
49
7. Struktur Case
Untuk masalah dengan dua kasus atau lebih, penggunaan CASE dapat lebih
menyederhanakan penulisan.
case ekspresi
nilai_1 : pernyataan_1
nilai_2 : pernyataan_2
..................................
nilai_n : pernyataan_n
otherwise : pernyataan_x
endcase
Flow chart
Kode C++
switch(ekspresi)
{
case nilai_1 :
pernyataan_1 ;
break;
case nilai_2 :
pernyataan_2 ;
break;
case nilai_3 :
pernyataan_3 ;
break;
default : pernyataan_n ;
}
Pada pernyataan switch :
 masing-masing pernyataan ( 1 sd n)
 bagian default bersifat opsional. Jika
dapat berupa satu atau beberapa
ada, bagian
perintah dan tidak perlu berupa blok
ini dijalankan jika nilai ekspresi tidak
pernyataan
ada yang cocok dengan nilai_1,
 pernyataan_1 dijalankan kalau nilai
ekspresi dengan nilai_1. Setelah
dijalankan eksekusi dilanjutkan ke
akhir pernyataan switch
 begitu juga dengan pernyataan lainya
dijalankan jika nilai ekspresi sesuai
dengan nilai ybs.
nilai_2,...,nilai_n.
 nilai kondisi hanya dapat berupa tipe
primitif
 pernyataan break digunakan untuk
mengendalikan eksekusi ke akhir
pernyataan switch.
50
Contoh : mencetak nama hari berdasarkan nomornya.
Algoritma
Kode C++
ALGORITMA hari
#include<iostream>
{Mencetak nama hari berdasarkan
using namespace std;
nomor (1 ..7)}
void main(void)
DEKLARASI
{
NomorHari : integer
int NomorHari;
DESKRIPSI
cout<<”Masukan Nomor Hari : ”<<endl;
read(NomorHari)
cin>>NomorHari;
case NomorHari
switch(NomorHari)
1 : write(’Minggu’)
{
2 : write(’Senin’)
case 1:
3 : write(’Selasa’)
cout<<”Minggu”<<endl;
4 : write(’Rabu’)
break;
5 : write(’Kamis’)
case 2:
6 : write(’Jumat’)
cout<<”Senin”<<endl;
7 : write(’Sabtu’)
break;
otherwisw :
case 3:
write(’Salah Nomor’)
cout<<”Selasa”<<endl;
endcase
break;
case 4:
cout<<”Rabu”<<endl;
break;
case 5:
cout<<”Kamis”<<endl;
break;
case 6:
cout<<”Jumat”<<endl;
break;
case 7:
cout<<”Sabtu”<<endl;
break;
default :
cout<<”Salah Nomor”<<endl;
}
}
Tugas:
1. Buatlah algoritma dan program C++ untuk mengitung luas, keliling, panjang diagonal
persegi panjang, dengan tampilan sbb (masukan : panjang dan lebar) :
===============================
MENU EMPAT PERSEGI PANJANG
1. Hitung Luas
2. Hitung Keliling
3. Hitung Panjang Diagonal
4. Keluar Program
================================
Pilih Nomor :
51
2. Buatlah algoritma dan program C++ untuk menghitung upah mingguan karyawan.
Masukan yang dibaca adalah nama karyawan, golongan, dan jumlah jam kerja. Keluaran
program adalah nama karyawan dan upahnya.
Ketentuan :
jam kerja normal = 48 jam
upah per jam :
Golongan A : Rp. 4000
Golongan B : Rp. 5000
Golongan C : Rp. 6000
Golongan D : Rp. 7000
upah lembur : Rp.3000/jam
52
PERTEMUAN X
53
III. PENGULANGAN
Struktur pengulangan terdiri atas :
 Kondisi pengulangan : ekspresi boolean
 Badan pengulangan
 Inisialisasi
 Terminasi
Instruksi (pernyataan) pengulangan
1. for
2. while
3. repeat (do – while)
1. Pernyataan for
Digunakan jika jumlah pengulangan sudah diketahui sebelum eksekusi
Bentuk :
a. for menaik :
for pencacah  nilai_awal to nilai_akhir do
Pernyataan
endfor



b. for menurun :
for pencacah  nilai_akhir downto nilai_awal do
Pernyataan
endfor
Flow chart

pencacah harus bertipe integer
atau karakter
pernyataan adalah satu atau
lebih instruksi yang diulang
nilai_awal lebih kecil atau
sama dengan nilai_akhir
jumlah pengulangan =
nilai_akhir - nilai_awal + 1
Struktur C++
for(init;kondisi;rubah_kondisi)
{
pernyataan;
pernyataan;
}
for(init;kondisi;)
{
pernyataan;
pernyataan;
rubah_kondisi;
}
init;
for(;kondisi;)
{
pernyataan;
pernyataan;
rubah_kondisi;
}
rubah_kondisi dapat diletakan
diawal, ditengah, atau diakhir
badan pengulangan
54
ALGORITMA for
DEKLARASI
I : integer
DESKRIPSI
for i1 to 5 do
write(I)
endfor
#include<iostream>
using namespace std;
void main(void)
{
for(int I=1 ; I 5 ; I++)
cout<<I<<endl;
}
Apa keluaran dari program diatas?
Analisis perkembangan nilai I
Kondisi
nilai I
Tercetak
I5
1
T
1
2
T
2
3
T
3
4
T
4
5
T
5
6
F
Keluar dari Loop
Tentukan output dari program berikut :
#include<iostream>
#include<iostream>
#include<iostream>
using namespace std;
using namespace std;
using namespace std;
void main(void)
void main(void)
void main(void)
{
{
{
for(int i=1; i<5;i++)
for(int i=1; i<=10;i+=2)
for(int i=1; i<=10;i+=2);
cout<<i<<endl;
cout<<i<<endl;
cout<<i<<endl;
}
}
}
#include<iostream>
#include<iostream>
#include<iostream>
using namespace std;
using namespace std;
using namespace std;
void main(void)
void main(void)
void main(void)
{
{
{
int i=0;
for(int i=1; i<=5;)
for(int i=1; i<=5;i++)
for(; i<=10;)
{
for(int j=1;j<=i;j++)
{
cout<<i+1<<endl;
cout<<”*”;
i++;
i++;
cout<<endl;
cout<<i<<endl;
}
}
}
}
}
#include<iostream>
#include<iostream>
#include<iostream>
using namespace std;
using namespace std;
using namespace std;
void main(void)
void main(void)
void main(void)
{
{
{
for(int i=1; i<5;i+=10)
for(int i=1; i<5;i+=4)
for(int i=11; i<=10;i+=2)
cout<<i<<endl;
cout<<i<<endl;
cout<<i<<endl;
}
}
}
Soal : Buat program untuk menghitung rata-rata dari sepuluh buah bilangan, yg diinput satu
per satu dari kb.
55
PERTEMUAN XI
56
3. Pernyataan repeat(do-while)
Bentuk :
Keterangan:
repeat
 Pengulangan dilakukan terus menerus jika kondisi masih true
Pernyataan
 Pengulangan berhenti jika nilai kondisi menjadi false
until kondisi
 Agar kondisi berubah ke false, dalam badan pengulangan
harus ada instruksi yang merubah nilai kondisi
Flow chart
Struktur C++
init;
do
{
pernyataan;
pernyataan;
rubah_kondisi;
} while(kondisi);
rubah_kondisi dapat diletakan
diawal, ditengah, atau diakhir badan
pengulangan
ALGORITMA
repeat
#include<iostream>
using namespace std;
void main(void)
{
int I=1;
do
{
cout<<I<<endl;
I++;
} while(I 5 );
}
DEKLARASI
I : integer
DESKRIPSI
I1
repeat
write(I)
II+1
until (I<=5)
Apa keluaran dari program
diatas?
nilai I
Tercetak
Nilai I baru
(Setelah I=I+1)
Kondisi
I5
1
2
3
4
5
1
2
3
4
5
2
3
4
5
6
T
T
T
T
F, keluar dari loop
Pertanyaan : Apa perbedaan dan persamaan penggunaan pernyataan for, while, do-while?
57
4. Pernyataan continue
Pernyataan continue dimaksudkan untuk memaksa melanjutkan loop (for, while, dowhile)
Contoh untuk pernyataan while :
Pada saat i=3 maka i dinaikan 1 dan kondisi while diuji
lagi , akibatnya pernyataan :
cout<<i<<endl;
i++;
tidak dijalankan saat i sama dengan 3
#include<iostream>
using namespace std;
void main(void)
{
int i=0;
while(i<5)
{
if(i==3)
{
i++;
continue;
}
cout<<i<<endl;
i++;
}
}
Hasilnya dilayar akan
tercetak :
0
1
2
4
Contoh untuk pernyataan for :
#include<iostream>
Using namespace std;
void main(void)
{
int i;
for(i=0;i<=5;i++)
{
if(i==3)
continue;
cout<<i<<endl;
}
}
Pada saat i=3 maka i dinaikan 1 dan loop for diulangi
lagi , akibatnya pernyataan :
cout<<i<<endl;
i++;
tidak dijalankan saat i sama dengan 3
Hasilnya dilayar akan tercetak :
0
1
2
4
58
5. Pernyataan break
Pernyataan break dimaksudkan untuk memaksa keluar dari loop (for, while, do-while)
Contoh :
#include<iostream>
using namespace std;
void main(void)
{
int i;
for(i=0;i<=5;i++)
{
if(i==3)
break;
cout<<i<<endl;
}
}
Pada saat i=3 maka eksekusi langsung keluar dari
loop , akibatnya pernyataan :
cout<<i<<endl;
i++;
tidak dijalankan saat i sama dengan 3
Hasilnya dilayar akan
tercetak :
0
1
2
Soal :
1. Susunlah algoritma dan program C++ untuk menginput sebuah bilangan bulat positif
maksimum 255 yang menyatakan suatu bilangan desimal. Kemudian konversikan dan
cetak kedalam bentuk biner.
2. Buat algoritma dan program C++ untuk menghitung dan mencetak 10 suku pertama deret
bilangan berikut : 1,2,4,8,16,…….
3. Sebuah roket ditembakkan tegak lurus keatas. Pada kilometer pertama menghabiskan 10 kg
bahan bakar. Pada kilometer ke-2 menghabiskan 8 kg bahan bakar (atau 80% dari
kilometer sebelumnya). Demikian seterusnya. Susun algoritma dan program C++ untuk
menghitung dan mencetak total bahan bakar yang dihabiskan setelah mencapai 100 km.
59
PERTEMUAN XII
60
LARIK (ARRAY)
Array adalah suatu koleksi data yang bertipe sama atau sesuatu yang berbaris atau
berderet-deret. Dalam bahasa pemrograman array adalah variable sejenis yang berderet-deret
sedemikian rupa sehingga alamatnya saling bersambungan atau bersebelahan/berdampingan.
Array 1 dimensi
Array 2 dimensi
Sifat array :

Statik : jumlah elemen harus sudah diketahui sebelum program dieksekusi

Jumlah elelmen tidak dapat diubah(dikurangi/ditambah) selama pelaksanaan program

Seluruh elemen memiliki tipe yang sama
1. Deklarasi array
Algoritma
A[10] : integer
A[4][7] : real
Kode C++
int A[10];
float A[4][7];
2. Alamat array
#include<iostream>
using namespace std;
void main(void)
{
int a[7];
cout<<"Alamat a[0] = "<<&a[0]<<endl;
cout<<"Alamat a[1] = "<<&a[1]<<endl;
cout<<"Alamat a[2] = "<<&a[2]<<endl;
}
Hasilnya :
Alamat a[0] = 0x0012FF64
Alamat a[1] = 0x0012FF68
Alamat a[2] = 0x0012FF6C
Catatan : lebar data int = 4 byte
61
3.
Mengisi array dengan konstanta
#include<iostream>
using namespace std;
void main(void)
{
int i,a[4];
//Mengisi array
for(i=0;i<=3;i++)
a[i]=2+i;
//Mencetak array
for(i=0;i<=3;i++)
cout<<a[i]<<endl;
}
#include<iostream>
using namespace std;
void main(void)
{
int i,a[4]={2,4,7,6};
//Mencetak array
for(i=0;i<=3;i++)
cout<<a[i]<<endl;
}
4. Mengisi array melalui keyboard
#include<iostream>
using namespace std;
void main(void)
{
int i=0, a[5];
while(i<5) //Baca data dari kb
{
cout<<"a["<<i<<"] = ";
cin>>a[i];
i++;
}
//Cetak data
cout<<endl<<"Isi array a adalah :"<<endl;
for(i=0;i<5;i++)
cout<<"a["<<i<<"] = "<<a[i]<<endl;
}
#include<iostream>
using namespace std;
void main(void)
{
int i,j,a[2][3];
//Baca data dari kb
for(i=0;i<=1;i++)
{
for(j=0;j<=2;j++)
{
cout<<"a["<<i<<"]["<<j<<"] = ";
cin>>a[i][j];
}
}
//Cetak data
cout<<endl<<"Isi array a adalah :"<<endl;
#include<iostream>
using namespace std;
void main(void)
{
int i,a[3];
//Mengisi array
a[0]=a[1]=10;
a[2]=20;
//Mencetak array
for(i=0;i<3;i++)
cout<<a[i]<<endl;
}
62
for(i=0;i<=1;i++)
for(j=0;j<=2;j++)
cout<<"a["<<i<<"]["<<j<<"] = "<<a[i][j]<<endl;
}
5. Array karakter
Array karakter biasa digunakan untuk menyimpan string.
contoh : char nama[]=”Jennifer Lopez”;
akan menyimpan array nama yang menyimpan string Jennifer Lopez
Contoh mengisi array dengan string :
#include<iostream>
using namespace std;
void main(void)
{
char nama[]="Mulyadi Oscar";
cout<<nama<<endl;
cout<<nama[0]<<endl;
cout<<nama[7]<<endl;
}
#include<iostream>
#include<string.h>
using namespace std;
void main(void)
{
char nama[15];
strcpy(nama,"Jennifer Lopez");
cout<<nama<<endl;
cout<<nama[0]<<endl;
cout<<nama[7]<<endl;
}
Fungsi-fungsi yang berkaitan dengan string dalam C++
Fungsi
Keterangan
strcat()
Menambahkan string ke akhir sebuah string
strcmp() Membandingkan dua buah string
strcmpi() Membandingkan dua buah string tanpa membedakan hurup kapital dan hurup
kecil
strcpy() Menyalin suatu string
strstr()
Mencari posisi suatu substring dalam suatu string
strlen()
Menghasilkan panjang string
strupr()
Mengkonversi semua hurup kecil dalam string menjadi hurup kapital
strlwr()
Mengkonversi semua hurup kapital dalam string menjadi hurup kecil
#include<iostream>
#include<string.h>
using namespace std;
void main(void)
{
Hasilnya :
KOTA YOGYAKARTA
kota yogyakarta
1
63
char kalimatA[35];
char kalimatB[35];
strcpy(kalimatA,"Kota Yogyakarta");
strcpy(kalimatB,kalimatA);
//Ubah semua hurup kecil ke kapital
strupr(kalimatA);
cout<<kalimatA<<endl;
//Ubah semua hurup kapital ke kecil
strlwr(kalimatA);
cout<<kalimatA<<endl;
//Membandingkan dua string
cout<<strcmp(kalimatA,kalimatB)<<endl;
//Membandingkan dua string
cout<<strcmpi(kalimatA,kalimatB)<<endl;
//Menggabungkan string
strcat(kalimatB," Never Ending Asia");
cout<<kalimatB<<endl;
}
Penjumlahan Matrik :
#include<iostream>
#include<iomanip.h>
using namespace std;
#define BARIS 3
#define KOLOM 4
void main(void)
{
int A[BARIS][KOLOM]={2,4,6,3,
4,2,5,6,
3,2,4,1};
int B[BARIS][KOLOM]={1,3,5,7,
2,2,4,6,
3,1,2,3};
int C[BARIS][KOLOM],i,j;
//Jumlahkan matrik
for(i=0;i<=BARIS-1;i++)
for(j=0;j<=KOLOM-1;j++)
C[i][j]=A[i][j]+B[i][j];
//cetak matrik A
cout<<"Matrik A : "<<endl;
for(i=0;i<=BARIS-1;i++)
{
for(j=0;j<=KOLOM-1;j++)
cout<<setw(3)<<A[i][j]<<" ";
cout<<endl;
}
//cetak matrik B
cout<<"Matrik B : "<<endl;
for(i=0;i<=BARIS-1;i++)
{
for(j=0;j<=KOLOM-1;j++)
0
Kota Yogyakarta Never Ending
Asia
64
cout<<setw(3)<<B[i][j]<<" ";
cout<<endl;
}
//Cetak matrik C
cout<<"Matrik C : "<<endl;
for(i=0;i<=BARIS-1;i++)
{
for(j=0;j<=KOLOM-1;j++)
cout<<setw(3)<<C[i][j]<<" ";
cout<<endl;
}
}
Tugas I dikerjakan di rumah (dikumpulkan pada pertemuan ke-14) :
1. Buatlah program untuk menampilkan nilai rata-rata, nilai tertinggi, dan nilai terendah dari
sekelompok bilangan bulat positip (integer) disimpan dalam array. Jumlah data tidak
diketahui, dimasukan melalui keyboard.
2. Buatlah program untuk menampilkan IP seorang mahasiswa dengan rincian sbb :
No
1
2
3
4
5
6
7
8
Bobot Nilai :
A=4
B=3
C=2
D=1
Mata Kuliah
Kalkulus
Fisika Dasar
PTI
Sistim Digital
PSO
Logika Matematika
Bahasa Inggris
Agama
Nilai
SKS
4
3
2
2
2
2
2
2
65
PERTEMUAN XIII
66
POINTER
Pointer : variable yang berisi alamat memori dari suatu variable yang berisi suatu nilai
tertentu.
pUsia merupakan variabel pointer (pointer) yang menunjuk ke variabel Usia.
Isi dari pUsia (FFAB0000) merupakan alamat dari variabel Usia. Variabel usia berisi nilai 37.
1. Deklarasi variabel pointer
Bentuk deklarasi variabel pointer :
tipe_data* namaVariabel
contoh :
int* pNilai;
Agar pointer menunjuk ke suatu variabel maka perlu
diisi dengan alamat dari variabel yang bersangkutan.
Contoh :
int Usia;
int * pUsia;
pUsia = &Usia;
tanda * menunjukkan bahwa variabel dideklarasikan sebagai pointer.
pUsia menunjuk ke sebuah obyek(Usia) yang memiliki tipe integer.
& : operator alamat, merupakan operator unary yang mengembalikan alamat dari operand.
#include<iostream>
using namespace std;
void main(void)
{
int A=25,*pA;
pA=&A;
cout<<"A = "<<A<<endl;
cout<<"pA = "<<pA<<endl;
cout<<"&A = "<<&A<<endl;
cout<<"&pA = "<<&pA<<endl;
cout<<"*pA = "<<*pA<<endl;
*pA=100;
cout<<"*pA = "<<*pA<<endl;
}
Hasilnya :
A = 25
pA = 0x0012FF7C
&A = 0x0012FF7C
&pA = 0x0012FF78
*pA = 25
*pA = 100
2. Pointer dan array 1D
Pointer dapat digunakan untuk menunjuk ke array dan selanjutnya pointer dapat dipakai untuk
mengakses elemen-elemen array.
67
Contoh :
int *pTgl, tglLahir[]={24,6,65};
pTgl = &tglLahir; atau
pTgl = tglLahir; atau
pTgl = &pTgl[0];
pTgl = &tglLahir[2]; berarti pTgl menunjuk ke elemen tglLahir dengan subskript/indek 2
#include<iostream>
using namespace std;
void main(void)
{
int *pTgl, *pTgl2,tglLahir[]={24,6,65};
pTgl=tglLahir;pTgl2=&tglLahir[1];
//Menampilkan isi array dengan pointer
for(int i=1;i<=3;i++)
{
cout<<*pTgl<<endl;
pTgl++;
}
cout<<*pTgl2<<endl;
cout<<*(pTgl2+1)<<endl;
}
(1)
#include<iostream>
using namespace std;
void main(void)
{
int *P;
int A[5]={2,1,7,0,5};
P=A; cout<<*P<<endl;P++;
cout<<*P<<endl;
}
(3)
#include<iostream>
using namespace std;
void main(void)
{
int *P;
int A[5]={2,1,7,0,5};
P=A;
cout<<*++P<<endl;
cout<<*P<<endl;
}
Hasilnya :
24
6
65
6
65
(2)
#include<iostream>
using namespace std;
void main(void)
{
int *P;
int A[5]={2,1,7,0,5};
P=A;
cout<<*P++<<endl;
cout<<*P<<endl;
}
(4)
#include<iostream>
using namespace std;
void main(void)
{
int *P;
int A[5]={2,1,7,0,5};
P=A;
cout<<++*P<<endl;
cout<<*P<<endl;
}
68
Penjelasan (1) :
 Pernyataan P=A menyebabkan pointer P menunjuk ke
elemen A[0], sehingga pernyataan cout<<*P<<endl
mencetak angka 2.
 Pernyataan P++ menyebabkan pointer P maju 1 langkah
menunjuk ke elemen A[1].
 Pernyataan cout<<*P<<endl mencetak isi elemen yang
sedang ditunjuk oleh P, sehingga tercetak angka 1.
Penjelasan (2) :
 Pernyataan cout<<*P++<<endl mencetak isi elemen yang
sedang ditunjuk oleh P, sehingga tercetak angka 2, setelah
itu pointer maju satu langkah menunjuk ke A[1]
 Pernyataan cout<<*P<<endl mencetak isi elemen yang
sedang ditunjuk oleh P, sehingga tercetak angka 1.
Penjelasan (3) :
 Pernyataan cout<<*++P<<endl menyebabkan pointer
maju satu langkah ke A[1] kemudian mencetak isi array
yg sedang ditunjukknya yaitu angka 1.
 Pernyataan cout<<*P<<endl mencetak isi elemen yang
sedang ditunjuk oleh P, sehingga tercetak angka 1
Penjelasan (4) :
 Elemen yang sedang ditunjuk oleh P adalah A[0] yang
isinya 2. Pernyataan cout<<++*P<<endl akan menambah
isi elemen A[0] dengan 1 sehingga isinya menjadi 3,
kemudian mencetak isi elemennya yaitu angka 3.
 Pernyataan cout<<*P<<endl mencetak isi elemen yang
sedang ditunjuk oleh P, sehingga tercetak angka 3
Posisi awal pointer P :
Tentukan posisi P dan isi
elemen untuk contoh (2), (3),
(4).
3. Pointer dan array 2D
Dengan perintah char A[3][5] terbentuk array 2D sbb:
0
1
2
3
4
0
A
B
C
D
E
1
F
G
H
I
J
2
K
L
M
N
O
Dalam memori komputer akan tersusun sbb :
0,0
0,1
A
B
0,2
0,3
0,4
1,0
1,1
C
D
baris-0
E
F
G
1,2
1,3
1,4
H
I
J
baris-1
0,0 artinya A[0][0]
2,0
2,1
K
L
2,2
2,3
2,4
M
N
baris-2
O
Pernyataan P=&A[0][0], menyebabkan pointer menunjuk ke array elemen pertama :
0,0
A

P
0,1
B
0,2
C
0,3
D
0,4
E
1,0
F
1,1
G
1,2
H
1,3
I
1,4
J
2,0
K
2,1
L
2,2
M
2,3
N
2,4
O
69
Instruksi P=&A[0][0], dapat
juga ditulis dalam bentuk
P=A[0]
Array 2D 3 x 5 dianggap sebagai kumpulan array
1D, A[0],A[1], dan A[2], masing-masing 5
elemen. Dengan pernyataan P=A[1] pointer P
akan menunjuk ke baris kedua yaitu A[1][0]
Pernyataan cout<<*P akan mencetak isi elemen yang ditunjuk oleh pointer P yaitu A[0][0].
#include<iostream>
#include<iomanip.h>
using namespace std;
void main(void)
{
char A[3][5]=
{'A','B','C','D','E',
'F','G','H','I','J',
'K','L','M','N','O'};
char *P;
P=A[0];
for(int i=0;i<=14;i++)
cout<<setw(2)<<*P++;
cout<<endl;
}
Outputnya :
ABCDEFGHIJKLMNO
#include<iostream>
#include<iomanip.h>
using namespace std;
void main(void)
{
char A[3][5]=
{'A','B','C','D','E',
'F','G','H','I','J',
'K','L','M','N','O'};
char *P;
for(int i=0;i<=2;i++)
{
P=A[i];
for(int j=0;j<=4;j++)
cout<<setw(2)<<*P++;
cout<<endl;
}
}
Outputnya :
ABCDE
FGHIJ
KLMNO
4. Pointer dan String
#include<iostream>
#include<iomanip.h>
using namespace std;
void main(void)
{
char kalimat[]={"Selamat Belajar Visual C++"};
char *pKarakter;
int JumlahHurupKecil=0;
int JumlahHurupBesar=0;
pKarakter=kalimat;
while(*pKarakter)
{
char kar=*pKarakter;
if(kar>='a' && kar<='z')
JumlahHurupKecil++;
if(kar>='A' && kar<='Z')
JumlahHurupBesar++;
pKarakter++;
}
70
cout<<"Jumlah Hurup Kecil = "<<JumlahHurupKecil<<endl;
cout<<"Jumlah Hurup Kapital = "<<JumlahHurupBesar<<endl;
}
Outputnya :
Jumlah Hurup Kecil = 17
Jumlah Hurup Kapital = 4
5. Array dari pointer
Array dapat berisi pointer.
Deklarasinya dapat dilakukan :
char
*Baju[4]={“Renang”,”Sekolah”,”Kerja”,
”Pesta”};
Baju[4] menunjukkan deklarasi sebuah
array yang terdiri dari 4 elemen. Bagian
char * menunjukkan bahwa tiap-tiap
elemen dari array Baju berupa pointer
terhadap char.
#include<stdio.h>
#define JML_MHS 10 //Banyaknya Mahasiswa
#define JML_MK 5 //Jumlah mata Kuliah
void main(void)
{
int i,k,*pNilaiMHS[JML_MHS],NILAI[JML_MHS][JML_MK];
FILE *pF;
for(i=0;i<=JML_MHS-1;i++)
{
pNilaiMHS[i]=NILAI[i];
}
if((pF=fopen("D:\\kampus\\program\\c++\\array3\\data.txt","r"))==NULL)
{
printf("File tidak dapat dibuka\n");
}
else
{
for(i=0;i<JML_MHS;i++)
for(k=0;k<JML_MK;k++)
fscanf(pF,"%d",&NILAI[i][k]);
}
for(i=0;i<JML_MHS;i++)
{
for(k=0;k<JML_MK;k++)
{
printf("%d ",*pNilaiMHS[i]++);
}
printf("\n");
}
fclose(pF);
}
71
Data yang tersimpan dalam file data.txt :
00 10 20 30 40
01 11 21 31 41
02 12 22 32 42
03 13 23 33 43
04 14 24 34 44
05 15 25 35 45
06 16 26 36 46
07 17 27 37 47
08 18 28 38 48
09 19 29 39 49
Hasilnya :
00 10 20 30 40
01 11 21 31 41
02 12 22 32 42
03 13 23 33 43
04 14 24 34 44
05 15 25 35 45
06 16 26 36 46
07 17 27 37 47
08 18 28 38 48
09 19 29 39 49
6. Pointer menunjuk ke pointer
Untuk membentuk hubungan
seperti disamping diperlukan
pendeklarasian :
int *pB;
int **pA;
int nilaiX;
pA adalah pointer yang menunjuk ke tipe
pointer
pB adalah pointer yang menunjuk ke tipe int
nilaiX adalah variabel bertipe int
Agar pointer pB menunjuk ke variabel nilaiX :
pB=&nilaiX
Agar pA menunjuk ke pointer pB :
pa=&pB
#include<iostream>
Using namespace std;
void main(void)
{
int *pB;
int **pA;
int nilaiX=100;
pB=&nilaiX;
pA=&pB;
cout<<”Isi nilaiX via pB = “<<*pB<<endl;
cout<<”Isi nilaiX via pA = “<<**pA<<endl;
}
Hasilnya :
Isi nilaiX via pB = 100
Isi nilaiX via pA = 100
7. Pengalokasian memori secara dinamis
Dengan menggunakan pointer dapat dilakukan pengalokasian memori secara dinamis, yaitu
pointer menunjuk ke lokasi memori yang diciptakan ketika program sedang berjalan. Memori
yang dialokasikan dapat dihapus kembali (dealokasi memori) kalau sudah diperlukan lagi.
Lokasi memori tersebut dikenal dengan nama heap.
Operator yang digunakan untuk alokasi memori : new
Operator yang digunakan untuk dealokasi memori : delete
72
Contoh :
int *pInt;
pInt= new int;
Setelah int *pInt dieksekusi
Setelah pInt=new int dieksekusi
#include<iostream>
#include<iomanip.h>
using namespace std;
void main(void)
{
const int KOLOM=2;
int(*pDuaDim)[KOLOM];
pDuaDim=new int[3][KOLOM];
pDuaDim[0][0]=10;
pDuaDim[0][1]=20;
pDuaDim[1][0]=30;
pDuaDim[1][1]=40;
pDuaDim[2][0]=50;
pDuaDim[2][1]=60;
for(int i=0;i<=2;i++){
for(int j=0;j<=KOLOM-1;j++)
cout<<setw(3)<<pDuaDim[i][j];
cout<<endl;
}
delete []pDuaDim;
}
Hasilnya :
10 20
30 40
50 60
int(*pDuaDim)[KOLOM]
digunakan untuk mendeklarasikan
pointer yang menunjuk ke array
berdimensi dua.
pDuaDim=new int[3][KOLOM]
digunakan untuk mengalokasikan
array berdimensi dua, yang
mengandung 3 buah baris dan 2
kolom.
8. Referensi
Referensi merupakan jenis pointer khusus yang memungkinkan suatu pointer diperlakukan
seperti variabel biasa. Referensi digunakan untuk memberikan nama alias suatu variabel :
Contoh :
int &ref=namaVariabel;
#include<iostream>
using namespace std;
void main(void)
{
int nilaiX=100;
Hasilnya:
nilaiX=100
nilaiX=200
nilaiX=201
73
int &refX=nilaiX;
cout<<"NilaiX = "<<refX<<endl;
refX=200;
cout<<"NilaiX = "<<refX<<endl;
refX++;
cout<<"NilaiX = "<<refX<<endl;
}
74
PERTEMUAN XIV
PEMBAHASAN TUGAS PERTEMUAN 12
75
PERTEMUAN XV
76
PROSEDUR dan FUNGSI
Baik prosedur maupun fungsi merupakan suatu modul sub program yang mengerjakan
tugas/aktivitas yang spesifik. Perbedaan diantara keduanya adalah sebuah fungsi akan
mengembalikan suatu nilai tertentu ke modul/atau fungsi lain/prosedur lain yang
memanggilnya.
Tujuan utama dari prosedur atau fungsi adalah untuk membuat suatu aplikasi agar dapat
dipecah menjadi sebuah bagian yang dapat dikelola dengan lebih mudah.
Kerangka aplikasi yang tersusun atas sejumlah fungsi/prosedur
1. Pendefinisian prosedur
- menuliskan nama prosedur
- mendeklarasikan nama-nama konstanta, variable dan tipe
- menjabarkan rangkaian aksi yang dilakukan
Setiap prosedur mempunyai nama yang unik
Prosedur terdiri dari:
- bagian judul(header) , terdiri atas nama prosedur dan deklarasi parameter (jika ada)
- bagian deklarasi, untuk mengumumkan nama-nama
- bagian algoritma/deskripsi, disebut badan prosedur
Parameter adalah nama-nama variabel yang dideklarasikan pada bagian header.
Parameter :
- aktual (argumen) : parameter yang disertakan pada saat pemanggilan prosedur
- formal : parameter yang dideklarasikan pada bagian header prosedur
77
Contoh notasi algoritmik sebuah prosedur:
Notasi algoritmik
Kode bahasa C++
procedure Luas
void Luas(void)
{ K. Awal
: nilai panjang dan lebar diberikan} {
{ K. Akhir
: luas segi empat tercetak}
int panjang, lebar, HitungLuas;
DEKLARASI
cin>>panjang;
panjang
: integer
cin>>lebar;
lebar
: integer
HitungLuas = panjang*lebar;
HitungLuas : integer
cout<<HitungLuas;
DESKRIPSI:
}
HitungLuas  panjang * lebar
write(HitungLuas)
2. Pemanggilan Prosedur
Prosedur bukan program yang berdiri sendiri, jadi tidak dapat dieksekusi secara
langsung. Prosedur diakses dengan cara memanggil namanya dari program pemanggil.
Prosedur bisa memiliki parameter atau tidak. Jika tidak memiliki parameter cukup dengan
menuliskan namanya.
Ketika sebuah prosedur dipanggil, kendali program secara otomatis pindah ke
prosedur tersebut. Seluruh instruksi dalam badan prosedur tersebut akan dilaksanakan. Setelah
semua instruksi selesai dilaksanakan, kendali program berpindah secara otomatis kembali ke
instruksi sesudah pemanggilan prosedur dalam program pemanggil.
Agar nama prosedur dikenal oleh program pemanggil, maka dalam program
pemanggil harus dideklarasikan prototipe prosedur tersebut. Contoh pemanggilan prosedur
dari contoh sebelumnya:
Notasi algoritmik
ALGORITMA HitungLuas
DEKLARASI
procedure Luas
DESKRIPSI:
Luas
procedure Luas
DEKLARASI
panjang
: integer
lebar
: integer
HitungLuas : integer
DESKRIPSI:
Read(panjang,lebar)
HitungLuas  panjang * lebar
write(HitungLuas)
Kode bahasa C++
#include <iostream>
using namespace std;
void Luas();
void main()
{
Luas();
}
void Luas()
{
int panjang, lebar, HitungLuas;
cin>>panjang;
cin>>lebar;
HitungLuas = panjang*lebar;
cout<<HitungLuas;
}
78
3. Lingkup variabel
Lingkup variabel menjelaskan bagaimana sifat suatu variabel didalam suatu prosedur/fungsi.
 Variabel otomatis/lokal
 Variabel eksternal/global
 Variabel statis
3.1. Variabel otomatis/lokal
Variabel otomatis bersifat lokal terhadap sebuah prosedur/fungsi. Variabel seperti ini
tidak dikenal diluar prosedur/fungsi yang mendeklarasikannya.
#include<iostream>
using namespace std;
void prosX(void);//prototipe prosedur
void main(void)
{
int bilX=50;
cout<<"Sebelum memanggil prosedur"<<endl;
cout<<"bilX = "<<bilX<<endl;
prosX();
cout<<"Setelah memanggil prosedur"<<endl;
cout<<"bilX = "<<bilX<<endl;
}
Hasilnya :
Sebelum memanggil prosedur
bilX = 50
Dalam prosedur
bilX = 100
Setelah memanggil prosedur
bilX = 50
void prosX(void)
{
int bilX=100;
cout<<"Dalam prosedur"<<endl;
cout<<"bilX = "<<bilX<<endl;
}
3.2. Variabel eksternal
Didefinisikan diluar prosedur/fungsi, sehingga dikenal oleh seluruh prosedur/fungsi.
#include<iostream>
using namespace std;
void ubahBilX(void);//prototipe prosedur
int bilX;
void main(void)
{
bilX=50;
cout<<"Sebelum memanggil prosedur"<<endl;
cout<<"bilX = "<<bilX<<endl;
ubahBilX();
cout<<"Setelah memanggil prosedur"<<endl;
cout<<"bilX = "<<bilX<<endl;
}
Hasilnya :
Sebelum memanggil prosedur
bilX = 50
Dalam prosedur
bilX = 50
Setelah memanggil prosedur
bilX = 100
79
void ubahBilX(void)
{
cout<<"Dalam prosedur"<<endl;
cout<<"bilX = "<<bilX<<endl;
bilX=100;
}
3.3. Variabel Statis
Sifat :

Variabel hanya bisa diakses oleh prosedur/fungsi yang mendeklarasikannya

Variabel tidak hilang saat eksekusi prosedur/fungsi berakhir

Inisialisasi dalam deklarasi hanya dilakukan sekali selama aplikasi berjalan
#include<iostream>
using namespace std;
void Pencacah(void);//prototipe prosedur
void main(void)
{
Pencacah();
Pencacah();
Pencacah();
}
Hasilnya :
Prosedur telah dipanggil 1 kali
Prosedur telah dipanggil 2 kali
Prosedur telah dipanggil 3kali
Coba kata static dihilangkan,
bagaimana hasilnya?
void Pencacah(void)
{
static int jumlah=1;
cout<<"Prosedur telah dipanggil = "<<jumlah<<"
kali"<<endl;
jumlah++;
}
Latihan :
Buatlah program untuk menghitung Luas, Keliling, Panjang Diagonal dari sebuah persegi
panjang. Luas, Keliling, Panjang Diagonal masin-masing dikerjakan dalam sebuah prosedur.
80
PERTEMUAN XVI
81
4. Parameter/Argumen
Kebanyakan program memerlukan pertukaran informasi antara prosedur dan
pemanggilnya. Penggunaan parameter menawarkan mekanisme pertukaran tersebut. Prosedur
dengan parameter diakses dengan cara memanggil prosedur tersebut beserta parameternya.
Aturan yang harus diperhatikan dalam korespondensi satu-satu antara parameter formal dan
parameter aktual adalah:
-
Jumlah parameter aktual pada pemanggilan prosedur harus sama dengan jumlah
parameter formal pada deklarasi prosedurnya
-
Tiap parameter aktual harus bertipe sama dengan tipe parameter formal yang
bersesuaian
-
Parameter aktual diekspresikan sesuai dengan jenis parameter formal(penjelasan lihat
dibawah)
Berdasarkan maksud penggunaannya, terdapat tiga jenis parameter formal:
a. parameter masukan (input parameter)
b. parameter keluaran (output parameter)
c. parameter masukan/keluaran (input/output parameter)
4.1. Parameter masukan
Parameter masukan : parameter yang nilainya berlaku sebagai masukan untuk
prosedur. Sering disebut juga sebagai parameter nilai (value parameter atau parameter
by value)
Contoh:
ALGORITMA HitungLuas
#include<iostream>
DEKLARASI
using namespace std;
a,b : integer
void Luas(int a,int b);//prototipe prosedur
procedure Luas(input panjang, lebar : void main(void)
integer)
{
DESKRIPSI:
int panjang=5,lebar=3;
read(a,b)
Luas(panjang,lebar);
Luas(a,b)
}
procedure Luas(input p,l:integer)
DEKLARASI
luas : integer
DESKRIPSI:
luas  p * l
write(luas)
void Luas(int p,int l)
{
int luas;
luas=p*l;
cout<<"Luas = "<<luas<<endl;
}
82
Nilai parameter aktual diisikan kedalam parameter formal yang bersesuaian. Perubahan nilai
dalam badan prosedur tidak mengubah nilai parameter aktual. Karena yang dipentingkan
adalah nilainya, maka nama parameter aktual boleh berbeda dengan nama parameter formal
yang bersesuaian.
4.2. Parameter Keluaran
Parameter keluaran
: parameter yang menampung keluaran yang dihasilkan oleh prosedur
yang akan digunakan oleh program pemanggil.
Contoh :
ALGORITMA HitungLuas
#include<iostream>
DEKLARASI
using namespace std;
a,b,L : integer
void hitung(int ,int, int * );
procedure Luas(input p,l : integer, void main(void)
output luas : integer)
{
DESKRIPSI:
int panjang,lebar,luas;
read(a,b)
cout<<"Panjang = ";cin>>panjang;
Luas(a,b,L)
cout<<"Lebar = ";cin>>lebar;
write(L)
hitung(panjang,lebar,&luas);
cout<<"Luas = "<<luas<<endl;
procedure Luas(input p,l : integer, output
}
luas : integer)
DEKLARASI
void hitung(int A, int B, int *luas)
{tidak ada}
{
DESKRIPSI:
*luas=A*B;
}
luas  p * l
Karena nama parameter merupakan suatu lokasi di memori maka bila didalam prosedur,
parameter aktual diisi suatu nilai, nilai ini akan tetap berada didalam parameter aktual
meskipun prosedur selesai dilaksanakan. Jadi setelah pemanggilan, parameter aktual berisi
suatu nilai yang merupakan keluaran dari prosedur tersebut.
4.3. Parameter Masukan/Keluaran
Parameter masukan/keluaran : parameter yang berfungsi sebagai masukan sekaligus keluaran
bagi prosedur tersebut.
Pada kebanyakan aplikasi kadang informasi harus dikirim dalam dua arah sehingga prosedur
harus dapat mengakomodasi baik masukan dari dan keluaran ke blok program pemanggil.
83
Contoh:
ALGORITMA SelisihXY
DEKLARASI
X,Y,Z : integer
procedure Tukar(input/output
integer)
DESKRIPSI:
read(X,Y)
if X  Y then
Tukar(X,Y)
endif
ZX-Y
write(Z)
A,B
procedure Tukar(input/output A,B : integer)
DEKLARASI
tmp : integer
DESKRIPSI:
tmp  A
AB
B  tmp
#include<iostream>
using namespace std;
void Tukar(int *, int *);
: void main(void)
{
int X,Y,Z;
cout<<"X = ";cin>>X;
cout<<"Y = ";cin>>Y;
if(X<Y)
Tukar(&X,&Y);
Z=X-Y;
cout<<Z<<endl;
}
void Tukar(int *A, int *B)
{
int tmp;
tmp=*A;
*A=*B;
*B=tmp;
}
Akibat penggunaan parameter masukan/keluaran, bila parameter aktual diubah nilainya dalam
badan prosedur maka sesudah pemanggilan prosedur, nilai parameter aktual di titik
pemanggilan juga berubah.
5. Translasi notasi algoritmik Prosedur kedalam notasi bahasa C
Aturan dalam translasi :

Pendefinisian prosedur ditulis diluar blok program utama, kecuali jika direalisasikan
sebagai file include. Prosedur umumnya diletakan setelah blok main(), sedangkan
deklarasi prosedur ditulis sebelum blok main() sebagai prototipe. Jika pendefinisian
prosedur ditulis sebelum blok main() maka pendeklarasian prototipe tidak diperlukan
lagi.

Dalam bahasa C tidak dikenal istilah prosedur. Semua modul program adalah fungsi.
Prosedur adalah fungsi yang tidak mengembalikan nilai apapun. Karena itu nilai
kembali untuk prosedur adalah void (artinya kosong).

Bila prosedur tidak memiliki parameter maka tanda kurung “(“ dan “)” tetap ditulis
setelah nama prosedur tersebut.
84

Semua parameter dalam bahasa C adalah parameter masukan. Oleh karena itu, semua
argumen parameter aktual dilewatkan sebagai “by value” , artinya nilai parameter
aktual disalin ke parameter formal yang bersesuaian. Suatu cara untuk memperoleh
efek parameter keluaran maupun efek parameter masukan/keluaran adalah
melewatkan pointer kedalam parameter aktual dengan menambahkan karakter “&” di
awal nama parameter aktual yang berjenis parameter masukan atau masukan/keluaran.
Sedangkan parameter formal yang berjenis masukan atau masukan/keluaran
ditambahkan karakter “*” didepannya.
85
PERTEMUAN XVII
86
6. Fungsi
Seperti halnya prosedur, fungsi juga merupakan sub-program yang mempunyai tujuan
spesifik.
Definisi Fungsi
Fungsi adalah sub-program yang memberikan/
mengembalikan (return) sebuah nilai dari tipe
tertentu. Contoh fungsi :
f ( x)  2 x 2  5 x  10
H ( x, y )  3x  2 y  5
Fungsi diakses dengan memanggil namanya
Penulisan fungsi:
function NamaFungsi(input parameter :
tipe)  tipe
…………
DELARASI
…………
ALGORITMA
…………
return ekspresi
Contoh:
Notasi Algoritmik
ALGORITMA F
DEKLARASI
x,y,Hasil : real
DESKRIPSI
read(x,y)
HasilF(x,y)
write(x,y,Hasil)
function F(input x,y : real)  real
DEKLARASI
H : real
DESKRIPSI:
H3*x + 2*y
return H
Kode bahasa C++
#include<iostream>
using namespace std;
float F(float x,float y);
void main(void)
{
float x,y,Hasil;
cout<<”x = “;cin>>x;cout<<”y = “;cin>>y;
Hasil=F(x,y);
cout<<x<<endl;cout<<y<<endl;cout<<Hasil<<endl;
}
float F(float A, float B)
{
float H;
H=3*A+2*B;
return H;
}
Fungsi dapat mengandung parameter formal. Parameter dalam fungsi selalu merupakan
parameter masukan.
87
Tentukan output dari program berikut
#include<iostream>
using namespace std;
void rubah(void);
void main(void)
{
int A=10,B=20;
cout<<"Nilai Awal A dan B"<<endl;
cout<<"A = "<<A<<endl;
cout<<"B = "<<B<<endl<<endl;
rubah();
cout<<"Nilai A dan B setelah ";
cout<<"pemanggilan fungsi"<<endl;
cout<<"A = "<<A<<endl;
cout<<"B = "<<B<<endl<<endl;
}
void rubah(void)
{
int A=100,B=200;
cout<<"Nilai
A
dan
B
fungsi"<<endl;
cout<<"A = "<<A<<endl;
cout<<"B = "<<B<<endl<<endl;
}
#include<iostream>
#include<iomanip.h>
using namespace std;
#define SIZE 10
void cetak(int *A)
{
for(int i=0;i<=SIZE-1;i++)
cout<<setw(3)<<A[i];
}
void jumlah(int *A,int *B)
{
int C[SIZE];
for(int i=0;i<=SIZE-1;i++)
C[i]=A[i]+B[i];
cetak(C);
}
void main(void)
{
int A[SIZE]={2,4,6,3,4,2,5,6,3,2};
int B[SIZE]={1,3,5,7,2,2,4,6,3,1};
//cetak matrik A
cetak(A);cout<<endl;
#include<iostream>
using namespace std;
void tukar(int,int);
void main(void)
{
int A,B;
cout<<"A = ";cin>>A;
cout<<"B = ";cin>>B;cout<<endl;
cout<<"Sebelum ditukar"<<endl;
cout<<"A = "<<A<<endl;
cout<<"B = "<<B<<endl<<endl;
tukar(A,B);
cout<<"Setelah ditukar"<<endl;
cout<<"A = "<<A<<endl;
cout<<"B = "<<B<<endl;
}
void tukar(int A, int B)
{
dlm
int C;
C=B;
B=A;
A=C;
}
#include<iostream>
#include<iomanip.h>
using namespace std;
#define SIZE 10
void cetak(int *A) //atau cetak(int A[])
{
for(int i=0;i<=SIZE-1;i++)
cout<<setw(3)<<A[i];
}
void cetak_elemen(int el)
{
cout<<"Elemen = "<<el;
}
void kali_elemen(int
//Elemen A[el]*a
{
A[el]*=a;
}
*A,int
void rubah_array(int A[])
{
for(int i=0;i<=SIZE-1;i++)
el,int
a)
88
//cetak matrik B
cetak(B);cout<<endl;
//Jumlahkan matrik
jumlah(A,B);cout<<endl;
A[i]=A[i]+2;
}
void main(void)
{
int A[SIZE]={2,4,6,3,4,2,5,6,3,2};
cetak(A);cout<<endl;
cetak_elemen(A[2]);cout<<endl;
kali_elemen(A,2,10);//Elemen
A[2]*10
cetak(A);cout<<endl;
rubah_array(A);
cetak(A);cout<<endl;
}
}
#include<iostream>
using namespace std;
#define N_Baris 5
#define N_Kolom 2
void cetak(int A[][N_Kolom]);
void Rubah_data(int array[][N_Kolom]);
void main(void)
{
int data[N_Baris][N_Kolom]=
{
{23,77},
{33,41},
{20,21},
{20,55},
{67,78}
};
cetak(data);
cout<<endl;
Rubah_data(data);
cetak(data);
cout<<endl;
}
void Rubah_data(int array[][N_Kolom])
{
int i,j;
for(i=0;i<N_Baris;i++)
{
for(j=0;j<N_Kolom;j++)
array[i][j]=0;
}
}
void cetak(int A[][N_Kolom])
{
int i,j;
for(i=0;i<5;i++){
for(j=0;j<2;j++){
cout<<A[i][j]<<" ";
}
cout<<endl;
}
}
7. Fungsi Rekursif
Algoritma rekursif adalah algoritma yang memanggil dirinya sendiri. Oleh karena itu,
algoritma rekursif harus dinyatakan dalam prosedur atau fungsi karena hanya prosedur atau
fungsi yang dapat dipanggil dalam sebuah program. Fungsi rekursif adalah fungsi yang
memanggil dirinya sendiri. Proses pemanggilan fungsi itu sendiri disebut rekursi.
Definisi rekursif disusun oleh dua bagian :
89
1) Basis : bagian yang berisi kasus yang terdefinisi secara eksplisit. Bagian ini
menghentikan rekursif dan memberikan sebuah nilai yang terdefinisi pada fungsi
rekursif.
2) Rekurens : bagian yang mendefinisikan obyek dalam terminologi dirinya sendiri
Contoh : masalah faktorial.
0! = 1
1! = 1
2! = 1 x 2
3! = 1 x 2 x 3
4! = 1 x 2 x 3 x 4
atau dapat ditulis :
0! = 1
1! = 1 x 0!
2! = 2 x 1!
3! = 3 x 2!
Untuk n>0 :
n! = 1 X 2 x 3 x .. x (n-1) x n = n x (n-1)!
Proses pemanggilan rekursif
n! = 1
, jika n = 0
n! = n x (n-1)! , jika n > 0
{basis}
{rekurens}
function Fak(input n : integer)  integer
DEKLARASI
DESKRIPSI
if n = 0 then
return 1
else
return n * Fak(n-1)
endif
{basis}
{rekuren}
Nilai yg dikembalikan dari tiap-tiap pemanggilan
rekursif
Fungsi pustaka math.h
Fingsi
Penjelasan
sqrt(x)
Akar dua dari x
x
exp(x)
Fungsi eksponensial e
log(x)
Logaritma natural dari x (basis e)
log10(x)
Logaritma dari x (basis 10)
fabs(x)
Nilai absolut dari x
ceil(x)
Membulatkan x ke integer terkecil tidak
kurang dari x
floor(x)
Membulatkan x ke integer terbesar tidak
Contoh
sqrt(900.0) = 30.0
exp(1.0) = 2.718282
log(2.718282) = 1
log10(100.0) = 2.0
fabs(-5.0) = 5.0
ceil(9.2) = 10.0
ceil(-9.8) = -9.0
floor(9.2) = 9.0
90
lebih besar dari x
pow(x,y)
fmod(x,y)
sin(x)
cos(x)
tan(x)
x
y
Sisa pembagian dari x/y, floating point
Sinus dari x ( x dalam radian)
Cosinus dari x ( x dalam radian)
Tangen dari x ( x dalam radian)
floor(-9.8) = -10.0
pow(9,0.5) = 3.0
fmod(13.657,2.33) = 1.992
sin(0.0) = 0.0
cos(0.0) = 1.0
tan(0.0) = 0.0
Tugas :
1. Tulislah kode program C++ untuk menghitung faktorial
2. Tulislah program untuk menghitung nilai rata-rata dari sekumpulan data bilangan bulat
yang dibaca berulang- ulang dari papan ketik (algoritma dan program C++).
3. Tulislah algoritma dan program C++ untuk menentukan nilai terbesar dan terkecil dari 3
integer
91
PERTEMUAN XVIII
92
PENCARIAN
Pencarian (searching) merupakan proses yang fundamental dalam pengolahan data. Proses
pencarian adalah menemukan nilai (data) tertentu didalam sekumpulan data yang bertipe
sama. Data dapat disimpan secara temporer dalam memori utama atau disimpan secara
permanen dalam memori sekunder. Dalam memori utama data disimpan dalam bentuk
array(larik) sedangkan dalam memori sekunder dalam bentuk file(arsip). Pencarian elemen
dalam larik disebut juga pencarian internal, sedangkan pencarian data yang disimpan dalam
memori sekunder disebut juga pencarian eksternal.
Persoalan Pencarian
Diberikan sebuah larik L yang sudah terdefinisi elemen-elemennya, x adalah elemen yang
bertipe sama dengan elemen larik L. Carilah x didalam larik L.
Hasil dari proses pencarian dapat bermacam-macam :
a) Pencarian hanya memeriksa keberadaan x. Keluaran yang diinginkan misalnya berupa
pesan bahwa x ditemukan atau tidak ditemukan.
contoh :
write(x,’ditemukan’) atau
write(x,’tidak ditemukan’)
b) Hasil pencarian adalah indeks elemen larik. Jika x ditemukan maka indek elemen larik
tempat x berada diisikan kedalam idx. Jika x tidak terdapat didalam larik L maka idx
diisi dengan nilai khusus misalnya -1.
contoh :
D 35 15 60 70 25 10 12
0 1 2 3 4 5 6
Misalkan x=70, maka idx=3. Tetapi jika x=100, maka idx=-1
c) Hasil pencarian adalah sebuah nilai boolean yang menyatakan status hasil pencarian.
Jika x ditemukan maka sebuah variabel bertipe boolean misalnya ketemu diisi dengan
nilai true, jika sebaliknya maka ketemu diisi dengan false.
I. Pencarian Beruntun (sequential search)
Metode pencarian beruntun adalah proses membandingkan setiap elemen larik satu
persatu secara beruntun, mulai dari elemen pertama sampai dengan elemen yang dicari
ditemukan atau seluruh elemen sudah ditemukan.
93
I. a. Versi 1 (Pembandingan elemen dilakukan diawal pengulangan)
(1). Hasil pencarian : sebuah variabel boolean bernilai true bila x ditemukan atau false
bila x tidak ditemukan.
Sudah ada array 1D yang dideklarasikan dengan int L[11] dan sudah ada isinya
dengan ilustrasi sebagai berikut :
n
0 1 2 3 4 5 6 7 8 9 10
12 17 10 5 15 25 11 7 25 16 19
Misal elemen yang akan dicari adalah x.
Setiap elemen larik L dibandingkan dengan x mulai dari elemen pertama L[0].
Aksi pembandingan dilakukan selama indek larik i belum melebihi n dan L[i]
belum sama dengan n. Aksi pembandingan dihentikan jika L[i] = x atau i = n.
Elemen terakhir L[n] diperiksa secara khusus.
procedure SeqSearch1(input L : LarikInt, input n : integer,
input x : integer, output ketemu : boolean)
DEKLARASI
i : integer
DESKRIPSI
i0
while (i < n) and (L[i]  x) do
ii+1
endwhile
if L[i] = x then
ketemu  true
else
ketemu  false
endif
#include<iostream>
using namespace std;
void SeqSearch1(int Data[], int n, int x, bool *ketemu);
void main(void)
{
int Data[]={23,56,10,90,35,45,9,100,200,65};
int x,i,jmlDat=10;bool ketemu;
cout<<"Elemen Array : ";
for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl;
cout<<"Masukan data yang akan dicari ?:";cin>>x;
SeqSearch1(Data,jmlDat,x,&ketemu);
94
if(ketemu!=false)
cout<<"Data yang dicari ditemukan"<<endl;
else
cout<<"Data yang dicari tidak ada dalam array"<<endl;
}
void SeqSearch1(int Data[],int n,int x, bool *ketemu)
{
int i=0;
while(i<n-1 && Data[i]!=x)i++;
if(Data[i]==x)*ketemu=true;
else *ketemu=false;
}
(2). Hasil Pencarian : indek elemen larik yang mengandung x
Setiap elemen larik L dibandingkan dengan x mulai dari elemen pertama L[0].
Aksi pembandingan dilakukan selama indek larik i belum melebihi n dan L[i]
belum sama dengan n. Aksi pembandingan dihentikan jika L[i] = x atau i = n.
Elemen terakhir L[n] diperiksa secara khusus. Keluaran yang dihasilkan oleh
prosedur adalah variabel idx yang berisi indek larik tempat x ditemukan. Jika x
tidak ditemukan, idx diisi dengan -1.
procedure SeqSearch2(input L : LarikInt, input n : integer,
input x : integer, output idx : integer)
DEKLARASI
i : integer
DESKRIPSI
i0
while (i < n) and (L[i]  x) do
ii+1
endwhile
if L[i] = x then
idx  i
else
idx  -1
endif
#include<iostream>
using namespace std;
void SeqSearch2(int Data[], int n, int x, int *idx);
void main(void)
{
int Data[]={23,56,10,90,35,45,9,100,200,65};
int idx,x,i,jmlDat=10;
cout<<"Elemen Array : ";
95
for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl;
cout<<"Masukan data yang akan dicari ?:";cin>>x;
SeqSearch1(Data,jmlDat,x,&idx);
if(idx!=-1)
cout<<"Data yang dicari berada pada indek "<<idx<<endl;
else
cout<<"Data yang dicari tidak ada dalam array"<<endl;
}
void SeqSearch1(int Data[],int n,int x, int *idx)
{
int i=0;
while(i<n-1 && Data[i]!=x)i++;
if(Data[i]==x)*idx=i;
else *idx=-1;
}
I. b. Versi 2 (Pembandingan elemen dilakukan didalam pengulangan)
(1). Hasil pencarian : sebuah variabel boolean bernilai true bila x ditemukan atau false
bila x tidak ditemukan.
procedure SeqSearch3(input L : LarikInt, input n : integer,
input x : integer, output ketemu : boolean)
DEKLARASI
i : integer
DESKRIPSI
i0
ketemu  false
while (i <= n) and (not ketemu) do
if L[i] = x then
ketemu  true
else
ii+1
endif
endwhile
#include<iostream>
using namespace std;
void SeqSearch3(int Data[], int n, int x, bool *ketemu);
void main(void)
{
int Data[]={23,56,10,90,35,45,9,100,200,65};
int x,i,jmlDat=10;bool ketemu;
cout<<"Elemen Array : ";
for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl;
cout<<"Masukan data yang akan dicari ?:";cin>>x;
SeqSearch3(Data,jmlDat,x,&ketemu);
if(ketemu==true)
cout<<"Data yang dicari ditemukan"<<endl;
96
else
cout<<"Data yang dicari tidak ada dalam array"<<endl;
}
void SeqSearch3(int Data[],int n,int x, bool *ketemu)
{
int i=0;*ketemu=false;
while(i<n && !(*ketemu))
{
if(Data[i]==x) *ketemu=true;
else i++;
}
}
Pada versi ini variabel boolean ketemu diinisialisasi dengan nilai false. Setiap
elemen L dibandingkan dengan x mulai dari elemen pertama. Jika L[i] sama
dengan x, variabel ketemu diisi nilai true dan pengulangan dihentikan. Jika L[i]
tidak sama dengan x, pembandingan dilanjutkan untuk elemen berikutnya. Setiap
elemen diperiksa termasuk elemen terakhir.
(2). Hasil Pencarian : indek elemen larik yang mengandung x
procedure SeqSearch4(input L : LarikInt,
input n : integer,
input x : integer,
output idx : integer)
DEKLARASI
i : integer
ketemu : boolean
DESKRIPSI
i0
ketemu  false
while (i <= n) and (not ketemu) do
if L[i] = x then
ketemu  true
else
ii+1
endif
endwhile
if ketemu then
idx  i
else
idx  -1
endif
97
#include<iostream>
using namespace std;
void SeqSearch4(int Data[], int n, int x, int *idx);
void main(void)
{
int Data[]={23,56,10,90,35,45,9,100,200,65};
int idx,x,i,jmlDat=10;
cout<<"Elemen Array : ";
for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl;
cout<<"Masukan data yang akan dicari ?:";cin>>x;
SeqSearch4(Data,jmlDat,x,&idx);
if(idx!=-1)
cout<<"Data yang dicari berada pada indek "<<idx<<endl;
else
cout<<"Data yang dicari tidak ada dalam array"<<endl;
}
void SeqSearch4(int Data[],int n,int x, int *idx)
{
int i=0;bool ketemu=false;
while(i<n && !ketemu)
{
if(Data[i]==x)ketemu=true;
elsei++;
}
if(ketemu)
*idx=i;
else
*idx=-1;
II. Kinerja Metode Pencarian Beruntun
Metode Pencarian Beruntun berjalan lambat. Waktu pencarian sebanding dengan
jumlah elemen larik. Misal larik berukuran n elemen maka pada kasus dimana x tidak terdapat
dalam larik atau x ditemukan pada elemen terakhir, maka harus dilakukan perbandingan
sebanyak n kali. Jadi waktu pencarian dengan metode pencarian beruntun sebanding dengan
n.
III. Metode Pencarian Beruntun pada larik terurut
Larik yang jumlah elemen-elemennya terurut dapat meningkatkan kinerja algoritma
pencarian beruntun.
98
Contoh :
(a). Diberikan larik L tidak terurut :
13 16 14 21 76 15
untuk mencari 15, dibutuhkan perbandingan sebanyak 6 kali.
(b). Misalkan larik L diatas sudah diurut naik :
13 14 15 16 21 76
untuk mencari 15, dibutuhkan perbandingan hanya 3 kali
Prosedur berikut adalah algoritma pencarian beruntun pada larik yang terurut menaik, yang
merupakan modifikasi dari algoritma sebelumnya dengan merubah L[i]  x menjadi L[i]  x.
procedure SeqSearch(input L : LarikInt,
input n : integer,
input n : integer,
output idx : integer)
DEKLARASI
i : integer
DESKRIPSI
i0
while(i < n) and (L[i] < x) do
ii+1
endwhile
if L[i] = x then
idx  i
else
idx  -1
endif
#include<iostream>
using namespace std;
void SeqSearch(int Data[], int n, int x, int *idx);
void main(void)
{
int Data[]={23,26,30,50,55,65,69,78,80,90};
int idx,x,i,jmlDat=10;
cout<<"Elemen Array : ";
for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl;
cout<<"Masukan data yang akan dicari ?:";cin>>x;
SeqSearch(Data,jmlDat,x,&idx);
if(idx!=-1)
cout<<"Data yang dicari berada pada indek "<<idx<<endl;
else
cout<<"Data yang dicari tidak ada dalam array"<<endl;
}
99
void SeqSearch(int Data[],int n,int x, int *idx)
{
int i=0;
while(i<n-1 && Data[i]<x)i++;
if(Data[i]==x) *idx=i;
else *idx=-1;
}
Soal :
1. Tulislah algoritma dan program C++ untuk pencarian sequensial versi 1. Pencarian
dilakukan dalam sebuah fungsi yang mengembalikan indek array tempat data yang dicari
berada.
2. Tulislah algoritma dan program C++ untuk pencarian sequensial versi 2. Pencarian
dilakukan dalam sebuah fungsi yang mengembalikan indek array tempat data yang dicari
berada.
3. Tulislah algoritma dan program C++ untuk pencarian sequensial dengan data yang sudah
terurut menurun.
100
PERTEMUAN XIX
101
IV. Metode Pencarian Bagidua/Biner (Binary Search)
Metode pencarian bagidua lebih efisien dibandingkan metode pencarian beruntun.
Metode ini memerlukan data yang sudah terurut. Dalam proses pencarian diperlukan dua buah
indeks array, yaitu indeks terkecil (indeks kiri) dan indeks terbesar (indeks kanan).
Misalkan indeks kiri adalah i dan indeks kanan adalah j. Data sudah terurut menurun.
Pada mulanya indek kiri i diinisialisasi dengan 1 dan dan j diinisialisasi dengan n.
81 76 21 18 16 13 10
7
i=0 1 2 3 4 5 6 7=j
Langkah-langkah dalam metode ini adalah:
Langkah 1:
Bagi dua elemen larik pada elemen tengah. Elemen tengah adalah elemen dengan indeks
k = (i + j) div 2
Langkah 2:
Periksa apakah L[k] = x?
Jika L[k] = x, pencarian selesai
Jika L[k] < x, pencarian dilakukan pada larik bagian kiri, j = k-1
Jika L[k] > x, pencarian dilakukan pada larik bagian kanan, i = k + 1
Langkah 3 :
Ulangi langkah 1 hingga x ditemukan atau i > j (yaitu ukuran array sudah 0)
Contoh 1:
misal elemen
yang dicari x =
18
Langkah 1:
i = 0, j = 7
k = (0 + 7) div
2=3
81
0
76 21
1
2
kiri
18
3
16
4
13 10
5
6
kanan
7
7
Langkah 2 :
Bandingkan L[3] = x?, ya
(x ditemukan, proses
pencarian selesai)
Contoh 2: Misal elemen yang dicari x = 16
Langkah 1:
i = 0 dan j = 7
k = (0 + 7) div 2 = 3
Langkah 2:
L[k] = x ?, tidak
L[k] < x ?, tidak
L[k] > x ?, ya, berarti pencarian dilakukan
pada array kanan dengan indeks i = k +1
81 76 21 18 16 13 10 7
0 1 2 3 4 5 6 7
kiri
kanan
16 13 10
7
i=4 5 6 7=j
102
Langkah 1’:
i = 4, j = 7
k = (4 + 7) div 2 = 5
16 13 10 7
4
5 6 7
kiri
kanan
Langkah 1’’:
i = 4, j = 4,
k = (4 +4) div 2 = 4
16
4
procedure BinarySearch(input L : LarikInt,
input n : integer,
input x : integer,
output idx : integer)
DEKLARASI
i,j,k : integer
ketemu : boolean
DESKRIPSI
i0
jn
ketemu  false
while (not ketemu) and (i  n) do
k  (i + j) div 2
if (L[k] = x ) then
ketemu  true
else
if (L[k]  x) then
ik+1
else
jk-1
endif
endif
endwhile
if ketemu then
idx  k
else
idx  -1
endif
Langkah 2’ :
L[k] = x ?, tidak
L[k] < x ?, tidak
L[k] > x ?, ya, maka pencarian dilakukan
pada array bagian kiri
j = k -1 = 5 -1 = 4
16
4
Langkah 2’’:
L[k] = x ? , ya ( x ditemukan, pencarian
dihentikan)
Jadi nilai 16 berada pada index k, yaitu
L[4]
103
#include<iostream>
using namespace std;
#define jmlDat 8
void BinSearch(int Data[], int n, int x, int *idx);
void main(void)
{
int Data[jmlDat]={81,76,21,18,16,13,10,7},x,idx,i;
cout<<"Elemen Array : ";
for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl;
cout<<"Masukan data yang akan dicari ?:";cin>>x;
BinSearch(Data,jmlDat,x,&idx);
if(idx!=-1)cout<<"Data yang dicari berada pada indeks : "<<idx<<endl;
else cout<<"Data yang dicari tidak ada dalam array"<<endl;
}
void BinSearch(int Data[],int n,int x, int *idx)
{
bool ketemu = false;
int top = n-1,bottom = 0,mid;
while(bottom<=top && !ketemu)
{
mid=(top+bottom)/2;
if(Data[mid]==x)ketemu=true;
else
if(Data[mid]<x)top=mid-1;
else bottom=mid+1;
}
if(ketemu) *idx=mid;
else *idx=-1;
}
Tugas :
1. Tulislah algoritma dan program C++ untuk pencarian metode bagidua dengan array terurut
naik.
104
PERTEMUAN XX
105
PENGURUTAN
Pengurutan : proses mengatur sekumpulan
obyek meurut urutan atau susunan tertentu.
Urutan menaik(ascending) : L[0]  L[1]  L[2]
… L[n]
Urutan menurun(descending) : L[0]  L[1] 
L[2] … L[n]
Contoh :
Keuntungan dari data yang terurut:
- mempercepat proses pencarian
- langsung diperoleh nilai maksimum
dan minimum
a. data bertipe integer terurut naik:
23 30 40 45 60
b. data bertipe riil terurut menurun:
100,1 60,3 50,4 40,5 10,7
c. data bertipe string terurut naik:
Amir Badu Cecep Dudi Rudi
d. data bertpe karakter terurut naik:
d e g l m
e. data terstruktur terurut naik berdasarkan field NIM
135901, Eko, A 135902, Edo, A 135903, Dudi, B 135904, Amir, A
Metode pengurutan diklasifikasikan menjadi dua:
a. Internal : metode pengurutan untuk data yang disimpan di dalam memori komputer.
Umumnya struktur internal yang dipakai untuk mengurutkan internal adalah larik,
sehingga pengurutan internal disebut juga pengurutan larik.
b. Eksternal : metode pengurutan untuk data yang disimpan didalam disk storage, disebut
juga pengurutan arsip (file), karena struktur eksternal yang digunakan adalah arsip.
I. METODE PENGURUTAN APUNG (BUBBLE SORT)
Metode ini diinspirasi oleh gelembung sabun yang berada diatas permukaan air.
Gelembung sabun selalu terapung ke atas permukaan air karena berat jenisnya lebih ringan
daripada berat jenis air. Jika sebuah array dengan jumlah elemen (ukuran array) sebesar N
maka proses pengapungan dilakukan sebanyak N-1 langkah (satu langkah disebut satu pass).
Proses pengapungan dilakukan dengan cara perbandingan.
Jumlah langkah = N - 1
Jumlah perbandingan = N(N - 1)/2
106
Algoritma Pengurutan Apung :
L = 30 60 35 70 50 25 20 40 43
k = 0 1 .. .. .. .. .. .. n
Untuk mendapatkan larik yang terurut menaik, algoritma pengurutan apung secara global sbb:
Untuk setiap pass i=1, 2, …, n, lakukan :
Mulai dari elemen k=n, n-1,…, i
1) Bandingkan L[k] dengan L[k-1]
2) Pertukarkan L[k] dengan L[k-1] jika L[k]  L[k-1]
Contoh :
Tinjau L dengan N = 6 buah elemen belum terurut (n = 5) :
L = 25 27 10 8 76 21
k= 0 1 2 3 4 5
Pass 1:
k Elem. yg dibandingkan Pertukarkan?
Hasil Sementara
5
Ya
25, 27, 10, 8, 21, 76
L[5]  L[4]
4
Tidak
25, 27, 10, 8, 21, 76
L[4]  L[3]
3
Ya
25, 27, 8, 10, 21, 76
L[3]  L[2]
2
Ya
25, 8, 27, 10, 21, 76
L[2]  L[1]
1
Ya
8, 25, 27, 10, 21, 76
L[1]  L[0]
Hasil akhir pass-1:
8 25 27 10 21 76
Pass 2 (berdasarkan hasil akhir pass 1) :
k Elem. yg dibandingkan Pertukarkan?
5
Tidak
L[5]  L[4]
4
Tidak
L[4]  L[3]
3
Ya
L[3]  L[2]
2
Ya
L[2]  L[1]
Hasil akhir pass-2:
8 10 25 27 21 76
Hasil Sementara
8, 25, 27, 10, 21, 76
8, 25, 27, 10, 21, 76
8, 25, 10, 27, 21, 76
8, 10, 25, 27, 21, 76
Pass 3 (berdasarkan hasil akhir pass-2)
k Elem yg dibandingkan
Pertukarkan?
5
Tidak
L[5]  L[4]
4
Ya
L[4]  L[3]
3
Ya
L[3]  L[2]
Hasil Sementara
8, 10, 25, 27, 21, 76
8, 10, 25, 21, 27, 76
8, 10, 21, 25, 27, 76
Hasil akhir pass-3:
8 10 21 25 27 76
Pass 4 (berdasarkan hasil akhir pass-3)
k Elem. yg dibandingkan Pertukarkan?
Hasil Sementara
5
Tidak
8, 10, 21, 25, 27, 76
L[5]  L[4]
4
Tidak
8, 10, 21, 25, 27, 76
L[4]  L[3]
Hasil akhir pass-4:
8 10 21 25 27 76
Pass 5 (berdasarkan hasil akhir pass-4)
k Elem. yg dibandingkan Pertukarkan?
Hasil Sementara
5
Tidak
8, 10, 21, 25, 27, 76
L[5]  L[4]
Hasil akhir pass-5:
8 10 21 25 27 76
Hasil akhir pass-5 menyisakan satu elemen (yaitu 76) yang tidak perlu diurutkan, maka
pengurutan selesai.
Algoritma pengurutan apung menaik:
procedure BubbleSort(input/output L : LarikInt, input n : integer)
{Keadaan Awal : Elemen larik L sudah terdefinisi nilai-nilainya}
{Keadaan Akhir : Elemen larik L terurut menaik}
DEKLARASI
i
: integer
k
: integer
tmp : integer
{pencacah untuk jumlah langkah}
{pencacah untuk pengapungan pada setiap langkah}
{variabel bantu untuk pertukaran}
DESKRIPSI
for i  1 to n do
for k  n downto i do
if L(k) < L(k –1) then
tmp  L[k]
L[k]  L[k –1]
L[k – 1]  tmp
endif
endfor
endfor
108
Metode pengurutan ini merupakan metode yang tidak efisien untuk data yang besar,
disebabkan oleh banyaknya operasi pertukaran yang dilakukan pada setiap langkah
pengapungan.
Translasi algoritma pengurutan dengan metode bubble sort kedalam bahasa C sbb:
/*Mengurutkan data dengan metode Bubble Sort*/
#include<iostream>
using namespace std;
void BubbleSort(int data[],int n); //prototipe fungsi
void main(void)
{
int i;
int n=9;//Jml Data = 10 maka n = 9
int data[]={20,10,32,100,60,12,70,25,45,65};
cout<<"Sebelum diurutkan :"<<endl;
for(i=0;i<=n;i++)
cout<<data[i]<<" ";
cout<<endl;
cout<<"_______________________________"<<endl;
BubbleSort(data,n); /*Pemanggilan fungsi BubbleSort*/
cout<<"Setelah diurutkan"<<endl;
for(i=0;i<=n;i++)
cout<<data[i]<<" ";
cout<<endl;
}
void BubbleSort(int array1[],int n)
{
int i,k,tmp;
for(i=1;i<=n;i++)
{
for(k=n;k>=i;k--)
{
if(array1[k]<array1[k-1])
{
tmp=array1[k];
array1[k]=array1[k-1];
array1[k-1]=tmp;
}
}
}
}
Latihan :
1. Tulislah algoritma dan untuk pengurutan secara menurun
109
PERTEMUAN XXI
110
II. METODE PENGURUTAN SELEKSI (SELECTION SORT)
Gagasan metode ini adalah memilih elemen maksimum/minimum dari array, lalu
menempatkan elemen maksimum/minimum itu pada ujung (awal atau akhir) array.
Selanjutnya elemen terujung tersebut diisolasi dan tidak disertakan pada proses selanjutnya.
Proses yang sama diulang untuk elemen larik yang tersisa. Pemilihan nilai maksimum/
minimum dilakukan pada setiap pass.
Ditinjau dari pemilihan elemen maksimum/minimum, algoritma pengurutan seleksi
dibagi menjadi dua:
1. Algoritma pengurutan seleksi-maksimum, yaitu memilih elemen maksimum sebagai
basis pengurutan
2. Algoritma pengurutan seleksi-minimum, yaitu memilih elemen minimum sebagai
basis pengurutan
Algoritma pengurutan seleksi-maksimum
Untuk memperoleh array dengan jumlah elemen N yang terurut menaik, algoritma
pengurutan seleksi-maksimum dapat ditulis secara garis besar sebagai berikut:
Jumlah pass : n = N –1
Jumlah perbandingan : N(N + 1)/2
Untuk setiap pass i = 1, 2, …, n; lakukan:
1) Cari elemen terbesar (maks) mulai dari elemen pertama (ke-0) sampai elemen
terakhir (ke-n)
2) Pertukarkan maks dengan elemen ke-n
3) Kurangi n dengan satu (karena elemen ke-n sudah terurut)
procedure SelectionMax(input/output L : LarikInt, input n : integer)
DEKLARASI
i
: integer
{pencacah pass}
j
: integer
{pencacah untuk mencari nilai maksimum}
imaks
: integer
{indeks yg berisi nilai maksimum sementara}
tmp
: integer
{variabel bantu untuk pertukaran}
111
DESKRIPSI:
for i  n downto 1 do
imaks  0
for j  1 to i do
if L[j] > L[imaks] then
imaks  j
endif
endfor
tmp  L [i]
L[i]  L[imaks]
L[imaks]  tmp
endfor
Contoh:
Urutkan elemen larik berikut secara menaik:
Elemen : 25 27 10 8 76 21
Index : 0 1 2 3 4 5
Pass 1 :
Cari elemen maksimum didalam array L[0…5]  hasilnya : maks = L[4] = 76. Pertukarkan
maks dengan L[n], diperoleh:
25 27 10 8 21 76
Pass 2 (berdasarkan susunan larik hasil pass 1) :
Cari elemen maksimum didalam array L[0…4]  hasilnya : maks = L[1] = 27. Pertukarkan
maks dengan L[4], diperoleh:
25 21 10 8 27 76
Pass 3(berdasarkan susunan larik hasil pass 2) :
Cari elemen maksimum didalam array L[0…3]  hasilnya : maks = L[0] = 25. Pertukarkan
maks dengan L[3], diperoleh:
8 21 10 25 27 76
Pass 4 (berdasarkan susunan larik hasil pass 3) :
Cari elemen maksimum didalam array L[0…2]  hasilnya : maks = L[1] = 21. Pertukarkan
maks dengan L[2], diperoleh:
8 10 21 25 27 76
Pass 5 (berdasarkan susunan larik hasil pass 4) :
Cari elemen maksimum didalam array L[0…1]  hasilnya : maks = L[1] = 10. Pertukarkan
maks dengan L[1], diperoleh:
8 10 21 25 27 76
Tersisa satu elemen (yaitu 8), maka pengurutan selesai. Array sudah terurut naik.
112
Translasi algoritma pengurutan seleksi-maksimum kedalam bahasa C :
/*Mengurutkan data dengan metode Seleksi Maksimum*/
#include<iostream>
using namespace std;
void SeleksiMaksimum(int data[],int n); /*prototipe fungsi*/
void main(void)
{
int i;
int n=9;//Index terbesar
int data[]={20,10,32,100,60,12,70,25,45,65};
cout<<"Sebelum diurutkan :"<<endl;
for(i=0;i<=n;i++)
cout<<data[i]<<" ";
cout<<endl;
cout<<"_______________________________"<<endl;
SeleksiMaksimum(data,n);
cout<<"Setelah diurutkan"<<endl;
for(i=0;i<=n;i++)
cout<<data[i]<<" ";
cout<<endl;
}
void SeleksiMaksimum(int array1[],int n)
{
int i,j,tmp,imaks;
for(i=n;i>=1;i--)
{
imaks=0;
for(j=1;j<=i;j++)
{
if(array1[j]>array1[imaks])
imaks=j;
}
tmp=array1[imaks];
array1[imaks]=array1[i];
array1[i]=tmp;
}
}
Algoritma pengurutan selesksi-minimum menaik :
Basis pencarian adalah elemen minimum (terkecil). Elemen minimum ditempatkan di
awal larik.
Algoritma seleksi-minimum untuk memperoleh larik yang terurut menaik sbb :
Untuk setiap pass i = 0, 1, 2, …, n-1, lakukan
1) Cari elemen terkecil (min) mulai dari elemen ke i sampai elemen ke n.
2) Pertukarkan min dengan elemen ke i.
113
procedure SelectionMin(input/output L : LarikInt, input n : integer)
DEKLARASI
i
: integer
{pencacah pass}
j
: integer
{pencacah untuk mencari nilai minimum}
imin : integer
{indeks yg berisi nilai minimum sementara}
tmp : integer
{variabel bantu untuk pertukaran}
DESKRIPSI:
for i  0 to n-1 do
imin  0
for j  i+1 to n do
if L[j] < L[imin] then
imin  j
endif
endfor
tmp  L [i]
L[i]  L[imin]
L[imin]  tmp
endfor
Contoh:
Urutkan elemen larik berikut secara menaik:
Elemen : 29 27 10 8 76 21
Index : 0 1 2 3 4 5
Pass 0 :
Cari elemen terkecil didalam array L[0…5]  hasilnya : min = L[3] = 8. Pertukarkan min
dengan L[0], diperoleh:
8 27 10 29 76 21
Pass 1 (berdasarkan susunan larik hasil pass 0) :
Cari elemen terkecil didalam array L[1…5]  hasilnya : min = L[2] = 10. Pertukarkan min
dengan L[1], diperoleh:
8 10 27 29 76 21
Pass 2 (berdasarkan susunan larik hasil pass 1) :
Cari elemen terkecil didalam array L[2…5]  hasilnya : min = L[5] = 21. Pertukarkan min
dengan L[2], diperoleh:
8 10 21 29 76 27
Pass 3 (berdasarkan susunan larik hasil pass 2) :
Cari elemen terkecil didalam array L[3…5]  hasilnya : min = L[5] = 27. Pertukarkan min
dengan L[3], diperoleh:
8 10 21 27 76 29
Pass 4 (berdasarkan susunan larik hasil pass 3) :
Cari elemen terkecil didalam array L[4…5]  hasilnya : min = L[5] = 29. Pertukarkan min
dengan L[4], diperoleh:
8 10 21 27 29 76
Tersisa satu elemen (yaitu 76), maka pengurutan selesai. Array sudah terurut naik.
114
Translasi algoritma pengurutan seleksi-minimum kedalam bahasa C :
/*Mengurutkan data dengan metode Seleksi Minimum*/
#include<iostream>
using namespace std;
void SeleksiMinimum(int data[],int n); /*prototipe fungsi*/
void main(void)
{
int i;
int n=9;//Index terbesar
int data[]={20,10,32,100,60,12,70,25,45,65};
cout<<"Sebelum diurutkan :"<<endl;
for(i=0;i<=n;i++)
cout<<data[i]<<" ";
cout<<endl;
cout<<"_______________________________"<<endl;
SeleksiMinimum(data,n);
cout<<"Setelah diurutkan"<<endl;
for(i=0;i<=n;i++)
cout<<data[i]<<" ";
cout<<endl;
}
void SeleksiMinimum(int array1[],int n)
{
int i,j,tmp,imin;
for(i=0;i<=n-1;i++)
{
imin=i;
for(j=i+1;j<=n;j++)
{
if(array1[j]<array1[imin])
imin=j;
}
tmp=array1[imin];
array1[imin]=array1[i];
array1[i]=tmp;
}
}
TUGAS
1. Tulislah algoritma untuk pengurutan secara menurun menggunakan metode selection
sort(min dan max).
2. Buatlah programnya menggunakan C++ untuk array sbb:
10 40 20 60 15 4 8 100 200 25
115
PERTEMUAN XXII
116
PENGAKSESAN BERKAS (FILE) DALAM C
Arsip/File/Berkas merupakan struktur penyimpanan data didalam memori sekunder seperti
hard disk. Struktur arsip memungkinkan data disimpan secara permanen dan diakses kembali
jika diperlukan. Setiap item data yang disimpan dalam arsip disebut rekaman (record).
Pengorganisasian data dalam arsip ada 2 cara :
1. Beruntun (seqential)
a. metode paling sederhana
b. rekaman disimpan secara beruntun (rekaman yg satu setelah yg lain)
c. data diakses mulai dari rekaman pertama sampai yang diinginkan
d. pada umumnya lambat
e. mudah dibuat dan dipelihara
2. Acak (random)/akses-langsung (direct access)
a. rekaman diakses secara langsung tanpa perlu mulai dari yang pertama
b. pengaksesan data individual lebih cepat
c. lebih sulit dibuat dan dipelihara
I. PENGAKSESAN ARSIP BERUNTUN
Arsip beruntun adalah sekumpulan rekaman bertipe sama yang diakses secara
beruntun mulai dari rekaman pertama sampai rekaman yang dituju atau sampai dengan
rekaman terakhir.
Struktur arsip beruntun tidak jauh berbeda dengan struktur larik. Setiap komponen larik
disebut elemen sedangkan pada arsip disebut rekaman. Perbedaan arsip dengan larik hanya
pada pilihan cara pengaksesan elemen dan arah pemrosesan. Rekaman dalam arsip beruntun
tidak dapat diakses secara langsung karena harus dibaca dari awal rekaman, sementara dalam
larik elemennya dapat diakses secara langsung melalui indeknya.
Struktur arsip beruntun
117
Sebelum melakukan pemrosesan arsip, maka arsip tersebut harus dideklarasikan terlebih
dahulu. Bentuk mum pendeklarasian arsip dalam bahasa C adalah sbb:
FILE *arsip;
Perintah-perintah baku yang dapat digunakan dalam pemrosesan arsip beruntun adalah :
fopen : menyiapkan arsip untuk penulisan atau pembacaan
fclose : menutup arsip
fscanf : membaca rekaman dari arsip
fprintf : menulis rekaman ke arsip
Contoh 1 : Menulis ke dan membaca dari arsip berurutan
#include<iostream>
#include<stdio.h>
using namespace std;
FILE *fp;
void main(void)
{
int i=0,k;
//Menyimpan data ke file
fp=fopen("d:\\kampus\\program\\c++\\FileIO1\\data1.dat","w");
if(fp==NULL)cout<<"Error membuka berkas"<<endl;
else
{
for(i=0;i<=10;i++)fprintf(fp,"%d ",i);
fclose(fp);
}
//Membaca data dari file
fp=fopen("d:\\kampus\\program\\c++\\FileIO1\\data1.dat","r");
if(fp==NULL)cout<<"Error membuka berkas"<<endl;
else
{
while(!feof(fp))
{
fscanf(fp,"%d ",&k);cout<<k<<" ";
}
cout<<endl;
fclose(fp);
}
}
118
Contoh 2 : Menulis ke dan membaca dari arsip berurutan
#include<iostream>
#include<stdio.h>
using namespace std;
FILE *fp;
void main(void)
{
int i,j,jml_dat,k[100];
//Menyimpan data ke file
fp=fopen("d:\\kampus\\program\\c++\\FileIO2\\data1.dat","w");
if(fp==NULL)cout<<"Error membuka berkas"<<endl;
else
{
for(i=0;i<=10;i++)fprintf(fp,"%d ",i);fclose(fp);
}
//Membaca data dari file
fp=fopen("d:\\kampus\\program\\c++\\FileIO2\\data1.dat","r");
if(fp==NULL)cout<<"Error membuka berkas"<<endl;
else
{
i=0;
while(!feof(fp))
{
fscanf(fp,"%d ",&k[i]);i++;
}
jml_dat=i;fclose(fp);
}
for(j=0;j<jml_dat;j++)cout<<k[j]<<" ";cout<<endl;
}
II. PENGAKSESAN FILE SECARA RANDOM
Panjang rekaman dalam file yang diakses secara random tetap dan dapat diakses
secara langsung tanpa melalui pencarian melalui rekaman lain. Oleh karena itu file yang
diakses secara random cocok digunakan dalam bidang reservasi pesawat terbang, sistem
perbangkan, aplikasi lain yang memerlukan pengaksesan data secara cepat terhadap data
tertentu. Karena panjang rekaman bersipat tetap maka lokasi dari suatu rekaman relatif
terhadap awal berkas dapat dihitung sebagai fungsi dari kunci rekaman.
Struktur penyimpanan secara random
119
Perintah-perintah baku yang dapat digunakan dalam pemrosesan arsip beruntun adalah :
fopen : menyiapkan arsip untuk penulisan atau pembacaan
fclose : menutup arsip
fread : membaca rekaman dari arsip
fwrite : menulis rekaman ke arsip
fseek : menempatkan pointer pada posisi tertentu
Contoh 1 : Menulis ke dan membaca dari arsip secara random
//Penyimpanan & Pembacaan data secara random
#include<iostream>
#include<stdio.h>
using namespace std;
FILE *fp;
void main(void)
{
int i,j,jml_dat;
int k[100];
//Menulis data ke arsip
fp=fopen("d:\\kampus\\program\\c++\\FileIO3\\data1.dat","w");
if(fp==NULL)cout<<"Error membuka file"<<endl;
else
{
for(i=0;i<=10;i++)fwrite(&i,sizeof(i),1,fp);
fclose(fp);
}
//Membaca seluruh data data dari arsip
fp=fopen("d:\\kampus\\program\\c++\\FileIO3\\data1.dat","r");
if(fp==NULL)cout<<"Error membuka file"<<endl;
else
{
i=0;
while(!feof(fp))
{
fread(&k[i],sizeof(int),1,fp);
i++;
}
fclose(fp);
}
//Mencetak selauruh data ke layar
jml_dat=i-1;
cout<<"Jumlah data = "<<jml_dat<<endl;
for(j=0;j<jml_dat;j++)cout<<k[j]<<" ";
cout<<endl;
fp=fopen("d:\\kampus\\program\\c++\\FileIO3\\data1.dat","r");
if(fp==NULL)cout<<"Error membuka file"<<endl;
else
{
120
//Baca data ke-0
fseek(fp,0*sizeof(j),SEEK_SET);
fread(&j,sizeof(j),1,fp);
cout<<"Data ke-0 = "<<j<<endl;
//Baca data ke-1
fseek(fp,1*sizeof(j),SEEK_SET);
fread(&j,sizeof(j),1,fp);
cout<<"Data ke-1 = "<<j<<endl;
//Baca data ke-5
fseek(fp,5*sizeof(j),SEEK_SET);
fread(&j,sizeof(j),1,fp);
cout<<"Data ke-5 = "<<j<<endl;
//Baca data ke-0
rewind(fp);
fread(&j,sizeof(j),1,fp);
cout<<"Data ke-0 = "<<j<<endl;
}
}
Contoh 2 : Menulis ke dan membaca dari arsip secara random
//Penyimpanan & Pembacaan data secara random, data ditulis sekaligus
#include<iostream>
#include<stdio.h>
using namespace std;
FILE *fp;
void main(void)
{
int i,j,jml_dat, k[100];
fp=fopen("d:\\kampus\\program\\c++\\FileIO4\\data1.dat","w");
if(fp==NULL)cout<<"Error membuka berkas"<<endl;
else
{
for(i=0;i<=10;i++)k[i]=i;
fwrite(k,sizeof(i),11,fp);
fclose(fp);
}
fp=fopen("d:\\kampus\\program\\c++\\FileIO4\\data1.dat","r");
if(fp==NULL)cout<<"Error membuka berkas"<<endl;
else
{
i=0;
rewind(fp);
while(!feof(fp))
{
fread(&k[i],sizeof(int),1,fp);i++;
}
fclose(fp);
}
jml_dat=i-1;
cout<<"Jumlah data = "<<jml_dat<<endl;
for(j=0;j<jml_dat;j++)cout<<k[j]<<" ";
121
cout<<endl;
}
TUGAS (dikumpulkan saat UAS)
Buatlah program C/C++ yang memberikan tampilan sbb :
Ket :
Pilihan 1 : Memasukan sejumlah data dari keyboard
Pilihan 2 : Menyimpan seluruh data kedalam sebuah arsip
Pilihan 3 : Membaca data dari arsip
Pilihan 4 : Menampilkan data
Pilihan 5 : Mengurutkan data
Pilihan 6 : Menampilkan data yang telah diurut
Download