1/40
Pendahuluan
2/40
Bagian 1
Perkenalan Pemrograman
3/40
Apa itu Program?
Program
Serangkaian instruksi yang dieksekusi oleh mesin untuk mencapai
suatu tujuan tertentu.
4/40
Pemrograman dan Bahasa Pemrograman
5/40
Bagaimana Komputer Menjalankan Program?
6/40
Bagaimana Komputer Menjalankan Program?
(lanj.)
7/40
Bagaimana Komputer Menjalankan Program?
(lanj.)
8/40
Kompilator
9/40
Mengapa C++?
10/40
Bagian 2
Petunjuk Mempersiapkan
Lingkungan Belajar
11/40
Instalasi Dev C++ (Windows)
12/40
Instalasi Dev C++ (Windows)
13/40
Instalasi Dev C++ (Windows) (lanj.)
• Berikut ini adalah tampilan dari
https://sourceforge.net/projects/orwelldevcpp
• Tekan ”Download” untuk mendapatkan Dev C++.
14/40
Instalasi Dev C++ (Windows) (lanj.)
15/40
Instalasi Dev C++ (Windows) (lanj.)
• Baca persetujuan yang ditampilkan.
• Setelah Anda menyetujui, tekan ”I Agree”.
16/40
Instalasi Dev C++ (Windows) (lanj.)
17/40
Instalasi Dev C++ (Windows) (lanj.)
• Atur di mana Anda hendak menyimpan Dev C++.
• Ingat di mana lokasinya, lalu tekan ”install”.
18/40
Instalasi Dev C++ (Windows) (lanj.)
19/40
Instalasi Dev C++ (Windows) (lanj.)
20/40
Instalasi Dev C++ (Windows) (lanj.)
• Jika kalian menjalankan program Dev C++, akan muncul
jendela untuk pengaturan.
• Setelah selesai mengatur, muncul tampilan berikut:
21/40
Lingkungan Pemrograman
22/40
Perkenalan Notepad++
23/40
Instalasi Notepad++ (Windows)
• Buka kembali browser kalian, dan kunjungi
http://notepad-plus-plus.org/download/v6.7.html
24/40
Instalasi Notepad++ (Windows) (lanj.)
• Jalankan installer Notepad++ yang baru kalian unduh.
• Akan muncul tampilan sebagai berikut:
25/40
Instalasi Notepad++ (Windows) (lanj.)
26/40
Menulis Program C++ Sederhana
27/40
Catatan Tentang Penamaan Berkas
28/40
Kompilasi Program C++
29/40
Kompilasi Program C++ (lanj.)
• Pergi ke direktori tempat halo.cpp disimpan, gunakan perintah
”cd ..” untuk mundur ke direktori parent dan ”cd <nama
folder>” untuk maju ke direktori <nama folder>.
30/40
Kompilasi Program C++ (lanj.)
• Ketikkan perintah g++ -o prog halo.cpp.
• Perhatikan bahwa mungkin akan muncul pesan kesalahan
seperti berikut ini:
31/40
Kompilasi Program C++ (lanj.)
32/40
Pengaturan environment variable
• Klik kanan pada ”my computer”, lalu pilih properties. Akan
muncul tampilan sebagai berikut:
34/40
Pengaturan environment variable (lanj.)
• Kemudian akan muncul tampilan sebagai berikut:
35/40
Pengaturan environment variable (lanj.)
• Pada bagian system variables, pilih Path lalu tekan tombol
edit. Jika kalian tidak bisa menemukannya, maka tekan
tombol new.
• Isikan direktori tempat Dev C++ yang sebelumnya diatur,
ditambah dengan ”\MinGW64\bin” pada bagian akhir.
36/40
Pengaturan environment variable (lanj.)
• Tutup cmd yang telah terbuka, lalu buka kembali.
• Pergi ke direktori tempat halo.cpp disimpan dan ketikkan
g++ -o prog halo.cpp.
• Pastikan tidak ada lagi pesan kesalahan yang muncul:
37/40
Kompilasi Program C++ (lanj.)
• Ketikkan ”prog” pada cmd, yang artinya menjalankan berkas
”prog” yang merupakan hasil kompilasi program ”helo.cpp”.
• Pastikan tulisan ”halo dunia” tercetak di cmd:
38/40
Penjelasan Cara Kompilasi
39/40
Selanjutnya...
40/40
Variabel dan Tipe Data
1/35
Pendahuluan
2/35
Kilas Balik
3/35
Baris Perintah Program
4/35
Bagian 1
Konsep Variabel
5/35
Perkenalan Variabel
Variabel
Merupakan istilah yang diadopsi dari dunia matematika, yang
memetakan sebuah nama ke suatu nilai.
6/35
Perkenalan Variabel (lanj.)
7/35
Aturan Penamaan Variabel
8/35
Aturan Penamaan Variabel (lanj.)
9/35
Assignment
Assignment
Pengisian nilai yang diacu oleh variabel dengan suatu nilai disebut
assignment.
10/35
Contoh Program: assign.cpp
11/35
Penjelasan Program: assign.cpp
12/35
Sekilas Tentang printf
13/35
Contoh Program: assign2.pas
14/35
Penjelasan Program: assign2.pas
15/35
Bagian 2
16/35
Tipe Data Variabel
17/35
Tipe Data: Bilangan Bulat
Nama Jangkauan Ukuran
short −215 ..215 − 1 2 byte
unsigned short 0..216 − 1 2 byte
int −231 ..231 − 1 4 byte
unsigned int 0..232 − 1 4 byte
long long −263 ..263 − 1 8 byte
unsigned long long 0..264 − 1 8 byte
18/35
Tipe Data: Bilangan Riil
Nama Jangkauan (magnitudo) Akurasi Ukuran
float 1.5 × 10−45 ..3.4 × 1038 7-8 digit 4 byte
double 5.0 × 10−324 ..1.7 × 10308 15-16 digit 8 byte
19/35
Tipe Data: Karakter
20/35
Tipe Data: Boolean
21/35
Deklarasi Variabel
22/35
Deklarasi Variabel (lanj.)
23/35
Contoh Program: tipedasar.pas
24/35
Penjelasan Program: tipedasar.pas
25/35
Simbol Variabel pada printf
• Sejauh ini, kita mengenal bahwa ”%d” digunakan untuk
mencetak int, dan ”%lf” untuk double.
• Berikut tabel variabel beserta simbolnya:
Variabel Simbol
short %d
unsigned short %u
int %d
unsigned int %u
long long %lld atau %I64d
unsigned long long %llu atau %I64u
float %f
double %lf
char %c
26/35
Simbol Variabel pada printf (lanj.)
27/35
Tipe Data Komposit: Struct
28/35
Tipe Data Komposit: Struct (lanj.)
29/35
Tipe Data Komposit: Struct (lanj.)
30/35
Tipe Data Komposit: Struct (lanj.)
• Sebagai contoh, perhatikan contoh program titik.pas berikut:
#include <cstdio>
struct titik {
int x, y;
};
titik a, b;
int main() {
a.x = 5;
a.y = 3;
b.x = 1;
b.y = 2;
printf("%d %d\n", a.x, a.y);
printf("%d %d\n", b.x, b.y);
}
31/35
Konsumsi Memori Struct
32/35
Ordinalitas
33/35
Ordinalitas (lanj.)
34/35
Yang Sudah Kita Pelajari...
35/35
Variabel dan Tipe Data: String
1/12
Pendahuluan
2/12
Tipe Data String
3/12
STL
4/12
Contoh Program String
5/12
Penjelasan Contoh Program String
6/12
Penjelasan Contoh Program String (lanj.)
7/12
Program String Tanpa std
8/12
Penjelasan Contoh Program String (lanj.)
9/12
String pada C++ dan C
• Lalu tipe data string seperti apa yang ada pada bahasa C?
• Pada bahasa C, string diwujudkan dengan membuat array of
char, atau biasa disebut dengan cstring.
• Pembelajaran tentang cstring akan diperdalam pada bab yang
akan datang.
10/12
Sifat String
11/12
Yang Sudah Kita Pelajari...
12/12
Ekspresi
1/26
Kilas Balik: Assignment
2/26
Mengenal Ekspresi
3/26
Mengenal Ekspresi (lanj.)
4/26
Operasi Numerik
5/26
Operasi Numerik (lanj.)
6/26
Operasi Numerik (lanj.)
7/26
Contoh Program: kuadrat.cpp
8/26
Prioritas Pengerjaan
9/26
Contoh Program: numerik.cpp
• Kita juga bisa menggunakan tanda kurung untuk mengatur
prioritas pengerjaan suatu ekspresi.
• Perhatikan contoh berikut dan coba jalankan programnya:
#include <cstdio>
int hasil1, hasil2;
int main() {
hasil1 = 3+5 / 4;
hasil2 = (3+5) / 4;
printf("%d\n", hasil1);
printf("%d\n", hasil2);
}
• Isi dari variabel hasil1 adalah 4, karena operasi ”5 div 4”
memiliki prioritas yang lebih tinggi untuk dikerjakan, dan
menghasilkan nilai 1. Barulah ”3 + 1” dilaksanakan.
10/26
Operasi Unary
11/26
Contoh Operasi Unary
12/26
Fungsi Dasar Numerik
13/26
Contoh Program: cmath.cpp
14/26
Operasi Relasional
15/26
Contoh Program: relasional.cpp
16/26
Operasi Relasional pada Floating Point
17/26
Operasi Relasional pada Floating Point (lanj.)
18/26
Operasi Relasional (lanj.)
19/26
Operasi Relasional (string)
20/26
Contoh Program: relasional2.pas
21/26
Operasi Boolean
• Operasi boolean merupakan operasi yang hanya melibatkan
nilai-nilai kebenaran. Terdiri atas: not (!), and (&&), or (||),
xor (b).
• Operasi-operasi ini sesuai dengan sebuah cabang ilmu
matematika yang bernama ”aljabar boolean”.
• Operasi not merupakan operasi unary. Gunanya untuk
membalik nilai kebenaran.
• Tabel berikut menunjukkan efek dari penggunaan not, yang
cara penulisannya dengan tanda seru (!) sebelum variabelnya.
a !a
TRUE FALSE
FALSE TRUE
22/26
Operasi Boolean (lanj.)
23/26
Operasi Boolean (lanj.)
24/26
Contoh Program: relasional3.pas
25/26
Selanjutnya...
26/26
Masukan/Keluaran
1/28
Bagian 1
Masukan
2/28
Kilas Balik: kuadrat.cpp
• Sekarang coba lihat kembali program kuadrat.cpp:
#include <cstdio>
int a, b, c, x, hasil;
int main() {
a = 1;
b = 3;
c = -2;
x = 2;
hasil = a*x*x + b*x + c;
printf("ax^2 + bx + c = %d\n", hasil);
}
• Jika kita ingin mengganti nilai x, kode harus diganti,
dikompilasi ulang, baru dijalankan kembali.
• Untuk menghasilkan keluaran yang bervariasi, perlu ada
masukan dari luar program.
3/28
Membaca Masukan
4/28
Membaca Masukan: scanf
• Modifikasi bagian x = 2 menjadi scanf("%d", &x):
#include <cstdio>
int a, b, c, x, hasil;
int main() {
a = 1;
b = 3;
c = -2;
scanf("%d", &x);
hasil = a*x*x + b*x + c;
printf("ax^2 + bx + c = %d\n", hasil);
}
• Kompilasi, dan jalankan program. Kemudian ketikkan angka
2, dan tekan enter.
• Selamat! Kalian berhasil membaca masukan!
5/28
Fungsi scanf
6/28
Fungsi scanf (lanj.)
7/28
Membaca Beberapa Variabel
8/28
Membaca Beberapa Variabel (lanj.)
9/28
Membaca Karakter
10/28
Membaca Karakter (lanj.)
11/28
Membaca Karakter (lanj.)
12/28
Membaca Karakter (lanj.)
• Cara yang tepat adalah dengan menambahkan ”\n” secara
tertib di akhir pembacaan baris:
#include <cstdio>
char c1, c2, c3;
int bil;
int main() {
scanf("%c %c\n", &c1, &c2);
scanf("%d\n", &bil);
scanf("%c", &c3);
printf("c1=’%c’ c2=’%c’ bil=%d c3=’%c’\n", c1, c2,
bil, c3);
}
• Karena berpotensi membingungkan dan memperumit
penulisan kode, pembacaan tipe data karakter kurang
disarankan.
13/28
Membaca String
14/28
Membaca String (lanj.)
• Perhatikan program berikut:
#include <cstdio>
#include <string>
using namespace std;
char buff[1001];
int main() {
scanf("%s", buff);
string s = buff;
printf("s=’%s’\n", s.c_str());
}
• Variabel buff merupakan array of char dengan maksimal
1001 karakter (angka ini dapat Anda ubah sesuai kebutuhan).
• Array of char inilah yang merupakan cstring.
15/28
Membaca String (lanj.)
16/28
Membaca Sebaris String
• Bagaimana jika kita hendak membaca sebuah baris string,
yang mungkin mengandung spasi?
• Caranya adalah menggunakan simbol khusus ”%[ b \n]\n”.
#include <cstdio>
#include <string>
using namespace std;
char buff[1001];
int main() {
scanf("%[^\n]\n", buff);
string s = buff;
printf("s=’%s’\n", s.c_str());
}
17/28
Kesimpulan dalam Membaca Masukan
18/28
Bagian 2
Keluaran
19/28
Mencetak Keluaran
20/28
Contoh Program: jumlah.cpp
• Coba ketikkan dan jalankan program berikut:
#include <cstdio>
int main() {
int a, b;
printf("masukkan nilai a: ");
scanf("%d", &a);
printf("masukkan nilai b: ");
scanf("%d", &b);
printf("hasil dari penjumlahan a dan b: %d\n", a+b);
}
• Pada program tersebut, dicetak terlebih dahulu apa yang perlu
dimasukkan. Tentu saja, program seperti ini sangat ramah
terhadap pengguna (user-friendly ).
• Namun dalam kontes pemrograman OSN/IOI, hal seperti
ini tidak perlu dilakukan. Bahkan, tidak boleh dilakukan.
21/28
Bagian 3
22/28
Penjelasan Tentang STDIO
23/28
Penjelasan Tentang STDIO (lanj.)
• Masukan yang kalian masukkan, akan melewati saluran
STDIN.
• Keluaran yang kalian lihat, sebenarnya datang lewat saluran
STDOUT.
• Namun, pada command line keduanya terlihat seperti
menyatu, seakan-akan keduanya melewati jalur yang sama.
24/28
Penjelasan Tentang STDIO (lanj.)
25/28
Penjelasan Tentang STDIO (lanj.)
• Isi dari output.txt adalah:
masukkan nilai a:
masukkan nilai b:
hasil dari penjumlahan a dan b: 3
26/28
Masukan dan Keluaran pada OSN/IOI
27/28
Selanjutnya...
28/28
Penunjang Pemrograman Dasar
1/16
Pendahuluan
2/16
Bagian 1
Komentar
3/16
Mengenal Komentar
4/16
Komentar
• Merupakan bagian dari program yang diabaikan oleh compiler.
• Kita bisa menuliskan apapun di dalam komentar. Misalnya:
apa yang dilakukan oleh suatu bagian program atau catatan
tertentu.
• Pada C++, komentar dapat dituliskan dalam dua gaya:
• Satu baris, dituliskan dengan awalan dua slash
// ini adalah komentar, hanya bisa sebaris
// jika perlu baris baru, tambahkan // lagi
5/16
Contoh Komentar
• Perhatikan program berikut:
#include <cstdio>
int main() {
int a, b, c, x, hasil;
// Inisialisasi
a = 1;
b = 3;
c = -2;
// Baca nilai x
scanf("%d", &x);
// Hitung hasil fungsi
hasil = a*x*x + b*x + c;
// Cetak
printf("ax^2 + bx + c = %d\n", hasil);
}
6/16
Penjelasan Komentar
7/16
Bagian 2
8/16
Dua Jenis Error
Compilation Error
Kesalahan yang terjadi ketika program dikompilasi.
Contoh: terdapat kesalahan dalam pengetikan nama variabel,
kurang tanda titik koma (;), atau salah penggunaan tipe data.
Runtime Error
Kesalahan yang terjadi ketika program dieksekusi.
Contoh: saat program dieksekusi, tiba-tiba ada operasi pembagian
dengan 0.
9/16
Compilation Error
Contoh:
tes.cpp:18:34: error: hasil was not declared in
this scope
10/16
Compilation Error (lanj.)
11/16
Runtime Error
• Ketika program sudah berhasil dikompilasi, belum tentu
program luput dari error ketika dieksekusi.
• Program dapat mengalami error ketika sedang dieksekusi
karena berbagai hal:
• Melakukan pembagian dengan angka 0.
• Mengakses memori di luar yang telah dialokasikan.
• Mengalami stack overflow.
• Pesan error akan langsung diberikan dalam bentuk kalimat,
contohnya ”Floating point exception”.
• Sebagian besar dari istilah dan masalah yang dijelaskan di atas
mungkin kalian hadapi ketika sudah mempelajari tentang
array dan rekursi.
12/16
Bagian 3
IO Redirection
13/16
IO Redirection
• Penjelasan tentang saluran input dan output sempat
dijelaskan pada bagian sebelumnya. Kali ini, kita akan
memperdalamnya.
• Pada contoh yang lalu, kita sempat melakukan hal ini:
jumlah < input.txt > output.txt
14/16
IO Redirection (lanj.)
• Kita bisa melakukan hanya salah satu dari keduanya. Misalnya
jika kita melakukan:
jumlah < input.txt
15/16
Selanjutnya...
16/16
Percabangan
1/20
Pendahuluan
2/20
Motivasi
3/20
Motivasi (lanj.)
4/20
Struktur ”if ... then ...”
5/20
Blok ”{ ... }”
6/20
Blok ”{ ... }” (lanj.)
7/20
Blok ”{ ... }” (lanj.)
8/20
Blok ”{ ... }” (lanj.)
9/20
Contoh Program: kondisi.cpp
• Ketikkan dan jalankan program berikut:
#include <cstdio>
int main() {
int x;
scanf("%d", &x);
if (x > 0) {
printf("positif\n");
}
}
• Perhatikan bahwa ekspresi ”x > 0” akan merupakan operasi
relasional yang menghasilkan nilai boolean. Sehingga tepat
untuk digunakan pada if.
• Bagaimana jika ingin dibuat jika bilangan itu bukan positif,
cetak ”non-positif”?
10/20
Struktur ”if ... then ... else ...”
• Kita juga bisa membuat percabangan jika nilai pada
<kondisi> adalah FALSE, yaitu dengan kata kunci else.
• Struktur dari penulisan ”if ... then ... else ...” adalah:
if (<kondisi>) {
<perintah 1>;
<perintah 2>;
...
} else {
<perintah a>;
<perintah b>;
...
}
• Jika nilai <kondisi> adalah TRUE, <perintah 1>, <perintah
2>, ..., akan dilaksanakan.
• Jika FALSE, <perintah a>, <perintah b>, ..., akan
dilaksanakan.
11/20
Contoh Program: kondisi2.cpp
• Dengan ”if ... then ... else ...”, kita bisa memodifikasi
kondisi.cpp menjadi kondisi2.cpp:
#include <cstdio>
int main() {
int x;
scanf("%d", &x);
if (x > 0) {
printf("positif\n");
} else {
printf("non-positif\n");
}
}
12/20
Persoalan Sebenarnya
13/20
Struktur ”if ... then ... else if ...”
14/20
Struktur ”if ... then ... else if ...” (lanj.)
• Jika nilai <kondisi 1> TRUE, <perintah 1>, <perintah 2>,
..., akan dilaksanakan.
• Jika nilai <kondisi 1> FALSE, diperiksa apakah <kondisi 2>
bernilai TRUE. Jika ya, <perintah a>, <perintah b>, ...,
akan dilaksanakan.
• Jika nilai <kondisi 2> FALSE, diperiksa apakah <kondisi 3>
bernilai TRUE. Hal ini akan terus diulang sampai seluruh
percabangan habis.
• Kalian juga bisa mengakhiri struktur ini dengan ”else ...”,
yaitu ketika seluruh kondisi yang diberikan tidak terpenuhi,
maka perintah-perintah di bawah else ini yang akan
dilaksanakan.
15/20
Contoh Program: kondisi3.cpp
• Dengan ”if ... then ... else if ...”, kita bisa memodifikasi
kondisi2.cpp menjadi kondisi3.cpp:
#include <cstdio>
int main() {
int x;
scanf("%d", &x);
if (x > 0) {
printf("positif\n");
} else if (x == 0) {
printf("nol\n");
} else if (x < 0) {
printf("negatif\n");
}
}
16/20
Contoh Program: kondisi4.cpp
• Pada kondisi3.cpp, sebenarnya ”else if ...” yang terakhir tidak
diperlukan.
• Ketika suatu bilangan bukan positif dan bukan nol, sudah
pasti bilangan itu negatif. Sehingga bisa didapatkan
kondisi4.cpp:
#include <cstdio>
int main() {
int x;
scanf("%d", &x);
if (x > 0) {
printf("positif\n");
} else if (x == 0) {
printf("nol\n");
} else {
printf("negatif\n");
}
}
17/20
Kombinasi dengan Ekspresi Boolean
18/20
If Bersarang
19/20
Selanjutnya...
20/20
Perulangan
1/21
Pendahuluan
2/21
Motivasi
3/21
Motivasi (lanj.)
4/21
Perulangan: for
• Biasanya digunakan ketika kita tahu berapa kali perulangan
perlu dilakukan.
• Pada C++, strukturnya:
for (<kondisi_awal>; <kondisi_ulang>; <perubahan>) {
<perintah 1>;
<perintah 2>;
...
}
• <kondisi awal> dapat diisi dengan inisialisasi variabel untuk
perulangan.
• <kondisi ulang> biasanya berupa ekspresi yang menghasilkan
boolean, untuk menandakan apakah perulangan sudah patut
diberhentikan.
• <perubahan> merupakan bagian yang dieksekusi pada akhir
setiap siklus perulangan.
• Penjelasan berikutnya dengan contoh akan meningkatkan
pemahaman kalian.
5/21
Contoh Program: for.cpp
6/21
Penjelasan Program: for.cpp
• Misalnya kita memasukkan N = 5.
• Pertama kali dijalankan, i dibuat dan diisi nilai 0.
• Kedua, C++ memeriksa apakah kondisi ulang tercapai.
Berhubung i kurang dari N, maka bagian dalam for
dilaksanakan dan tulisan dicetak saat i = 0.
• Setelah itu, akhir dari struktur for ditemukan. C++ akan
mengeksekusi bagian perubahan, yakni menambah i dengan
1, lalu kembali ke awal dari for.
• Jika i masih kurang dari N, maka perintah di dalamnya akan
kembali dilaksanakan.
• Dengan demikian, tercetaklah tulisan saat i = 1, 2, dan
seterusnya hingga N-1.
7/21
Penjelasan Program: for.cpp (lanj.)
8/21
Masa Hidup Variabel
9/21
Contoh Program: fordownto.cpp
10/21
Contoh Program: forskip.cpp
11/21
Contoh Program: forskip2.cpp
12/21
Contoh Program: forsum.cpp
13/21
Perulangan: while
• Selain for, terdapat pula struktur while.
• Biasa digunakan ketika tidak diketahui harus berapa kali
serangkaian perintah dilaksanakan, tetapi diketahui
perintah-perintah itu perlu dilaksanakan selama suatu kondisi
terpenuhi.
• Pada C++, strukturnya:
while (<kondisi>) {
<perintah 1>;
<perintah 2>;
...
}
• Seperti pada if, <kondisi> adalah suatu nilai boolean. Selama
nilainya TRUE, seluruh <perintah x> di dalamnya akan
dieksekusi secara berurutan.
14/21
Contoh Program: while.cpp
15/21
Penjelasan Program: while.cpp
16/21
Perulangan: while (lanj.)
17/21
Contoh Program: whilesum.cpp
• Berikut ini contoh program dengan while yang melakukan hal
serupa dengan forsum.cpp:
#include <cstdio>
int main() {
int awal, akhir;
scanf("%d %d", &awal, &akhir);
int jumlah = 0;
int i = awal;
while (i <= akhir) {
jumlah += i;
i++;
}
printf("jumlah bilangan bulat di antara %d dan %d
(inklusif) adalah %d\n", awal, akhir, jumlah);
}
18/21
Perulangan: while (lanj.)
• Terdapat variasi lain dari while, yang biasa disebut ”do ...
while”.
• Pada C++, strukturnya:
do {
<perintah 1>;
<perintah 2>;
...
} while (<kondisi>);
• Perbedaannya adalah, seluruh perintah akan dilakukan dulu,
baru diperiksa apakah kondisi masih terpenuhi. Bila ya, maka
seluruh perintah akan diulang.
• Hal ini menjamin seluruh perintah dijalankan paling sedikit
satu kali.
19/21
Contoh Program: dowhile.cpp
20/21
Sejauh ini...
21/21
Perulangan Lanjut
1/30
Pendahuluan
2/30
Bagian 1
Perulangan Bersarang
3/30
Motivasi: Pola 0
4/30
Motivasi (lanj.)
5/30
Motivasi: Pola 1
6/30
Contoh Program: pola1 1.cpp
7/30
Contoh Program: pola1 2.cpp
• Tentu saja kita bisa melakukannya dengan struktur
perulangan yang lain:
#include <cstdio>
int main() {
int N, M;
scanf("%d %d", &N, &M);
int i = 0;
while (i < N) {
int j = 0;
while (j < M) {
printf("*");
j++;
}
i++;
printf("\n");
}
}
8/30
Contoh Lain: Pola 2
9/30
Contoh Solusi: pola2.cpp
10/30
Latihan: Pola 3
11/30
Bagian 2
12/30
Break & Continue
13/30
Break & Continue (lanj.)
Break
Penggunaan break akan membuat program keluar dari perulangan
yang mengandung kata kunci tersebut.
Continue
Penggunaan continue akan membuat program kembali ke baris
awal perulangan, yaitu baris ”for”, atau ”while”.
14/30
Contoh Soal: Berhitung 1
• Setelah mahir dalam menggambar pola, kini Pak Dengklek
ingin mengajar tentang berhitung.
• Pak Dengklek akan memberikan dua bilangan, yaitu N dan M.
• Anda diminta untuk menuliskan bilangan dari 1 sampai
dengan N. Namun, ketika bilangan yang hendak ditulis adalah
M, jangan cetak bilangan itu dan jangan cetak bilangan
apapun lagi.
• Setelah selesai mencetak bilangan, cetak ”selesai”.
• Contoh untuk N = 10 dan M = 5:
1
2
3
4
selesai
15/30
Contoh Program: break.cpp
16/30
Penjelasan Program: break.cpp
17/30
Contoh Soal: Berhitung 2
18/30
Contoh Program: continue.cpp
19/30
Penjelasan Program: continue.cpp
20/30
Contoh Soal: Tes Keprimaan
21/30
Solusi 1
22/30
Solusi 1: prima1 1.cpp
#include <cstdio>
int main() {
int N;
scanf("%d", &N);
bool prima = true;
for (int i = 2; i <= N-1; i++) {
if (N % i == 0) {
prima = false;
}
}
if (prima) {
printf("%d adalah bilangan prima\n", N);
} else {
printf("%d bukan bilangan prima\n", N);
}
}
23/30
Solusi 2
24/30
Solusi 2: prima1 2.cpp
#include <cstdio>
int main() {
int N;
scanf("%d", &N);
bool prima = true;
for (int i = 2; i <= N-1; i++) {
if (N % i == 0) {
prima = false;
break;
}
}
if (prima) {
printf("%d adalah bilangan prima\n", N);
} else {
printf("%d bukan bilangan prima\n", N);
}
}
25/30
Contoh Soal: Pembangkit Prima
26/30
Solusi: Pembangkit Prima
27/30
Contoh Solusi: prima2.cpp
#include <cstdio>
int main() {
int N;
scanf("%d", &N);
int count = 0; // Banyaknya prima yang sudah ditemukan
int cur = 2; // nilai yang akan diperiksa keprimaannya
while (count < N) {
bool prima = true;
for (int i = 2; i <= cur-1; i++) {
if (cur % i == 0) {
prima = false;
break;
}
}
28/30
Contoh Solusi: prima2.cpp (lanj.)
if (prima) {
// Ditemukan prima!
// Cetak dan tambahkan prima yg sudah ditemukan
printf("%d\n", cur);
count++;
}
// Entah ini prima atau bukan, lanjut untuk
// memeriksa bilangan berikutnya
cur++;
}
// Keluar dari while, dipastikan count = N
}
29/30
Penutup
30/30
Analisis Kompleksitas
1/37
Pendahuluan
2/37
Bagian 1
3/37
Analisis Algoritma
4/37
Contoh Soal: Membajak Sawah
Deskripsi:
• Pak Dengklek memiliki N bibit tanaman yang akan ia semai di
sawahnya.
• Untuk itu, ia akan membajak sawahnya supaya sawahnya bisa
memuat N tanaman.
• Sawah yang akan dibajak harus memiliki bentuk persegi
panjang, tersusun atas R baris dan C kolom petak-petak.
Setiap petak bisa memuat maksimal sebuah tanaman.
• Tentukan nilai R dan C supaya semua petak yang ada
ditanami tanaman!
• Jika ada lebih dari satu kemungkinan jawaban, minimalkan
selisih R dengan C.
• Jika masih ada lebih dari satu kemungkinan jawaban, cetak
yang mana saja.
5/37
Contoh Soal: Membajak Sawah (lanj.)
Batasan:
• 1 ≤ N ≤ 109 .
Format Masukan:
• Sebuah baris berisi bilangan bulat, yaitu N.
Format Keluaran:
• Sebuah baris berisi dua bilangan bulat, yaitu R dan C .
6/37
Contoh Soal: Membajak Sawah (lanj.)
Contoh Masukan
35
Contoh Keluaran
75
7/37
Solusi 1: Coba Semua Kemungkinan
8/37
Solusi 1: Coba Semua Kemungkinan (lanj.)
Berikut implementasinya:
#include <cstdio>
#include <cmath>
using namespace std;
int main() {
int N, R, C;
scanf("%d", &N);
R = 1;
C = N;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i*j == N) {
if (abs(R-C) > abs(i-j)) {
R = i;
C = j;
}
}
}
}
printf("%d %d\n", R, C);
}
9/37
Solusi 1: Coba Semua Kemungkinan (lanj.)
10/37
Cerita Sampingan: Meramal Waktu Eksekusi
11/37
Solusi 1: Terlalu lambat!
12/37
Solusi 2: Coba Semua Kemungkinan R
13/37
Solusi 2: Coba Semua Kemungkinan R (lanj.)
Bagian implementasi:
scanf("%d", &N);
R = 1;
C = N;
for (int i = 1; i <= N; i++) {
if (N % i == 0) {
int j = N / i;
if (abs(R-C) > abs(i-j)) {
R = i;
C = j;
}
}
}
14/37
Solusi 2: Coba Semua Kemungkinan R (lanj.)
15/37
√
Solusi 3: Batasi R sampai N
• Persoalan ini sebenarnya meminta kita memfaktorkan N,
supaya dua bilangan hasil faktorisasi sedekat mungkin.
• Untuk memeriksa
√ seluruh faktor bilangan, cukup batasi
sampai N saja.
• Contoh: untuk N = 100, faktorisasi yang mungkin adalah:
• 1 × 100
• 2 × 50
• 4 × 25
• 5 × 20
• 10 × 10
• 20 × 5
• 25 × 4
• ... (faktorisasi selanjutnya hanya mengulang yang sudah ada)
16/37
√
Solusi 3: Batasi R sampai N (lanj.)
Bagian implementasi:
scanf("%d", &N);
R = 1;
C = N;
int i = 1;
while (i*i <= N) {
if (N % i == 0) {
int j = N / i;
if (abs(R-C) > abs(i-j)) {
R = i;
C = j;
}
}
i++;
}
printf("%d %d\n", R, C);
17/37
√
Solusi 3: Batasi R sampai N (lanj.)
√
• Kompleksitas solusi menjadi hanya O( N).
• Untuk N = 109 , hanya diperlukan sekitar 32.000 komputasi,
jauh di bawah 100 juta.
• Solusi ini bekerja dengan cepat bahkan untuk N yang besar.
18/37
Ulasan Contoh Soal
19/37
Notasi Big-Oh
20/37
Aturan Sederhana Notasi Big-Oh
21/37
Kelompok Kompleksitas
22/37
Kelompok Kompleksitas (lanj.)
• Linear : O(N)
Komputasi yang dilakukan proporsional secara linier terhadap
input.
√
• Polynomial: O( N), O(N 2 ), O(N 3 ), ...
Komputasi yang dilakukan proporsional secara polinomial
terhadap input.
• Exponential: O(N!), O(2N ), O(N N ), ...
Komputasi yang dilakukan proporsional secara eksponensial
terhadap input. Biasanya dihindari karena terlalu lambat.
23/37
Kelompok Kompleksitas (lanj.)
24/37
Bagian 2
Menghitung Kompleksitas
25/37
Menghitung Kompleksitas
26/37
Contoh 1: Soal
total = 0;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
total++;
}
}
27/37
Contoh 1: Jawaban
28/37
Contoh 2: Soal
total = 0;
for (int i = 1; i <= N; i++) {
for (int j = i; j <= N; j++) { // j dimulai dari i
total++;
}
}
29/37
Contoh 2: Jawaban
30/37
Contoh 3: Soal
total = 0;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
total++;
}
}
31/37
Contoh 3: Jawaban
32/37
Contoh 4: Soal
val = N;
while (val > 0) {
val /= 3; // Setara "val = val / 3"
}
33/37
Contoh 4: Jawaban
34/37
Contoh 5: Soal
counter = 1;
while (counter*counter < N) {
counter++;
}
35/37
Contoh 5: Jawaban
36/37
Penutup
37/37
Array
1/38
Pendahuluan
2/38
Bagian 1
Konsep Array
3/38
Motivasi
4/38
Solusi?
5/38
Pengertian Array
Array
Variabel dengan satu nama, tetapi mengandung banyak nilai.
Akses nilai-nilainya dilakukan dengan indeks.
6/38
Penjelasan
7/38
Bagian 2
8/38
Deklarasi
9/38
Contoh Deklarasi
Berikut ini adalah contoh deklarasi array pada C++:
bool tabel[101];
int frekuensi[1000];
10/38
Array dan Variabel
11/38
Array dan Variabel (lanj.)
12/38
Array dan Variabel (lanj.)
13/38
Array dan Variabel (lanj.)
14/38
Contoh Solusi: balik.pas
15/38
Array dan Memori
16/38
Rentang Array
• Pada program membalik array, dideklarasikan array sebesar
100 elemen (dari 0 sampai dengan 99), padahal bisa jadi
hanya digunakan sebagian saja.
• Cara ini memang ”boros” memori, tetapi merupakan cara
yang paling mudah adalah mendeklarasikannya sebesar nilai N
maksimal yang mungkin.
• Bisa juga kita deklarasikan sesudah N diketahui sebagai
berikut:
...
int N;
scanf("%d", &N);
int tabel[N];
...
17/38
Contoh Soal: Ujian Harian
Deskripsi:
• Pak Dengklek menyelenggarakan ujian harian setelah selesai
mengajarkan N ekor bebeknya mengenai konsep array.
• Setiap bebek ke-i mendapatkan nilai sebesar hi , yang
merupakan bilangan bulat.
• Tentukan banyaknya bebek yang memiliki nilai tidak kurang
dari rata-rata seluruh bebek!
Batasan:
• 1 ≤ N ≤ 100
• 1 ≤ hi ≤ 100, untuk 1 ≤ i ≤ N
18/38
Contoh Soal: Ujian Harian (lanj.)
Format masukan:
• Baris pertama berisi sebuah bilangan bulat N.
• N baris berikutnya berisi nilai ujian bebek. Baris ke-i ini
merupakan hi .
Format keluaran:
• Sebuah baris yang menyatakan banyaknya bebek yang lulus
ujian.
19/38
Contoh Soal: Ujian Harian (lanj.)
Contoh masukan:
3
5
6
7
Contoh keluaran:
2
Penjelasan
Nilai rata-rata dari seluruh bebek adalah 6, dan terdapat 2 ekor
bebek yang nilainya tidak kurang dari 6.
20/38
Petunjuk
21/38
Contoh Solusi: lulus.pas
#include <cstdio>
int main() {
int N;
scanf("%d", &N);
int nilai[N];
for (int i = 0; i < N; i++) {
scanf("%d", &nilai[i]);
}
int total = 0;
for (int i = 0; i < N; i++) {
total += nilai[i];
}
22/38
Contoh Solusi: lulus.pas (lanj.)
int lulus = 0;
for (int i = 0; i < N; i++) {
// Trik menghindari pembagian
if (nilai[i]*N >= total) {
lulus++;
}
}
printf("%d\n", lulus);
}
23/38
Bagian 3
24/38
Array Dua Dimensi
25/38
Array Dua Dimensi (lanj.)
26/38
Contoh Soal:
Cokelat Bebek
Deskripsi:
• Pak Ganesh datang bertamu ke peternakan bebek Pak
Dengklek.
• Pada peternakan bebek Pak Dengklek, terdapat kandang
bebek yang tersusun atas petak-petak N baris dan N kolom.
• Pak Dengklek memberi di,j gram cokelat* ke kandang di baris
ke-i dan kolom ke-j.
• Pak Ganesh memberi gi,j gram cokelat* ke kandang di baris
ke-i dan kolom ke-j.
• Tentukan berapa gram cokelat yang diperoleh setiap bebek di
kandangnya!
Batasan:
• 1 ≤ N ≤ 100
• 0 ≤ di,j , hi,j ≤ 10, untuk 1 ≤ i, j ≤ N
*Catatan: bebek-bebek suka cokelat!
27/38
Contoh Soal:
Cokelat Bebek (lanj.)
• Sebagai contoh, misalkan N = 3.
• Kemudian berikut adalah cokelat yang diberikan Pak
Dengklek (D) dan Pak Ganesh (G ):
1 3 0 2 1 7
D = 6 2 4 G = 0 0 1
2 1 5 1 1 2
• Maka total cokelat yang didapatkan setiap kandang adalah:
3 4 7
6 2 5
3 2 7
28/38
Contoh Soal:
Cokelat Bebek (lanj.)
Format masukan:
• Baris pertama berisi sebuah bilangan bulat N.
• N baris berikutnya berisi N bilangan. Bilangan di baris ke-i
dan kolom ke-j ini adalah di,j .
• N baris sisanya berisi N bilangan. Bilangan di baris ke-i dan
kolom ke-j ini adalah gi,j .
Format keluaran:
• N baris yang berisi N bilangan. Bilangan di baris ke-i dan
kolom ke-j ini adalah total makanan yang ada di kandang
baris ke-i dan kolom ke-j.
29/38
Contoh Soal:
Cokelat Bebek (lanj.)
Contoh masukan:
3
1 3 0
6 2 4
2 1 5
2 1 7
0 0 1
1 1 2
Contoh keluaran:
3 4 7
6 2 5
3 2 7
30/38
Petunjuk
• Salah satu cara yang mudah adalah membuat tiga array dua
dimensi, masing-masing untuk menampung makanan yang
diberikan Pak Dengklek (D), Pak Ganesh (G ), dan hasil
akhirnya (hasil).
• Tentu saja hubungannya adalah hasil[i][j] = D[i][j] + G [i][j],
untuk 1 ≤ i, j ≤ N.
31/38
Solusi: cokelat.pas
Pertama, mari kita deklarasikan variabel dan baca masukan:
#include <cstdio>
int main() {
int N;
scanf("%d", &N);
int D[N][N], G[N][N], hasil[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
scanf("%d", &D[i][j]);
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
scanf("%d", &G[i][j]);
}
}
32/38
Solusi: cokelat.pas (lanj.)
Lakukan penjumlahan, lalu cetak hasilnya:
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
hasil[i][j] = D[i][j] + G[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d", hasil[i][j]);
if (j+1 < N) {
printf(" ");
}
}
printf("\n");
}
}
33/38
Solusi: cokelat 2.pas
Nilai array D dan G sebenarnya tidak perlu disimpan, kita bisa
menghemat memori dengan langsung menjumlahkannya.
#include <cstdio>
int main() {
int N;
scanf("%d", &N);
int hasil[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int temp;
scanf("%d", &temp);
hasil[i][j] = temp;
}
}
34/38
Solusi: cokelat 2.pas (lanj.)
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int temp;
scanf("%d", &temp);
hasil[i][j] += temp;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d", hasil[i][j]);
if (j+1 < N) {
printf(" ");
}
}
printf("\n");
}
}
35/38
Array Multidimensi
36/38
Catatan
• Pada saat array dideklarasi, nilai yang ada di dalam array bisa
jadi tidak tentu.
• Sebagai contoh, program berikut akan mencetak angka yang
tidak tentu:
#include <cstdio>
int main() {
int arr[10];
printf("%d\n", arr[0]);
}
• Pastikan Anda melakukan inisialisasi pada array dengan tepat.
37/38
Selanjutnya...
38/38
Subprogram
1/42
Motivasi-1
• Ketika menulis program, kadang-kadang kita memerlukan
suatu rutinitas yang sama di beberapa tempat.
• Sebagai gambaran, perhatikan contoh soal berikut:
• Pak Dengklek menancapkan tiga buah tiang pancang di
halaman rumahnya untuk membangun sebuah kandang bebek.
• Setiap tiang pancang bisa dianggap terletak di suatu sistem
koordinat Kartesius, yaitu di (Ax , Ay ), (Bx , By ), dan (Cx , Cy ).
• Pagar akan dibentangkan menurut garis lurus antar setiap
tiang pancang.
• Sekarang Pak Dengklek ingin tahu berapa luas kandang
bebeknya.
• Persoalan yang kita hadapi adalah menghitung luas dari
segitiga, jika hanya diberikan titik-titik sudutnya.
2/42
Motivasi-1 (lanj.)
3/42
Motivasi-1 (lanj.)
• Kita perlu menghitung jarak antar titik terlebih dahulu, baru
bisa menghitung luasnya.
• Kita dapat menuliskannya:
// tA, tB, tC merupakan ketiga titik yang diberikan
a = sqrt((tA.x - tB.x)*(tA.x - tB.x) + (tA.y -
tB.y)*(tA.y - tB.y));
b = sqrt((tA.x - tC.x)*(tA.x - tC.x) + (tA.y -
tC.y)*(tA.y - tC.y));
c = sqrt((tB.x - tC.x)*(tB.x - tC.x) + (tB.y -
tC.y)*(tB.y - tC.y));
• Perhatikan bahwa hal yang sama, yaitu menghitung jarak
titik, dituliskan secara berulang-ulang.
• Bagaimana jika pada salah satunya terdapat kesalahan
pengetikan? Atau suatu ketika rumusnya perlu diubah?
Sungguh merepotkan!
4/42
Motivasi-2
• Seringkali ketika kita menulis program yang panjang, program
menjadi lebih sulit dipahami, meskipun telah ditulis komentar
sekalipun.
• Alangkah baiknya jika kita bisa membuat subprogram untuk
suatu rutinitas tertentu dan menyatukannya di akhir, seperti:
bacaMasukan(N);
cariPrimaSampai(N);
printf("faktorisasi:\n");
temp = N;
while (!cekPrima(temp)) {
d = cariPembagiTerkecil(temp);
temp = temp / d;
printf("%d\n", d);
}
if (temp > 1) {
printf("%d\n", temp);
}
5/42
Bagian 1
Konsep Subprogram
6/42
Konsep Subprogram
7/42
Contoh Subprogram
• Kita bisa memindahkan serangkaian kode menjadi sebuah
fungsi, lalu memanggilnya pada program utama.
• Perhatikan contoh pesan.cpp berikut!
#include <cstdio>
#include <string>
using namespace std;
char buff[1001];
string pesan;
// Subprogram
void bacaPesan() {
printf("masukkan pesan: \n");
scanf("%s", buff);
pesan = buff;
}
// Program utama
int main() {
bacaPesan();
printf("pesan = %s\n", pesan.c_str());
}
8/42
Penjelasan
9/42
Penjelasan (lanj.)
10/42
Bagian 2
11/42
Fungsi
12/42
Konsep Parameter
13/42
Konsep Parameter (lanj.)
14/42
Konsep Parameter (lanj.)
15/42
Konsep Parameter (lanj.)
16/42
Parameter
17/42
Lingkup Variabel
18/42
Lingkup Variabel (lanj.)
19/42
Fungsi dengan Nilai Kembalian
20/42
Penjelasan
21/42
Nilai Kembalian
22/42
Nilai Kembalian (lanj.)
23/42
Fungsi
24/42
Contoh Fungsi Lain
• Perhatikan fungsi yang memeriksa keprimaan berikut:
bool prima(int x) {
if (x < 2) {
return false;
}
for (int i = 2; i*i <= x; i++) {
if (x % i == 0) {
return false;
}
}
return true;
}
• Pertama, periksa apakah bilangan yang diberikan kurang dari
dua. Bila ya, langsung kembalikan nilai FALSE.
√
• Kedua, periksa apakah ada angka di antara 2 dan x yang
habis membali x. Bila ada, langsung kembalikan FALSE.
• Selain daripada itu, dijamin x prima.
25/42
Return pada Fungsi void
• Sebenarnya, return juga dapat dilakukan pada fungsi yang
tidak mengembalikan nilai.
• Perintah return akan menghentikan eksekusi dan keluar dari
program.
• Pada contoh berikut, gambar ’*’ tidak akan dicetak apabila x
lebih dari 1000.
void gambar(int x) {
if (x > 1000) {
return;
}
for (int i = 0; i < x; i++) {
printf("*");
}
printf("\n");
}
26/42
Bagian 3
Passing Parameter
27/42
Passing Parameter
28/42
Passing Parameter by Value
29/42
Passing Parameter by Value (lanj.)
30/42
Passing Parameter by Reference
31/42
Passing Parameter by Reference (lanj.)
32/42
Passing Parameter by Reference (lanj.)
33/42
Penulisan pada C++
34/42
Bagian 4
35/42
Fungsi Pangkat (int)
36/42
Fungsi Pangkat (void)
37/42
Mengembalikan Nilai atau Tidak
• Baik dengan kedua cara, kita bisa mencapai hal yang sama.
• Pertanyaannya adalah: mana yang lebih tepat?
38/42
Mengembalikan Nilai atau Tidak (lanj.)
39/42
Kilas Balik: Fungsi tukar
40/42
Penggunaan Subprogram
41/42
Manfaat Subprogram
42/42
Pendalaman String
(C++)
1/24
Bagian 1
Pengolahan String
2/24
String pada C++
3/24
Bagian 2
cstring
4/24
Pengenalan cstring
5/24
Representasi cstring
6/24
Representasi cstring
7/24
Pengolahan cstring
8/24
Mencari Panjang cstring
Contoh:
#include <cstdio>
#include <cstring>
char s[1001];
int main() {
scanf("%s", s);
printf("%d\n", strlen(s));
}
9/24
Penggunaan strlen
• Fungsi strlen memiliki kompleksitas O(N), dengan N adalah
panjang dari string masukan.
• Penyebabnya adalah strlen sebenarnya mencari di indeks
keberapakah \0 berada.
• Apabila hendak digunakan dalam perulangan, simpan dulu
panjangnya ke dalam suatu variabel untuk menghindari
pemanggilan yang berulang-ulang.
Contoh:
// Buruk, O(N^2)
for (int i = 0; i < strlen(s); i++) {
printf("%c", s[i]);
}
// Baik, O(N)
int len = strlen(s);
for (int i = 0; i < len; i++) {
printf("%c", s[i]);
}
10/24
Membandingkan cstring
• Untuk membandingkan 2 cstring s dan t secara leksikografis,
gunakan strcmp(s,t).
• Nilai kembaliannya memiliki arti sebagai berikut:
• Negatif, artinya s lebih awal dari t.
• Nol, artinya s sama dengan t.
• Positif, artinya s lebih akhir dari t.
• Kompleksitasnnya O(N), dengan N adalah panjang string
terkecil yang dibandingkan.
Contoh penggunaan:
#include <cstdio>
#include <cstring>
char s[1001];
char t[1001];
int main() {
scanf("%s %s", s, t);
printf("%d\n", strcmp(s, t));
}
11/24
Mengisi Array
• Untuk mengisi array arr dengan x, gunakan memset(arr,
x, sizeof(arr)).
• Nilai x terbatas pada tipe data char, atau angka di antara
-128 sampai 127 saja.
• Fungsi ini biasanya juga dimanfaatkan untuk menginisialisasi
array bilangan dengan 0 atau -1.
Contoh:
#include <cstdio>
#include <cstring>
char s[1001];
int arr[101];
int main() {
memset(s, ’x’, sizeof(s));
memset(arr, -1, sizeof(arr));
printf("%c %d\n", s[0], arr[0]);
}
12/24
Fungsi cstring Lainnya
13/24
Bagian 3
std string
14/24
Representasi string
15/24
Mencari Panjang string
16/24
Mencari Substring
• Untuk mencari posisi suatu substring t dari string s, gunakan
s.find(t).
Contoh:
#include <cstdio>
#include <string>
using namespace std;
int main() {
string s = "Pak Dengklek berternak";
string t1 = "Dengklek";
string t2 = "pak";
string t3 = "klek";
printf("%d\n", s.find(t1)); // 4
printf("%d\n", s.find(t2)); // -1 (tak ditemukan)
printf("%d\n", s.find(t3)); // 8
}
17/24
Mengambil Substring
18/24
Menghapus Substring
19/24
Menyisipkan String
20/24
Operasi Tambahan: Penempelan String
• Pada std string, hal ini dapat dilakukan cukup dengan operasi
’+’, layaknya operasi numerik.
Contoh:
#include <cstdio>
#include <string>
using namespace std;
int main() {
string s = "Pak";
string t = "Dengklek";
string gabung = s + t;
printf("%s\n", gabung.c_str()); // PakDengklek
}
21/24
Operasi Char
• Setiap karakter dari string memiliki tipe char.
• Kita dapat melakukan operasi penambahan atau pengurangan
pada char, yang akan dioperasikan pada kode ASCII-nya.
Contoh:
#include <cstdio>
#include <string>
using namespace std;
int main() {
string s = "abc";
s[0]++;
s[1] += 2;
s[2] -= 2;
printf("%s\n", s.c_str()); // bda
}
22/24
Operasi Char (lanj.)
• Operasi ini dapat digunakan untuk mengubah karakter suatu
string.
• Operasi yang umum adalah mengubah dari huruf kecil ke
besar, dengan cara mengurangkan char dengan selisih antara
ASCII ’a’ dengan ’A’.
• Cara sebaliknya akan mengubah dari huruf besar ke huruf
kecil.
• Hafalkan ASCII ’a’ adalah 97, dan ’A’ adalan 65.
#include <cstdio>
#include <string>
using namespace std;
int main() {
string s = "toki";
for (int i = 0; i < s.size(); i++) {
s[i] -= ’a’ - ’A’;
}
printf("%s\n", s.c_str()); // TOKI
}
23/24
Selanjutnya...
24/24
Pengenalan rekursi
1/24
Pengenalan Rekursi
2/24
Mengapa Perlu Ada Rekursi
3/24
Strategi Rekursif
4/24
Contoh Soal: Faktorial
Deskripsi:
• Pak Dengklek baru mempelajari konsep matematika baru,
yaitu faktorial.
• Operasi faktorial pada N, atau ditulis dengan notasi N!,
adalah operasi mengalikan bilangan dari 1 sampai dengan N.
• Contoh: Jika N = 4, maka 4! = 1 × 2 × 3 × 4 = 24
• Diberikan N, bantu Pak Dengklek mencari hasil N!
5/24
Contoh Soal: Faktorial (lanj.)
Format masukan:
• Sebuah baris berisi sebuah bilangan N
Format keluaran:
• Sebuah baris berisi hasil N!
Batasan:
• 1 ≤ N ≤ 10
6/24
Solusi
• Ide 1:
• Cukup gunakan for loop biasa
• Solusi ini bekerja secara iteratif.
• Ide 2: Rekursi
7/24
Contoh Solusi Iteratif
8/24
Solusi Rekursif
Base Case
• Pada batasan soal, nilai N berkisar antara 1 sampai dengan
10.
• Dari batasan tersebut, kasus terkecilnya adalah N = 1.
• Jadi N = 1 adalah base case, dan memang jelas diketahui
bahwa 1! = 1.
9/24
Solusi Rekursif (lanj.)
Recurrence Relation
• Bagaimana jika N > 1?
• Untuk mencari N!, kita bisa mencari (N − 1)! dan
mengalikannya dengan N.
• Jadi persoalan mencari N! bisa diselesaikan dengan mudah
jika diketahui (N − 1)!.
• Dengan observasi ini, kita mengetahui hubungan rekursif dari
N!.
10/24
Contoh Solusi: faktorial rekursif.cpp
11/24
Contoh Solusi: faktorial rekursif.cpp (lanj.)
12/24
Contoh Eksekusi Fungsi
program utama
13/24
Contoh Eksekusi Fungsi (lanj.)
14/24
Contoh Eksekusi Fungsi (lanj.)
• faktorial(4) mengeksekusi
”return x *
faktorial(x-1)”, yang pada
kasus ini x = 4.
faktorial(3)
• Akibatnya, dipanggil fungsi
faktorial(4) faktorial(3).
program utama • Kini yang ”aktif” adalah
faktorial(3).
15/24
Contoh Eksekusi Fungsi (lanj.)
faktorial(2)
faktorial(3) • Hal serupa terjadi untuk mencari
nilai faktorial(3).
faktorial(4)
program utama
16/24
Contoh Eksekusi Fungsi (lanj.)
faktorial(1)
faktorial(2)
faktorial(3) • Terjadi juga untuk mencari nilai
faktorial(2).
faktorial(4)
program utama
17/24
Contoh Eksekusi Fungsi (lanj.)
faktorial(1)
• Pada saat ini, faktorial(1) tidak
faktorial(2) lagi melakukan pemanggilan
rekursif, berhubung ditemui base
faktorial(3) case.
• Sebaliknya, langsung
faktorial(4)
dikembalikan nilai 1 sebagai
program utama jawaban atas faktorial(1).
18/24
Contoh Eksekusi Fungsi (lanj.)
19/24
Contoh Eksekusi Fungsi (lanj.)
20/24
Contoh Eksekusi Fungsi (lanj.)
21/24
Contoh Eksekusi Fungsi (lanj.)
22/24
Kompleksitas Solusi
23/24
Materi Selanjutnya
24/24
Rekursi Lanjut
1/36
Bagian 1
Fibonacci
2/36
Soal: Fibonacci
Deskripsi:
• Deret Fibonacci merupakan deret yang mana suatu anggota
adalah penjumlahan dari dua anggota sebelumnya, kecuali dua
anggota pertama.
• Jika fN adalah bilangan Fibonacci ke-N, maka f0 = 0, f1 = 1,
dan fN = fN−1 + fN−2 untuk N > 1.
• Beberapa bilangan pertama dari deret Fibonacci adalah 0, 1,
1, 2, 3, 5, 8, 13, 21, . . . .
• Carilah bilangan Fibonacci ke-N.
• Contoh: Bilangan Fibonacci ke-6 adalah 8. Perhatikan bahwa
indeks dimulai dari 0.
3/36
Soal: Fibonacci (lanj.)
Format masukan:
• Sebuah baris berisi sebuah bilangan N.
Format keluaran:
• Sebuah baris berisi bilangan Fibonacci ke-N.
Batasan:
• 0 ≤ N ≤ 20
4/36
Solusi
5/36
Penjelasan Solusi Rekursif
Base Case
• Pada batasan soal, nilai N berkisar antara 0 sampai 20.
• Dari batasan tersebut, kasus terkecil yang sudah pasti
diketahui jawabannya adalah f0 dan f1 .
• Nilai dari f0 = 0 dan f1 = 1, atau dapat dituliskan fN = N,
untuk 0 ≤ N ≤ 1.
• Sehingga, N = 0 dan N = 1 adalah base case.
6/36
Penjelasan Solusi Rekursif (lanj.)
Recurrence Relation
• Bagaimana jika N > 1?
• Seperti yang sudah didefinisikan, fN = fN−1 + fN−2 untuk
N>1
• Contoh: f5 = f4 + f3 .
• Mencari f4 dan f3 sendiri juga memunculkan permasalahan
yang lebih kecil, yaitu:
• f4 = f3 + f2
• f3 = f2 + f1
• Hal ini akan terus diulang sampai tercapai base case, yaitu f0
atau f1 .
• Dengan ini, kita menemukan hubungan rekursif dari fN .
7/36
Contoh Solusi: fibonacci rekursi.cpp
8/36
Penjelasan Solusi Rekursif
Alur eksekusi rekursi dapat dimodelkan dengan pohon rekursi.
Berikut adalah contoh pohonnya untuk f4 .
f4
f3 f2
f2 f1 f1 f0
f1 f0
9/36
Penjelasan Solusi Rekursif (lanj.)
10/36
Penjelasan Solusi Rekursif (lanj.)
11/36
Penjelasan Solusi Rekursif (lanj.)
12/36
Kompleksitas Solusi
13/36
Masalah
14/36
Bagian 2
Permutasi
15/36
Soal: Permutasi
Deskripsi:
• Pak Dengklek lupa password akun TLX-nya!
• Yang ia ingat hanyalah passwordnya terdiri dari N angka, dan
mengandung masing-masing angka dari 1 sampai N.
• Misalnya N = 3, bisa jadi password Pak Dengklek adalah 123,
132, 312, dst
• Bantu Pak Dengklek menuliskan semua kemungkinan
passwordnya!
16/36
Soal: Permutasi (lanj.)
Format masukan:
• Sebuah baris berisi sebuah bilangan N.
Format keluaran:
• Beberapa baris yang merupakan semua kemungkinan
password, satu pada setiap barisnya.
• Urutkan keluaran secara leksikografis (seperti pada kamus).
Batasan:
• 1≤N≤8
17/36
Soal: Permutasi (lanj.)
Contoh masukan:
3
Contoh keluaran:
123
132
213
231
312
321
18/36
Solusi
19/36
Solusi (lanj.)
20/36
Solusi (lanj.)
21/36
Ide Rekursif
• Setiap kedalaman loop bisa diwujudkan oleh sebuah
pemanggilan rekursif.
for 1..N
for 1..N
for 1..N
...
end
end
end
22/36
Ide Rekursif (lanj.)
23/36
Ide Rekursif (lanj.)
24/36
Ide Rekursif (lanj.)
25/36
Ide Rekursif (lanj.)
26/36
Solusi untuk Permutasi
27/36
Menghindari Digit Berulang
28/36
Menghindari Digit Berulang (lanj.)
29/36
Menghindari Digit Berulang (lanj.)
30/36
Menghindari Digit Berulang (lanj.)
31/36
Implementasi
void tulis(int kedalaman) {
if (kedalaman >= N) {
// Cetak password
for (int i = 0; i < N; i++) {
printf("%d", catat[i]); // Cetak
}
printf("\n");
} else {
// Masuk ke lapisan lebih dalam
for (int i = 1; i <= N; i++) {
if (!pernah[i]) { // i belum pernah?
pernah[i] = true; // Gunakan
catat[kedalaman] = i; // Catat di sini
tulis(kedalaman + 1);
pernah[i] = false; // Selesai menggunakan
}
}
}
}
32/36
Menghindari Digit Berulang (lanj.)
33/36
Kompleksitas
• Jika N = 3, maka berikut pohon rekursif yang
menggambarkan pemilihan i untuk setiap pemanggilan:
tulis(1)
34/36
Kompleksitas
35/36
Penutup
36/36