bilangan terbesar kedua
Latihan membuat instruksi untuk tugas pemrograman, diadaptasi dari instruksi bilangan terbesar kedua pada gambar.
Implementasi instruksinya menggunakan bahasa pemrograman Rust.
(sumber)
Ringkasan Tujuan
Kamu diminta membuat program dalam Rust untuk mencari bilangan terbesar kedua dari sejumlah bilangan bulat yang dimasukkan.
Contoh:
Input:
5 3 4 2 8 7
Output:
7
Penjelasan: bilangan terbesar = 8, bilangan terbesar kedua = 7.
Tujuan Pembelajaran
Setelah menyelesaikan tugas ini, kamu akan:
Mampu membaca sejumlah
n
bilangan bulat dari input.Mampu menyusun algoritma sederhana untuk mencari bilangan terbesar dan terbesar kedua tanpa perlu melakukan pengurutan atau sorting seluruh data.
Memahami bahwa ada beberapa pendekatan, dan bisa menimbang kemudahan pemahaman vs efisiensi.
Merefleksikan bagaimana konsep ini berkembang kalau diminta "terbesar ketiga" atau seterusnya.
Tantangan Konseptual
Banyak siswa cenderung overthinking:
Mendengar kata "terbesar" → langsung terbayang sorting seluruh data.
Padahal, kita tidak perlu tahu urutan lengkap. Kita hanya butuh dua nilai tertinggi.
Dengan menyimpan hanya dua variabel (max1
dan max2
), masalah bisa diselesaikan lebih efisien dan jelas alurnya.
Memang ada bagian dari kode kita yang akan melakukan proses seperti yang terjadi pada pengurutan atau sorting, namun sebetulnya yang kita lakukan hanya proses perbandingan dua nilai saja.
Refleksi untuk Pengembangan
Terbesar kedua → cukup simpan dua nilai (
max1
,max2
).Terbesar ketiga → butuh tiga variabel (
max1
,max2
,max3
) dengan logika lebih panjang.Untuk kasus lebih umum (
k
-terbesar), solusi paling bersih adalah menggunakan struktur data (misalnya heap) atau sorting. Tapi untuk belajar dasar, kita cukup fokus pada dua nilai.
Algoritma "Bersih" (clean)
Baca
n
, jumlah bilangan.Baca semua bilangan satu per satu.
Gunakan dua variabel:
max1
: bilangan terbesar sejauh ini.max2
: bilangan terbesar kedua sejauh ini.
Untuk setiap bilangan
x
:Jika
x > max1
: gesermax1
kemax2
, lalu simpanx
kemax1
.Else jika
x > max2
danx != max1
: simpanx
kemax2
.
Setelah semua input diproses, cetak
max2
.
Contoh Program (Rust)
// bilangan_terbesar_kedua.rs
// Program untuk mencari bilangan terbesar kedua dari sekumpulan angka.
use std::io;
fn main() {
// Baca input pertama: jumlah bilangan
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Gagal membaca input");
let n: usize = input.trim().parse().expect("Input harus angka");
// Siapkan variabel max1 dan max2
// Gunakan i32::MIN agar lebih aman daripada asumsi awal "angka pertama"
let mut max1 = i32::MIN;
let mut max2 = i32::MIN;
// Proses semua bilangan satu per satu
for _ in 0..n {
let mut num_str = String::new();
io::stdin().read_line(&mut num_str).expect("Gagal membaca angka");
let x: i32 = num_str.trim().parse().expect("Input harus angka");
if x > max1 {
// Geser max1 ke max2, lalu simpan x ke max1
max2 = max1;
max1 = x;
} else if x > max2 && x != max1 {
// Update max2 hanya jika lebih besar dari max2
max2 = x;
}
}
// Cetak hasil
if max2 == i32::MIN {
println!("Tidak ada bilangan terbesar kedua yang valid");
} else {
println!("{}", max2);
}
}
Penjelasan Singkat Kode
n
→ banyak bilangan yang akan diproses.max1
danmax2
→ inisialisasi ke nilai terkecil (i32::MIN
).if x > max1
→ update bilangan terbesar baru.else if x > max2 && x != max1
→ update bilangan terbesar kedua jika cocok.Edge case → jika semua bilangan sama, maka tidak ada terbesar kedua yang valid.
Pertanyaan Refleksi
Apa yang terjadi jika semua angka sama, misalnya
5 5 5 5
? Bagaimana output sebaiknya?Jika kamu diminta mencari bilangan terbesar ketiga, bagaimana kamu akan menambah logika? Apakah masih "bersih"?
Menurutmu, apakah selalu lebih baik menggunakan sorting untuk masalah seperti ini? Mengapa iya/tidak?