Slide 1

Slide 1 text

Solusi Training Gate TLX Course : Pemrograman Dasar Chapter : 1-8 dalam Bahasa C++ © Mamat Rahmat olimpiadeinformatika.com 1

Slide 2

Slide 2 text

Slide ini hanya membahas solusi soal tipe pemrograman 2

Slide 3

Slide 3 text

Chapter 1 - Perkenalan 3

Slide 4

Slide 4 text

1A - Halo Dunia! Soal : Outputkan sebuah string Halo, dunia! Solusi : #include using namespace std; int main () { cout << "Halo, dunia!" << endl; } Perhatikan output string harus sama persis : Halo, dunia! Kurang koma/spasi/tanda seru akan dianggap salah endl akan mencetak enter (Output program harus selalu diakhiri dengan baris kosong) 4

Slide 5

Slide 5 text

Untuk seterusnya, kode program akan dituliskan hanya intinya saja atau hanya idenya saja. Detail implementasi diserahkan kepada pembaca. 5

Slide 6

Slide 6 text

Chapter 2 - Variabel dan Tipe Data 6

Slide 7

Slide 7 text

Chapter 3 - Ekspresi dan Masukan/Keluaran 7

Slide 8

Slide 8 text

3B - A Tambah B Soal : Diberikan input dua bilangan. Outputkan penjumlahannya. Solusi : cin >> a >> b; cout << a + b << endl; a dan b bertipe data int 8

Slide 9

Slide 9 text

Contoh program lengkap : #include using namespace std; int a, b; int main () { cin >> a >> b; cout << a + b << endl; } 9

Slide 10

Slide 10 text

3C - Burung Beo Soal : Diberikan input sebaris kalimat. Outputkan kalimat tsb. Solusi : getline(cin, s); cout << s << endl; s bertipe data string (diperlukan #include ). getline(cin, s) akan membaca sebaris string. Sedangkan cin >> s hanya membaca sampai whitespace (spasi/tab/newline) atau dengan kata lain satu kata saja. 10

Slide 11

Slide 11 text

3D - Bebek untuk Teman Soal : Diberikan input dua bilangan. Outputkan hasil bagi dan sisa bagi dalam format yang telah ditentukan. Solusi : cin >> N >> M; cout << "masing-masing " << N/M << endl; cout << "bersisa " << N%M << endl; Output program harus mengikuti format keluaran Hati-hati terlewat tanda - pada output masing-masing Perhatikan pula ada spasi di akhir output string 11

Slide 12

Slide 12 text

3E - Luas Segitiga Soal : Diberikan input alas tinggi segitiga. Outputkan luasnya. Solusi : cin >> A >> T; cout << fixed << setprecision(2) << A*T/2 << endl; A dan T bertipe data double , agar pembagiannya menjadi double Cara lain, A dan T bertipe data int tetapi perhitungan diubah menjadi 0.5*A*T agar hasilnya menjadi double fixed dan setprecision(2) berguna untuk menghasilkan output 2 angka di belakang koma 12

Slide 13

Slide 13 text

3F - Transpos Matriks Soal : Diberikan input sebuah matriks. Outputkan hasil transpose nya (dicerminkan terhadap diagonal kiri-atas ke kanan-bawah). Solusi : cin >> a >> b >> c >> d >> e >> f >> g >> h >> i; cout << a << " " << d << " " << g << endl; cout << b << " " << e << " " << h << endl; cout << c << " " << f << " " << i << endl; Input dapat disingkat menjadi seperti di atas, karena cin akan membaca hingga whitespace (spasi/tab/newline) Perhatikan pada output harus disertakan spasi yaitu " " antar bilangan agar sama persis dengan format output Cara lainnya, tukarkan nilai "b dan d", "c dan g", "f dan h" lalu outputkan kembali sesuai urutan input 13

Slide 14

Slide 14 text

Chapter 4 - Penunjang Pemrograman Dasar 14

Slide 15

Slide 15 text

Chapter 5 - Percabangan 15

Slide 16

Slide 16 text

5B - If Then Soal : Diberikan input sebuah bilangan. Jika bilangan itu positif, outputkan bilangan tsb. Solusi : if (N>0) { cout << N << endl; } Karena hanya ada 1 operasi dalam if, maka kurung kurawal {} adalah opsional Jika lebih dari 1 operasi, kurung kurawal harus disertakan untuk membungkus operasi-operasi tersebut 16

Slide 17

Slide 17 text

5C - If Then Multi Soal : Diberikan input sebuah bilangan. Jika bilangan itu genap dan positif, outputkan kembali. Solusi : if ((N%2==0) && (N>0)) { cout << N << endl; } Pengecekan bilangan genap dapat dilakukan dengan melihat hasil modulo 2 nya. Biasakan menggunakan tanda kurung untuk mengelompokkan ekspresi logika Seperti dijelaskan pada soal sebelumnya, sebetulnya kurung kurawal {} disini adalah opsional 17

Slide 18

Slide 18 text

5D - If Then Else Soal : Diberikan input sebuah bilangan. Jika positif, cetak positif , jika negatif cetak negatif, selain itu cetak nol. Solusi : if (N>0) { cout << "positif" << endl; } else if (N<0) { cout << "negatif" << endl; } else if (N==0) { cout << "nol" << endl; } 18

Slide 19

Slide 19 text

Atau dapat disingkat menjadi : if (N>0) { cout << "positif" << endl; } else if (N<0) { cout << "negatif" << endl; } else { cout << "nol" << endl; } else if (N==0) dapat diganti menjadi else saja karena kasus sisanya pasti = 0 19

Slide 20

Slide 20 text

5E - If Then / Case Soal : Diberikan input sebuah bilangan. Jika satuan, cetak satuan . Jika puluhan, cetak puluhan . Jika ratusan, cetak ratusan . Jika ribuan, cetak ribuan . Jika puluh ribuan, cetak puluhribuan . Solusi : if (1<=N && N<10) { cout << "satuan" << endl; } else if (10<=N && N<100) { cout << "puluhan" << endl; } else if (100<=N && N<1000) { cout << "ratusan" << endl; } else if (1000<=N && N<10000) { cout << "ribuan" << endl; } else if (N==10000) { cout << "puluhribuan" << endl; } 20

Slide 21

Slide 21 text

Atau, dapat disingkat menjadi if (N<10) { cout << "satuan" << endl; } else if (N<100) { cout << "puluhan" << endl; } else if (N<1000) { cout << "ratusan" << endl; } else if (N<10000) { cout << "ribuan" << endl; } else { cout << "puluhribuan" << endl; } 21

Slide 22

Slide 22 text

5F - Floor and Ceiling Soal : Diberikan input sebuah bilangan real. Outputkan pembulatan ke bawah dan ke atas nya. Solusi : M = int(N); if (N == M) { // jika N merupakan bilangan bulat cout << M << " " << M << endl; } else { if (N>0) cout << M << " " << M+1 << endl; else cout << M-1 << " " << M << endl; } N bertipe data double sedangkan M bertipe data int int(N) akan mengonversi ke integer dengan mengambil bagian bulat dari N. Contoh : int(3.14) = 3, int(-3.14) = -3 Cara lain yang kurang diharapkan adalah menggunakan fungsi floor() dan ceil() dari library 22

Slide 23

Slide 23 text

5G - Jarak Manhattan Soal : Diberikan input koordinat dua buah titik. Outputkan jarak manhattan antar kedua titik. Solusi : Jumlahkan selisih koordinat x dan selisih koordinat y. Untuk menghitung selisih dua buah bilangan, misalnya a dan b, bisa dengan cara : if (a>b) { selisih = a-b; } else { selisih = b-a; } Cara lain yang kurang diharapkan adalah menggunakan fungsi abs() dari library 23

Slide 24

Slide 24 text

Chapter 6 - Perulangan 24

Slide 25

Slide 25 text

6B - For Soal : Diberikan input sebuah bilangan N, dan N buah bilangan bulat. Outputkan total bilangan-bilangan bulat tersebut. Solusi : cin >> N; sum = 0; for (int i=0; i> bil; sum += bil; } cout << sum << endl; Biasakan menginisialisasi (mengisi nilai awal) variabel. Misalnya, karena sum menampung hasil penjumlahan, nilai awalnya haruslah 0. 25

Slide 26

Slide 26 text

6C - While Soal : Diberikan input beberapa baris kata, outputkan kembali. Solusi : while (cin >> s) { cout << s << endl; } cin dalam while akan menghasilkan true jika pembacaan berhasil. Sehingga jika output sudah habis akan menghasilkan false dan perulangan berhenti Perhatikan disini tidak perlu melakukan input semua data dahulu baru outputkan. Karena tempat input dan output sebetulnya berbeda (konsep stdin/stdout) Setelah input selesai ketik CTRL+Z untuk memberikan sinyal end-of-file (menghentikan program) 26

Slide 27

Slide 27 text

6D - While + Pencacah Soal : Diberikan beberapa baris bilangan, outputkan totalnya. Solusi : Kerjakan dengan memanfaatkan cara pada dua soal sebelumnya. 27

Slide 28

Slide 28 text

6E - Dua Pangkat Soal : Diberikan input sebuah bilangan. Tentukan apakah bilangan tersebut berbentuk 2 . Solusi : Caranya adalah dengan membagi 2 terus menerus selama bilangannya genap. Jika bilangan yang diinput berbentuk 2 , pasti berakhir menjadi 1. while (N%2 == 0) { N /= 2; } if (N==1) cout << "ya" << endl; else cout << "bukan" << endl; k k 28

Slide 29

Slide 29 text

Cara lainnya adalah dengan melakukan iterasi i dari 0 s/d 16 lalu hitung 2 dan cocokkan apakah ada yg sama dgn N. found = false; bil = 1; for(int i=0; i<=16; i++) { if (bil == N) found = true; bil *= 2; } if (found) cout << "ya" << endl; else cout << "tidak" << endl; k 29

Slide 30

Slide 30 text

6F - Faktor Bilangan Soal : Diberikan sebuah bilangan. Outputkan faktor-faktor bilangan terurut turun. Solusi : for int(i=N; i>=1; i--) { if (N%i == 0) cout << i << endl; } 30

Slide 31

Slide 31 text

6G - Statistika Sederhana Soal : Diberikan input bilangan N, dan N buah bilangan bulat. Outputkan bilangan terbesar dan bilangan terkecil. Solusi : cin >> N; maxi = -100001; mini = 100001; for(int i=0; i> bil; if (bil > maxi) maxi = bil; if (bil < mini) mini = bil; } cout << maxi << " " << mini << endl; maxi diinisialisasi dengan bilangan terkecil yang mungkin (atau lebih kecil lagi). Sebaliknya untuk mini. 31

Slide 32

Slide 32 text

6H - Pola I Soal : Diberikan input bilangan N dan K. Outputkan pola sesuai contoh. Solusi : Polanya adalah menulis bilangan 1 s/d N, kecuali untuk bilangan kelipatan K, outputnya dalah * . for(int i=1; i<=N; i++) { if (i%K == 0) cout << "*"; else cout << i; if (i==N) cout << endl; else cout << " "; } Kesalahan umum biasanya ada output spasi di setelah pola ke- N. Padahal tidak boleh ada spasi berlebih di akhir. Karena harus ada enter di akhir, maka ganti spasi menjadi enter pada pola ke-N. 32

Slide 33

Slide 33 text

Chapter 7 - Perulangan Lanjut 33

Slide 34

Slide 34 text

7A - Break Continue Exit Soal : Diberikan input bilangan N. Outputkan 1 s/d N, tetapi lompati bilangan kelipatan 10. Saat akan mencetak 42 cetaklah ERROR lalu hentikan. Solusi : for(int i=1; i<=N; i++) { if (i%10 == 0) continue; if (i==42) { cout << "ERROR" << endl; break; } cout << i << endl; } 34

Slide 35

Slide 35 text

7B - Pola II Soal : Diberikan input bilangan N. Outputkan pola segitiga * rata kanan. Solusi : Polanya adalah, untuk baris ke-i, banyaknya spasi adalah N−i dan banyaknya * adalah i, kemudian diakhiri dengan enter. for(int i=1; i<=N; i++) { for(int j=1; j<=N-i; j++) cout << " "; for(int j=1; j<=i; j++) cout << "*"; cout << endl; } 35

Slide 36

Slide 36 text

7C - Pola III Soal : Diberikan input bilangan N. Outputkan pola segitiga bilangan sesuai contoh. Solusi : Polanya adalah, bilangan selanjutnya adalah bilangan sebelumnya + 1 lalu dimodulo 10. Pada baris ke i, tertulis i angka. bil = 0; for(int i=1; i<=N; i++) { for(int j=1; j<=i; j++) { cout << bil; bil = (bil+1)%10; } cout << endl; } 36

Slide 37

Slide 37 text

Chapter 8 - Analisis Kompleksitas 37

Slide 38

Slide 38 text

8B - Cek Bilangan Prima Soal : Diberikan input bilangan N dan N buah bilangan bulat. Tentukan apakah bilangan-bilangan tersebut prima atau bukan. Solusi : Untuk mengecek apakah bil bilangan prima, cukup iterasi i dari 2 s/d . Jika tidak ada diantara i yang merupakan faktor dari bil , maka bil adalah bilangan prima. Kompleksitas = O(N ∗ ) cin >> N; for(int i=0; i> bil; prima = true; for(int k=2; k*k

Slide 39

Slide 39 text

8C - Bilangan Agak Prima Soal : Diberikan input bilangan N dan N buah bilangan. Tentukan apakah bilangan-bilangan tersebut agak prima (memiliki <= 4 faktor). Solusi : Iterasi i dari 2 sampai , maksimal ada 1 faktor. Kompleksitas = O(N ∗ ) cin >> N; for(int i=0; i> bil; nfaktor = 0; for(int k=2; k*k