Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik...

48
Introduction Minggu #1 Jurusan Teknik Informatika FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman ? Komputer seringkali dikenal sebagai “benda pintar”, namun sebenarnya pendapat ini tidak terlalu benar. Komputer yang hanya terdiri dari sekumpulan hardware, secanggih apapun, tetap tidak berguna jika tidak ada softwarenya. Secara sederhana, pemrograman merupakan kegiatan manusia (selaku brainware) membuat software. Jadi, manusialah sebenarnya yang “pintar”, ia yang memberitahukan apa yang harus dikerjakan oleh komputer sehingga dapat menyelesaikan suatu masalah. Tapi, bagaimana mungkin manusia dapat berkomunikasi dengan komputer yang bahasanya berbeda? Perlu ada penerjemah! Penerjemah itulah yang kita kenal dengan nama compiler. Sayangnya, bahasa manusia terlalu ambigu, sehingga sulit untuk diterjemahkan secara langsung. Karena itu, perlu ada suatu bahasa yang cukup mudah dimengerti oleh manusia, namun cukup jelas strukturnya sehingga dapat diterjemahkan menjadi bahasa mesin. Bahasa ini dikenal sebagai bahasa pemrograman. Compiler bertugas menerjemahkan code yang ditulis dalam bahasa pemrograman ke dalam bahasa mesin. Bahasa C/C++ Seperti layaknya bahasa manusia, bahasa pemrograman juga banyak jenisnya, misalnya: C, C++, Java, Pascal, Python, dll. Pada modul ini, kita akan mempelajari bahasa C/C++. Bahasa C merupakan sebuah bahasa pemrograman dengan pendekatan prosedural. Seiring berjalannya waktu, teknik pemrograman dengan pendekatan berorientasi objek mulai berkembang dan populer. Bahasa C++ merupakan pengembangan dari bahasa C yang menambahkan fitur-fitur untuk mendukung pemrograman berorientasi objek. Prosedural V.S. Berorientasi Objek (Object Oriented / OO) Kedua pendekatan ini tentunya memiliki keunggulan dan kelemahan masing-masing. Pada kuliah ini, kita tidak akan membahas perbedaan keduanya, namun kita akan banyak menggunakan cara prosedural karena umumnya cara ini lebih cocok untuk keperluan kompetisi. Namun demikian, beberapa teknik OO memiliki keunggulan dalam menyelesaikan kasus-kasus tertentu. Pada minggu ke-12 hingga 14, kita akan berkenalan dengan teknik ini. Manusia (bahasa manusia) Komputer (bahasa mesin) Penerjemah bahasa mesin compiler bahasa pemrograman ide/gagasan

Transcript of Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik...

Page 1: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Introduction Minggu #1

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1

Apa itu Pemrograman ?

Komputer seringkali dikenal sebagai “benda pintar”, namun sebenarnya pendapat ini tidak terlalu

benar. Komputer yang hanya terdiri dari sekumpulan hardware, secanggih apapun, tetap tidak

berguna jika tidak ada softwarenya.

Secara sederhana, pemrograman merupakan kegiatan manusia (selaku brainware) membuat

software. Jadi, manusialah sebenarnya yang “pintar”, ia yang memberitahukan apa yang harus

dikerjakan oleh komputer sehingga dapat menyelesaikan suatu masalah. Tapi, bagaimana mungkin

manusia dapat berkomunikasi dengan komputer yang bahasanya berbeda? Perlu ada penerjemah!

Penerjemah itulah yang kita kenal dengan nama compiler.

Sayangnya, bahasa manusia terlalu ambigu, sehingga sulit untuk diterjemahkan secara langsung.

Karena itu, perlu ada suatu bahasa yang cukup mudah dimengerti oleh manusia, namun cukup jelas

strukturnya sehingga dapat diterjemahkan menjadi bahasa mesin. Bahasa ini dikenal sebagai bahasa

pemrograman. Compiler bertugas menerjemahkan code yang ditulis dalam bahasa pemrograman ke

dalam bahasa mesin.

Bahasa C/C++

Seperti layaknya bahasa manusia, bahasa pemrograman juga banyak jenisnya, misalnya: C, C++, Java,

Pascal, Python, dll. Pada modul ini, kita akan mempelajari bahasa C/C++.

Bahasa C merupakan sebuah bahasa pemrograman dengan pendekatan prosedural. Seiring

berjalannya waktu, teknik pemrograman dengan pendekatan berorientasi objek mulai berkembang

dan populer. Bahasa C++ merupakan pengembangan dari bahasa C yang menambahkan fitur-fitur

untuk mendukung pemrograman berorientasi objek.

Prosedural V.S. Berorientasi Objek (Object Oriented / OO)

Kedua pendekatan ini tentunya memiliki keunggulan dan kelemahan masing-masing. Pada kuliah ini,

kita tidak akan membahas perbedaan keduanya, namun kita akan banyak menggunakan cara

prosedural karena umumnya cara ini lebih cocok untuk keperluan kompetisi. Namun demikian,

beberapa teknik OO memiliki keunggulan dalam menyelesaikan kasus-kasus tertentu. Pada minggu

ke-12 hingga 14, kita akan berkenalan dengan teknik ini.

Manusia

(bahasa manusia)

Komputer

(bahasa mesin)

Penerjemah

bahasa mesin

compiler bahasa pemrograman

ide/gagasan

Page 2: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Hello World ! Minggu #1

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 2

Hello World !

#include <stdio.h>

int main(){

printf(“Hello World !”);

return 0;

}

“Hello World !” mungkin merupakan salah satu program yang paling sering dibuat oleh manusia .

Ketikan code di atas, lalu simpanlah dengan nama hello.cpp. Compile program tersebut, dan coba

jalankan !

Program ini mendemokan bagian-bagian penting dalam sebuah program C

#include <stdio.h> library yang digunakan

int main() program utama

printf(“Hello World !”); perintah untuk mengeluarkan teks ke layar

return 0; menandakan program selesai dengan baik

Tipe Data

Program komputer pada dasarnya adalah alat untuk memproses data. Problem yang kita miliki dapat

dituangkan dalam bentuk data input, kemudian input tersebut diproses oleh program, sehingga

dihasilkan data-data solusi dari problem tersebut.

Untuk dapat memproses data, komputer perlu menyimpannya dalam memory. Tipe data yang dapat

disimpan di komputer sebenarnya hanya 3 jenis, seperti dituliskan pada tabel berikut ini.

Tipe Ukuran Rentang nilai Tipe data

Bilangan bulat 1 byte -128 .. +127 char

2 byte -32,768 .. +32,767 short int

4 byte -2,147,483,648 .. +2,147,483,647 int

Bilangan riil 4 byte 1.2E-38 .. 3.4E+38 float

8 byte 2.3E-308 .. 1.7E+308 double

Pointer 4/8 byte - * <tipe_data>

Bilangan bulat

Bilangan bulat merupakan bilangan yang sifatnya diskrit. Untuk setiap bilangan, kita dapat

menentukan apa bilangan sebelumnya, dan apa bilangan sesudahnya. Misalnya angka 5,

sebelumnya pasti angka 4, dan sesudahnya pasti angka 6. Tipe data seperti ini dapat digunakan

untuk menghitung jumlah item, dsb.

Page 3: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Tipe Data & Variable Minggu #1

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 3

Bilangan riil

Kebalikan dari bilangan bulat, sifat bilangan riil adalah kontigu. Kita tidak dapat menentukan apa

bilangan sebelum dan sesudah suatu bilangan. Misalnya angka 5, apakah angka sebelumnya

adalah 4.0? atau 4.5? atau 4.9? atau 4.99999999? Tipe data seperti ini cocok digunakan untuk

perhitungan matematika.

Pointer

Pointer sebenarnya mirip dengan tipe bilangan bulat, hanya saja tipe ini dikhususkan untuk

menyimpan alamat memori. Kita akan mempelajari tipe ini lebih lanjut pada minggu ke-6.

Variable

Variable merupakan media penyimpanan dalam program komputer. Sebelum dapat digunakan,

variable harus dideklarasikan terlebih dahulu, dengan cara menuliskan tipe dan namanya. Penamaan

variable harus dimulai dengan huruf atau simbol underscore (_) , dan hanya boleh mengandung

huruf kecil, huruf kapital, angka, dan underscore.

Cobalah program berikut ini ! Simpan dengan nama latihan1.cpp.

#include <stdio.h>

int main(){

int a = 5;

int b = 7;

int jumlah;

jumlah = a + b;

printf(“%d”, jumlah);

return 0;

}

Input / Output Stream

ada program sebelumnya, kita menemukan code printf(“%d”, jumlah);

Seperti disinggung di bagian sebelumnya, printf merupakan perintah untuk menuliskan teks ke

layar. Lebih tepatnya, printf merupakan sebuah fungsi yang berguna untuk menuliskan teks ke

output stream, sesuai dengan parameter yang kita berikan di dalam kurung. Kita akan membahas

lebih detil tentang apa itu fungsi dan parameter pada minggu ke-5. Di minggu ini kita akan fokus

pada pemahaman tentang input dan output stream.

output stream

program input stream

Page 4: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Input / Output Stream Minggu #1

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 4

Pada bagian sebelumnya telah disinggung bahwa sebuah program menerima input, kemudian

memprosesnya, dan mengeluarkan output. Secara default, input program datang dari keyboard, dan

output dikeluarkan lewat layar monitor. Namun demikian, kita dapat menerima input dari lokasi lain,

misalnya dari file, mouse, computer port, dll. Dengan cara yang sama, output juga bisa dikeluarkan

ke lokasi-lokasi lain.

Input dan output program bersifat seperti aliran air, karena itu disebut “stream”. Input datang dalam

bentuk deretan karakter-karakter, dan output keluar dalam bentuk yang sama. Seperti halnya aliran

air yang dapat dibelokan, input dan output stream juga dapat dibelokan. Cara ini dikenal dengan

metoda pipelining.

Cobalah jalankan program latihan1.exe dengan perintah berikut ini :

latihan1 > output.txt

Perhatikan bahwa program selesai tanpa menulis apapun ke layar. Periksalah folder tempat program

ini berada. Anda akan menemukan sebuah file baru bernama output.txt, yang berisikan keluaran dari

progam latihan1.exe.

Tanda > berguna untuk membelokan aliran output ke file bernama output.txt. Pada bagian

berikutnya akan dicontohkan cara membelokan aliran input dengan menggunakan tanda <.

Cobalah program berikut ini ! Simpan dengan nama latihan2.cpp.

Program ini menerima input sebuah angka, menyimpannya ke variable bernama a, kemudian

menuliskannya kembali ke layar.

#include <stdio.h>

int main(){

int a;

scanf(“%d”, &a);

printf(“a = %d”, a);

return 0;

}

Sekarang coba buat sebuah file dengan nama input.txt, lalu isikan sebuah angka. Jalankan lagi

program tadi dengan perintah berikut ini:

latihan2 < input.txt > output.txt

Perhatikan isi file output.txt !

Page 5: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Fungsi printf dan scanf Minggu #1

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 5

Fungsi printf dan scanf

Pada contoh sebelumnya, kita telah mencoba menggunakan fungsi scanf dan printf. Kedua fungsi ini

berguna untuk menerima input dan mengeluarkan output. Parameter scanf dan printf terbagi 2

bagian utama, yaitu formatting, dan daftar variable.

Parameter formatting menentukan apa yang akan ditulis ke output stream, berapa variable (jika

ada), dan apa tipenya masing-masing. Variable dilambangkan dengan simbol persen (%), dan tipenya

dituliskan setelah tanda %. Pada contoh sebelumnya, %d melambangkan variable bertipe int.

Berikut ini daftar formatting yang umum digunakan :

Tipe data Formatting

int dan char (sebagai bilangan) %d

long %ld

float %f

double %lf

char (sebagai huruf) %c

array of char (sebagai string) %s

Cara kerja fungsi scanf sangar mirip dengan fungsi printf. Formatting pada scanf berguna

untuk menentukan tipe data apa saja yang ingin dibaca dan disimpan ke variable, dan karakter apa

saja yang ingin diabaikan. Pada contoh sebelumnya, scanf(“%d”, &a), berarti “bacalah sebuah

int, simpan di variable bernama a”. Perhatikan bahwa pada scanf, variable penampung

dituliskan dengan diawali simbol ampersand (&).

Fungsi printf dan scanf dapat membaca dan menuliskan beberapa variable sekaligus. Cobalah

program berikut ini ! Simpan dengan nama latihan3.cpp.

#include <stdio.h>

int main(){

int pembilang, penyebut;

float pecahan;

scanf(“%d %d”, &pembilang, &penyebut);

pecahan = pembilang/penyebut;

printf(“%d/%d = %f”, pembilang, penyebut, pecahan);

return 0;

}

Code scanf(“%d %d”,… artinya “bacalah sebuah int, lalu abaikan spasi, lalu baca sebuah int”.

Maka file input.txt harus berisi dua buah bilangan bulat yang dipisahkan spasi (boleh lebih dari 1).

Cobalah:

Berikan input “10 3”. Apa hasilnya ?

Berikan input “7 0”. Apa hasilnya ?

Page 6: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Chapter Notes Minggu #1

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 6

Page 7: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Operator Minggu #2

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 7

Literal

Pada bagian sebelumnya, kita sudah berkenalan dengan tipe-tipe data yang ada dalam bahasa C.

Data dalam sebuah program dapat disimpan dalam variable, atau konstanta literal. Contohnya:

int a = 5 + 7;

a merupakan variable yang bertipe int, 5 dan 7 merupakan literal yang bertipe int.

float pi = 3.1415926535897932384626433832795;

pi merupakan variable yang bertipe float, 3.14 merupakan literal yang bertipe double.

Perhatikan bahwa literal riil selalu bertipe double, namun ketika literal tersebut diisikan ke variable

bertipe float, nilainya akan dibulatkan ke ketelitian terdekat.

Dari contoh di atas, kita dapat melihat cara menuliskan literal bertipe bilangan bulat (dianggap

bertipe int) dan bilangan riil (dianggap bertipe double). Untuk mengubah tipe data, dapat

digunakan perintah (tipe_data), yang dikenal dengan istilah type casting.

Cobalah code berikut ini:

float a, b, c;

a = 1/2;

b = (float)1/(float)2;

c = 1.0/2.0;

printf(“%f %f %f\n”, a,b,c);

Berikut ini beberapa cara penulisan literal yang umum digunakan:

Tipe literal Contoh

Bilangan bulat basis 10 int a = 100;

Bilangan bulat basis 8 (octal): dengan menambahkan angka 0 di awal

int a = 054; //sama dengan 44 desimal

Bilangan bulat basis 16 (hexa): dengan menambahkan 0x di awal

int a = 0xFF; // sama dengan 255 desimal

Bilangan riil: dengan menambahkan . dan diikuti angka di belakang koma

float a = 1.0/2.0; // sama dengan 0.5

String: dengan diapit kutip “

char s[] = “Hello”;

Huruf: dengan diapit kutip satu ‘

char c = ‘A’;

Page 8: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Operator Minggu #2

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 8

Operator

Operator dapat digunakan untuk memanipulasi data yang kita miliki. Operator terbagi atas 2 jenis:

unary, yaitu operator yang menerima sebuah data, dan binary, yaitu operator yang menerima 2

data. Berikut ini operator-operator yang terdapat pada bahasa C:

Operator Arti

Assignment:

<left> = <right> <left> += <right>

<left> -= <right>

<left> *= <right>

<left> /= <right>

<left> %= <right>

menyalin nilai <right> ke variable <left> <left> = <left> + <right> <left> = <left> - <right> <left> = <left> * <right> <left> = <left> / <right> <left> = <left> % <right>

Binary arithmetic: +

-

*

/

%

tambah kurang kali bagi modulus (hanya untuk tipe bil. bulat)

Unary arithmetic: +

-

++

--

positif negatif increment (hanya untuk tipe bil. bulat) decrement (hanya untuk tipe bil. bulat)

Binary relational: >

<

>=

<=

==

!=

lebih besar lebih kecil lebih besar atau sama dengan lebih kecil atau sama dengan sama dengan tidak sama dengan

Binary logical: &&

||

and or

Unary logical: !

not

Selain operator-operator di atas, ada juga operator untuk memanipulasi pointer dan untuk

memanipulasi bit, tapi akan dibahas pada bagian lain .

Operator Presedensi

Setiap operator memiliki prioritas yang berbeda-beda. Misalnya 5+4*2 akan bernilai 13 (dari 5+8),

bukan 18 (9*2). Untuk mendapatkan hasil 18, dapat digunakan tanda kurung: (5+4)*2. Untuk

urutan lengkap mengenai prioritas operator, dapat dilihat pada buku.

Page 9: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Percabangan if-else Minggu #2

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 9

Percabangan dengan if…else…

Sejauh ini kita sudah mencoba berbagai code program, masing-masing berjalan sekuensial, dari baris

pertama, berurutan sampai baris paling akhir. Kita dapat mencabangkan jalannya program kita

dengan perintah if… dan if…else. Perhatikan contoh berikut ini:

#include<stdio.h>

int main(){

char huruf;

scanf(“%c”, &huruf);

if(huruf >= ‘A’ && huruf <= ‘Z’)

printf(“huruf kapital”);

else

printf(“huruf kecil”);

return 0;

}

Format perintah ini adalah : if(<kondisi>) <code1>; else<code2>;

Jika <kondisi> terpenuhi, maka <code1> yang dijalankan, jika tidak, maka <code2> yang

dijalankan. Perhatikan bahwa <code1> dan <code2> masing-masing hanya boleh satu perintah saja. Supaya kita dapat menjalankan lebih dari satu perintah, gunakan { }. Misalnya:

#include<stdio.h>

int main(){

char huruf, huruf2;

scanf(“%c”, &huruf);

if(huruf >= ‘A’ && huruf <= ‘Z’){

huruf2 = huruf + 32;

printf(“huruf kecil dari %c adalah %c”, huruf, huruf2);

}

else{

huruf2 = huruf – 32;

printf(“huruf kapital dari %c adalah %c”, huruf, huruf2);

}

return 0;

}

Latihan:

Buatlah sebuah program yang menerima sebuah bilangan bulat, kemudian mengeluarkan string:

jika angkanya 0 : “nol”

jika angkanya <0 : “negatif”

jika angkanya >0 : “positif”

Page 10: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Percabangan dengan switch-case Minggu #2

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 10

Percabangan dengan switch-case

Perintah percabangan yang lain adalah switch-case. Perintah ini dapat membuat lebih dari 2 cabang,

bergantung dari nilai sebuah variable bertipe bilangan bulat. Perhatikan contoh berikut ini:

#include<stdio.h>

int main(){

char nilai;

scanf(“%c”, &nilai);

switch(nilai){

case ‘A’ : printf(“Sangat Baik”); break;

case ‘B’ : printf(“Baik”); break;

case ‘C’ : printf(“Cukup”); break;

case ‘D’ : printf(“Kurang”); break;

case ‘E’ : printf(“Tidak Lulus”); break;

default : printf(”Nilai tidak valid”);

}

return 0;

}

Format perintah ini adalah: switch(<variable>){

case <nilai #1> : <code-code #1>

case <nilai #2> : <code-code #2>

}

Perhatikan bahwa perintah ini bukan menerima kondisi, namun menerima sebuah variable. Variable

ini harus bertipe bilangan bulat. <code-code #i> boleh terdiri dari banyak perintah. Jika kondisi

<variable>==<nilai #i> terpenuhi, maka <code-code #i> dan seterusnya akan

dijalankan. Perintah break; berguna untuk keluar dari blok { }, sehingga perintah setelah

break; tidak dijalankan. Cobalah hilangkan semua perintah break; pada program di atas,

kemudian perhatikan perbedaannya!

Latihan:

Buatlah sebuah program yang menerima sebuah angka bulan, kemudian mengeluarkan jumlah hari

dalam bulan tersebut. Anggap bulang Febuari selalu memiliki 28 hari. Gunakan perintah

percabangan switch-case untuk mengerjakan program ini !

Page 11: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Latihan Minggu #2

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 11

1. Selisih Bilangan

Buatlah sebuah program yang menerima dua buah bilangan bulat A dan B (-1,000,000 ≤ A,B ≤

1,000,000), kemudian mengeluarkan selisihnya.

Contoh Input #1 1024 24

Contoh Output #1 1000

Contoh Input #2 253 1234

Contoh Output #2 981

2. Ganjil Genap

Buatlah sebuah program yang menerima sebuah bilangan bulat X (-1,000,000 ≤ X ≤ 1,000,000),

kemudian mengeluarkan string “ganjil” jika X tidak habis dibagi 2, atau “genap” jika X habis dibagi 2.

Contoh Input #1 56

Contoh Output #1 genap

Contoh Input #2 77

Contoh Output #2 ganjil

3. Kalkulator Sederhana

Buatlah sebuah program yang menerima sebuah ekspresi matematika yang terdiri dari dua buah

bilangan riil dan sebuah operator (+, -, *, atau /). Keluarkan hasil perhitungan ekspresi tersebut

dengan ketelitian 3 angka di belakang koma. Hint: gunakan %.3f untuk formatting prinf.

Contoh Input #1 10.03 + 11.05

Contoh Output #1 21.080

Contoh Input #2 77 + 31.1234

Contoh Output #2 108.123

Page 12: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Chapter Notes Minggu #2

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 12

Page 13: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Perulangan dengan for-loop Minggu #3

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 13

Percabangan dan perulangan merupakan dua kontrol paling fundamental untuk mengatur jalannya

program. Pada minggu lalu kita sudah melihat bagaimana cara mencabangkan jalannya program

dengan perintah if…else dan switch-case. Minggu ini kita akan mempelajari teknik perulangan

menggunakan perintah for-loop, while, dan do-while. Semua perintah ini intinya sama saja, namun

ada kasus-kasus tertentu yang lebih mudah dikerjakan dengan menggunakan for-loop, dan

sebaliknya ada yang lebih mudah dikerjakan dengan while atau do-while.

Percabangan dengan for-loop

Perintah for-loop merupakan jenis percabangan yang paling sering digunakan, karena itu kita akan

membahas perintah ini terlebih dahulu. For-loop umum digunakan untuk mengulang satu baris code

(atau satu blok kode yang diapit oleh {}) sebanyak sekian kali. Cobalah code berikut ini:

int i;

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

printf(“Hello World!\n”);

Code di atas akan menuliskan teks Hello World! sebanyak 10 kali. Perhatikan format perintah

for pada baris ke-2. Di dalam kurung terdapat 3 bagian yang dipisahkan oleh titik-koma:

1. inisialisasi, dilakukan sekali sebelum perulangan dilakukan

2. kondisi boleh terus mengulang, diperiksa setiap kali selesai 1 iterasi dan menentukan apakah

program akan masuk ke iterasi berikutnya

3. code yang dijalankan di akhir setiap iterasi

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

Pada code di atas, i merupakan variable bertipe int. Mula-mula i diisi dengan nilai 0 (pada bagian

inisialisasi for). Kemudian kondisi diperiksa, apakan i<10 ? Karena saat ini i masih bernilai 0, dan

0<10, maka code berikutnya dikerjakan (pada contoh ini, printf(“Hello World!\n”);).

Setelah code selesai dikerjakan, bagian ke-3 dikerjakan, dan nilai i berubah jadi 1. Proses ini terus

berulang hingga nilai i menjadi 10. Perulangan berhenti karena 10 tidak lebih kecil dari 10. Jadi nilai

i ketika perulangan ini berjalan adalah 0, 1, 2, …, 9, total ada 10 kali iterasi. Untuk lebih jelasnya,

cobalah code berikut ini:

int i;

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

printf(“Nilai i = %d\n”, i);

Latihan:

Ubahlah code di-atas supaya nilai i menurun mulai dari 10 hingga 1

1 2 3

Page 14: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Perulangan dengan for-loop Minggu #3

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 14

Sama seperti pada percabangan, perintah for-loop juga dapat mengulang lebih dari satu code yang

digabungkan ke dalam satu blok {}. Perhatikan contoh berikut ini. Program ini menerima input

sebuah bilangan bulat n, kemudian menerima n buah bilangan bulat yang ingin dicari nilai

kuadratnya.

#include<stdio.h>

int main(){

int n, i, bilangan;

scanf(“%d\n”, &n);

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

scanf(“%d\n”, &bilangan);

printf(“%d kuadrat = %d\n”, bilangan, bilangan*bilangan);

}

return 0;

}

Cobalah input berikut ini, apa outputnya ?

5

3

7

2

9

5

Latihan:

Buatlah sebuah program yang menerima tiga buah bilangan bulat n, a, b (1 ≤ n,a,b ≤ 100). Keluarkan

n buah bilangan sesuai dengan aturan deret aritmatika

Suku ke-n didapat dari rumus:

Contoh Input #1 6 3 4

Contoh Output #1 3 7 11 15 19 23

Contoh Input #2 4 7 2

Contoh Output #2 7 9 11 13

Page 15: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Perulangan dengan while Minggu #3

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 15

Perulangan dengan while

Perulangan dengan perintah while memiliki struktur yang nampak lebih sederhana daripada perintah

for-loop, namun pada prinsipnya sama saja. Pada perintah while, tidak disediakan tempat khusus

untuk inisialisasi dan code yang dilakukan di akhir iterasi, tapi jika memang diperlukan, dapat kita

tambahkan sendiri di tempat yang lebih fleksibel. Perhatikan contoh berikut ini:

int i=0;

int n;

scanf(“%d”, &n);

while(i<n){

printf(“iterasi ke-%d\n”, i);

i++;

}

Pada code di atas, nilai variable i digunakan sebagai syarat kondisi mengulang (i<n), sapa seperti

pada contoh for-loop. Namun pada contoh ini, inisialisasi i=0 dikerjakan di awal program, yaitu saat

mendeklarasikan variable. Pada code terakhir, perintah i++ berguna untuk mengubah nilai i

supaya pada suatu saat kondisi i<n tidak lagi terpenuhi, dan program dapat berhenti mengulang.

Perhatikan bahwa lokasi perintah i++ biasanya di akhir blok {}, tapi tidak wajib di lokasi ini!

Penting !

Perintah perulangan selalu bergantung pada kondisi mengulang, misalnya pada contoh di atas, i<n.

Jika kondisi ini selalu bernilai false, maka perulangan tidak akan pernah dijalankan. Sebaliknya jika

kondisi ini selalu bernilai true, maka perulangan tidak akan pernah berhenti (dikenal dengan istilah

looping forever). Ketika merancang program perulangan, pastikan nilai kondisi dapat berubah.

Misalnya pada contoh di atas, nilai i bertambah 1 setiap iterasi, maka pada suatu saat i akan lebih

besar atau sama dengan n, kemudian perulangan berhenti. Tapi misalnya perintah i++ lupa

dituliskan, maka nilai i selamanya sama dengan 0.

Hati-hati ! Bagaimana jika kondisi berhentinya (i==n) dan ternyata n merupakan angka negatif *?

Misalnya mula-mula i=0 dan n bernilai -5. Pada setiap iterasi nilai i menaik, maka tidak mungkin

mencapai nilai -5. Jadi pastikan variable yang digunakan pada kondisi pengulangan dapat berubah

di dalam blok { }, dan perubahan tersebut bergerak mendekati kondisi berhenti.

*Pada prakteknya, setiap variable memiliki batas-batas nilai. Misalnya variable bertipe char memiliki

rentang -128…+127. Bagaimana jika kita mencoba menambah 1 pada variable bertipe char yang

nilainya 127 ? Fenomena ini dikenal dengan istilah overflow, dimana 127+1 sama dengan -128.

Bayangkan seperti pada angka jam, pk 24.00 + 1 jam = pk 1.00. Jadi pada kasus perulangan di atas,

jika n berupa angka negatif, perulangan akan tetap berhenti, yaitu ketika nilai i sudah overflow

menjadi angka negatif. Namun tentunya pada kasus ini, cara berhenti demikian tidak kita harapkan

.

Page 16: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Perulangan dengan do-while Minggu #3

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 16

Perulangan dengan do-while

Perulangan do-while sangat mirip dengan perulangan while, hanya saja pada cara ini, kondisi

mengulang diperiksa di akhir iterasi. Hal ini menyebabkan perulangan selalu dilakukan minimal 1x

iterasi. Cobalah dan bandingkan kedua contoh berikut ini:

int i=0, n;

scanf(“%d”, &n);

while(i<n){

printf(“Hello !\n”);

i++;

}

int i=0, n;

scanf(“%d”, &n);

do{

printf(“Hello !\n”);

i++;

} while(i<n);

Jika input berupa angka yang lebih besar dari 0, misalnya 5, maka keduanya akan mengeluarkan teks

“Hello!” sebanyak 5 kali. Tapi jika input bernilai 0 atau lebih kecil dari 0, maka program kiri tidak

akan mengeluarkan apapun, tapi program kanan akan mengeluarkan sebaris teks.

Perhatikan format perintah do-while pada contoh di atas! Terdapat sebuah titik-koma di akhir

while(…).

Latihan:

Ubahlah contoh-contoh program dan latihan perulangan for-loop menjadi bentuk perulangan while!

Break & Continue

Ada kalanya kita ingin keluar dari blok perulangan di tengah jalan, tanpa harus melakukan

pemeriksaan kondisi di awal atau akhir iterasi. Perintah break digunakan untuk keluar dari blok {}

dan menghentikan perulangan. Kita sudah melihat contoh penggunaan perintah ini pada bagian

switch-case, dimana code-code setelah perintah break semuanya tidak dikerjakan. Pada perulangan

juga sama.

Perintah continue digunakan untuk keluar dari blok {}, tapi tidak menghentikan perulangan.

Perulangan tetap dilanjutkan ke awal iterasi berikutnya. Cobalah contoh berikut ini, lalu gantilah

perintah continue dengan break, dan perhatikan bedanya !

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

printf(“Kalimat pertama, iterasi %d\n”, i);

continue;

printf(“Kalimat kedua, iterasi %d\n”, i);

}

Page 17: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Latihan Minggu #3

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 17

1. Bilangan genap < N

Buatlah sebuah program yang menerima input sebuah bilangan bulat N (2 ≤ N ≤ 1 juta),

kemudian mengeluarkan seluruh bilangan genap positif yang < N, dimulai dari angka 2, masing-

masing dipisahkan spasi.

Contoh Input #1 2

Contoh Output #1 2

Contoh Input #2 17

Contoh Output #2 2 4 6 8 10 12 14 16

2. XO

Buatlah sebuah program yang menerima input sebuah bilangan bulat N (1 ≤ N ≤ 100), kemudian

menuliskan karakter X sebanyak N kali, diikuti dengan karakter O sebanyak N kali.

Contoh Input #1 3

Contoh Output #1 XXXOOO

Contoh Input #2 6

Contoh Output #2 XXXXXXOOOOOO

3. Penjumlahan angka

Buatlah sebuah program untuk menjumlahkan pasangan-pasangan angka a dan b (-1 juta ≤ a, b ≤

1 juta). Input terdiri dari beberapa baris yang masing-masing berisi sepasang angka dipisahkan

spasi. Untuk setiap pasang, tuliskan jumlahnya dalam satu baris output. Input diakhiri dengan

pasangan angka 0 0, pasangan ini tidak perlu dihitung jumlahnya.

Contoh Input #1 3 4

5 1

-6 8

2 -4

-3 -7

0 0

Contoh Output #1 7

6

2

-2

-10

Contoh Input #2 100 100

-1010 10

10 -1010

5 -5

0 0

Contoh Output #2 200

-1000

-1000

0

Page 18: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Chapter Notes Minggu #3

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 18

Page 19: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Percabangan & Perulangan Lanjut Minggu #4

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 19

Percabangan & Perulangan Lanjut

Pada bagian sebelumnya kita telah mempelajari dasar dari program control, yaitu percabangan dan

perulangan. Program-program yang lebih kompleks seringkali membutuhkan perulangan dan atau

percabangan bertingkat, atau bahkan gabungan dari keduanya. Pada bagian ini kita akan berlatih

membuat perulangan dan percabangan bertingkat.

Contoh 4.1: Menentukan kuadran

IV I

III II

Sistem koordinat kartesius dibagi atas 4 kuadran: Kuadran I : x positif, y positif Kuadran II : x positif, y negatif Kuadran III : x negatif, negatif Kuadran IV : x negatif, y positif

Program berikut ini menerima input koordinat (x,y) sebuah titik, kemudian menentukan kuadran

berapa titik tersebut berada. Perhatikan bahwa kurung kurawal { } pada if pertama sebenarnya tidak

wajib, karena isinya hanya satu perintah.

#include<stdio.h>

int main(){

int x,y;

scanf("%d %d", &x, &y);

if(x>=0){

if(y>=0)

printf("Kuadran I");

else

printf("Kuadran II");

}

else{

if(y>=0)

printf("Kuadran IV");

else

printf("Kuadran III");

}

return 0;

}

Contoh 4.2: Tabel Celcius – Fahrenheit

Celcius dan Fahrenheit merupakan dua satuan ukur suhu yang umum digunakan. Untuk

mengkonversi suhu dalam celcius ke fahrenheit dapat digunakan rumus:

Page 20: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Percabangan & Perulangan Lanjut Minggu #4

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 20

Program berikut ini mencetak tabel suhu dalam celcius dan fahrenheit. Perhatikan bahwa variable

iterator untuk for tidak harus selalu bertambah 1 setiap berulang. Pada contoh ini variable celc

bertambah 10 tiap perulangan. Formatting %6.2lf artinya variable bertipe double di-print

sebanyak 6 karakter (karakter titik termasuk), dengan 2 angka dibelakang koma. Jika angka tidak

mencapai 6 karakter, output akan di-padding dengan karakter spasi. Cobalah ganti formatting

tersebut dengan %-6.2lf, apa yang terjadi ?

#include<stdio.h>

int main(){

double fahr;

int celc;

printf("Celcius\tFahrenheit\n");

for(celc=0; celc<=100; celc+=10){

fahr = 9.0/5.0 * celc + 32.0;

printf("%6.2lf\t%6.2lf\n", (double)celc, fahr);

}

return 0;

}

Contoh 4.3: Tabel Perkalian 1 s.d. 10

Program berikut ini menuliskan tabel perkalian 1 hingga 10. Formatting %3d menuliskan bilangan

bulat dalam 3 digit. Jika angka yang dituliskan lebih pendek dari 3 digit, maka akan di-padding

dengan spasi. Coba ganti formatting tersebut dengan %-3d dan %+3d, apa yang terjadi ?

#include<stdio.h>

int main(){

int i,j;

for(i=1; i<=10; i++, printf("\n"))

for(j=1; j<=10; j++)

printf("%3d ", i*j);

return 0;

}

Page 21: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Trik Input/Output Minggu #4

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 21

Trik Input/Output

Umumnya input pada soal kompetisi pemrograman terdiri dari banyak tes kasus. Input masing-

masing tes kasus tidak saling berpengaruh, karena itu kita tidak perlu menyimpan semua inputnya

sekaligus. Pola yang umum digunakan adalah membaca input satu kasus, memprosesnya,

mengeluarkan output, kemudian baca input selanjutnya.

Ada beberapa pola input/output yang umum digunakan pada soal kompetisi. Pada bagian ini kita

akan membahas trik membaca input yang mudah dan ringkas untuk pola-pola yang sering muncul

tersebut. Sebagai contoh, kita akan menggunakan soal penjumlahan dua angka pada soal latihan no

3 di minggu ke-3.

Pola input #1: Akhir dari input ditandai oleh kasus khusus yang tidak perlu diproses

Pada soal ini, akhir dari input ditandai dengan pasangan angka 0 0. Kita tahu bahwa perintah

“return 0” menyebabkan program berhenti. Solusi berikut ini memanfaatkan perintah “return

0” untuk keluar dari perulangan. Perintah while(1) artinya looping forever, karena 1 pada bahasa

C berarti true.

#include<stdio.h>

int main(){

int a,b;

while(1){

scanf("%d %d\n", &a, &b);

if(a==0 && b==0)

return 0;

printf("%d\n", a+b);

}

return 0;

}

Pola input #2: Jumlah test case diberikan di awal

Input jenis ini diawali dengan sebuah bilangan bulat yang menandakan jumlah test case. Misalnya:

Contoh Input

3

3 4

5 1

-6 8

Untuk mengulang sebanyak N kali, umumnya kita menggunakan perintah for(i=0; i<N; i++),

tapi ada cara yang lebih ringkas . Perhatikan contoh berikut ini. Jumlah test case disimpan pada

variable tc dan di-decrement setiap akhir pengecekan while(tc--). Hal ini menyebabkan loop

berhenti ketika tc bernilai 0 (pada bahasa C artinya false).

Page 22: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Trik Input/Output Minggu #4

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 22

#include<stdio.h>

int main(){

int a,b, tc;

scanf("%d\n", &tc);

while(tc--){

scanf("%d %d\n", &a, &b);

printf("%d\n", a+b);

}

return 0;

}

Pola input #3 : Loop sampai input habis

Input jenis ini memanfaatkan karakter spesial End Of File (EOF) yang selalu ada di akhir input stream.

Pada DOS, karakter EOF dapat dimasukan dengan menekan Ctrl+Z. Jika input program anda di-pipe

dari file, karakter EOF otomatis ada pada akhir file. Berikut ini contoh input yang memanfaatkan

karakter EOF.

Contoh Input

3 4

5 1

-6 8

Untuk membaca input semacam ini, kita dapat memanfaatkan return value dari fungsi scanf.

Fungsi scanf mengembalikan sebuah bilangan bulat yang menandakan berapa banyak input yang

berhasil dibaca. Misalnya scanf(“%d %d\n”, &a, &b) berusaha membaca dua buah bilangan

int. Jika pada input stream terdapat lebih dari 2 bilangan bulat, maka fungsi scanf akan berhasil

mengisi nilai variable a dan b, kemudian mengembalikan nilai 2. Tapi jika input stream hanya berisi

satu bilangan, maka variable a akan terisi dan b tidak. Pada kasus ini, fungsi scanf akan

mengembalikan nilai 1. Jika tidak ditemukan bilangan bulat pada input stream, maka scanf akan

mengembalikan 0.

Perhatikan contoh berikut ini. Ketika scanf tidak mengembalikan nilai 2, maka loop berhenti.

#include<stdio.h>

int main(){

int a,b;

while(scanf("%d %d\n", &a, &b)==2)

printf("%d\n", a+b);

return 0;

}

Page 23: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Trik Input/Output Minggu #4

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 23

Pola output #1 : Satu baris per output

Contoh Output

7

6

2

Pola output seperti ini paling umum ditemui. Triknya adalah apakah perlu ada ekstra \n di akhir

output atau tidak. Perintah printf("%d\n", a+b); mengakibatkan adanya \n pada akhir

setiap angka output. Jika soal melarang ada ekstra \n di akhir, kita dapat menambahkan sebuah

variable penanda test case pertama. Jadi pada test case pertama kita hanya mencetak angkanya

saja, sedangkan pada test case lainnya kita mencetak \n dan angkanya.

Mengapa test case pertama yang special ? Karena mungkin saja input soal menggunakan pola ke-3

sehingga kita tidak tahu jumlah total test case .

#include<stdio.h>

int main(){

int a,b;

int first = 1;

while(scanf("%d %d\n", &a, &b)==2){

if(first) first = 0;

else printf("\n");

printf("%d", a+b);

}

return 0;

}

Pola output #2: Print nomor test case

Pola ini meminta keluaran berupa nomor test case dan diikuti output hasil pemrosesan.

Contoh Output

Case#1: 7

Case#2: 6

Case#3: 2

Jika jumlah test case diberikan pada input, kita dapat menggunakan perintah for untuk perulangan

dan mencetak nilai i pada setiap iterasinya. Jika jumlah test case tidak diberikan, kita dapat

menambahkan sebuah variable untuk counter nomor test case. Perhatikan contoh berikut ini.

casenum++ meng-increment variable casenum setelah nilainya di-print.

Page 24: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Latihan Minggu #4

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 24

#include<stdio.h>

int main(){

int a,b;

int casenum = 1;

while(scanf("%d %d\n", &a, &b)==2)

printf("Case#%d: %d",casenum++, a+b);

return 0;

}

Latihan

1. Bilangan Prima

Buatlah program untuk menentukan apakah sebuah bilangan merupakan bilangan prima atau

bukan. Bilangan prima didefinisikan sebagai bilangan yang memiliki tepat dua faktor, yaitu 1 dan

bilangan itu sendiri. Perhatikan format input/output pada contoh.

Contoh Input #1 3

Contoh Output #1 prima

Contoh Input #2 6

Contoh Output #2 bukan prima

2. Fibonacci

Bilangan fibonacci ke-n dirumuskan sebagai berikut:

Buatlah sebuah program untuk menghitung bilangan fibonacci. Input terdiri dari beberapa kasus.

Masing-masing kasus terdiri dari sebuah bilangan bulat n (0 ≤ n ≤ 40). Untuk setiap kasus,

keluarkan bilangan fibonacci ke-n.

Contoh Input #1 0

1

2

3

Contoh Output #1 0

1

1

2

Contoh Input #2 18

6

20

Contoh Output #2 2584

8

6765

Page 25: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Latihan Minggu #4

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 25

Buatlah program yang menerima input sebuah bilangan bulat N, kemudian mencetak pola seperti

pada contoh output:

3. Pola Bintang #1

Contoh Input 4

Contoh Output *

*

**

*

**

***

*

**

***

****

4. Pola Bintang #2

Contoh Input 4

Contoh Output *

*

**

*

**

***

*

**

***

****

5. Pola Bintang #3

Contoh Input 4

Contoh Output *

*

**

*

**

***

*

**

***

****

Page 26: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Chapter Notes Minggu #4

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 26

Page 27: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Fungsi & Prosedur Minggu #5

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 27

Fungsi & Prosedur

Seperti telah disinggung di awal, bahasa C merupakan bahasa pemrograman dengan pendekatan

prosedural. Sesuai namanya, program dalam bahasa C terdiri dari sekumpulan prosedur dan fungsi.

Sejauh ini kita telah mengenal fungsi main(), yaitu fungsi spesial yang selalu dipanggil pertama kali

ketika program dijalankan. Pada bagian ini kita akan membahas lebih dalam tentang fungsi dan

prosedur.

Istilah “fungsi” akrab kita dengar pada pelajaran matematika. Sebuah fungsi dapat menerima satu

atau lebih parameter input, kemudian mengolahnya dengan ketentuan-ketentuan tertentu, lalu

mengembalikan sebuah nilai. Misalnya, fungsi menerima sebuah bilangan x,

mengolahnya dengan cara menguadratkan dan menambah 5, lalu mengembalikan hasilnya.

Pada konteks pemrograman, fungsi merupakan sekumpulan perintah yang mengolah input

parameter menjadi return value. Fungsi yang tidak mengembalikan nilai disebut prosedur. Pada

prakteknya, hanya istilah “fungsi” yang umum digunakan (walaupun demikian, bahasa C tidak

disebut pemrograman fungsional, karena istilah tersebut telah digunakan untuk pendekatan

pemrograman lain).

Sebagai contoh, fungsi dapat dibuat dalam bahasa C seperti berikut ini:

1. #include<stdio.h>

2.

3. double foo(double x){

4. return (x*x+5);

5. }

6.

7. int main(){

8. double x;

9.

10. scanf(“%lf”, &x);

11. printf(“%lf”, foo(x));

12. 13. return 0;

14. }

Fungsi foo dibuat pada baris ke-3 hingga ke-5. double pertama menandakan tipe data untuk return

value fungsi foo. Parameter fungsi dituliskan di antara ( dan ), pada kasus ini hanya ada satu, yaitu

x yang bertipe double. Jika fungsi tidak memiliki parameter, tanda () tetap harus dituliskan,

karena tanda inilah yang membedakan pembuatan fungsi dan variable. Jika fungsi tidak memiliki

return value, tipe return value-nya dituliskan sebagai void (yang artinya tidak bertipe).

Page 28: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Fungsi & Prosedur Minggu #5

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 28

Perhatikan bahwa fungsi-fungsi yang kita buat harus ditulis sebelum fungsi tersebut dipanggil. Pada

kasus ini, fungsi foo dipanggil pada baris ke-11, maka fungsi tersebut harus dibuat sebelum baris ke-

11. Karena alasan ini, umumnya fungsi dituliskan setelah #include dan sebelum fungsi main. Jika

ada lebih dari satu fungsi yang kita buat, aturan ini juga tetap berlaku. Perhatikan contoh berikut ini:

1. #include<stdio.h>

2. 3. double kuadrat(double x){

4. return x*x;

5. }

6. 7. double foo(double x){

8. return (kuadrat(x)+5);

9. }

10. 11. int main(){ 12. double x;

13. 14. scanf(“%lf”, &x);

15. printf(“%lf”, foo(x));

16. 17. return 0;

18. }

Pada contoh di atas, fungsi kuadrat harus dituliskan sebelum fungsi foo, karena fungsi ini

dipanggil di dalam fungsi foo. Contoh ini juga menunjukan bahwa fungsi dapat dipanggil oleh fungsi

lain, termasuk oleh fungsi itu sendiri. Fungsi yang memanggil dirinya sendiri disebut fungsi rekursif,

akan dibahas pada bagian berikutnya .

Sebuah fungsi dapat memiliki lebih dari satu parameter, misalnya fungsi pangkat berikut ini

berguna untuk menghitung xy (y bilangan bulat positif). Sama halnya dengan fungsi main, fungsi lain

juga dapat memiliki variable. Pada contoh berikut ini, kita membuat variable i dan result.

int pangkat(int x, int y){

int i, result=1;

for(i=1; i<y; i++)

result *=x;

return result;

}

Latihan

Fungsi pangkat di atas menggunakan perulangan sebanyak y kali. Sebenarnya cara ini termasuk

lambat. Perhatikan bahwa :

Jadi untuk mencapai x8 hanya perlu 3 kali perkalian (dibandingkan 8 kali perkalian pada cara

sebelumnya). Bagaimana cara menghitung x16 ? x5 ? x10 ? xy

? Perbaikilah fungsi di atas dengan cara

yang lebih cepat !

Page 29: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Pengecekan Bilangan Prima Minggu #5

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 29

Variable Lokal V.S. Global

Variable yang dideklarasikan di dalam sebuah fungsi disebut variable lokal, yang artinya variable

tersebut hanya dapat digunakan di dalam fungsi yang bersangkutan. Kadangkala kita membutuhkan

variable yang dapat diakses oleh semua fungsi. Variable jenis ini disebut variable global, dan dapat

dideklarasikan diluar fungsi. Sama seperti prinsip pembuatan fungsi, variable yang ingin digunakan

harus dibuat dahulu. Supaya variable global dapat dipakai oleh semua fungsi, maka

pendeklarasiannya sebaiknya sebelum pembuatan fungsi apapun, yaitu tepat setelah bagian

#include. Perhatikan contoh berikut ini !

#include<stdio.h>

const double PI = 3.1415;

double luas(double r){

return PI*r*r;

}

double keliling(double r){

return 2*PI*r;

}

int main(){

double r;

scanf(“%lf”, &r);

printf(“%Luas = lf\n”, luas(x));

printf(“%Keliling = lf\n”, keliling(x));

return 0;

}

Variable PI dapat diakses baik oleh fungsi luas maupun keliling. const artinya konstanta.

Variable yang bertipe const nilainya tidak dapat berubah, karena itu nilai PI harus diisikan ketika

variable tersebut dibuat.

Bahasa C++ mengijinkan pembuatan variable lokal dalam scope { } apapun, seperti di dalam

percabangan atau perulangan. Hal ini menguntungkan dalam pembuatan program skala besar,

karena lokasi pendeklarasian variable dapat dibuat sedekat mungkin dengan lokasi penggunaannya.

Namun demikian, cara ini tidak disarankan untuk situasi kompetisi pemrograman, karena pada

kasus-kasus tertentu akan memperlambat program.

Contoh Kasus: Pengecekan Bilangan Prima

Salah satu kegunaan fungsi adalah untuk membuat program lebih mudah dibaca. Kegunaan lainnya

adalah untuk membungkus sekumpulan perintah yang sering digunakan, sehingga tidak perlu ditulis

berulang-ulang. Pada latihan minggu sebelumnya telah diutarakan sebuah problem klasis

mengencek bilangan prima. Salah satu solusi problem tersebut dapat dilihat pada code berikut ini:

Page 30: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Pengecekan Bilangan Prima Minggu #5

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 30

#include<stdio.h>

int is_prime(int x){

int i, prime=1;

if(x==1) prime = 0;

else

for(i=2; i*i<=x && prime; i++)

if(x%i==0) prime=0;

return prime;

}

int main(){

int x;

scanf("%d\n", &x);

printf("%s\n", is_prime(x)?"prima":"bukan prima");

return 0;

}

Pada baris terakhir dicontohkan cara lain untuk menuliskan if-else, yaitu dengan sintaks

<kondisi>?<when_true>:<when_false>. Cara ini sedikit berbeda dengan if-else biasanya,

karena keluarannya dapat berupa sebuah nilai. Pada penggunaan cara ini juga wajib mengisikan

bagian <when_false>. Pada contoh di atas, keluarannya berupa string “prima” (jika kondisi

true) atau string “bukan prima” (jika kondisi false). Fungsi is_prime dapat langsung dituliskan

di bagian <kondisi> karena tipe keluarannya adalah int, yang pada bahasa C dapat dianggal

sebagai boolean expression.

Misalnya ada problem yang meminta kita untuk menuliskan bilangan prima dari n sampai m, maka

fungsi main pada program di atas dapat dimodifikasi menjadi:

int i, n, m;

scanf(“%d %d\n”, &n, &m);

for(i=n; i<=m; i++)

if(is_prime(i))

printf(“%d “, i);

return 0;

Percabangan pada contoh ini tidak memiliki bagian <when_false>, karena itu tidak dapat dituliskan

menggunakan sintaks ? … : … .

Tentunya percabangan ini dapat dituliskan sebagai

is_prime(i)?printf("%d ", i):printf("");

tapi tidak direkomendasikan karena sulit dibaca (dan lebih panjang juga ).

Page 31: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Fungsi Rekursif Minggu #5

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 31

Fungsi Rekursif

Rekursif merupakan proses pengulangan suatu objek dengan sifat yang mirip dengan dirinya sendiri.

Misalnya pada matematika kita kenal fungsi fibonacci, yaitu fungsi yang didefinisikan oleh fungsi itu

sendiri.

Secara umum, fungsi rekursif terbagi atas dua komponen: (1) base case, dan (2) recurrence. Base

case merukapan kasus dimana fungsi rekursif berhenti memanggil dirinya sendiri. Pada kasus

fibonacci, base case-nya adalah ketika n=0 dan n=1. Recurrence merupakan bagian ketika fungsi

rekursif memanggil dirinya sendiri. Pada kasus fibonaccin, recurrence-nya adalah F(n-1) dan F(n-2).

Fungsi fibonacci dapat dibuat dalam bahasa C seperti berikut ini:

int fibo(int n){

if(n<=1) return n;

else return fibo(n-1) + fibo(n-2);

}

Walaupun terlihat sederhana dan mudah dimengerti, fungsi ini jauh lebih lambat dibandingkan

fungsi fibonacci versi iterasi. Alasannya karena cara ini banyak mengulang perhitungan yang sama

berkali-kali. Misalnya pemanggilan fibo(5), akan memanggil fibo(4) dan fibo(3). Sedangkan fibo(4)

sendiri juga akan memanggil fibo(3). Bayangkan jika n sangat besar, berapa banyak perulangan ini

terjadi ?

Contoh fungsi rekursif lainnya adalah rumus faktorial.

Fungsi faktorial dapat dituliskan dalam bahasa C seperti berikut ini:

int factorial(int n){

if(n==1) return 1;

else return n*factorial(n-1);

}

Berbeda dengan fungsi fibonacci, fungsi ini sama cepatnya dengan menghitung faktorial versi iterasi.

Perhitungan N! versi rekursif dan iterasi akan sama-sama membutuhkan N-1 kali perkalian, karena

itu keduanya memiliki kecepatan yang sama .

Page 32: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Latihan Minggu #5

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 32

1. Menghitung Perkalian AxB

Nilai AxB dapat dihitung dengan menjumlahkan A sebanyak B kali. Jadi AxB = A + Ax(B-1). Pada

kasus ini, apa base case-nya? Apa recurrence-nya ?

Buatlah fungsi rekursif yang menerima dua parameter bilangan bulat A dan B, kemudian

menghitung nilai AxB dengan cara yang dijelaskan sebelumnya.

2. Menghitung Pangkat AB

Mirip dengan soal sebelumnya, AB dapat dihitung dengan cara mengalikan A sebanyak B kali.

Buatlah fungsi rekursif serupa untuk menghitung AB.

3. Greatest Comon Divisor (GCD)

GCD (atau dikenal juga dengan Faktor Persekutuan Terbesar) dari dua angka A dan B

didefinisikan sebagai angka C dimana A mod C = 0 dan B mod C = 0, dan C merupakan bilangan

terbesar dengan sifat tersebut.

GCD dapat dihitung secara naif dengan mencoba semua kemungkinan nilai C, yaitu 1 hingga

MIN(A,B). Cara ini memerlukan pengecekan sebanyak MIN(A,B), yang pada kasus ini kurang

efisien. Matematikawan bernama Euclid menemukan algoritma untuk mencari GCD yang jauh

lebih cepat (Cara ini mengasumsikan a>=b. Jika nilai b>a, dapat ditukar terlebih dahulu).

Page 33: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Chapter Notes Minggu #5

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 33

Page 34: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Array Minggu #6

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 34

Array

Array merupakan struktur data paling sederhana, namun sangat luas kegunaannya. Struktur data ini

terbentuk dari sekumpulan variable yang bertipe sama. Setiap element dalam array dapat diakses

dengan nomor index. Pada bahasa C, index array dimulai dari 0.

0 1 2 3 4 5 6 7 8 9

0 1 2 3 4 5

0

1

2

3

Biasanya array digambarkan sebagai tabel. Penggambaran ini memudahkan kita dalam memahami

konsep array, namun pada prakteknya, array bukanlah table. Array satu dimensi berukuran N

biasanya digambarkan dalam tabel yang memanjang ke samping. Array dua dimensi berukuran N x

M biasanya digambarkan sebagai tabel dengan N baris dan M kolom. Bagaimana dengan array 3

dimensi ? Kita sulit menggambarkan tabel berbentuk “kubus”. Bagaimana dengan 100 dimensi?

Cara lain untuk memahami konsep array berdimensi banyak adalah seperti daftar isi sebuah buku.

Bab 1 dapat dibagi-bagi menjadi sub-bab 1.1, 1.2, dst. Sub-bab 1.1 dapat dibagi-bagi lagi menjadi

1.1.1, 1.1.2, dst. Dan seterusnya. Dengan demikian, kita dapat membayangkan array berdimensi 3

seperti buku yang dibagi-bagi kedalam sub-sub-bab.

Membuat array pada bahasa C cukup mudah, yaitu hanya dengan menambahkan [size] pada

akhir nama variable yang dideklarasikan. Element array dapat diakses dengan menambahkan

[nomor_index]. Perhatikan contoh berikut ini:

int A[10], i;

A[0] = 1;

for(i=1; i<10; i++)

A[i] = A[i-1]*2;

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

printf(“2^%d = %d\n”, i, A[i]);

Program di bawah ini mendemokan cara membuat dan menggunakan array 2 dimensi:

int perkalian[10][10], i,j;

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

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

perkalian[i][j] = i*j;

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

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

printf(“%d x %d = %d\n”, i, j, perkalian [i][j]);

Page 35: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Latihan Minggu #6

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 35

Latihan

1. Deret Fibonacci

Buatlah sebuah array bernama fibonacci yang bertipe bilangan bulat dan berukuran 30.

Isilah array tersebut sedemikian rupa sehingga fibonacci[i] berisi bilangan fibonacci ke-i.

2. Tabel perkalian 1-20

Contoh tabel perkalian di atas memuat nilai perkalian dari angka 0 sampai 9. Modifikasilah

program tersebut supaya memuat nilai perkalian dari 1 sampai 20.

3. Matriks Transpose

Buatlah sebuah program yang menerima input sebuah matriks berukuran N x M (1<=N,M<=100)

dan mengeluarkan transpose dari matriks tersebut. Input diawali dengan bilangan N dan M. N

baris berikutnya masing-masing berisi M buah bilangan yang menunjukan isi matriks.

Contoh Input 3 5 1 2 3 4 5 2 3 4 5 6 9 8 7 6 5

Contoh Output 1 2 9 2 3 8 3 4 7 4 5 6 5 6 5

4. Jolly Jumpers (UVA 10038)

Sebuah deret bilangan bulat sepanjang n (n>0) disebut jolly jumper bila selisih absolut antara

bilangan-bilangan yang bersebelahan memunculkan nilai 1 hingga n-1 masing-masing tepat satu

kali. Misalnya: 1 4 2 3 adalah jolly jumper, karena nilai selisih absolutnya adalah 3, 2, dan 1.

Definisi di atas mengimplikasikan bahwa deret yang berukuran 1 angka saja adalah jolly jumper.

Tulislah sebuah program untuk menentukan apakah sebuah deret memiliki sifat jolly jumper

atau tidak.

Input

Setiap baris input diawali dengan sebuah bilangan bulat n <= 3000, diikuti dengan n buah

bilangan bulat yang menunjukan deret yang akan diperiksa.

Output

Untuk setiap baris input, keluarkan sebaris tulisan “Jolly” atau “Not Jolly”.

Contoh Input 4 1 4 2 3

5 1 4 2 -1 6

Contoh Output Jolly

Not jolly

Page 36: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

String Minggu #6

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 36

String

Bahasa C hanya mengenal variable bertipe bilangan bulat dan pecahan, karena itu teks (string)

disimpan dalam array of char. Ingat bahwa char adalah tipe data bilangan bulat paling kecil (1

byte). Kapasitas char tepat dapat menampung sejumlah jenis ASCII code, karena itu tipe data ini

paling cocok sebagai penampung string.

String pada C dikenal dengan sebutan null terminated string, yang artinya deretan huruf-huruf yang

tersimpan pada array of char ini dibatasi dengan sebuah karakter khusus sebagai penanda akhir

string. Karakter yang digunakan adalah null, yang pada bahasa C dapat dituliskan sebagai NULL

(huruf kapital semua), atau ‘\0’, atau 0.

String bukanlah variable primitif, maka pengisian nilai pada string tidak dapat menggunakan

operator assignment (=). Fungsi-fungsi untuk memanipulasi string sudah disediakan pada library

bahasa C, dapat digunakan dengan #include <string.h>. Perhatikan contoh berikut ini:

char str[10];

strcpy(str, “abc”);

0 1 2 3 4 5 6 7 8 9

a b c \0

Berikut ini fungsi-fungsi dasar untuk memanipulasi string:

string copy: strcpy(string_target, string_value)

menyalin isi string_value ke string_target

string compare : strcmp(string1, string2)

membandingkan isi string1 dan string2. Jika sama, maka fungsi ini mengembalikan nilai 0. Jika

string1 lebih kecil secara kode ASCII, maka fungsi ini mengembalikan nilai negatif. Jika string2

lebih kecil, maka fungsi ini mengembalikan nilai positif.

string concat: strcat(string_target, string_tambahan)

menambahkan string_tambahan di akhir string_target

string in string: strstr(string1, string2)

mencari kemunculan string2 pada string1. Mengembalikan nilai 0 jika tidak ditemukan, atau jika

ditemukan, akan mengembalikan pointer ke lokasi ditemukannya string2.

Karena string disimpan dalam array of char, maka kita dapat memperlakukannya sebagai array pada

umumnya. Perhatikan contoh berikut ini! Note: ingat pada bab sebelumnya bahwa string dapat di-

print menggunakan formatting %s.

char str[100];

int i;

strcpy(str, “Hello World!”);

printf(“%s\n”, str);

for(i=0; str[i]; i++)

if(str[i]>=‘A’ && str[i]<=‘Z’) printf(“%c”, str[i]+(‘a’-‘A’));

else if(str[i]>=‘a’ && str[i]<=‘z’) printf(“%c”, str[i]-(‘a’-‘A’));

else printf(“%c”, str[i]);

Page 37: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Chapter Notes Minggu #6

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 37

Page 38: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Sequential Search Minggu #7

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 38

Searching pada computer science terbagi atas dua kategori, yaitu: (1) pencarian data dan

(2)pencarian solusi. Pada bagian ini kita akan mempelajari yang pertama.

Pencarian data umum dilakukan pada struktur data, misalnya yang sudah kita pelajari minggu lalu,

struktur data array. Ada dua algoritma pencarian yang paling dasar, yaitu:

sequential search : digunakan pada data yang tidak terurut

binary search: digunakan pada data yang terurut

Sequential Search

Algoritma sequential search merupakan cara pencarian yang memeriksa data satu per satu secara

teratur. Biasanya mulai dari data pertama, kemudian kedua, dan seterusnya hingga data paling akhir.

Cara seperti ini menjamin setiap data pasti akan diperiksa, tanpa ada yang terlewat, karena itu cara

ini cocok digunakan pada data yang tidak beraturan. Perhatikan contoh berikut ini:

#include<stdio.h>

int sequential_search(int A[], int size, int key){

int i;

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

if(A[i] == key) return i;

return -1;

}

int main(){

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

int found_idx, key;

scanf("%d", &key);

found_idx = sequential_search(A, 10, key);

if(found_idx == -1)

printf("key %d tidak ditemukan\n", key);

else

printf("key %d ditemukan pada index %d\n", key, found_idx);

return 0;

}

Latihan

Selain untuk mencari data tertentu, algoritma ini juga mudah dimodifikasi untuk mencari data

terkecil atau data terbesar. Buatlah fungsi int max(int A[], int size) dan int min(int A[], int size) yang

mengembalikan nilai maksimum dan minimum pada array A.

Page 39: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Sorting Minggu #7

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 39

Sorting Seperti telah disebutkan di atas, binary search merupakan cara pengurutan pada data yang sudah terurut. Secara intuitif kita dapat membayangkan bahwa mencari di tempat yang tidak beraturan pasti lebih lama daripada mencari di tempat yang beraturan . Pada bagian ini kita akan mempelajari bagaimana cara mengurutkan data.

Sorting atau pengurutan merupakan masalah klasik yang sudah dipelajari selama berpuluh-puluh

tahun. Banyak sekali algoritma sorting yang telah dikembangkan selama beberapa dekade terakhir.

Masing-masing memiliki keunggulan dan kelemahannya sendiri. Berikut ini beberapa algoritma yang

umum dipelajari untuk mengerti prinsip dasar sorting:

Bubble Sort – cara paling naïve (dan lambat) untuk mengurutkan

Insertion Sort & Selection Sort – sedikit lebih cepat dari bubble sort

Shell Sort – menggabungkan keunggulan insertion & selection sort sehingga bisa lebih cepat

Merge Sort, Quick Sort – lebih cepat dari ketiga cara di atas, paling sering dipakai

Count Sort, Radix Sort, Bucket Sort – sangat cepat, tapi terbatas pada kasus tertentu saja

Sorting pada C++ Standard Template Library (C++ STL)

C++ STL telah menyediakan beberapa fungsi sorting yang siap digunakan. Implementasi yang mereka

gunakan merupakan optimasi dari beberapa algoritma sehingga cukup cepat. Walaupun demikian,

kita perlu sadar bahwa pemanggilan fungsi sort tidaklah “gratis”. Fungsi ini walaupun sudah

dioptimasi sedemikian rupa, tetap memakan waktu jauh lebih lambat daripada misalnya sebuah

perintah if-else atau sebuah perhitungan aritmatik.

Untuk dapat menggunakan fungsi sort pada STL, tambahkan header berikut ini:

#include<algorithm>

using namespace std;

Fungsi sort menerima dua parameter, yang pertama adalah pointer ke elemen pertama pada array,

sedangkan yang kedua adalah pointer ke element terakhir. Ada banyak cara untuk mendapatkan

kedua pointer ini. Pada contoh berikut ini ditunjukan cara yang paling sederhana. Untuk

mendapatkan pointer ke elemen pertama, tuliskan nama arraynya saja. Untuk mendapatkan pointer

ke elemen terakhir, tuliskan nama array + ukuran.

Page 40: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Sorting Minggu #7

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 40

#include<stdio.h>

#include<algorithm>

using namespace std;

int main(){

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

int i;

printf("Array mula-mula:\n");

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

printf("%d ", A[i]);

printf("\n");

sort(A, A+10);

printf("Array setelah diurutkan:\n");

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

printf("%d ", A[i]);

printf("\n");

return 0;

}

Cobalah !

Ubahlah sort(A, A+10) menjadi :

sort(A, A+5)

sort(A+5, A+10)

apa yang terjadi ? apa kesimpulan anda ?

Pengurutan secara menurun (descending)

Secara default, fungsi sort() akan mengurutkan array secara menaik. Untuk mengurutkan secara

menurun, kita dapat menambahkan sebuah parameter lain, yaitu fungsi pembanding yang ingin

digunakan. STL telah menyediakan berbagai fungsi pembanding yang siap digunakan. Tambahkan

header #include <functional> untuk menggukannya. Ubahlah sort(A, A+10) pada

program di atas menjadi sort(A, A+10, greater<int>()) , perhatikan apa yang terjadi !

Fungsi greater<T>() merupakan fungsi pembading universal yang menerima tipe data pada

kolom <>. Dengan kata lain, kita dapat membandingkan tipe “apapun” *dengan memasukan nama

tipenya pada kolom <>.

*Note: Tentunya komputer tidak sepintar itu untuk dapat membandingkan “apapun” tanda diajari

terlebih dahulu . int, char, float, dll adalah tipe data primitive, sehingga C++ sudah tahu

bagaimana cara mengurutkannya, tapi jika kita membuat suatu tipe data baru, kita perlu

mendeskripsikan dengan jelas bagaimana cara mengurutkannya.

Page 41: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Chapter Notes Minggu #7

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 41

Page 42: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Struct Minggu #8

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 42

Struct

Sampai saat ini kita sudah sering menggunakan array, yaitu struktur data yang dapat menyimpan

lebih dari satu variable bertipe sama. Struct merupakan struktur data yang juga dapat menyimpan

lebih dari satu variable, tapi tipenya bisa berbeda. Jika pada array kita mengakses elemen-

elemennya dengan menggunakan index, pada struct kita mengakses elemen-elemennya dengan

nama. Ada banyak cara untuk mendeklarasikan sebuah struct. Pada modul ini kita akan melihat salah

satunya, yaitu dengan cara mendeklarasikan tipe bentukan terlebih dahulu.

Sebagai contoh, misalnya kita ingin menyimpan data saldo nasabah bank. Setiap nasabah memiliki

nama (yang berupa string), dan jumlah tabungan (yang berupa floating point). Perhatikan contoh

berikut:

struct Nasabah{

char nama[100];

double saldo;

};

code di atas menunjukan cara pembuatan tipe data baru yang bernama Nasabah. Tipe data ini

berupa struct yang memiliki dua elemen, yaitu nama dan saldo. Perhatikan bahwa nama tipe data

biasa dituliskan dengan awalan huruf kapital, ini untuk membedakan dengan nama variable.

Pembuatan tipe data biasa dituliskan setelah deretan #include. Tipe data bentukan belum bisa

dipakai jika sekedar dideklarasikan saja. Jika ingin digunakan, kita harus membuat variable dengan

tipe data tersebut (seperti ibaratnya tipe data int memang ada, tapi tidak bisa langsung dipakai).

#include<stdio.h>

#include<string.h>

struct Nasabah{

char nama[100];

double saldo;

};

int main(){

Nasabah n1, n2;

strcpy(n1.nama, "Alice");

n1.saldo = 150000.00;

strcpy(n2.nama, "Bob");

n2.saldo = 17500.50;

printf("%s memiliki saldo %.2lf\n", n1.nama, n1.saldo);

printf("%s memiliki saldo %.2lf\n", n2.nama, n2.saldo);

return 0;

}

Page 43: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Class Minggu #8

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 43

Seperti layaknya tipe data primitif (seperti int, float, dll.), tipe data bentukan juga dapat dibuat array.

Misalnya, code diatas dapat diubah menjadi seperti berikut:

#include<stdio.h>

#include<string.h>

struct Nasabah{

char nama[100];

double saldo;

};

int main(){

Nasabah n[2];

int i;

strcpy(n[0].nama, "Alice"); n[0].saldo = 150000.00;

strcpy(n[1].nama, "Bob"); n[1].saldo = 17500.50;

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

printf("%s memiliki saldo %.2lf\n", n[i].nama, n[i].saldo);

return 0;

}

Keuntungan utama dari penggunaan array adalah kita dapat menggunakan perulangan untuk

memproses banyak variable dengan sebuah potongan code yang sama .

Class

Pada bahasa C++, struct dikembangkan lebih lanjut menjadi class. Jika kita menggunakan compiler

C++, struct dan class hampir tidak ada bedanya. Perbedaan yang paling mencolok adalah pada hak

akses elemen-elemen di dalamnya. Karena C merupakan bahasa yang dirancang untuk gaya

pemrograman perosedural, ia tidak mengenal konsep encapsulation, sehingga semua variable dapat

diakses oleh siapapun selama dalam blok { } yang sama. Namun C++ merupakan bahasa yang

dirancang untuk mendukung gaya pemrograman berorientasi objek, dimana hak akses setiap

variable betul-betul diperhatikan.

Pada modul ini kita tidak akan membahas secara detil tentang gaya pemrograman, karena itu cukup

dipahami bahwa fitur yang didukung oleh class pada C++ sebenarnya jauh lebih kompleks dari yang

dipelajadi disini.

Ubahlah deklarasi struct Nasabah pada contoh sebelumnya menjadi :

class Nasabah{

public:

char nama[100];

double saldo;

};

Coba hilangkan baris public: , apa yang terjadi ?

Page 44: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Atribut & Method Minggu #8

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 44

Gaya pemrograman berorientasi objek mengadaptasi konsep “objek” pada dunia nyata, dimana

objek selalu memiliki sifat, dan dapat berinteraksi dengan objek-objek lain diluar dirinya. Misalnya

pada contoh sebelumnya, Alice dan Bob sama-sama merupakan nasabah, tapi masing-masing

memiliki nama dan saldo (sifat) yang berbeda. Maka disini kita dapat membedakan antara “nasabah”

dan “Alice”. Nasabah hanyalah konsep abstrak, kita dapat bercerita bahwa nasabah pasti memiliki

nama, memiliki saldo, dst, tapi tidak dapat mengatakan siapa namanya, atau berapa saldonya. Tapi

Alice merupakan benda nyata. Ia adalah seorang nasabah, yang namanya Alice, dan saldonya 150

ribu.

Pada pemrograman berorientasi objek, nasabah disebut class, dan Alice disebut objek. (Kita kenal

sebelumnya, pada pemrograman prosedural, nasabah disebut tipe data, dan Alice disebut variable).

Jadi istilah tipe data/class dan variable/objek, hanya untuk membantu pemahaman kita saja. Pada

prakteknya, keduanya hampir sama.

Atribut & Method

Pada class, sifat-sifat objek disebut sebagai atribut, dan apa yang dapat dilakukan oleh objek

tersebut disebut method. (Sebelumnya kita kenal struct memiliki elemen-elemen, inilah yang pada

class disebut atribut).

Pada bagian ini kita akan fokus pada pembuatan method. Secara sederhana, method dapat dianggap

sebagai fungsi yang spesial hanya dapat digunakan oleh class yang bersangkutan. Perhatikan contoh

berikut :

#include<stdio.h>

#include<string.h>

class Nasabah{

public:

char nama[100];

double saldo;

bool menarik_tunai(double tarikan){

if(saldo > tarikan){

printf("%s menarik tunai sebanyak %.2lf, "

" sisa saldo = %.2lf\n", nama, tarikan, saldo);

saldo = saldo - tarikan;

return true;

}

else{

printf("%s gagal menarik tunai\n", nama);

return false;

}

}

void print_data(){

printf("%s memiliki saldo %.2lf\n", nama, saldo);

}

};

Page 45: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Constructor Minggu #8

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 45

int main(){

Nasabah n[2];

int i;

strcpy(n[0].nama, "Alice"); n[0].saldo = 150000.00;

strcpy(n[1].nama, "Bob"); n[1].saldo = 17500.50;

n[0].menarik_tunai(50000.00);

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

n[i].print_data();

return 0;

}

Perhatikan pada method menarik_tunai dan print_data, atribut nama dan saldo yang

dipakai pasti yang dimiliki oleh objek pemanggil methodnya. Maka ketika kita menuliskan

n[0].menarik_tunai(50000.00);, hanya Alice yang berkurang saldonya.

Constructor

Coba tambahkan seorang nasabah baru dengan mengubah:

Nasabah n[2] Nasabah n[3]

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

Apa yang di-print ke layar ?

Sama seperti variable pada umumnya, atribut pada objek yang dibuat pun memiliki nilai yang tidak

dapat diprediksi. Umumnya kita menambahkan code-code untuk memberikan nilai awal pada

variable yang kita buat. Pada class, ada sebuah method spesial yang otomatis dipanggil pada saat

objek class tersebut dibuat, dikenal dengan sebutan constructor. Sebaliknya ada method yang

dipanggil saat objek class tersebut selesai digunakan, disebut destructor, tapi tidak akan kita bahas

pada modul ini.

Constructor banyak kegunaannya, tapi yang paling umum adalah untuk mengisikan nilai default pada

atribut-atribut objek. Tambahkan method berikut ke dalam class Nasabah, perhatikan perubahannya

pada nama dan saldo nasabah ke-3 !

Nasabah(){

nama[0] = 0; //nama kosong

saldo = 0.0;

}

Page 46: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Chapter Notes Minggu #8

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 46

Page 47: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Kumpulan Latihan Minggu #9

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 47

Kartu Remi

Satu set kartu remi terdiri dari 52 jenis kartu, masing-masing memiliki simbol dan angka. Simbol yang

mungkin adalah: Hati(H), Tahu(T), Sekop(S), dan Keriting(K). Angka yang mungkin adalah As(A), 2

s.d.9 (dilambangkan dengan angka 1 digit), 10(T), Jack(J), Queen(Q), dan King(K). Buatlah sebuah

program yang menerima dua buah karakter yang melambangkan angka dan simbol dari sebuah kartu

remi, kemudian mengeluarkan:

1. teks “Merah” jika kartu bersimbol hati atau tahu/teks “Hitam” jika bersimbol sekop atau keriting

2. keterangan lengkap tentang kartu tersebut (perhatikan contoh)

Contoh Input Warna (soal 1) Keterangan Kartu (soal 2) AT Merah As Tahu

TT Merah 10 Tahu

5K Hitam 5 Keriting

3S Hitam 3 Sekop

Modifikasilah program anda agar menerima input dua buah kartu, masing-masing dituliskan dalam 2

karakter seperti pada soal di atas. Keluarkan:

3. teks “Kartu 1 lebih besar” jika angka kartu pertama lebih besar/teks “Kartu 1 lebih kecil” jika

lebih kecil/ teks “sama nilainya” jika kedua kartu bernilai sama.

4. teks “Kartu 1 lebih besar” jika angka&simbol kartu pertama lebih besar/teks “Kartu 1 lebih kecil”

jika sebaliknya. Asumsikan: As bernilai 1. Jack,Queen,King masing-masing bernilai 11, 12, dan 13.

Jika angkanya sama, maka simbol Sekop > Hati > Keriting > Tahu. Asumsikan kedua kartu yang

diinput selalu berbeda.

Contoh Input Perbandingan nilai (soal 3) Perbandingan kartu (soal 4) AT

AK

sama nilainya Kartu 1 lebih kecil

5K

TT

Kartu 1 lebih kecil Kartu 1 lebih kecil

5K

3S

Kartu 1 lebih besar Kartu 1 lebih besar

JS

JK

sama nilainya Kartu 1 lebih besar

Page 48: Introduction Minggu #1acm.mi2.me/resource/Modul_C_C++.pdf · Introduction Minggu #1 Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 1 Apa itu Pemrograman

Kumpulan Latihan Minggu #9

Jurusan Teknik Informatika – FTIS UNPAR | Modul Pra-Kuliah Pemrograman Kompetitif 48

Deret Angka

5. Diberikan sebuah deret bilangan bulat sepanjang n. Anda diminta untuk menentukan apakah

angka yang bersebelahan nilainya menaik(N) atau menurun(T). Misalnya deret 2,4,3,5,1.

Angka 2 ke 4 menaik, angka 4 ke 3 menurun, dst., maka keluarannya adalah: N T N T

6. Diberikan sebuah deret bilangan bulat sepanjang n. Anda diminta untuk membuat deret baru

sepanjang n-1 yang dibentuk dari penjumlahan nilai-nilai yang bersebelahan pada deret awal.

Misalnya deret 2,4,3,5,1. Angka 2+4 = 6, angka 4+3=7, dst., maka keluarannya: 6 7 8 6

7. Proses pembentukan deret baru pada no 6 dapat diulang hingga deret berukuran 1. Perhatikan

contoh input/output

Contoh Input Output soal 5 Output soal 6 Output soal 7 5

2 4 3 5 1

N T N T 6 7 8 6 6 7 8 6

13 15 14

28 29

57

4

1 3 5 8

N N N 4 8 13 4 8 13

12 21

33