hitung domba
Latihan membuat instruksi untuk tugas pemrograman, diadaptasi dari instruksi hitung domba pada gambar.
Implementasi instruksinya menggunakan bahasa pemrograman Rust.
(sumber)
Ringkasan tujuan:
Siswa mampu menulis program Rust sederhana yang menerima dua input: jumlah domba M dan angka kesayangan N. Program mencetak urutan 1..=M; untuk setiap angka yang dapat dibagi habis oleh N, cetak kata "happy"; selain itu cetak angkanya. Fokus: pemahaman alur kontrol (loop & percabangan), parsing input, dan kejelasan kode—bukan optimasi.
Tujuan pembelajaran (learning objectives)
Setelah menyelesaikan tugas ini, kamu bisa:
Membaca dan mem-parse input dari stdin di Rust.
Menggunakan loop for untuk iterasi terkontrol.
Menerapkan kondisi pembagian (%) untuk memutuskan output.
Menulis kode yang mudah dibaca dengan komentar singkat.
Menjelaskan alur program secara singkat (self-explanation).
Prasyarat
Dasar sintaks Rust (variabel immutable/mutable, for loop, if).
Cara menjalankan program Rust (cargo run atau rustc + executable).
Kemampuan membaca dan menuliskan komentar kode.
Langkah-langkah tugas (struktur tugas untuk siswa)
Baca masukan: Program menerima dua bilangan bulat M dan N dari stdin. Mereka bisa berada di baris yang sama atau berbeda.
Validasi sederhana (opsional untuk pemula): Pastikan M >= 1 dan N >= 1. Jika tidak, tampilkan pesan error sederhana. (Boleh dilewatkan untuk tugas dasar.)
Iterasi: Untuk setiap i dari 1 sampai M (inklusif):
Jika i % N == 0 → cetak happy pada baris baru.
Jika tidak → cetak i pada baris baru.
Kejelasan: Gunakan nama variabel yang jelas (m, n, i) dan beri komentar pendek yang menjelaskan blok penting.
Refleksi singkat: Setelah menjalankan program, tuliskan 1–2 kalimat: apa yang terjadi ketika N = 1? apa ketika N > M?
Contoh Masukan / Keluaran
Masukan (input):
5
2
(atau 5 2 juga diterima)
Keluaran (output):
1
happy
3
happy
5
Contoh Program (Rust) — mudah dibaca, bukan fokus optimasi
// hitung_domba.rs
// Program sederhana: baca M dan N dari stdin, lalu dari 1..=M
// cetak "happy" jika angka dapat dibagi N, selain itu cetak angkanya.
// Import modul yang diperlukan
use std::io::{self, Read};
fn main() {
// Baca seluruh input dari stdin sebagai string
let mut input = String::new();
io::stdin().read_to_string(&mut input).expect("gagal membaca input");
// Pisah input berdasarkan whitespace dan ubah ke iterator angka
let mut parts = input.split_whitespace();
// Parse M (jumlah domba)
let m: i64 = match parts.next() {
Some(s) => s.parse().expect("input M harus bilangan bulat"),
None => {
eprintln!("Masukkan M dan N (misal: 5 2)");
return;
}
};
// Parse N (angka kesayangan)
let n: i64 = match parts.next() {
Some(s) => s.parse().expect("input N harus bilangan bulat"),
None => {
eprintln!("Masukkan N setelah M (misal: 5 2)");
return;
}
};
// (Opsional) Validasi sederhana
if m < 1 || n < 1 {
eprintln!("M dan N harus >= 1");
return;
}
// Loop dari 1 sampai M (inklusif) dan cetak sesuai aturan
for i in 1..=m {
if i % n == 0 {
println!("happy");
} else {
println!("{}", i);
}
}
}
Komentar singkat pada kode (penjelasan):
Baca seluruh stdin karena input mungkin berada di baris terpisah atau baris sama.
split_whitespace() memudahkan parsing tanpa memikirkan baris.
1..=m adalah rentang inklusif; untuk setiap angka i, i % n == 0 berarti i dapat dibagi habis oleh n.
Cetak happy atau angka sesuai kondisi.
Kegiatan belajar & evaluasi (scaffolding)
Pasangan/Peer review: Tukar kode dengan teman; coba jelaskan pilihanmu (mengapa baca seluruh stdin? mengapa cek m < 1?).
Debugging guided: Beri input 3 1 — apa outputnya? (Semua baris harus happy karena setiap angka habis dibagi 1.)
Ekstensi tugas (opsional):Tambahkan opsi: jika i habis dibagi N cetak happy, jika juga habis dibagi K cetak superhappy (perkenalkan multiple condition).Tulis versi yang menangani banyak pasangan (M,N) hingga EOF.
Kriteria penilaian sederhana:
Program berjalan tanpa crash untuk input valid.
Output sesuai contoh untuk kasus uji sederhana (misal 5 2).
Kode diberi komentar minimal dan jelas.
Pertanyaan refleksi (untuk mengembangkan metakognisi)
Apa yang kamu pelajari tentang penggunaan operator %?
Bagaimana cara memodifikasi program ini jika input M sangat besar (misal jutaan)? (konsep: performance, streaming output)Apa yang berubah jika N == 0? (kena error pembagian; diskusikan validasi input)