Berikut ini adalah pertanyaan dari 4dministraktor pada mata pelajaran TI untuk jenjang Sekolah Menengah Atas
Carilah letak bilangan ke berapakah nilai dari B, apabila terdapat 2 atau lebih nilai B maka cetak urutan yang paling akhir.
Contoh input:
5 4
5 6 4 1 5
Contoh output:
Bilangan ke-3
Contoh input:
5 4
5 6 4 1 4
Contoh output:
Bilangan ke-5
Buat dan rancanglah programnya!
(ini tugas teman saya)
Jawaban dan Penjelasan
Berikut ini adalah pilihan jawaban terbaik dari pertanyaan diatas.
Kode Program (C++)
// letak-bilangan-01.cpp
// oleh hy
/*
Diberikan suatu bilangan yaitu A dan B,
dimana A merupakan banyaknya bilangan
yang akan diinput, dan B merupakan
bilangan yang akan dicari dari inputan
bilangan. Carilah letak bilangan ke
berapakah nilai dari B, apabila terdapat
2 atau lebih nilai B maka cetak urutan
yang paling akhir.
Contoh input:
5 4
5 6 4 1 5
Contoh output:
Bilangan ke-3
Contoh input:
5 4
5 6 4 1 4
Contoh output:
Bilangan ke-5
*/
#include <iostream>
#include <limits>
using namespace std;
int main() {
// Deklarasi variabel i, A dan B
unsigned int i, A, B;
// Input A dan B
cout << "Input A dan B: ";
if ( !(cin >> A >> B) ) {
return 1;
}
// clear input buffer
// Berguna jika pada input pertama
// user menginputkan lebih dari 2 bilangan
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
// Deklarasi variabel larik_bilangan
// dengan ukuran A.
// Deklarasi di sini dimaksudkan agar
// secara efisien mengalokasi memori
// untuk array larik_bilangan.
// Jika dilakukan di awal program,
// kita harus mendefinisikan ukurannya,
// yang belum diketahui sampai nilai A
// diperoleh dari input.
int larik_bilangan[A];
// Input bilangan sebanyak A
cout << "Input " << A << " bilangan: ";
for (i = 0; i < A; i++) {
cin >> larik_bilangan[i];
}
// Cari bilangan B pada larik_bilangan
// mulai dari urutan/indeks terakhir,
// karena jika terdapat duplikasi, yang
// dicetak adalah urutan paling akhir.
i = A;
while ((i > 0) && (larik_bilangan[i-1] != B)) {
// Dari elemen terakhir, selama tidak
// sama dengan B, dekrementasi i.
i--;
}
// Jika i == 0, maka B tidak ditemukan.
// Sebaliknya, B ditemukan, outputkan i.
if (i == 0) {
cout << "=> " << B
<< " tidak ditemukan.\n\n";
} else {
cout << "=> " << B
<< " adalah elemen ke-" << i
<< ".\n\n";
}
return 0;
}
_________________
Pembahasan
Untuk persoalan ini, secara garis besar, algoritmanya adalah sebagai berikut.
- Input bilangan A dan B.
- Input larik/array bilangan berukuran A.
- Cari bilangan B pada larik, mulai dari urutan terakhir sampai yang pertama.
- Jika B tidak ditemukan, cetak informasi bahwa B tidak ditemukan.
Sebaliknya, cetak indeks dari B.
Penelusuran nilai B pada larik/array dilakukan dari urutan terakhir karena jika terdapat duplikasi dari nilai B pada larik, cetak urutan/indeks terakhir.
- Jika kita menelusuri dengan iterasi dari elemen pertama, maka iterasi tetap harus dilakukan sampai semua elemen larik dievaluasi.
- Namun, jika kita lakukan sebaliknya (dari urutan terakhir), maka hanya cukup sampai menemukan nilai B yang pertama saja (terhitung dari elemen terakhir larik).
Untuk kasus di mana nilai B terdapat dalam larik, jelas cara penelusuran kedua membutuhkan iterasi yang lebih sedikit.
Pada kasus terburuk, di mana nilai B tidak terdapat dalam larik, banyak iterasi yang perlu dilakukan pada kedua cara penelusuran tersebut adalah sama.
Pada program di atas, sudah saya tambahkan keterangan dalam bentuk comment, dengan harapan akan lebih memudahkan untuk membaca dan memahami programnya.
Contoh hasil eksekusi
(dapat juga dilihat pada gambar tangkapan layar)
- $ ./letak-bilangan-01
Input A dan B: 5 4
Input 5 bilangan: 5 6 4 1 5
=> 4 adalah elemen ke-3. - $ ./letak-bilangan-01
Input A dan B: 5 4
Input 5 bilangan: 5 6 4 1 4
=> 4 adalah elemen ke-5. - $ ./letak-bilangan-01
Input A dan B: 5 3
Input 5 bilangan: 1 2 3 3 2
=> 3 adalah elemen ke-4. - $ ./letak-bilangan-01
Input A dan B: 5 0
Input 5 bilangan: 1 2 3 4 5
=> 0 tidak ditemukan.
Semoga dengan pertanyaan yang sudah terjawab oleh henriyulianto dapat membantu memudahkan mengerjakan soal, tugas dan PR sekolah kalian.
Apabila terdapat kesalahan dalam mengerjakan soal, silahkan koreksi jawaban dengan mengirimkan email ke yomemimo.com melalui halaman Contact
Last Update: Tue, 22 Nov 22