Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Solusi Kelas Pemrograman Dasar TLX

Solusi Kelas Pemrograman Dasar TLX

More Decks by Catatan Olimpiade Informatika

Other Decks in Programming

Transcript

  1. Solusi Training Gate TLX Course : Pemrograman Dasar Chapter :

    1-8 dalam Bahasa C++ © Mamat Rahmat olimpiadeinformatika.com 1
  2. 1A - Halo Dunia! Soal : Outputkan sebuah string Halo,

    dunia! Solusi : #include <iostream> 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
  3. Untuk seterusnya, kode program akan dituliskan hanya intinya saja atau

    hanya idenya saja. Detail implementasi diserahkan kepada pembaca. 5
  4. 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
  5. Contoh program lengkap : #include <iostream> using namespace std; int

    a, b; int main () { cin >> a >> b; cout << a + b << endl; } 9
  6. 3C - Burung Beo Soal : Diberikan input sebaris kalimat.

    Outputkan kalimat tsb. Solusi : getline(cin, s); cout << s << endl; s bertipe data string (diperlukan #include <string> ). 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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 <cmath> 22
  17. 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 <cmath> 23
  18. 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<N; i++) { cin >> bil; sum += bil; } cout << sum << endl; Biasakan menginisialisasi (mengisi nilai awal) variabel. Misalnya, karena sum menampung hasil penjumlahan, nilai awalnya haruslah 0. 25
  19. 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
  20. 6D - While + Pencacah Soal : Diberikan beberapa baris

    bilangan, outputkan totalnya. Solusi : Kerjakan dengan memanfaatkan cara pada dua soal sebelumnya. 27
  21. 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
  22. 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
  23. 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
  24. 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<N; i++) { cin >> 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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<N; i++) { cin >> bil; prima = true; for(int k=2; k*k<bil; k++) { if (bil%k == 0) prima = false; } if (prima) cout << "YA" << endl; else cout << "BUKAN" << endl; } √ bil √ bil 38
  30. 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<N; i++) { cin >> bil; nfaktor = 0; for(int k=2; k*k<bil; k++) if (bil%k == 0) nfaktor++; if (nfaktor <= 1) cout << "YA" << endl; else cout << "BUKAN" << endl; } √bil √bil 39