Modul Algoritma Pemrograman 2020
Modul Algoritma Pemrograman 2020
Referensi :
Abdul Kadir dan Heriyanto
BAB I
PENGANTAR ALGORITMA DAN PEMROGRAMAN
Orientasi
Bahasa beraras-rendah
Bahasa mesin dan rakitan
Mesin
Gambar 1.1Kelompok bahasa pemograman
Tampak bahasa mesin lebih panjang dan sukaat dimengerti dibandingkan kode
dalam bahasa yang lebih berorientasi pada manusia.
Kode
Sumber
Kompilasi
Interpreter Kompiler
Kelebihan :
Kemudahan mencari kesalahan 1. Pengerjaan instruksi dilakukan
seandainya program menghasilkan dengan sangat cepat, karena
sesuatu yang dianggap salah ketika setelah kode objek terbentuk maka
program dijalankan, karena kode tidak perlu lagi adanya
sumber selalu tersedia penerjemahan, mengingat
komputer dapat memahami kode
objek secara langsung.
2. Kode objek dapat didistribusikan
ke komputer lain tanpa perlu
menyertakan kode sumber dan
kompiler, sehingga kerahasiaan
kode sumber tetap terjamin.
Kelemahan :
1. Kode sumber harus selalu Seluruh kode sumber harus benar secara
tersedia sintaks agar program dapat diuji
2. Eksekusi lambat
Lebar
Gambar 1.6Persegi panjang dan keliling
Anda dapat menuangkan algoritma seperti berikut :
1. Peroleh nilai panjang dan lebar persegi panjang
2. Hitung keliling persegi panjang dengan menggunakan rumus 2 x (panjang +
lebar)
3. Tampilkan nilai keliling persegi panjang
Dalam praktik, banyak persoalan yang solusinya tidak semudah itu. Sebagai
contoh yang sederhana, anda diminta untuk menghitung luas lingkaran yang diketahui
jari-jarinya. Bagaimana anda menghitung luas lingkaran? Apakah dapat dengan hanya
menggunakan logika sederhana?. Tentu saja tidak, anda harus memiliki pengetahuan
tentang rumus luas lingkaran. Jika anda tidak tahu, anda perlu mencari tahu melalui
buku atau bertanya pada orang yang tahu. Setelah anda tahu bagaimana cara
menghitung luas lingkaran, anda baru dapat menuangkannya dalam Bentuk algoritma
sebagai berikut:
1. Peroleh jari – jari lingkaran
2. Hitung luas lingkaran dengan menggunakan rumus 3,14 x jari – jari2.
3. Tampilkan nilai luas lingkaran.
4. write (i)
Merupakan pseudokode yag berorientansi pada bahasa C, Pascal, atau Algol. Algoritma
di atas di gunakan untuk melakukan perhitungan 1 +2 + 3 + 4 + 5 + 6 + 7 + 8 + 9.
Adakalanya suatu algoritma disajikan dalam bentuk diagram alir (flowchart).
Diagram alir adalah suatu standar untuk menggambarkan urutan langkah dalam suatu
proses. Setiap langkah dalam algoritma dinyatakan dalam sebuah symbol dan aliran
setiap langkah (dari suatu langkah ke langkah yang lain) dinyatakan dengan garis yang
di lengkapi panah. Gambar 1.7 memperlihatkan diagram alir untuk menghitung luas
persegi lingkaran.
Mulai
Masukkan
jari-jari
Keluaran luas
Selesai
Adapun gambar 1.8 memperlihatkan sejumlah simbol standar yang digunakan untuk
menyusun diagram alir.
Gambar 1.8Simbol standar untuk diagram alir
Bahasa Pernyataan
BASIC keliling = 2 * (panjang + lebar)
C dan C++ keliling = 2 * (panjang + lebar);
COBOL COMPUTE keliling = 2 * (panjang + lebar)
Pascal keliling :=2 * (panjang + lebar)
return 0;
}
1. Sekuensi (algoritma),
2. Seleksi,
3. Pengulangan
Langkah 2
Langkah 3
C ← (F-32) x 5/9
Tampilkan C
56 77 keadaan awal
Untuk menukarkan isi dua buah variabel diperlukan sebuah variabel yang digunakan
untuk membantu penukaran data.
Algoritma yang diperlukan:
1. Masukkan (a,b)
2. c ← a
3. a ← b
4. b ← c
5. Tampilkan (a,b)
Gambar 2.4 menggambarkan proses penukaran berdasarkan algoritma di atas.
a b c
(b) Setelah c £ a
56 77 56
(c) Setelah a £ b
77 77 56
(d) Setelah b £ c
77 56 56
Langkah 2
AKHIR-JIKA
Langkah 1 Langkah 2
Pada struktur di atas, langkah 1 hanya akan dijalankan kalau kondisi bernilai benar,
sedangkan langkah 2 hanya akan dijalankan kalau kondisi bernilai salah.
Bentuk yang lebih kompleks dalam pengambilan keputusan pada dasarnya dapat
dikembangkanmelalui struktur seleksi.
Contoh 2.3
Buatlah algoritma untuk menentukan bilangan terbesar dari dua buah bilangan x dan
y.
Solusi: pemecahan masalah ini diperlihatkan pada gambar 2.6.
Masukkan x.y
Terbesar x
Terbesar <
x
Terbesar x
Tampilkan terbesar
Gambar 2.6 diagram alir menentukan bilangan terbesar di antara dua buah bilangan.
Penyelesaian dalam bentuk pseudokode dapat dilihat di bawah ini:
1. Masukan (x.y)
2. Terbesar ← x // asumsi bahwa x adalah yang terbesar.
3. JIKA terbesar < y MAKA
terbesar ← y
AKHIR-JIKA
4. Tampilkan (terbesar)
Contoh 2.4
Suatu swalayan memberikan diskon sebesar 10% bagi siapa saja yang berbelanja
sebesar 100.000 atau lebih. Buatlah algoritma untuk menghitung nilai uang yang harus
dibayar oleh pembeli.
Solusi: pemecahan masalah ini dalam bentuk diagram alir dan pseudekode dapat
dilihat pada gambar berikiut.
1. Masukan (pembilan)
2. JIKA pembelian >= 100.000 MAKA
Diskon ←0,1 x pembelian
SEBALIKNYA
diskon ←0
AKHIR-JIKA
3. Pembayaran ← pembelian-diskon
4. Tampilkan (pembayaran)
Masukan pembelian
Pembeli
an
>=100.0
Diskon ← Diskon ← 0
pembelian/10
Pembayaran ← pembelian-diskon
Tampilkan pembayaran
benar
prosedur
(titik keluar)
Pencacah
<7
Tampilkan
“Selamat Belajar”
Pencacah ←
Pencacah + 1
selesai
Gambar 2.9 Diagram alir dan pseudekode untuk menampilkan 6 buah tulisan
“selamat belajar”
Contoh 2.5
Buatlah algoritma untuk membuat tabel seperti berikut dengan menggunakan
struktur pengulangan:
1. 1
2. 4
3. 9
4. 16
5. 25
6. 36
7. 49
8. 64
9. 81
10. 100
Solusi: Pembuatan tabel diatas dalam bentuk diagram alir dan pseudokode dapat
dilihat pada gambar berikut:
bil ← 1
ULANG SELAMA bil < 11
tampilkan (bil, bil x bil)
bil ← bil + 1
AKHIR-ULANG
bil ← 1
bil < 11
Tampilkan bil
dan bil x bil
bil ← bil + 1
selesai
salah
bil < 10
benar
salah
bil ≠ 5
benar
Tampilkan bil
bil ← 1 + 1
selesai
Pada contoh kedua, bil ! bil + 1 tetap menyatakan senuah pernyataan, tetapi
sisanya dalam baris berkedudukan sebagai komentar.
7. Notasi masukkan () dan tampilkan () secara berurutan mewakili perintah untuk
memperoleh masukan dan menyajikan keluaran. Contoh :
masukan(panjang, lebar)
tampilkan(luas)
Pada contoh pertama, masukan yang diperlukan berupa panjang dan lebar. Pada
contoh kedua, yang ditampilkan adalah nilai luas.
8. Ada dua nilai logika uang digunakan, yaitu BENAR dan SALAH. Nilai ini juga
dihasilkan oleh pembanding yang menggunakan tanda seperti <, <, >, >, =, ≠, yang
secara berturut-turut menyatakan kurang dari, kurang dari atau sama dengan,
lebih dari, lebih dari atau sama dengan, sama dengan, dan tidak sama dengan.
Selain itu operator DAN, ATAU, dan TIDAK dapat digunakan untuk membentuk
ekspresi yang menghasilkan nilai BENAR atau SALAH. Logika yang dipakai untuk
operasi DAN dan ATAU dapat dilihat pada tabel berikut :
Tabel 3.1Operasi dengan DAN dan ATAU
a b a DAN b a ATAU b
SALAH SALAH SALAH SALAH
BENAR SALAH SALAH BENAR
SALAH BENAR SALAH BENAR
BENAR BENAR BENAR BENAR
9. Notasi seperti A[i] menyatakan elemen ke-i pada larik A. Nilai terkecil untuk i
adalah nol. Untuk larik berdimensi dua, sebuah elemen akan dinotasikan dengan
A[i,j] atau A [i][j] dengan i menyatakan indeks untuk baris dan j untuk kolom.
Contoh :
terbesar ← A[0]
merupakan pernyataan untuk memasukkan nilai elemen terkiri dalam larik A ke
variabel terbesar.
0 1 2 3 4
Larik A
A[2]
(a) Larik berdimensi satu
0 1 2 3 4
0
Larik B
1
B[1,3]
2
Atau
B[1][3]
#include <iostream.h>
int main ()
{
cout <<“Selamat Belajar C++\n”;
return 0;
}
Catatan Huruf kecil dan huruf kapital dibedakan pada pengenal. Itulah sebabnya,
alamat dan Alamat adalah dua buah pengenal yang berbeda.
Contoh pengenal yang absah dan yang salah dapat dilihat pada tabel berikut:
Catatan Beberapa pemodifikasi tipe seperti signed dan unsigned juga dapat
diterapkan pada sejumlah tipe dasar. Misalnya,
unsigned int
berarti bilangan bulat tak bertanda, yang dapat mencakup nilai antara 0
sampai dengan 65535. Jika Anda tertarik dengan detail pemrograman C,
Anda dapat membaca buku penulis yang berjudul “Pemrograman Dasar
Turbo C untuk IBM PC” (Penerbit Andi).
Misalnya, dulu
berisi 23
24 Sekarang berisi
24
4.4.1 Mendeklarasikan Variabel
Sebelum Anda dapat menggunakan suatu variabel dalam program, variabel
harus dideklarasikan dulu. Pendeklarasian variabel digunakan untuk memesan lokasi
dalam memori komputer dan menentukan tipe dari data yang dapat disimpan dalam
variabel. Bentuk pendeklarasiannya adalah sebagai berikut:
int i, j, k;
variabel = nilai;
Contoh:
n = 7;
n=n+1
Yang berarti “hasil penjumlahan nilai n dengan 1 diberikan ke n”. Dengan kata
lain, isi n dinaikan sebesar satu.
Y O g y a \0
C:\progc>kopistr¿
Nama: David Beckham
Info: Pemain sepakbola
C:\progc>
#include <iostream.h>
#include <string.h>
int main ()
{
Char info [25];
cout<< “\n” ;
Return 0;
}
C:\progc>initstr¿
Nama: David Beckham
Info: Pemain sepakbola
C:\progc>
int main ()
{
char info [25] = “Nama: David Beckam”);
cout<< info ;
cout<< “\n” ;
Return 0;
}
Akhir Kode Sumber
Untuk mengakses suatu karakter yang terdapat dalam sebuah variable string,
notasi berikut dapat digunakan :
nama_variabel [indeks]
int main ()
{
Int bil = 23;
return 0;
}
C:\progc>hexoct¿
Desimal = 23
Heksadesimal = 17
Oktal = 27
27
Gambar 4.10 Hasil program hexoct
C:\progc>
#include <iostream.h>
#include <iomanip.h>
int main ()
{
int bil = 23;
char st [] = “Halo”;
C:\progc>manip¿
23
23
23
23
23
*****23
Halo
Halo
***Halo
C:\progc>
int main ()
{
double bil = 467856.6784532;
<<setprecision (2)
<<bil<< “\n” ;
cout<< setw(15)
<<setprecision (3)
<<bil<< “\n” ;
cout<< setw(15)
<<setprecision (5)
<<bil<< “\n” ;
cout<< bil << “\n”; // Tetep berpresisi 5 digit pecahan
return 0;
}
2+3 Ekspresi
Operand
Operand
Ditinjau dari jumlah operand yang dilibatkan dalam sebuah operator, terdapat
tiga macam operator.
1. Operator unary, yaitu operator yang hanya melibatkan sebuah operand.Contoh:
+1
-1
2. Operator binary, yaitu operator yang melibatkan dua buah operand.Contoh:
2+3
5*2
5>2
3. Operator tertiary, yaitu operator yang melibatkan tiga buah operand.
a >b ? : 0
Ekspresi di atas berarti “jika a lebih besar dari pada b maka ekspresi
menghasilkan nilai 1, sedangkan kalau tidak maka ekspresikan menghasilkan nilai 0 ”
.
Catatan
- 1 Unary minus -1
+ 1 Unary plus +1
233
* 2 Perkalian 2*3 → 6
2*3.0 → 6.0
/ 2 Pembagian 7/2→3
7 / 2.0 → 3.5
7.0 / 2 → 3.5
% 2 Sisa
pembagian
+ 3 Penjumlahan
- 3 pengurangan
ax2 + bx + c a*x*x*+b*x+c
√b sqrt (b)
3
√b pow (b, 1.0/3)
a+b (a + b) / (c + d)
√b2 – 4 ac sqrt (b * b – 4 * a * c)
exp (x + y) / (x + y)
a + b / fabs (m-n)
Log10 m Log10 (m)
Loge (m + n) Log (m + n)
Program peluru.c memberikan contoh pemakaian fungsi sin () dan cos () untuk
menghitung jarak peluru jatuh terhadap posisi penembakan peluru.Gambar 4.13
memberikan ilustrasi tentang hal itu.
C:\progc>peluru¿
Jarak = 102.88942
C:\progc>C:\progc>
#include <iostream.h>
#include <math.h>
int main ()
{
double kecepatan, sudut, jarak;
kecepatan = 32;
sudut = 40;
return 0;
}
Tampilan dev c ++
Operator Keterangan
>= Lee
Ekspresi Keterangan
5>1 1 (bener)
4<5 Lee
4 <= 3 0 (salah)
‘A’ > ‘B’ 0 (salah)
‘B’ > ‘A’ 1 (bener)
‘A’ < ‘a’ 1 (bener)
Pada data bertipe karakter, pembandingan didasarkan pada nilai ASCII dari
karakter yang dibandingkan. Misalnya, nilai ASCII A adalah 65, nilai ASCII B berupa 6,
dan nilai ASCII a berupa 97.
Catatan Operator pembandingan hanya dapat dipakkai untuk tipe dasar; tidak
dapat digunakan untuk string.
|| Operator “atau”
! Operator “bukan”
A B A && B A || B
Contoh operasi dengan operator logika dapat dilihat pada Table 4.17.
Tabel 4.17 Contoh operasi dengan operator logika
Ekspresi Keterangan
Hasil berupa benar hanya kalau kar
Kar >= ‘A’ && kar <= ‘Z’
berupa huruf kapital
Hasil berupa benar kalau kode
Kode == ‘a’ || kode == ‘A’
berupa huruf a dan A
Hasil berupa benar kalau kar tidak
! (kar == ‘A’)
berupa huruf A
1+4*2
Akan dievaluasi sebagai berikut:
1+4*2
Prioritas * lebih
8
tinggi daripada +
9
a = b = 5;
a = b = 5;
b berisi 5
a berisi 5
Gambar 4.15 Pengevaluasian ekspresi dilakukan dari kanan
Table 4.18 memperlihatkan prioritas operator-operator pada C dan C++
dimulai dari yang tertinggi menuju ke yang terendah. Operator yang terletak pada
baris yang sama menyatakan bahwa prioritasnya sama. Table ini dapat Anda gunakan
sebagai acuan kalau Anda menggunakan sejumlah operator dalam sebuah ekspresi.
(1 + 4) * 2
memberikan hasil 10. Pada contoh ini, tanda kurang menyebabkan 1 + 4 dikerjakan
terlebih dulu.Setelah itu baru mengerjakan pengalian hasil 1 + 4 dengan 2.
Contoh lain:
5 * (5 + (6 – 2) + 1)
memberikan hasil 50.
5 * (5 + (6 – 2) + 1)
hargaPerUnit * jumlah
C/C++ akan mengonversi jumlah yang bertipe int ke float mengingat ada
operand (yaitu hargaPerUnit) yang bertipe float. Selanjutnya, hasil ekspresi tersebut
dikonversi ke double mengingat di sebelah kanan operator = bertipe double.
int jumlah;
float hargaPerUnit;
double hargaTotal;
Dikonversi dari
int ke float
float
float
Dikonversi ke
Gambar 4.17 Gambar konversi tipe
double
Kadangkala diperlukan langkah untuk mengubah suatu tipe data menjadi tipe
data lain. Proses untuk mengubah suatu tipe ke tipe yang lain dikenal dengan istilah
type casting atau pengarah tipe. Bentuk pengarah tipe adalah sebagai berikut:
(tipe_data) data
Contoh berikut memperlihatkan pengonversian data:
isi variable kar dikonversikan ke tipe int dan kemudian disimpan ke variable nilai.
Hasil eksekusi program ditunjukkan pada gambar berikut:
C:\progc>konversi ¿
Nilai ASCII A : 65
C:\progc>ec
Setelah suatu tipe struct didefinisikan, tipe tersebut dapat dipakai untuk
mendeklarasikan suatu variable. Caranya seperti berikut:
Variable peg
Gambar 4.19 Variabel bertipe struct
Untuk mengakses suatu field, notasi seperti berikut digunakan:
variable_struct.nama_field
contoh berikut menunjukkan pendefinisian tipe struct, pendeklarasian variable
bertipe struct, dan cara mengakses setiap field dalam tipe struct:
C:\progc>struct ¿
NIP : 4567
Nama : Audi Febrianti
Gaji : 1200000
C:\progc>
Gambar 4.20 Hasil program struct
Program C++ serupa dengan struct.c di depan adalah seperti berikut:
Kode Sumber C++ : struct.cpp
#include <iostream.h>
#include <string.h>
struct data_pegawai
{
int nip;
char nama [25];
long int gaji;
};
int main ()
{
struct data_pegawai peg;
peg.nip = 4567;
strcpy (peg.nama, “audi febrianti”);
peg.gaji = 1200000L;
return0;
}
Adapun argument berupa alamat suatu variabel. Alamat suatu variable dapat
diperoleh dengan menyertakan tanda & di depan suatu variable.
Catatan Yang termasuk spasi-putih adalah karakter spasi, newline, dan tab.
Penentu format menentukan tipe data yang akan dibaca. Kode-kode yang
dapat dipakai dalam penentu format dapat dilihat pada Tabel 4.19.
Kode Keterangan
%c Data yang dibaca berupa sebuah karakter
%s Data yang dibaca berupa sebuah string
Data yang dibaca berupa sebuah sebuah bilangan
% i atau % d
bulat
Data yang dibaca berupa sebuah sebuah bilangan
% e atau % f
real
Data yang dibaca berupa sebuah sebuah bilangan
%u
bulat tak bertanda
Awalan untuk membaca data long int atau
L (huruf L kecil)
double. Contoh: % ld
Contoh penggunaan scanf() dapat dilihat pada table berikut:
Tabel 4.20 Contoh pemakaian scanf()
Pernyataan Keterangan
Pernyataan untuk membaca
sebuah bilangan real dan
meletakkannya ke variable jarak
Scanf (“ % f ”, & jarak);
yang bertipe float. Dalam hal ini &
jarak berarti “alamat dari variable
jarak”
Pernyataan untuk membaca
sebuah bilangan bulat dan
Scanf (“ % d “, & jumlah);
meletakkannya ke variable jumlah
yang bertipe int.
Pernyataan untuk membaca
sebuah bilangan bulat bertipe
Scanf (“ % ld “, & jum_penduduk); long int dan meletakkannya ke
variable jum_penduduk yang
bertipe long int.
Program berikut memberikan gambaran penggunaan scanf(). Program ini
merupakan hasil pemodifikasian terhadap program peluru.c.Dalam hal ini data
C:\progc>peluru2 ¿
Kecepatan : 32¿
Gambar 4.21 Hasil program peluru2
Sudut : 40¿
Kec : 32.000000Jarak = 102.889492
C:\progc>
Pseudokode Keterangan
masukan (jumlah)
Printf (“jumlah = “);
(Dengan asumsi jumlah bertipe Scanf (“%d”, &jumlah);
int)
masukan (panjang, lebar) Printf (“panjang = “);
Scanf (“%f”, &panjang);
(Dengan asumsi panjang dan lebar Printf (“lebar= “);
bertipe float) Scanf (“%f”, &lebar);
masukan (nama) Printf (“Nama = “);
Scanf (“%s”, &nama);
(Dengan asumsi nama adalah
variable string) (Perhatikan bahwa di depan nama
tidak diberi tanda &)
int main ()
{
double kecepatan, sudut, jarak;
return0;
}
C:\progc>bacanama ¿
Nama Anda: Aulia¿
Hai, Aulia. Selamat belajar C
C:\progc>
Gambar 4.22 Hasil program bacanama
Pada C++, string juga dapat dibaca melalui cin. Contoh berikut memperhatikan
program C++ yang setara dengan program bacanama.cdi depan:
#include <iostream.h>
int main ()
{
char nama [35];
return0;
}
Tampilan Dev C++
Akhir Kode Sumber
BAB 5
OPERASI SELEKSI
Pseudokode Kode C
JIKA kondisi benar MAKA If (kondisi)
{
Pernyataan_1 Pernyataan_1;
... ...
SEBALIKNYA }
Else
Pernyataan_2 {
... Pernyataa_2;
AKHIR – JIKA ...
}
Algoritma :
Algoritma untuk menentukan bilangan genap atau ganjil adalah seperti berikut :
1. masukkan (bilangan)
2. JIKA sisa_pembagian (bilangan, 2) = 0 MAKA
tampilkan (“Bilangan genap”)
SEBALIKNYA
tampilkan(“Bilangan ganjil”)
AKHIR-JIKA
Program:
Adapun implementasi dalam C++ adalah sebagai berikut :
#include <iostream.h>
int main()
{
int bilangan;
if (bilangan % 2 == 0)
cout << "Bilangan genap" << "\n";
else
cout << "Bilangan ganjil" << "\n";
return 0;
}
Ø Jika Menggunakan DEV C++
#include <iostream>
Using namespace std;
int main()
{
int bilangan;
if (bilangan % 2 == 0)
cout << "Bilangan genap" << "\n";
else
cout << "Bilangan ganjil" << "\n";
return 0;
}
Akhir Kode Sumber
Contoh 5.2 [ Menentukan bilangan terbesar di antara dua buah bilangan ]Dua buah
bilangan bulat dimasukkan dari keyboard. Bagaimana cara menampilkan bilangan
yang terbesar di antara kedua bilangan tersebut?
Ada banyak cara untuk memberikan solusi pada persoalan ini. Kedua cara itu akan
dibahas.
Cara 1 :
Salah satu algoritma untuk menyelesaikan masalah ini pernah dibahas pada Bab 2.
Algoritmanya adalah sebagai berikut :
1. masukkan (x, y).
2. terbesar ← x // Asumsi bahwa x adalah yang terbesar
3. JIKA terbesar < y MAKA
terbesar ← y
AKHIR-JIKA
4. tampilkan (terbesar)
if (terbesar < y)
terbesar = y;
return 0;
}
int main()
{
double x, y, terbesar;
if (terbesar < y)
terbesar = y;
Cara 2 :
Cara kedua dilakukan tanpa melibatkan variable lain. Algoritmanya adalah sebagai
berikut :
1. masukkan (x, y).
2. JIKA x > y MAKA
tampilkan (“terbesar yaitu”, x)
SEBALIKNYA
tampilkan (“terbesar yaitu”, y)
AKHIR-JIKA
int main()
{
double x, y;
if (x > y)
cout << "Bilangan terbesar = " << x << "\n";
else
cout << "Bilangan terbesar = " << y << "\n";
return 0;
}
#include <iostream>
using namespace std;
int main()
{
double x, y;
Algoritma :
Algoritma untuk menyelesaikan masalah di atas adalah seperti berikut :
1. Masukkan (nilai).
2. JIKA nilai > 0 dan nilai < 100 MAKA
tampilkan (“Benar”)
SEBALIKNYA
tampilkan (“Salah “)
AKHIR-JIKA
Program:
Program C++ berdasarkan algoritma di atas dapat dilihat dibawah ini.
#include <iostream>
using namespace std;
int main()
{
double nilai;
int main()
{
char karakter;
int main()
{
char karakter;
int main()
{
int tahun;
if (tahun % 4 != 0)
cout << "Bukan kabisat\n";
else
if ((tahun % 100 == 0) && (tahun % 400 != 0))
cout << "Bukan kabisat\n";
else
cout << "Kabisat\n";
return 0;
}
int main()
{
int tahun;
if (tahun % 4 != 0)
cout << "Bukan kabisat\n";
else
if ((tahun % 100 == 0) && (tahun % 400 != 0))
cout << "Bukan kabisat\n";
else
cout << "Kabisat\n";
return 0;
}
Akhir Kode Sumber
Program:
Implementasi dalam c++:
int main()
{
double ip;
int main()
{
double ip;
Contoh 5.7[ Menentukan nama bulan menurut angka ] Buatlah diagram dan program
yang membaca data kode bulan dari keyboard dan kemudian menampilkan nama
bulan.
Cara pertama:
Cara pertama di pecahkan dengan menggunakan bentuk JIKA .. AKHIR –JIKA.
Algoritmanya sebagai berikut:
masukkan ( kode_bulan )
JIKA kode_bulan = 1 MAKA
tampilkan (‘’Januari’’)
SEBALIKNYA
JIKA kode_bulan = 2 MAKA
tampilkan (‘’Februari’’)
SEBALIKNYA
JIKA kode_bulan = 3 MAKA
tampilkan (‘’Maret ‘’)
SEBALIKNYA
JIKA kode_bulan = 4 MAKA
tampilkan (‘’April’’)
SEBALIKNYA
JIKA kode_bulan = 5 MAKA
tampilkan (‘’Mei’’)
SEBALIKNYA
JIKA kode_bulan = 6 MAKA
tampilkan (‘’Juni’’)
SEBALIKNYA
JIKA kode_bulan = 7 MAKA
tampilkan (‘’Juli’’)
SEBALIKNYA
JIKA kode_bulan = 8 MAKA
tampilkan (‘’Agustus’’)
SEBALIKNYA
JIKA kode_bulan = 9 MAKA
tampilkan (‘’September’’)
SEBALIKNYA
JIKA kode_bulan = 10 MAKA
tampilkan (‘’Oktober’’)
SEBALIKNYA
JIKA kode_bulan = 11 MAKA
tampilkan (‘’November’’)
SEBALIKNYA
JIKA kode_bulan = 12 MAKA
tampilkan (‘’Desember’’)
SEBALIKNYA
tampilkan (‘’Salah kode bulan ‘’)
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
Program:
Implementasi dalam C++
Kode Sumber : bulan.cpp
#include <iostream.h>
int main()
{
int kode_bulan;
if (kode_bulan == 1)
cout << "Januari\n";
else
if (kode_bulan == 2)
cout << "Februari\n";
else
if (kode_bulan == 3)
cout << "Maret\n";
else
if (kode_bulan == 4)
cout << "April\n";
else
if (kode_bulan == 5)
cout << "Mei\n";
else
if (kode_bulan == 6)
cout << "Juni\n";
else
if (kode_bulan == 7)
cout << "Juli\n";
else
if (kode_bulan == 8)
cout << "Agustus\n";
else
if (kode_bulan == 9)
cout << "Septemmber\n";
else
if (kode_bulan == 10)
cout << "Oktober\n";
else
if (kode_bulan == 11)
cout << "November\n";
else
if (kode_bulan == 12)
cout << "Desember\n";
else
cout << "Salah kode
bulan\n";
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int kode_bulan;
if (kode_bulan == 1)
cout << "Januari\n";
else
if (kode_bulan == 2)
cout << "Februari\n";
else
if (kode_bulan == 3)
cout << "Maret\n";
else
if (kode_bulan == 4)
cout << "April\n";
else
if (kode_bulan == 5)
cout << "Mei\n";
else
if (kode_bulan == 6)
cout << "Juni\n";
else
if (kode_bulan == 7)
cout << "Juli\n";
else
if (kode_bulan == 8)
cout << "Agustus\n";
else
if (kode_bulan == 9)
cout << "Septemmber\n";
else
if (kode_bulan == 10)
cout << "Oktober\n";
else
if (kode_bulan == 11)
cout << "November\n";
else
if (kode_bulan == 12)
cout << "Desember\n";
else
cout << "Salah kode
bulan\n";
return 0;
}
Akhir Kode Sumber
Cara Kedua:
Persoalan penentuan nama bulan juga bisa dipecahkan dengan menggunakan bentuk
COCOK..AKHIR-COCOK. Algoritmanya sebagai berikut:
1. masukkan (kode_bulan).
2. COCOK kode_bulan
DENGAN 1 MAKA
tampilkan(“Januari’’)
DENGAN 2 MAKA
tampilkan(“Februari’’)
DENGAN 3 MAKA
tampilkan(“Maret’’)
DENGAN 4 MAKA
tampilkan(“April’’)
Dengan 5 MAKA
tampilkan (“Mei’’)
DENGAN 6 MAKA
tampilkan(“Juni’’)
DENGAN 7 MAKA
tampilkan(“Juli’’)
DENGAN 8 MAKA
tampilkan(“Agustus’’)
DENGAN 9 MAKA
tampilkan(“September’’)
DENGAN 10 MAKA
tampilkan(“Oktober’’)
DENGAN 11 MAKA
tampilkan(“November’’)
DENGAN 12 MAKA
tampilkan(“Desember’’)
LAINNYA
tampilkan(“Salah kode bulan’’)
AKHIR-COCOK
Algoritma diatas dimplementasikan dalam program C++ sebagai berikut:
int main()
{
int kode_bulan;
switch (kode_bulan)
{
case 1:
cout << "Januari\n";
break;
case 2:
cout << "Februari\n";
break;
case 3:
cout << "Maret\n";
break;
case 4:
cout << "April\n";
break;
case 5:
cout << "Mei\n";
break;
case 6:
cout << "Juni\n";
break;
case 7:
cout << "Juli\n";
break;
case 8:
cout << "Agustus\n";
break;
case 9:
cout << "September\n";
break;
case 10:
cout << "Oktober\n";
break;
case 11:
cout << "November\n";
break;
case 12:
cout << "Desember\n";
break;
default:
cout << "Salah kode bulan\n";
}
return 0;
}
int main()
{
int kode_bulan;
switch (kode_bulan)
{
case 1:
cout << "Januari\n";
break;
case 2:
cout << "Februari\n";
break;
case 3:
cout << "Maret\n";
break;
case 4:
cout << "April\n";
break;
case 5:
cout << "Mei\n";
break;
case 6:
cout << "Juni\n";
break;
case 7:
cout << "Juli\n";
break;
case 8:
cout << "Agustus\n";
break;
case 9:
cout << "September\n";
break;
case 10:
cout << "Oktober\n";
break;
case 11:
cout << "November\n";
break;
case 12:
cout << "Desember\n";
break;
default:
cout << "Salah kode bulan\n";
}
return 0;
}
Akhir Kode Sumber
Contoh 5.8 [Menentukan jumlah hari] Buatlah algoritma dan program yang meminta
data bulan (1...12) dimasukkan dari keyboard dan kemudian menentukan jumlah hari
dalam bulan tersebut.
Cara Pertama:
Persoalan di atas dapat dipecahkan dengan menggunakan sederetan JIKA...AKHIR-
JIKA. Algoritmanya sebagai berikut:
1. Masukkan(kode_bulan).
2. JIKA kode_bulan = 2 MAKA
tampilkan(“Jumlah hari 28 atau 29”)
SEBALIKNYA
JIKA kode_bulan = 1 atau 3 atau 5 atau 7 atau 8
atau 10 atau 12 MAKA
tampilkan(“Jumlah hari 31”)
SEBALIKNYA
JIKA kode_bulan = 4 atau 6 atau 9 atau 11 MAKA
tampilkan(“Jumlah hari 30”)
SEBALIKNYA
tampilkan(“Salah kode bulan”)
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
int main()
{
int kode_bulan;
if (kode_bulan == 2)
cout << "Jumlah hari 28 atau 29\n";
else
if (kode_bulan == 1 || kode_bulan == 3 ||
kode_bulan == 5 || kode_bulan == 7 ||
kode_bulan == 8 || kode_bulan == 10 ||
kode_bulan == 12)
cout << "Jumlah hari 31\n";
else
if (kode_bulan == 4 || kode_bulan == 6 ||
kode_bulan == 9 || kode_bulan == 11)
cout << "Jumlah hari 30\n";
else
cout << "Salah kode bulan\n";
return 0;
}
if (kode_bulan == 2)
cout << "Jumlah hari 28 atau 29\n";
else
if (kode_bulan == 1 || kode_bulan == 3 ||
kode_bulan == 5 || kode_bulan == 7 ||
kode_bulan == 8 || kode_bulan == 10 ||
kode_bulan == 12)
cout << "Jumlah hari 31\n";
else
if (kode_bulan == 4 || kode_bulan == 6 ||
kode_bulan == 9 || kode_bulan == 11)
cout << "Jumlah hari 30\n";
else
cout << "Salah kode bulan\n";
return 0;
}
Akhir Kode Sumber
Cara kedua:
Cara lain untuk menentukan jumlah hari dalam suatu bulan adalah dengan
menggunakan bentuk COCOK...AKHIR-COCOK. Algoritmanya sebagai berikut:
1. masukkan(kode_bulan)
2. COCOK kode_bulan
DENGAN 2 MAKA
tampilkan(“Jumlah hari 28 atau 29”)
DENGAN 1 MAKA
tampilkan(“Jumlah hari 31”)
DENGAN 3 MAKA
tampilkan(“Jumlah hari 31”)
DENGAN 5 MAKA
tampilkan(“Jumlah hari 31”)
DENGAN 7 MAKA
tampilkan(“Jumlah hari 31”)
DENGAN 8 MAKA
tampilkan(“Jumlah hari 31”)
DENGAN 10 MAKA
tampilkan(“Jumlah hari 31”)
DENGAN 12 MAKA
tampilkan(“Jumlah hari 31”)
DENGAN 4 MAKA
tampilkan(“Jumlah hari 30”)
DENGAN 6 MAKA
tampilkan(“Jumlah hari 30”)
DENGAN 9 MAKA
tampilkan(“Jumlah hari 30”)
DENGAN 11 MAKA
tampilkan(“Jumlah hari 30”)
LAINNYA
tampilkan(“Salah kode bulan”)
AKHIR-COCOK
int main()
{
int kode_bulan;
switch (kode_bulan)
{
case 2:
cout << "Jumlah hari 28 atau 29\n";
break;
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10:
case 12:
cout << "Jumlah hari 31\n";
break;
case 4 :
case 6 :
case 9 :
case 11:
cout << "Jumlah hari 30\n";
break;
default:
cout << "Salah kode bulan\n";
}
return 0;
}
int main()
{
int kode_bulan;
switch (kode_bulan)
{
case 2:
cout << "Jumlah hari 28 atau 29\n";
break;
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10:
case 12:
cout << "Jumlah hari 31\n";
break;
case 4 :
case 6 :
case 9 :
case 11:
cout << "Jumlah hari 30\n";
break;
default:
cout << "Salah kode bulan\n";
}
return 0;
}
Akhir Kode Sumber
Contoh 5.9 [Menentukan zodiak] Zodiak (bintang kelahiran] seperti virgo dan Aries
sebenarnya dapat ditentukan dengan mudah karena ada aturan yang pasti,
sebagaimana tercantum pada Tabel 5.4. Berdasarkan tabel tersebut susunlah
algoritma dan program berdasarkan tanggal dan bulan kelahiran.
Algoritma:
Untuk menyederhanakan algoritma, diasumsikan bahwa tanggal (1 s/d 31) dan
bulan (1 s/d 12) yang dimasukkan pemakai selalu dalam keadaan benar. Dengan
keadaan seperti ini, algoritma untuk menentukkan zodiak adalah sebagai berikut:
1. masukkan(tanggal, bulan).
2. JIKA (tanggal ≥ 21 dan bulan = 3) atau
(tanggal ≤ 19 dan bulan = 4) MAKA
tampilkan(“Zodiak Aries”)
SEBALIKNYA
JIKA (tanggal ≥ 20 dan bulan = 4) atau
(tanggal ≤ 20 dan bulan = 5) MAKA
tampilkan(“Zodiak Taurus”)
SEBALIKNYA
JIKA (tanggal ≥ 21 dan bulan = 5) atau
(tanggal ≤ 20 dan bulan = 6) MAKA
tampilkan(“Zodiak Gemini”)
SEBALIKNYA
JIKA (tanggal ≥ 21 dan bulan = 6) atau
(tanggal ≤ 22 dan bulan = 7) MAKA
tampilkan(“Zodiak Cancer”)
SEBALIKNYA
JIKA (tanggal ≥ 23 dan bulan = 7) atau
(tanggal ≤ 22 dan bulan = 8) MAKA
tampilkan(“Zodiak Leo”)
SEBALIKNYA
JIKA (tanggal ≥ 23 dan bulan = 8) atau
(tanggal ≤ 22 dan bulan = 9) MAKA
tampilkan(“Zodiak Virgo”)
SEBALIKNYA
JIKA (tanggal ≥ 23 dan bulan = 9) atau
(tanggal ≤ 22 dan bulan = 10) MAKA
tampilkan(“Zodiak Libra”)
SEBALIKNYA
JIKA (tanggal ≥ 23 dan bulan = 10) atau
(tanggal ≤ 21 dan bulan = 11) MAKA
tampilkan(“Zodiak Scorpio”)
SEBALIKNYA
JIKA (tanggal ≥ 22 dan bulan = 11) atau
(tanggal ≤ 21 dan bulan = 12) MAKA
tampilkan(“Zodiak Sagitarius”)
SEBALIKNYA
JIKA (tanggal ≥ 22 dan bulan = 12) atau
(tanggal ≤ 19 dan bulan = 1) MAKA
tampilkan(“Zodiak Capricorn”)
SEBALIKNYA
JIKA (tanggal ≥ 20 dan bulan = 1) atau
(tanggal ≤ 18 dan bulan = 2) MAKA
tampilkan(“Zodiak Aqurius”)
SEBALIKNYA
tampilkan(“Zodidak Pisces”)
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
Program:
Program C++ berikut merupakan implementasi dari algoritma untuk menentukan
zodiak.
int main()
{
int tanggal, bulan;
int main()
{
int tanggal, bulan;
Dengan cara seperti itu terbesar akan berisi bilangan terbesar di antara x, y, dan z.
Adapun penuangan dalam bentuk program C++ adalah sebagai berikut:
int main()
{
double x, y, z, terbesar;
int main()
{
double x, y, z, terbesar;
return 0;
}
Akhir Kode Sumber
Cara Kedua:
Cara kedua dilakukan dengan menggunakan penghubung “dan” seperti berikut:
1. masukkan(x, y, z).
2. JIKA x > y dan x > z MAKA
terbesar ← x
SEBALIKNYA
JIKA y > x dan y < z MAKA
terbesar ← y
SEBALIKNYA
terbesar ← z
AKHIR-JIKA
AKHIR-JIKA
3. tampilkan(terbesar)
return 0;
}
int main()
{
double x, y, z, terbesar;
return 0;
}
Program:
Implementasi dalam C++:
#include <iostream.h>
#include <math.h>
int main()
{
double a, b, c;
double diskriminan, x1, x2, re, im;
// Hitung dskriminan
diskriminan = b * b - 4 * a * c;
// Evaluasi diskriminan
if (diskriminan > 0)
{
x1 = (-b + sqrt(diskriminan)) / (2 * a);
x2 = (-b - sqrt(diskriminan)) / (2 * a);
cout << "Akar real:\n";
cout << "x1 = " << x1 << "\n";
cout << "x2 = " << x2 << "\n";
}
Else
if (diskriminan == 0)
{
x1 = -b / (2 * a);
x2 = x1;
cout << "Akar kembar:\n";
cout << "x1 = " << x1 << "\n";
cout << "x2 = " << x2 << "\n";
}
else /* diskriminan < 0 */
{
re = -b / (2 * a);
im = sqrt(fabs(diskriminan))/(2 * a);
cout << "Akar kompleks\n";
cout << "x1 = " << re << " + " << im < "\n";
cout << "x2 = " << re << " - " << im < "\n";
}
return 0;
}
Akhir Kode Sumber
BAB 6
OPERASI PENGULANGAN
Catatan Kondisi pada C dan C++ dapat berupa ekspresi yang menghasilkan nilai
benar atau salah dan harus ditulis dalam tanda kurung.
CONTOH 6.1 pada bab 3 telah dibahas sebuah algoritma untuk memperoleh faktor
persekutuan terbesar (FPB). Algoritmanya seperti berikut:
masukkan (m, n)
1. r ← sisa_pembagian(m, n)
2. ULANG SELAMA r ≠ 0
m ← n
n ← r
r ← sisa_pembagian(m, n)
AKHIR-ULANG
3. tampilkan (n)
int main()
{
int m, n, r;
r = m % n;
while (r != 0)
{
m = n;
n = r;
r = m % n;
}
cout << "FPB: " << n << "\n";
return 0;
}
Akhir Kode Sumber
#include <iostream.h>
int main()
{
int bil;
bil = 1;
while (bil <= 6)
{
cout << "Bahasa C++\n";
bil = bil + 1;
}
return 0;
}
Akhir Kode Sumber
CONTOH 6.3 Buatlah algoritma dan pemograman untuk menampilkan bilangan ganjil
yang terletak antara 1 sampai dengan 10.
Algoritma:
1. bil ← 1
2. ULANG SELAMA bil ≤ 10
tampilkan(bil)
bil ← bil + 2
AKHIR-ULANG
Program:
Program C++ berikut merupakan translasi berdasarkan algoritma tersebut.
#include <iostream.h>
int main()
{
int bil;
bil = 1;
while (bil <= 10)
{
cout << "%d ", bil;
bil = bil + 2;
}
CONTOH 6.4 Buatlah program dan algortima yang menampilkan deretan seperti
berikut:
10
9
8
7
6
5
4
3
2
1
Algoritma:
1. Bil ← 10
2. ULANG SELAMA bil ≥ 1
tampilkan(bil)
bil ← bil – 1
AKHIR-ULANG
Program:
Penuangan algoritma di depan ke dalam program C++ adalah seperti berikut:
#include <iostream.h>
int main()
{
int bil;
bil = 10;
while (bil >= 1)
{
cout << "%d\n", bil;
bil = bil - 1;
}
return 0;
}
Akhir Kode Sumber
CONTOH 6.5 Buatlah algoritma dan pemograman untuk menghitung jumlah seperti
berikut dengan n adalah bilangan yang dimasukan dari keyboard:
1+2+3+4+5+…+(n+2)+(n–1)+n
Algoritma:
1. masukkan(n)
2. jum ← 0
3. pencacah ← 0
4. ULANG SELAMA pencacah ≤ n
jum ← jum + pencacah //Jumlahkan
pencacah ← pencacah + 1
AKHIR-ULANG
5. tampilkan(jum)
Program:
Program C++ hasil translasi algoritma di depan dapat diliha di bawah ini.
int main()
{
int n, pencacah, jum;
jum = 0;
pencacah = 1;
while (pencacah <= n)
{
jum = jum + pencacah;
pencacah = pencacah + 1;
}
return 0;
}
Akhir Kode Sumber
Program:
Translasi algortima di depan dapat dilihat pada program C++ berikut:
#include <iostream.h>
#include <math.h>
int main()
{
int n, bil;
double jum, pi;
jum = 0;
bil = 1;
while (bil <= n)
{
jum = jum + 1.0 / (bil * bil);
bil = bil + 1;
}
pi = sqrt(jum * 6);
return 0;
}
Akhir Kode Sumber
Dimaksudkan agar hasil pembagian 1 dengan bilangan kuadrat bernilai pecahan. Bila
1.0 ditulis dengan 1, hasil pembagian akan selalu berupa nol.
CONTOH 6.7 Buatlah algoritma dan program yang meminta n buah bilangan bulat
dimasukkan dari keyboard dan kemudian menampilkannilai rata-rata dari keseluruhan
bilangan tersebut.
Algoritma:
Algortima dimulai dengan mula-mula meminta jumlah data yang akan dimasukkan
dari keyboard (n). selanjutnya, n buah data di baca dari keyboard dan setiap kali setiap
data selesai dibaca, nilainya ditambahkan ke variabel jum. Dengan demikian, setelah
data terakhir dimasukkan, jum berisi penjumlahan n buah nilai yang dimasukkan dari
keyboard. Algoritma selengkapnya adalah sebagai berikut:
1. masukkan(n)
2. jum ← 0
3. pencacah ← 0
4. ULANG SELAMA pencacah ≤ n
masukkan(bil)
jum ← jum +bil //Jumlahkan
pencacah ← pencacah + 1
AKHIR-ULANG
5. rata_rata ← jum / n
6. tampilkan(rata_rata)
Program:
Program C++ yang di dasarkan pada algoritma di depan dapat dilihat di bawah ini.
jum = 0;
pencacah = 1;
while (pencacah <= n)
{
cout << "Bilangan " << pencacah << " = ";
cin >> bil;
rata_rata = jum / n;
return 0;
}
Akhir Kode Sumber
CONTOH 6.8 Buatlah algortima dan pemograman yang meminta sebuah bilangan
bulat dimasukkan dari keyboard dan kemudian menampilkan deret seperti berikut:
1 2 4 7 11 16 22 29 37 46
Bila bilangan adalah 50. Bantuan: angka terakhir yang dimasukkan dalam derat harus
tidak lebih dari bilangan yang dimasukkan dari keyboard.
Algoritma:
1. masukkan(n)
2. pencacah ← 1
3. nilai ← 1
4. ULANG SELAMA nilai < n
tampilkan(nilai)
nilai ← nilai + pencacah
pencacah ← pencacah + 1
AKHIR-ULANG
Program:
Implementasi dalam program C++
Kode Sumber : naiktrs.cpp
#include <iostream.h>
int main()
{
int n, pencacah, nilai;
pencacah = 1;
nilai = 1;
while (nilai <= n)
{
cout << nilai << " ";
nilai = nilai + pencacah;
pencacah = pencacah + 1;
}
return 0;
}
Akhir Kode Sumber
CONTOH 6.9 Buatlah algortima dan pemograman untuk menampilkan deret berikut
dengan menggunakkan struktur pengulangan:
100000000
10000000
1000000
100000
10000
1000
100
10
1
Algortima:
1. Nilai ← 100000000
2. ULANG SELAMA nilai ≥ 1
tampilkan(nilai)
nilai ← nilai / 10
AKHIR-ULANG
Program:
Program C++ yang didasarkan algortima di depan adalah sebagai berikut:
Kode Sumber : bagi10.cpp
#include <iostream.h>
int main()
{
long int nilai;
nilai = 100000000;
while (nilai >= 1)
{
cout << nilai << "\n";
nilai = nilai / 10;
}
return 0;
}
Akhir Kode Sumber
CONTOH 6.10 Sebagiamana telah disebutkan, string dalam C selalu di akhiri dengan
karakter NULL. Berdasarkan fakta tersebut buatlah algoritma dan program yang
pertama-tama meminta suatu string yang terdapat pada string tersebut.
Algortima:
1. masukkan(string)
2. indeks ← 0
3. ULANG SELAMA string[indeks] ≠ NULL
Indeks ← indeks + 1
AKHIR ULANG
4. tampilkan(“Jumlah karakter =”, indeks)
Program:
Translasi algortima dalam program C++ adalah sebagai berikut:
#include <iostream.h>
int main()
{
char string[80];
int indeks;
indeks = 0;
while (string[indeks] != '\0')
{
indeks = indeks + 1;
}
return 0;
}
Akhir Kode Sumber
CONTOH 6.11 Buatlah algoritma dan program untuk menampilkan suatu string yg di
masukkan dari keyboard menjadi terbalik. Contoh jika string yg dimasukkan berupa
Yogya
Maka hasilnya
aygoY
Algoritma:
1. masukkan(string)
2. indeks ← panjang(string) – 1
3. ULANG SELAMA indeks >= 0
tampilkan(string[indeks])
indeks = indeks – 1
AKHIR ULANG
Program:
Penuangan algoritma ke dalam program C ++:
indeks = strlen(string) - 1;
while (indeks >= 0)
{
cout << string[indeks];
indeks = indeks - 1;
}
return 0;
}
Akhir Kode Sumber
#include <iostream.h>
int main()
{
int bil;
for (bil = 1; bil <= 6; bil++)
{
cout << "Selamat belajar\n";
}
return 0;
}
Akhir Kode Sumber
Algoritma:
1. jum ← 0
2. UNTUK bil ← 1 s/d 99
jum ← jum + bil / (bil + 1)
AKHIR-UNTUK
3. tampilkan(jum)
Program :
int main()
{
double jum;
int pencacah, bil;
return 0;
}
Akhir Kode Sumber
CONTOH 6.14Buatlah algoritma untuk menghitung faktorial dengan menggunakan
bentuk UNTUK...UNTUK-AKHIR. Perlu diketahui, suatu factorial didefinisikan seperti
berikut:
n! = n x (n-1) x (n-2) x ... x 2 x 1
Sebagai contoh
2! = 2 x 1 =2
3! = 3 x 2 x 1 = 6
4! = 4 x 3 x 2 x 1 = 24
Setelah Anda membuat algoritmanya, translasikan ke program C++.
Algoritma:
1. masukkan(n)
2. hasil ← 1
3. UNTUK bil ← n S/D LANGKAH -1
hasil ← hasil * bil
AKHIR-UNTUK
4. tampilkan(hasil)
Program:
int main()
{
int bil, n;
long int hasil;
hasil = 1;
for (bil = n; bil >= 1; bil--)
{
hasil = hasil * bil;
}
return 0;
}
Akhir Kode Sumber
int main()
{
long int pokok, bunga;
int tahun;
pokok = 5000000;
for (tahun = 1; tahun <= 8; tahun++)
{
bunga = pokok * 7 / 100;
cout << setw(2) << tahun
<< setw(11) << pokok
<< setw(11) << bunga
<< "\n";
return 0;
}
Akhir Kode Sumber
Contoh 6.16 Buatlah algoritma untuk menampilkan semua bilangan ganjil yang terletak
antara 1 sampai dengan 25 yang tidak habis dibagi 5.
Algoritma :
UNTUK bil ← 1 S/D 25
JIKA sisa_pembagian(bil,5) ≠ MAKA
tampilkan(bil)
AKHIR-JIKA
AKHIR-UNTUK
Program:
int main()
{
int bil;
return 0;
}
Akhir Kode Sumber
CONTOH 6.17Sebuah bilangan prima adalah bilangan bulat yang hanya habis dibagi
dengan 1 atau dirinya sendiri. Berdasarkan ketentuan ini, buatlah algoritma dan
program untuk menentukan sebuah bilangan yang dimasukkan dari keyboard,
termasuk bilangan prima atau bukan.
Algoritma:
Salah satu pemecahan yang paling gampang adalah dengan membagi bilangan
tersebut dengan bilangan dari 1 sampai dengan bilangan itu sendiri. Jika bilangan
tersebut adalah bilangan prima maka bilangan tersebut hanya habis dibagi oleh dua
bilangan, yaitu bilangan 1 dan bilangan itu sendiri. Algoritmanya adalah sebagai
berikut:
1. masukkan(bil)
2. jum = 0
3. UNTUK i ← 1 S/D bil
JIKA sisa_pembagian(i, bil) = 0 MAKA
jum = jum + 1
AKHIR-JIKA
4. JIKA jum = 2 MAKA
tampilkan(“Bilangan prima”)
SEBALIKNYA
tampilkan(“Bukan bilangan prima”)
AKHIR-JIKA
Program:
int main()
{
int bil, jum, i;
jum = 0;
for (i = 1; i <= bil; i++)
if (bil % i == 0)
jum++;
if (jum == 2)
cout << "Bilangan prima\n";
else
cout << "Bukan bilangan prima\n";
return 0;
}
Akhir Kode Sumber
Contoh 6.18
Menurut Lipschutz dan Poe (1982, hal. 87), khusus untuk pengujian bilangan lebih
besar daripada 2, bilangan prima bisa ditentukan dengan memeriksa pembagian dari
2 sampai n/2 saja jika n adalah bilangan yang diuji. Jadi tidak perlu menguji dari 1
sampai dengan n. Tuangkan hal ini dalam bentuk algoritma dan kemudian translasikan
ke dalam program C++.
Algirtma:
1. masukkan(bil)
2. JIKA bil < 2 MAKA
tampilkan(“Bilangan harus lebih besar dari 2”)
hentikan program
AKHIR-JIKA
3. prima ← benar
4. UNTUK i ← 1 S/D bil/2
JIKA sisa_pembagian(i, bil) = 0 MAKA
prima ← salah
keluar dari UNTUK..AKHIR-UNTUK
AKHIR-JIKA
AKHIR-UNTUK
5. JIKA prima = benar MAKA
tampilkan(“Bilangan prima”)
SEBALIKNYA
tampilkan(“Bukan bilangan prima”)
AKHIR-JIKA
Program:
int main()
{
int bil, i, prima;
if (bil < 2)
{
cout << "Bilangan harus lebih besar dari 2\n";
exit(1); // Akhiri program dg nilai keluar = 1
}
if (prima)
cout << "Bilangan prima\n";
else
cout << "Bukan bilangan prima\n";
return 0;
}
Akhir Kode Sumber
Contoh 6.18 Buatlah algoritma dan program yang meminta sebuah bilangan bulat
dimasukkan dari keyboard dan kemudian menampilkan semua bilangan yang menjadi
faktor pembagi bilangan tersebut. Contoh, bila bilangan yang dimasukkan adalah 12,
maka hasilnya berupa:
Pembagi 12:
1
2
3
4
6
12
Algoritma:
1. masukkan(bil)
2. tampilkan(“Pembagi”, n,”:””)
3. UNTUK i ←1 S/D n
JIKA sisa_pembagian(i,bil) = 0 MAKA
tampilkan(bil)
AKHIR-JIKA
AKHIR-UNTUK
Program:
int main()
{
int bil, i, prima;
return 0;
}
Contoh 6.19 Tuliskan algoritma yang membaca data dari keyboard secara terus-
menerus sampai nilai -99999 dimasukkan dan kemudian menampilkan nilai
terbesarnya dan nilai rata-ratanya. Setelah itu translasikan ke dalam program C++.
Algoritma:
1. selesai← SALAH
2. pencacah ← 0
3. jum ← 0
4. ULANGAN SELAMA selesai = SALAH
masukan(bil)
JIKA bil = -99999 MAKA
selesai ← BENAR
SEBALIKNYA
pencacah ← pencacah + 1
jum ← jum + bil
JIKA pencacah = 1 MAKA
terbesar ← bil
SEBALIKNYA
JIKA bil > terbesar MAKA
tebesar ← bil
AKHIR-JIKA
AKHIR-JIKA
AKHIR-JIKA
AKHIR-ULANG
5. JIKA pencacah = 0 MAKA
tampilkan(“tak ada data yang dimasukkan”)
SEBALIKNYA
rata_rata ← jum / pencacah
tampilkan(“terbesar =”,terbesar)
tampilkan(“rata-rata=”,rata-rata)
AKHIR-JIKA
Program:
Adapun implementasi dalam C++ adalah seperti berikut:
int main()
{
int selesai, pencacah;
double jum, bil, terbesar, rata_rata;
while (!selesai)
{
cout << "Masukkan bilangan (Akhiri dengan -9999): ";
cin >> bil;
if (bil == -9999)
selesai = 1; // berarti selesai
else
{
pencacah++;
jum += bil;
if (pencacah == 1)
terbesar = bil;
else
if (bil > terbesar)
terbesar = bil;
}
}
if (pencacah == 0)
cout << "Tak ada data yang dimasukkan\n";
else
{
rata_rata = jum / pencacah;
cout << "Terbesar = " << terbesar << "\n";
cout << "Rata-rata = " << rata_rata << "\n";
}
return 0;
}
Akhir Kode Sumber
SEBALIKNYA
sinx ← sinx + hasil_pangkat / faktorial
AKHIR-JIKA
AKHIR-UNTUK
4. tampilkan(sinx)
Program:
Program C++ nya adalah sebagai berikut:
int main()
{
double sinx, x, hasil_pangkat, faktorial;
int i, j;
sinx = x;
for (i = 2; i <= 10; i++)
{
// --- Hitung (2i-1)! ---
faktorial = 1;
for (j = 2*i-1; j >= 1; j--)
faktorial = faktorial * j;
// --- x pangkat (2i-1) ---
hasil_pangkat = 1;
for (j = 1; j <= (2*i-1); j++)
hasil_pangkat *= x;
return 0;
}
Akhir Kode Sumber
Contoh 6.21 Tulislah algoritma untuk membuat segitiga yang di susun dari simbol *
dengan tinggi segitiga di tentukan melalui keyboard. Beberapa contoh hasilnya di
perlihatkan di bawah ini.
* * *
** ** **
*** *** ***
**** **** ****
***** *****
******
Tinggi = 4 Tinggi = 5 Tinggi = 6
Gambar 6.19Gambaran segitiga berpola*
Program:
Adapun implementasi dalam C++ adalah seperti berikut:
int main()
{
int i, j, tinggi;
return 0;
}
Akhir Kode Sumber
Algoritma:
1. Masukkan (tinggi)
2. UNTUK i ← 1 S/D tinggi
bil ← i
UNTUK j ← 1 S/D i
tampilkan (bil) // Tanpa pindah baris
bil ← bil + tinggi – j
AKHIR – UNTUK
tampilkan (karakter_pindah_baris) // Untuk berpindah baris
AKHIR – UNTUK
Int main ()
{
int I, j, tinggi, bil;
return 0;
}
int main ()
{
int i, j, jum_baris, jum_kolom, bil;
cout << “masukkan jumlah baris: “;
cin >> jum_baris;
return 0;
}
Akhir Kode Sumber
int main ()
{
int i, n;
double jum;
jum = 1;
for (i = 2; i <= n; i++)
if (i % 2 == 0)
jum = jum – 1.0 / i;
else
jum = jum + 1.0 / i;
Alternatif lain:
Alternatif lain untuk menyelesaikan persoalan di depan adalah dengan tanpa memeriksa
bilangan genap atau bilangan ganjil. Cara detailnya diperlihatkan pada algoritma berikut:
1. masukkan(n)
2. tanda ← -1
3. jum ← 1
4. UNTUK i ← 2 S/D n
jum ← jum + tanda / i
tanda ← -tanda
AKHIR – UNTUK
tampilkan(jum)
Dengan memberikan
tanda ← -tanda
isi tanda akan berubah menjadi -1, 1, -1, 1, -1, dan seterusnya.
int main ()
{
int i, n;
double jum, tanda;
tanda = -1;
jum = 1;
for (i = 2; i <= n; i++)
{
Jum = jum + tanda / i;
Tanda = -tanda;
}
return 0;
}
Contoh 6.25 Buatlah algoritma dan program yang membaca suatu string dari keyboard dan
kemudian tampilkan semacam berikut:
Yogyakarta
ogyakarta
gyakarta
yakarta
karta
arta
rta
ta
a
#include <iostream.h>
#include <string.h>
int main ()
{
int i, j, panjang;
char string [80];
return 0;
}
Algoritma:
1. masukkan(string)
2. jum ← 0
3. UNTUK i ← 0 S/D panjang(string)-1
kar ← string[i]
JIKA kar ≥ “ A” DAN kar ≤ “Z” MAKA
jum ← jum + 1
AKHIR – JIKA
AKHIR – UNTUK
4. tampilkan(jum)
#include <iostream.h>
#include <string.h>
int main ()
{
int i, jum;
char string [80] ;
jum = 0;
for (i = 0; i < (int) strlen (string) ; i++)
{
Kar = string [i] ;
If ((kar >= ‘A’) && (kar <= ‘Z’))
Jum++;
}
return 0 ;
}
Akhir Kode Sumber
Contoh 6.27Buatlah algoritma dan program yang meminta sebuah kalimat dimasukkan dari
keyboard dan kemudian menampilkan masing – masing karakter dengan ketentuan sebagai
berikut:
• Huruf kecil diubah ke huruf capital
• Huruf capital diubah ke huruf kecil
Perlu diketahui, huruf kecil dan huruf capital yang setara meiliki selisih nilai ASCII sebesar 32.
Contoh:
• Nilai ASCII A adalah 65
• Nilai ASCII a adalah 97
Algoritma:
1. masukkan(string)
2. UNTUK i ← 0 S/D panjang(string)-1
kar ← string[i]
JIKA kar ≥ “A” DAN kar ≤ “Z” MAKA
Nilai ASCII = ASCII(kar) + 32
tampilkan(karakter_bernilai_ASCII_berupa_nilai ASCII)
SEBALIKNYA
JIKA kar ≥ “a” DAN kar ≤ “z” MAKA
Nilai ASCII = ASCII(kar) - 32
tampilkan(karakter_bernilai_ASCII_berupa_nilai ASCII)
SEBALIKNYA
tampilkan(kar)
AKHIR-JIKA
AKHIR-JIKA
AKHIR-UNTUK
3. tampilkan(karakter_pindah_baris)
#include <iostream.h>
#include <string.h>
int main ()
{
int i;
char straing [80];
char kar ;
return 0;
}
Contoh 6.28 Deret Fibonacci memiliki nilai suku pertama dan suku kedua berupa 1. Nilai suku
– suku berikutnya ditentukan oleh dua suku sebelumnya. Contoh:
1 1235813 …
Tuliskan algoritma dan program untuk menampilkan deret Fibonacci sampai nilai suku
terakhir tidak lebih dari 200.
Algoritma:
1. fn1 ← 1
2. fn2 ← 1
3. tampilkan(1)
4. tampilkan(1)
5. fn ← fn1 + fn2
6. ULANG SELAMA fn ≤ 200
tampilkan(fn)
fn2 = fn1
fn1 = fn
fn ← fn1 + fn2
AKHIR-ULANG
#include <iostream.h>
int main ()
{
int fn, fn1, fn2;
fn1 = 1;
fn2 = 1;
cout << 1 << “ “ ;
cout << 1 << “ “ ;
fn = fn1 + fn2;
while (fn <= 200)
{
cout << fn << “ “;
fn2 = fn1;
fn1 = fn;
fn = fn1 + fn2;
}
return 0;
}
Contoh 6.29 Salah satu metode untukmenghitung depresiasi adalah metode jumlah – digit.
Sebagai contoh, suatu computer seharga 150 juta hendak di depresiasi selama 5 tahun. Mula
– mula digit tahun dijumlahkan seperti berikut:
JUM = 1 + 2 + 3 + 4 + 5 = 15
Berdasarkan uraian tersebut, tulis algoritma dan program yang meminta BIAYA dan jumlah
TAHUN dan kemudian menampilkan depresiasi per tahun semacam berikut:
1. 50000000
2. 40000000
3. 30000000
4. 20000000
5. 10000000
JUM=1+2+3+…+n
= n (n + 1)/2
Algoritma:
1. masukkan(biaya, tahun)
2. jum ← n x (n + 1) / 2
3. UNTUK i ← 1 S/D tahun
depresiasi ← (tahun + 1 – i) / jum x biaya
tampilkan (i, depresiasi)
AKHIR-UNTUK
#include <iostream.h>
#include <iomanip.h>
int main ()
{
long int biaya;
int i, jum, tahun;
double depresiasi;
return 0;
}
Akhir Kode Sumber
Contoh 6.30 Buatlah algoritma dan program untuk mengubah suatu tahun ke dalam bentuk
angka romawi. Sebagai contoh, jika bilangan yang dimasukkan dari keyboard adalah 1987
maka hasilnya berupa MCMLXXXVII. Batasilah angka yang dimasukkan berkisar antara 1
sampai dengan 3999.
Algoritma:
Sebelum membicarakan algoritmanya, perlu diketahui bahwa angka romawi hanya mengenal
symbol – symbol M, D, C, L, X, V, dan I dengan masing – masing symbol bernilai seperti tertera
pada table berikut:
Simbol Nilai
M 1000
D 500
C 100
L 50
X 10
I 1
Semua angka romawi disusun atas kombinasi simbol – simbol tersebut. Tentu saja angka
romawi hanya cocok untuk bilangan yang tidak terlalu besar, misalnya untuk menyatakan
tahun. Hal lain yang perlu diperhatikan adalah cara mengonversi bilangan seperti 900 yang
dibentuk menjadi CM; bukan DCCCC. Begitu juga angka seperti 4 akan diterjemahkan menjadi
IV dan bukan IIII.
1. masukkan(tahun)
2. JIKA tahun < 1 ATAU tahun > 3999 MAKA
tampilkan(“Tahun harus dalam jangkauan 1 … 3999”)
SEBALIKNYA
ULANG SELAMA tahun >= 1000
tampilkan(“M”)
tahun ← tahun – 1000
AKHIR -ULANG
#include <iostream.h>
int main ()
{
int tahun;
if (tahun >= 5)
{
if (tahun == 9)
{
cout << “IX”;
tahun = tahun – 9;
}
else
{
cout << “v”;
tahun = tahun – 5;
}
}
return 0;
}
Akhir Kode Sumber
BAB 7
Larik
Larik A 1 2 3 4
Gambar 7.1 Gambaran larik
Pada contoh diatas, larik A memiliki empat buah elemen.Untuk menyatakan sebuah
elemen dalam larik, anda bisa menggunakan notasi berikut:
A[indeks]
Dalam hal ini indeks digunakan untuk menyatakan posisi elemen. Posisi
pertama diberi kode 0, posisi kedua diberi kode 1, dan seterusnya. Gambar 7.2
menjelaskan notasi untuk seluruh elemen dalam larik A.
Indeks
0 1 2 3
Larik A 1 2 3 4
A[3]
A[2]
A[1]
A[0]
Gambar 7.2 Notasi untuk mengakses sebuah elemen dalam larik
Contoh berikut menunjukkan cara menampilkan elemen pada larik A dengan
indeks sama dengan 2:
tampilkan(A[2])
Adapun
A[2] ←0
Deklarasi Keterangan
Perlu diketahui, larik yang telah dibahas di depan adalah contoh larik berdimensi satu.
Catatan Pada C dan C++ terdapat larik dengan dimensi lebih dari satu. Larik seperti
ini akan dibahas belakangan.
int main ()
{
char kar [5];
int i;
int main()
{
char kar[] = {'A', 'E', 'I', 'O', 'U'};
return 0;
}
Akhir Kode Sumber
Contoh 7.2 Buatlah algoritma dan program untuk menyiapkan data berikut ke dalam
larik:
10 4 2 5 3 8 9 2 9 5
Kemudian carilah bilangan yang terbesar.
Algoritma:
1. Data ← [10, 4, 2, 3, 8, 9, 2, 9, 5]
2. terbesar ← Data [0]
3. UNTUK i ← 1 S/D 9
JIKA Data [i] > terbesar MAKA
terbesar ← Data [i]
AKHIR- JIKA
AKHIR-UNTUK
4. tampilkan(terbesar)
Mula – mula variable terbesar diisi dengan elemen pertama larik Data.
Selanjutnya semua elemen kedua hingga yang terakhir dibandingkan dengan isi
variableterbesar. Kalau nilai elemen tersebut lebih besar daripada variabel
terbesar maka isinya diberikan ke variabel terbesar.
Program:
Penuangan dalam program C++.
#include <iostream.h>
int main ()
{
int data [] = {10, 4, 2, 5, 3, 8, 9, 2, 9, 5};
int i;
int terbesar;
terbesar = data [0];
for (i = 1; i < 10; i++)
if (data [i] > terbesar)
terbesar = data [i];
#include <iostream.h>
int main ()
{
double data [10];
int i, jumdata;
char jawaban;
jumdata = 0;
for (i = 0; i < 10; i++)
{
cout << “Masukkan sembarang bilangan : “;
cin >> data [i];
return 0;
}
Contoh 7.4 Berdasarkan larik pada Soal 7.3, tuliskan algoritma untuk memperoleh
nilai rata – ratanya.
Algoritma:
1. jumdata ← 0
2. UNTUK i ← 0 S/D 9
masukkan (Data [i])
tampilkan (“Memasukkan lagi (Y/T) ? “)
masukkan (jawaban)
JIKA jawaban = “T” atau “t” MAKA
jumdata ← i + 1
keluar dari pengulangan
AKHIR – JIKA
AKHIR – UNTUK
3. jumtotal = 0
4. UNTUK i ← 0 S/D jumdata – 1
jumtotal ← jumtotal + Data [i]
AKHIR-UNTUK
5. rata_rata ← jumtotal / jumdata
6. tampilkan(rata_rata)
langkah kedua digunakan untuk memasukkan data dengan maksimal sebanyak 10
buah. Langkah keempat digunakan untuk untuk menjumlahkan isi semua elemen larik.
Langkah kelima dipakai untuk menghitung nilai rata – rata.
Program:
Penuangan dalam program C++
#include <iostream.h>
int main ()
{
double data [10];
int i, jumdata;
char jawaban;
double jumtotal, rata_rata;
jumdata = 0;
for (i = 0; i <10; i++)
{
cout << “Masukkan sembarang bilangan: “;
cin >> data [i];
return 0;
}
Akhir Kode Sumber
Contoh 7.5 Buatlah algoritma dan program untuk menampilkan nama bulan
berdasarkan kode bulan. Misalnya, 1 berarti “Januari”, 2 berarti “Februari”, dan
sebagainya. Gunakan larik untuk menyimpan nama bulan.
Algoritma:
1. Nama_bulan = [“”, “Januari”, “Februari”, “Maret”, “April”, “Mei”,“Juni”, “Juli”,
“Agustus”, “September”, “Oktober”,“November”, “Desember”]
2. masukkan(kode_bulan)
3. JIKA kode_bulan ≥ 1 DAN kode_bulan ≤ 12 MAKA
tampilkan (Nama_bulan [kode_bulan – 1]
SEBALIKNYA
tampilkan (“Kode bulan harus berada antara 1 s/d 12”)
AKHIR-JIKA
Perlu diketahui, elemen pertama dalam larik Nama_bulan segaja diisi dengan string
kosong dengan maksud agar Nama_bulan dapat diakses dengan bentuk:
Nama_bulan [kode-bulan]
dengan kode-bulan berkisar antara 1 sampai dengan 12.
Program:
Penuangan dalam program C++:
#include <iostream.h>
int main ()
{
char nama_bulan [] [10] = { “”, “Januari”, “Februari”,
“Maret”, “April”, “Mei”,
“Juni”, “Juli”, “Angustus”,
“September”, “Oktober”,
“November”, “Desember”};
int kode_bulan;
Contoh 7.6 Buatlah algoritma dan program untuk menampilkan permutasi dari tiga
orang bernama “Budi”, “Andri”, dan “Permana”.
Algoritma:
Algoritma untuk mendapatkan pasangan dari tiga orang tersebut dengan susunan
boleh dibolak – balik adalah seperti berikut:
1. Nama ← [“Budi”, “Andri”, “Purnama”]
2. UNTUK i ← 0 S/D 2
UNTUK j ← 0 S/D 2
JIKA i ≠ j MAKA
UNTUK k = 0 S/D 2
JIKA i ≠ k DAN j ≠ k MAKA
tampilkan (Nama[i], Nama[j], Nama[k])
AKHIR-JIKA
AKHIR-UNTUK
AKHIR-JIKA
AKHIR-UNTUK
AKHIR-UNTUK
Program:
Implementasi dalam C++:
#include <iostream.h>
int main ()
{
char nama [] [10] = { “Budi”, “Andri”, “Permana”};
int i, j, k;
Tuliskan algoritma dan program untuk menjumlahkan elemen pada kedua larik yang
memiliki posisi sama dan menaruhnya ke larik ketiga. Setelah itu tampilkan seluruh
elemen pada ketiga tersebut.
Algoritma:
1. A ← [1, 2, 3, 5, 6, 8]
2. B ← [4, 6, 1, 5, 2, 8]
3. UNTUK i ← 0 S/D 5
C [i] ← A [i] + B [i]
AKHIR-UNTUK
4. UNTUK i ← 0 S/D 5
tampilkan (C [i])
AKHIR-UNTUK
Program:
Penuangan dalam program C++:
#include <iostream.h>
int main ()
{
int a [6] = {1, 2, 3, 5, 6, 8} ;
int b [6] = {4, 6, 1, 5, 2, 8} ;
int c [6] ;
int i;
for (i = 0; i <= 5; i++)
c [i] = a [i] + b [i];
return 0;
}
Akhir Kode Sumber
#include <iostream.h>
int main ()
{
int a [6] = {1, 2, 3, 5, 6, 8} ;
int b [6] = {4, 6, 1, 5, 2, 8} ;
int c [6] ;
int i, j;
int jum_interseksi;
int dicari;
jum_interseksi = 0;
return 0;
}
#include <iostream.h>
int main ()
{
int data [] = {8, 9, 4, 7, 6, 1, 5, 3};
return 0;
}
Akhir Kode Sumber
#include <iostream.h>
int main ()
{
int data [] = {8, 9, 4, 7, 6, 1, 5, 3, 10, 4, 16, 3};
int tmp;
int i;
for (i = 0; i < 11; i += 2)
{
tmp = data [ i ];
data [i] = data [ i + 1];
data [i + 1] = tmp;
}
return 0;
}
Akhir Kode Sumber
7.4 Larik Berdimensi Dua
Gambaran larik berdimensi dua diperlihatkan pada Gambar 7.13. Pada larik seperti itu
setiap elemen di akses melalui dua buah indeks, yaitu indeks baris dan indeks kolom.
0 1 2
Indeks kolom
2
nilai[2][1]
Indeks baris
Gambar 7.13 Larik berdimensi dua
Pada bahasa C dan C++, larik pada contoh Gambar 7.13 dideklarasikan dengan cara
sebagai berikut:
int nilai [4][3];
Untuk mengakses sebuah elemen pada larik tersebut diperlukan notasi seperti
berikut:
Nilai [indek_baris][indek_kolom]
Hal ini berlaku pada algoritma maupun program C dan C++. Dalam hal ini masing –
masing indeks dimulai dari nol.
Contoh 7.11Buatlah algoritma dan program yang menyimpan pasangan data Negara
dan ibukota seperti berikut:
Indonesia Jakarta
Pilipina Manila
Austria Wina
India New Delhi
Iran Taheran
Kemudian tampilkan nama Negara dan ibukotanya, khusus untuk Negara yang
berlawanan dengan I.
Algoritma:
1. Negara [ 0 ] [ 0 ] ← “Indonesia”
2. Negara [ 0 ] [ 1 ] ← “Jakarta”
3. Negara [ 1] [ 0 ] ← “ Pilipina”
4. Negara [ 1 ] [1 ] ← “Manila”
5. Negara [ 2 ] [ 0 ] ← “Austria”
6. Negara [ 2 ] [ 1 ] ← “Wina”
7. Negara [ 3 ] [ 0 ] ← “India”
8. Negara [ 3 ] [ 1 ] ← “New Delhi”
9. Negara [ 4 ] [ 0 ] ← “Iran”
10. Negara [ 4 ] [ 1 ] ← “Taheran”
11. UNTUK baris ← 0 S/D 4
Jika Negara [baris] [0] [0] = “I” MAKA
tampilkan (Negara [baris] [0], Negara [baris] [1])
AKHIR-JIKA
AKHIR-UNTUK
Program:
Adapun penuangan dalam program C++ adalah:
#include <iostream.h>
#include <string.h>
int main ()
{
char Negara [5] [2] [15];
int baris;
return 0;
}
Akhir Kode Sumber
Alternatife lain untuk mengisikan data ke dalam larik Negara dapat ditangani sewaktu
larik tersebut dideklarasikan. Penuangan dalam algoritmanya adalah seperti berikut:
1. Negara ← [[ “Indonesia”, “Jakarta”],
[“Pilipina”, “Manila”],
[“Austria”, “New Delhi”],
[“Iran”, “Taheran”]]
2. UNTUK baris ← 0 S/D 4
JIKA Negara[baris] [0] [0] = “I” MAKA
tampilkan (Negara[baris] [0], Negara [baris] [1])
AKHIR-JIKA
AKHIR-UNTUK
Penuangan dalam program C++:
#include <iostream.h>
#include <string.h>
int main ()
{
char Negara [5] [2] [15] = {{“Indonesia”, “Jakarta”},
{“Pilipina”, “Manila”},
{“Austria”, “Wina”},
{“India”, “New Delhi”},
{“Iran”, “Taheran”}};
return 0;
}
Akhir Kode Sumber
#include <iostream.h>
#include <string.h>
#include <iomanip.h>
int main ()
{
int a [2] [2] = {{6, 7}, {5, 8}};
int b [2] [2] = {{1, 3}, {4, -1}};
int c [2] [2];
int i, j;
return 0;
}
Akhir Kode Sumber
Contoh 7.13 Tuliskan algoritma untuk memasukkan data ke dalam matriks. Semua
data dimasukkan dari keyboard. Mula – mula jumlah baris dan kolom dimasukkan dari
keyboard, dan kemudian semua elemen dimasukkan dari keyboard. Setelah itu
tampilkan semua elemen matriks dalam bentuk susunan matriks.
Selanjutnya teranlasikan ke dalam program C/C++.
Algoritma:
1. masukkan(jum_baris)
2. masukkan (jum_kolom)
3. UNTUK i ← 0 S/D jum_baris – 1
UNTUK j ← 0 S/D jum_kolom – 1
masukkan (A [i] [j])
AKHIR-UNTUK
AKHIR – UNTUK
4. UNTUK i ← 0 S/D jum_baris – 1
UNTUK j ← 0 S/D jum_kolom – 1
tampilkan (A [i], [j]) // Tanpa pindah baris
AKHIR-UNTUK
tampilkan (karakter_pindah_baris)
AKHIR-UNTUK
Program:
Program C++ - nya adalah sebagai berikut:
#include <iostream.h>
#include <iomanip.h>
int main ()
{
int jum_baris, jum_kolom;
int i, j;
// Menampilkan matriks
return 0;
}
Akhir Kode Sumber
3
Gambar 7.17Larik peg dengan tipe elemen berupa struct.
Contoh 7.14 Sepuluh siswa mengikuti ujian dengan nilai hasil berkisar antara 0 sampai
dengan 100. Tulislah algoritma untuk membaca seluruh data tersebut (yang
mencakup nama dan nilai ujian) dan kemudian:
Hitunglah nilai rata – ratanya.
Tampilkan siswa yang gagal (yaitu yang nilainya kurang dari 60).
Setelah itu translasikan ke dalam program C/C++.
Algoritma:
Solusi untuk permasalahan ini dapat dipecahkan dengan menggunakan larik yang
bertipe rekaman. Dalam hal ini rekaman mengandung data nama dan nilai.
Penuangan dalam bentuk algoritma:
1. pencacah ← 0
2. //Membaca data dan memasukkan nama dan nilai ke larik
ULANG SELAMA pencacah < 10
masukkan(Daftar[pencacah] → nama)
ULANG SELAMA BENAR
masukkan (Daftar[pencacah] → nilai)
JIKA Daftar[pencacah] → nilai ≥ 0 DAN ≤ 100 MAKA
keluar dari pengulangan ULANG SELAMA BENAR
SEBALIKNYA
tampilkan (“Nilai harus terletak antara 0 sampai dengan 100”)
AKHIR – JIKA
AKHIR – ULANG
Pencacah ← pencacah + 1
AKHIR ULANG
3. //Awal penghitungan nilai rata-rata
jum ← 0
4. pencacah←0
5. ULANG SELAMA pencacah < 10
jum ← jum + Daftar[pencacah] ® nilai
pencacah ← pencacah + 1
AKHIR-ULANG
6. rata_rata ← jum / 10.0
7. tampilkan(rata_rata)
8. //Menampilkan siswa yang gagal
tampilkan (“Siswa yang gagal”)
9. pencacah ← 0
10. ada_gagal ← 0
11. ULANG SELAMA pencacah ≤ 10
JIKA Daftar [pencacah] → nama < 60 MAKA
ada_gagal ← 1
tampilkan(daftar[pencacah] ® nama)
AKHIR-JIKA
pencacah← pencacah + 1
AKHIR-ULANG
12. JIKA ada_gagal ≠ 0 MAKA
tampilkan (“Tak ada”)
AKHIR – JIKA
#include <iostream.h>
int main ()
{
Struct siswa {
char nama [25];
double nilai;
};
pencacah = 0;
while (pencacah < 10)
{
cout << “Nama siswa: “;
cin >> daftar [pencacah].nama;
while (1)
{
cout << “Nilai: “;
cin >> daftar [pencacah].nilai;
Pencacah++;
}
jum = 0;
pencacah = 0;
while (pencacah < 10)
{
Jum= jum + daftar[pencacah].nilai;
Pencacah++;
}
Pencacah++;
}
if (ada_gagal == 0)
cout << “Tak ada\n”;
return 0;
}
Akhir Kode Sumber
Contoh 7.15 Modifikasilah persoalan zodiac pada Bab 5 dengan melibatkan larik.
Dalam hal data tentang zodiac perlu disimpan pada larik.
Algoritma:
Solusi untuk permasalahan ini dapat dipecahkan dengan menggunakan larik bertipe
struktur, dengan struktur meliputi data nama zodiak (zodiak), tanggal awal zodiac
(tg_awal), bulan awal zodiak (bl_awal), tanggal akhir zodiak (tg_akhir),dan
bulan akhir zodiak(bl_awal).Penuangan dalam program:
1. //Elemen Z terdiri nama, tg_awal, bl_awal, tg_akhir, bl_akhir,
//Selanjutnya Z diisi seperti berikut:
2. Z ← [ [ “Aries”, 21, 3, 19, 4],
[ “Taurus”, 20, 4, 20, 5],
[ “Gemini”, 21, 5, 20, 6],
[ “Cancer”, 21, 6, 22, 7],
[ “Leo”, 23, 7, 22, 8],
[ “Virgo”, 23, 8, 22, 9],
[ “Libra”, 23, 9, 22, 10],
[ “Scorpio”, 23, 10, 21, 11],
[ “Sagitarius”, 22, 11, 21, 12],
[ “Capricorn”, 22, 12, 19, 1],
[ “Aquarius”, 20, 1, 18, 2],
[ “Princes”, 19, 2, 20, 3] ]
3. masukkan(tanggal, bulan).
4. UNTUK i ← 0 S/D 11
JIKA (tanggal ≥ Z [i] → tg_awal dan bulan = Z [i] → bl_awal)
atau
(tanggal ≤ Z [i] → tg_akhir dan bulan = bl_akhir) MAKA
tampilkan (Z [i] → nama)
keluar dari pengulangan
AKHIR – JIKA
AKHIR – UNTUK
Program:
Program dalam C++ -nya adalah seperti berikut:
#include <iostream.h>
int main ()
{
Struct zodiac {
char nama [12];
int tg_awal;
int bl_awal;
int tg_akhir;
int bl_akhir;
};
Return 0;
}
Akhir Kode Sumber
BAB 8
SUBRUTIN
Program
Subrutin_a() Subrutin_b()
Subrutin_b()
Subrutin_C()
Gambar 8.1 Konsep program yang tersusun atas sejumlah subrutin
Program 1
Subrutin fx()
...
4
fx() 2
...
3 5
...
fx()
6
...
Gambar 8.2 Gambaran penghemat kode pada pemanggilan subrutin yang sama
pada beberapa tempat dalam program
hasil = fungsi()
return keliling;
}
C:\progc>kelkotak¿
Keliling = 117.000000
C:\progc>
Program:
Ekivalensi program di atas pada C++ adalah seperti berikut:
#include <iostream.h>
return keliling;
}
int main ()
{
double keliling, panjang, lebar;
panjang = 56.5;
lebar = 2;
return 0;
}
Akhir Kode Sumber
C:\progc>void¿
PT Primasoft Citra Data
C:\progc>
NILAI-BALIK min
AKHIR-SUBRUTIN
C:\progc>terkecil¿
Terkecil dari 35.600000 Dn 78.500000 : 35.600000
C:\progc>
#include <iostream.h>
if (x < y)
min = x;
else
min = y;
return min;
}
int main ()
{
double a, b, c;
a = 35.6;
b = 78.5;
c = terkecil (a, b);
return 0;
}
Akhir Kode Sumber
Contoh 8.4 Buatlah subrutin untuk menentukan suatu bilangan terkecil dalam suatu
larik. Argumen dalam subrutin berupa larik dan jumlah datanya. Implementasi dalam
bentuk algoritma maupun program.
Algoritma:
SUBRUTIN terkecil (X, jum)
min ← X [0]
UNTUK i = 1 S/D jum – 1
JIKA X[i] < min MAKA
min ← X [ i ]
AKHIR-JIKA
AKHIR-UNTUK
NILAI-BALIK min
AKHIR-SUBRUTIN
Pada algoritma di atas, X menyatakan larik dan jumlah menyatakan jumlah elemen
dalam larik.
C:\progc>minim¿
Terkecil = 2.300000
C:\progc>
Program:
Implementasi dalam C++:
#include <iostream.h>
return min;
}
int min ()
{
double y;
double data[] = {578, 67.8, 2.3, 24, 123.5};
return 0;
}
Akhir Kode Sumber
Contoh 8.5 Buatlah subrutin untuk menentukan suatu bilangan termasuk gelap atau
ganjil.
Algoritma:
Subrutin berikut memberikan nilai balik berupa 1 kalau bilangan argument adalah
bilangan ganjil atau nilai balik berupa 0 untuk keadaan sebaliknya.
SUBRUTIN ganjil(bil)
JIKA sisa_pembagian(bil, 2) = 1 MAKA
NILAI-BALIK 1
SEBALIKNYA
NILAI-BALIK 0
AKHIR-JIKA
AKHIR-SUBRUTIN
C:\progc>ganjil¿
1
1
0
C:\progc>
Gambar 8.9 Hasil program ganjil
Program:
Implementasi dalam C++:
#include <iostream.h>
int main ()
{
cout << ganjil (5) << “\n”;
cout << ganjil (7) << “\n”;
cout << ganjil (6) << “\n”;
return 0;
}
Akhir Kode Sumber
Contoh 8.6 Buatlah subrutin dengan nama str2int dengan argument berupa suatu
string yang menyatakan bilangan bulat. Nilai baliknya berupa suatu angka yang
menrupakan hasil konversi string tersebut ke dalam bentuk bilangan. Sekiranya ada
karakter yang tidak menyiratkan bilangan dalam string argument, subrutin
memberikan nilai balik berupa nol. Tanda plus dan negative boleh disertai dalam
argument.
Algoritma:
SUBRUTIN str2int(st)
// Cek kalau string berupa string kosong
JIKA panjang (st) = 0 MAKA
NILAI_BALIK = 0
AKHIR-JIKA
JIKA ok ≠ 0 MAKA
NILAI-BALIK
AKHIR – JIKA
C:\progc>str2int¿
1234567
-1234567
0
C:\progc>
Gambar 8.10 Hasil program str2int
Perhatikan bahwa
str2int (“1.234.567”)
menghasilkan nilai nol mengingat string mengandung tanda titik.
Program:
Implementasi dalam C++:
#include <iostream.h>
#include <string.h>
if (strlen(st) == 0)
return 0;
ok = 1;
if (digit ! = -1)
{
bilangan = bilangan + digit * pengali;
pengali = pengali * 10;
}
else
bilangan = -bilangan;
}
return bilangan;
}
int main ()
{
cout << str2int(“1234567”) << “\n”;
cout << str2int(“-1234567”) << “\n”;
cout << str2int(“1.234.567”) << “\n”;
return 0;
}
Akhir Kode Sumber
Contoh 8.7 Buatlah subrutin bernama kanan yang memiliki dua buah argument
berupa string std an bilangan n. Subrutin ini memberikan nilai ballik berupa string yang
terdiri atas n buah karakter yang terletak di bagian kanan string st. Misal:
kanan (“Yogyakarta”, 5) → “karta”
kanan (“Yogyakarta”, 2) → “ta”
Subrutin ini juga bisa menangani keadaan kalau argument n ternyata melebihi jumlah
karakter dalam string st. Dalam hal ini nilai baliknya berupa string st itu sendiri.
Algoritma:
SUBRUTIN kanan(St, n)
panjang ← panjang (St)
JIKA n < panjang MAKA
n← panjang
AKHIR-JIKA
i←0
UNTUK indek ← panjang – n S/D panjang – 1
StrTemp [i] ← St[indeks]
i←i+1
AKHIR – UNTUK
StrTemp [i + 1] ← 0; //Tanda akhir string
C:\progc>kanan¿
Sinta
evi Sinta
Devi Sinta
C:\progc>
gambar 8.11 Hasil program kanan
Program:
Implementasi dalam C++:
#include <iostream.h>
#include <string.h>
panjang = strlen(st);
if (n > panjang)
n = panjang;
i = 0;
for (indeks = panjang – n ; indeks < panjang; indeks++)
{
strTemp[i] = st[indeks];
i++;
}
strTemp[i + 1] = 0;
return (char *)strTemp;
}
int main ()
{
cout<< kanan(“Devi Sinta”, 5) << “\n”;
cout << kanan(“Devi Sinta”, 9) << “\n”;
cout << kanan(“Devi Sinta”, 15) << “\n”;
return 0;
}
Akhir Kode Sumber
Contoh 8.8 Buatlah subrutin bernama ulang dengan argument berupa string st
dan bilangan n. sebagai contoh, pemanggilan
ulang (“a”, 5)
akan memberikan nilai balik berupa “aaaaa”. Dengan kata lain, nilai baliknya berupa
string yang merupakan pengulangan st sebayank 5 kali.
Dengan demikian
ulang (“ha”, 5)
memberikan hasil berupa “hahahahaha”.
Algoritma:
SUBRUTIN ulang (St, n)
panjang ← panjang (St)
JIKA panjang = 0 MAKA
NILAI-BALIK ‘’’’ // String kosong
AKHIR- JIKA
posisi ← 0
UNTUK i ← 0 S/D panjang – 1
UNTUK j ← 0 S/D panjang – 1
StrTemp [posisi] ← St [j]
posisi ← posisi + 1
AKHIR-UNTUK
AKHIR – UNTUK
StrTemp [posisi] ← 0; // Tanpa akhir string
NILAI – BALIK StrTemp
AKHIR – SUBRUTIN
Contoh hasil pengeksekusian program:
C:\progc>ulang¿
++++++++
HAHAHAHA
BLABLABLA
C:\progc>
Gambar 8.12 Hasil program ulang
Program:
Implementasi dalam C++:
#include <iostream.h>
#include <string.h>
if (panjang == 0)
return (char *) 0;
posisi = 0;
for (i = 0; i < n; i++)
for (j = 0; j < panjang; j++)
{
strTemp[posisi] = st[j];
posisi++;
}
strTemp[posisi] = 0;
int main ()
{
cout << ulang(“+”, 8) << “\n”;
cout << ulang(“HA”, 4) << “\n”;
cout << ulang(“BLA”, 3) << “\n”;
return 0;
}
Akhir Kode Sumber
jum_titik ← panjang / 3
JIKA jum_titik = 0 MAKA
NILAI – BALIK St // String St sendiri
AKHIR – JIKA
panjang ← panjang -3
AKHIR-ULANG
NILAI-BALIK StrTemp
AKHIR – SUBRUTIN
C:\progc>ribuan¿
9.776.543
C:\progc>
#include <iostream.h>
#include <string.h>
panjang = strlen(st);
if (panjang == 0)
return (char *) 0;
jum_titik = panjang / 3;
if (jum_titik == 0)
return (char *) st;
strTemp[posisiTemp] = ‘-‘;
posisiTemp--;
panjang = panjang – 3;
}
if (panjang > 0)
for (i = 0; i < panjang; i++)
strTemp[i] = st[i];
strTemp[jumKar] = 0;
int main ()
{
cout << format_ribuan(“9776543”) << “\n”;
return 0;
}
Akhir Kode Sumber
Contoh 8.10 Buatlah subrutin untuk menghitung sisi miring segitiga siku – siku.
Implementasikan pula pada program C dan C++.
Algoritma:
SUBRUTIN sisi_miring(x, y)
NILAI – BALIK akar(kuadrat(x) + kuadrat(y))
AKHIR – SUBRUTIN
C:\progc>sisimir¿
5.000000
C:\progc>
#include <iostream.h>
#include <math.h>
int main ()
{
cout << sisi_miring(3,4) << “\n”;
return 0;
}
Akhir Kode Sumber
C:\progc>tukar¿
a = 12.300000, b = 56.700000
C:\progc>
#include <iostream.h>
z = *x;
*x = *y;
*y = z;
}
int main ()
{
double a, b’
a = 56.7;
b = 12.3;
tukar(&a, &b);
return 0;
}
Akhir Kode Sumber
Secara khusus C++ memiliki penanganan tersendiri (yang tidak terdapat pada C) untuk
melakukan pemanggilan dengan referensi yaitu dengan menggunakan referensi.
Referensi adalah jenis pointer khusus yang memungkinkan suatu pointer diperlikan
seperti variabel biasa (non – pointer). Referensi dinyatakan dengan tanda &. Berikut
adalah contoh implementasi pertukaran data yang didasarkan pada algoritma di
depan:
void tukar(double *x, double *y)
{
double z;
z = x;
x = y;
y = z;
}
Perhatikan bahwa tanda & hanya diberikan dalam daftar parameter, sedangkan pada
tubuh fungsi parameter tidak ditulis dengan &.
Selanjutnya untuk melakukan pemanggilan terhadap tukar () cukup dilakukan
dengan cara seperti berikut:
Tukar(a, b);
Perhatikan bahwa tidak ada penulisann & di dalam argumen.
Berikut adalah contoh program untuk menguji fungsi tukar () yang memakai
referensi:
#include <iostream.h>
z = x;
x = y;
y = z;
}
int main ()
{
double a, b’
a = 56.7;
b = 12.3;
tukar(a, b);
return 0;
}
Akhir Kode Sumber
BAB 9
REKURSI
Catatan Stack adalah area memori yang dipakai untuk variabel local dan untuk
mengalokasikan memori ketika suatu fungsi dipanggil.
Persoalan rekursi biasa dijumpsi pada matematika. Sebagai contoh, proses rekursi
dapat digunakan untuk menghitung factorial. Dalam hal ini suatu factorial m!
didefinisikan sebahai berikut:
1, jika m = 0 atau m =1
m!
4 * faktorial(3)
3 * faktorial(2)
2 * faktorial(1)
faktorial(1)
#include <stdio.h>
int main ()
{
int n;
long int hasil;
cout << “n = “;
cin >> n;
hasil = faktorial(n);
return 0;
}
Akhir Kode Sumber
Contoh 9.2 Fungsi Fibonacci dapat dinyatakan dalam bentuk rekursif seperti berikut:
fib(n) = 0, untuk n = 0
fib(n) = 1, untuk n = 1
fib(n) = fib(n-1) + fib(n-2), untuk n > 1
Contoh hubungan antara n dan hasil fungsi:
n fib(n)
0 0
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
… …
fib(6) = fib(5) + fib(4)
fib(3) + fib(2)
fib(4) + fib(3)
fib(1) + fib(0)
fib(2) + fib(1)
fib(1) + fib(0)
fib(1) + fib(0)
#include <iostream.h>
long int fib(unsigned int n)
{
if (n == 0)
return 0;
else
if ( n == 1)
return 1;
else
return fib(n-1) + fib(n-2)
}
int main ()
{
int n;
long int hasil;
cout << “n = “;
cin >> n;
hasil = fib(n);
cout << “fib( “ << n << “) = “ << hasil;
return 0;
}
Akhir Kode Sumber
Contoh 9.3 Y” dengan n berupa bilangan bulat lebih besar daripada nol dapat dihitung
secara rekursif dengan menggunakan acuan seperti berikut:
• Y” = Y, untuk n = 1
• Y” = Y x Yn-1, untuk n ≠ 1
Gambar 9.6 memperlihatkan ilustrasi penghitungan Y4.
pangkat(2,4) Hasil akhir 16
2 * pangkat(2,3)
2 * pangkat(2,2)
2 * pangkat(2,1)
pangkat(2,1)
Tuangkan dalam bentuk algoritma maupun program.
Algoritma:
SUBRUTIN pangkat(y, n)
JIKA n = 1 MAKA
NILAI-BALIK y
SEBALIKNYA
NILAI-BALIK y x pangkat(y, n-1)
AKHIR – JIKA
AKHIR – SUBRUTIN
#include <iostream.h>
int main ()
{
int y, n;
long int hasil;
cout << “Menghitung y pangkat n\n”;
cout << “y = “;
cin >> y;
cout << “n = “;
cin >> n;
return 0;
}
Akhir Kode Sumber
Contoh 9.4 Buatlah subrutin untuk membalik suatu bilangan dengan cara rekursi.
Sebagai contoh, bilangan 7895 ditampilkan menjadi 5987.
Algoritma:
SUBRUTIN balik(bil)
tampilkan(sisa_pembagian(n, 10)
digitTersisaDiKiri = bil / 10;
JIKA DigitTersisaDiKiri ≠ 0 MAKA
Balik(DigitTersisaDiKiri)
AKHIR-JIKA
AKHIR-SUBRUTIN
Contoh pengeksekusian program:
Implementasi dalam program C++:
#include <iostream.h>
int main ()
{
int bil;
balik(bil);
return 0;
}
Akhir Kode Sumber
Contoh 9.5 L adalah larik yang berisi n buah elemen. Buatlah subrutin maks(L, n,
k) yang akan menghasilkan bilangan terbesar pada K elemen pertama dalam larik L.
kerjakan dengan pendekatan rekursi. Contoh, bil L berisi
[5, 6, 3, 5, 8, 3]
Subrutin maks (L, 6, 4) mencari bilangan terbesar dari elemen – elemen 5, 6, 3, 5
(sebanyak 4 buah elemen).
Algoritma:
Algoritma berikut mengasumsikan bahwa n > 0 dengan indeks larik dimulai dari nol:
SUBRUTIN maks (L, n, k)
JIKA k > n MAKA
K←n
AKHIR-JIKA
JIKA k = 1 MAKA
NILAI-BALIK L [0]
SEBALIKNYA
JIKA k > 1 MAKA
JIKA L [k-1] >maks(L, n, k-1) MAKA
NILAI-BALIK L [k-1]
SEBALIKNYA
NILAI-BALIK maks(L, n, k-1)
AKHIR – JIKA
SEBALIKNYA
//Berarti k < 1
NILAI-BALIK -32768
AKHIR-JIKA
AKHIR-JIKA
AKHIR-SUBRUTIN
Pada algoritma di atas, bila nilai k < 1, indeks akan diberi nilai berupa -32768.
Contoh pengeksekusian program:
C:\progc>maxrekur¿
4
6
8
C:\progc>
#include <iostream.h>
if (k==1)
return data[0];
else
if (k > 1)
if (data[k-1] > maka(data, n, k-1)
return data[k-1]
else
return maks(data, n, k-1);
else /* Berarti k < 1 */
return -32768;
}
int main ()
{
int L[] = {1, 4, 6, 2, 8, 5, 2, 4, 3};
return 0;
}
Akhir Kode Sumber
C:\progc>acker¿
6
2
13
C:\progc>
Catatan Fungsi ackerman berjalan lamban untuk m dan n lebih besar dari 3.
#include <iostream.h>
int main ()
{
cout << acker(0, 5) << “\n”;
cout << acker(1, 0) << “\n”;
cout << acker(3, 1) << “\n”;
return 0;
}
Contoh 9.7 Koefisien binomial dapat didefinisikan secara rekursif seperti berikut:
Tuangkan dalam bentuk algoritma dan program.
Algoritma:
Dengan menganggap bahwa nilai k selalu berada antara 0 sampai dengan n, persoalan
di atas dapat ditulis menjadi seperti berikut:
SUBRUTIN binom(n, k)
JIKA k = 0 MAKA
NILAI-BALIK 1
SEBALIKNYA
JIKA k = n MAKA
NILAI-BALIK 1
SEBALIKNYA
NILAI-BALIK binom(n-1, k-1) + binom(n-1, k)
AKHIR – JIKA
AKHIR-JIKA
AKHIR-SUBRUTIN
Contoh pengeksekusian program:
C:\progc>binom¿
1
10
C:\progc>
#include <iostream.h>
int main ()
{
cout << binom(1, 1) << “\n”;
cout << binom(5, 3) << “\n”;
return 0;
}
Contoh 9.8 Menara Hanio adalah persoalan klasik untuk memindahkan tumpukan
piring dari suatu tonggak ke tonggak lain dengan bantuan sebuah tonggak perantara.
Algoritma:
SUBRUTIN Hanoi(n, a, b, c)
JIKA n = 1 MAKA
tampilkan(“memindahkan piring dari”, a, “ke”, c)
SEBALIKNYA
// memindahkan n-1 piring dari a ke b, dengan c sebagai
perantara
hanoi(n-1, a, c, b)
// memindahkan 1 piring tersisa dari a ke c
hanoi(1, a, b, c)
// memindahkan n-1 dari b ke c, dengan a sebagai perantara
hanoi (n-1, b, a, c)
AKHIR-JIKA
AKHIR-SUBRUTIN
Implementasi dalam program C++:
int main ()
{
int jum_piring;
return 0;
}
SUBRUTIN cari(L, n, k)
JIKA n ≤ 0 MAKA
posisi ¬ -1
SEBALIKNYA
ketemu ¬ SALAH
i=0
ULANG SELAMA (i < n-1) DAN (TIDAK ketemu)
JIKA k = L[i]
posisi ¬ i
ketemu ¬ BENAR
SEBALIKNYA
i¬i+1
AKHIR-JIKA
AKHIR-ULANG
JIKA TIDAK ketemu MAKA
posisi ¬ -1
AKHIR-JIKA
AKHIR-JIKA
NILAI-BALIK posisi
AKHIR-SUBRUTIN
Program:
Implementasi dalam C++:
cout << "Posisi " << dicari << " dalam larik data: "
<< cari(data, 8, dicari) << "\n";
return 0;
}
Contoh 10.2 Kembangkan subrutin pada Contoh 10.2 sehingga memiliki 4 argumen
seperti berikut:
SUBRUTIN cari(L, n, k, m)
Dalam hal ini m menyatakan posisi ke-m terhadap data k yang dicari. Misalnya,
L ¬ [10, 9, 4, 6, 3, 4, 2, 5]
Bila dilakukan pemanggilan
cari(L, 6, 4, 2)
maka hasilnya adalah 5, yang menyatakan bahwa nilai 4 yang kedua terdapat pada
indeks 5.
Algoritma :
SUBRUTIN cari(L, n, k, m)
JIKA n ≤ 0 MAKA
posisi ¬ -1
SEBALIKNYA
ketemu ¬ SALAH
i=0
ULANG SELAMA (i < n-1) DAN (TIDAK ketemu)
JIKA k = L[i] MAKA
pencacah ¬ penacacah + 1
JIKA pencacah = m MAKA
posisi ¬ i
ketemu ¬ BENAR
SEBALIKNYA
i=i+1
AKHIR-JIKA
AKHIR-ULANG
JIKA TIDAK ketemu MAKA
posisi ¬ -1
AKHIR-JIKA
AKHIR-JIKA
NILAI-BALIK posisi
AKHIR-SUBRUTIN
Contoh 10.3 Buatlah algoritma dan program untuk melakukan pencarian data pada
suatu larik dengan hasil berupa posisi terkanan dari data yang dicari. Misalnya, L berisi
[6, 2, 7, 2, 5, 8, 4, 2, 9]. Bila yang dicari adalah 2 maka hasilnya berupa 7, yang
menyatakan bahwa 2 terkanan ada pada indeks 7.
Algoritma:
SUBRUTIN cari(L, n, k)
JIKA n ≤ 0 MAKA
posisi ¬ -1
SEBALIKNYA
ketemu ¬ SALAH
i ¬ n-1
ULANG SELAMA (i ≥ 0) DAN (TIDAK ketemu)
JIKA k = L[i] MAKA
posisi ¬ i
ketemu ¬ BENAR
SEBALIKNYA
i¬i–1
AKHIR-JIKA
AKHIR-ULANG
JIKA TIDAK ketemu MAKA
posisi ¬ -1
AKHIR-JIKA
AKHIR-JIKA
NILAI-BALIK posisi
AKHIR-SUBRUTIN
Program:
Implementasi dalam C++:
Contoh 10.4 Tulislah algoritma untuk menghitung jumlah suatu bilangan dalam larik
L yang berisi n buah elemen.
Algoritma:
SUBRUTIN hitung(L, n, k)
jumlah ¬ 0
UNTUK i ¬ 0 S/D n-1
JIKA k = L[i] MAKA
jumlah ¬ jumlah + 1
AKHIR-JIKA
AKHIR-UNTUK
NILAI-BALIK jumlah
AKHIR-SUBRUTIN
Program:
Implementasi dalam C++:
jumlah = 0;
for (i = 1; i < n; i++)
if (data[i] == k)
jumlah++;
return jumlah;
}
int main()
{
int data[8] = { 6, 7, 8, 5, 7, 8, 1, 9};
int dicari = 8;
1. Data yang dicari sama dengan elemen terakhir pada bagian pertama dalam
larik. Jika kondisi ini terpenuhi, data yang dicari berarti ditemukan.
2. Data yang dicari bernilai kurang dari nilai elemen terakhir pada bagian pertama
dalam larik. Pada keadaan ini, pencarian diteruskan pada bagian pertama
3. Data yang dicari bernilai lebih dari nilai elemen terakhir pada bagian pertama
dalam larik. Pada keadaan ini, pencarian diteruskan pada bagian ke dua.
Supaya lebih jelas, perhatikan gambar berikut ini
3 5 6 7 9 10 11 12 15 17 20
Dicari : 12
Gambar 10.5 Pencarian pada data yang telah urut
Mula – mula larik tersebut dipecah menjadi dua bagian seperti berikut.
3 5 6 7 8 9 10 11 12 15 17 20
Elemen
Terakhir pada
Bagian pertama
i = 0;
posisi = -1;
panjang = strlen(st);
while ((i < panjang-1) && posisi == -1)
{
if (st[i] == k)
posisi = i;
i++;
}
return posisi;
}
int main()
{
char kalimat[] = "Hallo kawan";
char dicari = 'k';
cout << "Posisi " << dicari << " dalam string "
<< kalimat << ": "
<< poskar(kalimat, dicari) << "\n";
return 0;
}
Akhir Kode Sumber
Contoh 10.7 Buatlah suatu subrutin bernama gantikar yang menerima tiga argumen
sebagai berikut :
1. Argumen pertama berupa suatu string yang menjadi sumber data bagi pengganti
karakter.
2. Argumen kedua berupa sebuah karakter
3. Argumen ketiga juga berupa sebuah karakter.
Nilai balik subrutin berupa salinan dari string argumen pertama dengan setiap
karakter yang cocok dengan karakter argumen kedua di ganti dengan karakter
argumen ketiga. Perlu diperhatikan, string argumen pertama tidak ikut di ubah.
Contoh :
Algoritma :
SUBRUTIN gantikar (St, c1, c2)
// c1 adalah karakter yang akan diganti
// c2 adalah karakter pengganti
StTemp = St // Salin string
UNTUK i ¬0 S/D panjang (St)
JIKA StTemp [i] = c1 MAKA
StTemp[i] ¬c2
AKHIR – JIKA
AKHIR – UNTUK
NILAI – BALIK
AKHIR – SUBRUTIN
Program :
Implementasi dalam C++:
Kode Sumber C++ :gantikar.cpp
#include <iostream.h>
#include <string.h>
/* Salin string */
strcpy(stTemp, st);
if (stTemp[i] == c1)
stTemp[i] = c2;
int main()
{
char kalimat[] = "Bisa! maka kau bisa";
return 0;
}
Akhir Kode Sumber
Contoh 10.8 Buatlah suatu subrutin untuk menampilkan posisi suatu string dalam
string yang lain. Contoh :
Posstr (“ Kelabu “, “abu “)
memberikan nilai balik berupa 3 yang menyatakan bahwa string “abu” terdapat pada
string “kelabu” pada posisi ke-3 ( posisi pertama dimulai dari nol). Jika string yang
dicari tidak ditemukan, nilai balik berupa -1.
a b u
K e l a b u
0 1 2 3 4 5
Posisi string
“abu “
ditemukan
pada string
“kelabu”
indeks 1¬0
posisi ¬-1
ketemu ¬0
ULANG SELAMA (indeks1 < panjang1) DAN TIDAK ketemu
JIKA panjang2 > (panjang1 – indeks1) MAKA
keluar dari pengulangan
AKHIR – JIKA
indeks3¬indeks1
ketemu ¬1
UNTUK indeks2 ¬0 S/D panjang 2-1
JIKA St[indeks3] = St[indeks2]MAKA
indeks3 ¬indeks3 + 1
SEBALIKNYA
ketemu ¬0
keluar dari pengurangan
AKHIR – JIKA
AKHIR – UNTUK
JIKA ketemu MAKA
posisi ¬indeks1
SEBALIKNYA
indeks1 ¬indeks 1 + 1
AKHIR – JIKA
AKHIR – ULANG
indeks1 = 0;
posisi = -1;
ketemu = 0;
indeks3 = indeks1;
ketemu = 1;
for (indeks2 = 0; indeks2 < panjang2; indeks2++)
{
if (st1[indeks3] == st2[indeks2])
indeks3++;
else
{
ketemu = 0;
break;
}
}
if (ketemu)
posisi = indeks1;
else
indeks1++;
}
return posisi;
}
int main()
{
char kalimat[] = "Daun cemarapun berderai-derai";
char kata1[] = "derai";
char kata2[] = "Dedaunan";
return 0;
}
Akhir Kode Sumber
Contoh 10.9 Terdapat larik yang mengandung n buah nama orang. Tulislah algoritma
yang menampilkan semua nama orang yang mengandung penggalan nama tertentu.
Contoh :
Larik
Dicari nama yang
mengandung ahmad
ahmad dani
Ali hamdani
edi ahmadi
dian
fahmi rahmadi
Hasil
ahmad dani
Gambar 10.13 pencarian menurut penggalan nama.
Algoritma :
SUBRUTIN carinama (Data, n, Nama)
UNTUK i ¬ 0 S/D n-1
JIKA posstr (Data, Nama) ≠ -1 MAKA
tampilkan (Data[i])
AKHIR- JIKA
AKHIR – UNTUK
AKHIR- SUBRUTIN
Algoritma di atas memerlukan subrutin posstr yang telah dibahas didepan
Program :
Implementasi dalam C++:
indeks3 = indeks1;
ketemu = 1;
for (indeks2 = 0; indeks2 < panjang2; indeks2++)
{
if (st1[indeks3] == st2[indeks2])
indeks3++;
else
{
ketemu = 0;
break;
}
}
if (ketemu)
posisi = indeks1;
else
indeks1++;
}
return posisi;
}
void carinama(char data[][35], int n, char nama[])
{
int i;
for (i = 0; i < n; i++)
if (posstr(data[i], nama) != -1)
cout << data[i] << "\n";
}
int main()
{
char daftar_nama[][35] = {"ahmad dani",
"ali hamdani",
"edi ahmadi",
"dian",
"fahmi rahmadi"};
carinama(daftar_nama, 5, "ahmad");
return 0;
}
1 2 3 4 5 6 7 8 9 Urut naik
(Ascending)
9 8 7 6 5 4 3 2 1 Urut turun
(Descending)
25 57 48 37 12 92 80 33
Contoh proses pengurutan dengan urut naik ditunjukkan pada gambar 11.2
sampai dengan gambar 11.3
25 57 48 37 12 92 80 33
Tidak Terjadi
25 57 penukaran
Terjadi
48 57 penukaran
Terjadi
37 57 penukaran
12 57 Terjadi
penukaran
92 92 Tidak Terjadi
penukaran
80 92 Terjadi
penukaran
33 92
Terjadi
penukaran
Tidak Terjadi
25 48 penukaran
Terjadi
37 48 penukaran
Terjadi
12 48 penukaran
48 57 Tidak Terjadi
penukaran
57 80 Tidak Terjadi
penukaran
33 80 Terjadi
penukaran
Jika jumlah data adalah n, maka terjadi n-1 tahap pengurutan. Berarti pada
contoh di depan diperlukan 7 tahap pengurutan. Gambar 11.4 memperlihatkan
keadaan setelah 7 tahap pengurutan dilakukan.
Awal 25 57 48 37 12 92 80 33
Tahap 1 25 48 37 12 57 80 33 92
Tahap 2 25 37 12 48 57 33 80 92
Tahap 3 25 12 37 48 33 57 80 92
Tahap 4 12 25 37 33 48 57 80 92
Tahap 5 12 25 33 37 48 57 80 92
Tahap 6 12 25 33 37 48 57 80 92
Tahap 7 12 25 33 37 48 57 80 92
Program:
Implementasi dalam C++:
cout << "Hasil tahap " << tahap << ": ";
tampilkan_larik(data, n);
}
}
int main()
{
const JUM_DATA = 8;
int i;
int data[] = {25, 57, 48, 37, 12, 92, 80, 33};
bubble_sort(data, JUM_DATA);
/* Hasil pengurutan */
tampilkan_larik(data, JUM_DATA);
return 0;
}
Contoh 11.2 Pada contoh gambar 11.4 terlihat bahwa sebenarnya tidak diperlukan
n-1 tahap untuk mengurutkan data. Pada tahap kelima daata sebenarnya sudah
terurutkan. Oleh karena itu metode bubble-sort dapat diperbaiki agar begitu data
sudah urut dan walaupun n-1 tahap belum terpenuhi, pengurutan segera diakhiri. Hal
ini dapat dilaksanakan dengan melakukan pemeriksaan apakah masih ada penukaran
data atau tidak. Kalau dalam suatu tahap ternyata tidak terjadi pertukaran data, maka
iterasi segera dihentikan. Cobalah untuk mengimplementasikannya.
Algoritma:
SUBRUTIN buuble_sort(L, n)
tahap ¬ 1
ada_penukaran ¬ BENAR
ULANG SELAMA tahap ≤ n-1 DAN ada_penukaran
ada_penukaran ¬ SALAH
UNTUK j ¬ 0 S/D n-tahap-1
JIKA L[j] > L[j+1] MAKA
ada_penukaran ¬ BENAR
//Lakukan penukaran
tmp ¬ L[j]
L[j] ¬ L[j+1]
L[j+1] ¬ tmp
AKHIR-JIKA
AKHIR-UNTUK
tahap ¬ tahap + 1
AKHIR-ULANG
AKHIR-SUBRUTIN
Program:
Implementasi dalam C++:
/* Tukarkan */
tmp = data[j];
data[j] = data[j+1];
data[j+1] = tmp;
}
cout << "Hasil tahap " << tahap << ": ";
tampilkan_larik(data, n);
tahap++;
}
}
int main()
{
const JUM_DATA = 8;
int i;
int data[] = {25, 57, 48, 37, 12, 92, 80, 33};
bubble_sort(data, JUM_DATA);
/* Hasil pengurutan */
return 0;
}
Akhir Kode Sumber
posAwal 67 25
tukarkan
35 posAwal 35
posMin 25 67 tukarkan
27 27
26 posMin 26
(a) (b)
25 25
26 26
posAwal 67 27
tukarkan
posMin 27 posAwal 67 tukarkan
35 posMin 35
(c) (d)
Hasil akhir: 25 26 27 67 35
/* Tukarkan */
tmp = data[posAwal];
data[posAwal] = data[posMin];
data[posMin] = tmp;
int main()
{
const JUM_DATA = 8;
int i;
int data[] = {25, 57, 48, 37, 12, 92, 80, 33};
selection_sort(data, JUM_DATA);
/* Hasil pengurutan */
tampilkan_larik(data, JUM_DATA);
return 0;
}
Akhir Kode Sumber
Contoh 11.4 Bila L adalah larik dengan n elemen, mula-mula L[0] (elemen pertama)
dianggap sebagai kumpulan data yang telah diurutkan, yang terdiri atas 1 buah data.
Kemudian dilakukan penyisipan data dari L[1] sampai dengan L[n-1] ke dalam
kumpulan data dari L[0] sampai dengan L[k-1] dengan 1< k < n. Dalam hal ini
penyisipan dilakukan pada tempat yang tepat sehingga data pada L[0] sampai dengan
L[k] menjadi urut.
Algoritma:
SUBRUTIN selection_sort(L, n)
UNTUK k ¬ 1 S/D n-1
x ¬ L[k]
// Sisipkan x ke dalam L[0...k-1]
1 ¬ k-1
ketemu ¬ SALAH
ULANG SELAMA i ≥ 0 DAN TIDAK ketemu
JIKA x < L[i] MAKA
L[i+1] ¬ L[i]
i ¬ i+1
SEBALIKNYA
ketemu = BENAR
AKHIR-JIKA
L[i+1] ¬ x
AKHIR-ULANG
AKHIR-UNTUK
AKHIR-SUBRUTIN
Program:
Implementasi dalam C++:
data[i+1] = x;
}
}
}
int main()
{
const JUM_DATA = 8;
int i;
int data[] = {25, 57, 48, 37, 12, 92, 80, 33};
insertion_sort(data, JUM_DATA);
// Hasil pengurutan
return 0;
}
Akhir Kode Sumber
// Melakukan penggeseran
for (j = k - 1; j >= kiri; j--)
data[j+1] = data[j];
// Tempatkan x ke data[kiri]
data[kiri] = x;
}
}
int main()
{
const JUM_DATA = 8;
int i;
int data[] = {25, 57, 48, 37, 12, 92, 80, 33};
binary_insertion(data, JUM_DATA);
// Hasil pengurutan
return 0;
}
Akhir Kode Sumber
pivot ® L[0] = 5
5 1 3 2 6 4 3 7
i j
Setelah digerakkan ke
kanan sampai L[i\ ≥ 5
dan setelah j digerakkan
5 1 3 2 6 4 3 7
ke kiri sampai L[j] ≤ 5
i j
i j
Setelah digerakkan ke
kanan sampai L[i\ ≥ 5
3 1 3 2 4 6 5 7 dan setelah j digerakkan
ke kiri sampai L[j] ≤ 5
i j
i j
Setelah digerakkan ke
kanan sampai L[i\ ≥ 5
3 1 3 2 4 6 5 7 dan setelah j digerakkan
ke kiri sampai L[j] ≤ 5
j i
Mengingat sekarang i < j tidak lagi berlaku, maka
nilai balik berupa j. Dengan demikia pembagian
larik adalah seperti berikut
5 1 3 2 4 6 5 7
L[0,4] L[5,7]
Gambar 11.12 Ilustrasi pemartisian larik
Bila masing-masing bagian dikenakan operasi pemartisian, akhirnya akan diperoleh
data yang urut.
Program:
Implementasi dalam C++:
x = data[p];
i = p;
j = r;
while (1)
{
while (data[j] > x)
j = j - 1;
if (i < j)
{
// Tukarkan data
tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
else
return j;
}
}
if (p < r)
{
q = partisi(data, p, r);
quick_sort(data, p, q);
quick_sort(data, q+1, r);
}
}
int main()
{
const JUM_DATA = 9;
int i;
int data[] = {25, 57, 48, 37, 12, 92, 80, 33, 1};
quick_sort(data, 0,JUM_DATA-1);
// Hasil pengurutan
return 0;
}
Akhir Kode Sumber