Mini-proyek Bagian 1: Statistik Nilai
Proyek ini merangkum seluruh Bagian 1: masukan, percabangan, perulangan, fungsi, dan array — dengan format masukan/keluaran seperti soal penilai daring.
Programnya membaca daftar nilai ujian satu kelas, lalu mencetak ringkasan statistiknya.
Yang harus dibuat
Program yang membaca dari masukan standar:
- baris pertama: satu bilangan bulat
n(1 ≤ n ≤ 100.000), banyaknya siswa, - baris kedua:
nbilangan bulat0..100, nilai tiap siswa.
Lalu mencetak lima baris:
- nilai terendah,
- nilai tertinggi,
- rata-rata dengan dua angka di belakang koma,
- banyaknya siswa yang nilainya di atas rata-rata,
- lima bilangan dipisahkan spasi: banyaknya nilai A, B, C, D, dan E.
Batas huruf memakai aturan Bab 04: A ≥ 90, B ≥ 80, C ≥ 70, D ≥ 60, selain itu E.
Contoh masukan:
8
95 72 88 60 45 79 91 83
Contoh keluaran:
45
95
76.62
5
2 2 2 1 1
Periksa sendiri: rata-ratanya 613 / 8 = 76,625 → dibulatkan
76.62 oleh setprecision. Nilai di atas
rata-rata ada lima (95, 88, 79, 91, 83).
Rencana pengerjaan
Jangan menulis kelima baris keluaran sekaligus. Kerjakan bertahap, dan setelah setiap tahap jalankan programnya — begitu ada yang salah, kamu tahu persis tahap mana penyebabnya.
| Tahap | Yang dikerjakan | Selesai kalau |
|---|---|---|
| 1 | baca n dan n nilai |
cerr << n << " " << a[0]; mencetak
8 95 |
| 2 | baris 1 dan 2 (terendah, tertinggi) | keluarannya 45 lalu 95 |
| 3 | baris 3 (rata-rata) | keluarannya 76.62, bukan 76 atau
76.625 |
| 4 | baris 4 (di atas rata-rata) | keluarannya 5 |
| 5 | fungsi huruf dan baris 5 |
keluarannya 2 2 2 1 1 |
Tahap 3 adalah tempat dua kesalahan Bab 03 bertemu sekaligus:
pembagian bulat, dan setprecision tanpa fixed.
Kalau keluaranmu 76 atau 7.66e+01, periksa
keduanya.
Kasus tepi yang wajib diuji
| Masukan | Keluaran yang benar |
|---|---|
1 / 100 |
100, 100, 100.00,
0, 1 0 0 0 0 |
3 / 0 0 0 |
0, 0, 0.00, 0,
0 0 0 0 3 |
4 / 70 70 70 70 |
70, 70, 70.00,
0, 0 0 4 0 0 |
Ketiganya menguji hal yang berbeda. Yang pertama: n = 1,
saat nilai terendah dan tertinggi adalah data yang sama. Yang kedua:
nilai 0 harus digolongkan E, dan nilai awal
untuk "terendah" tidak boleh 0. Yang ketiga: "di
atas rata-rata" berarti lebih besar, bukan lebih besar atau sama
dengan — kalau semua nilainya sama, jawabannya 0,
bukan 4.
Kalau macet
Baca satu petunjuk saja, coba lagi, baru baca berikutnya.
- Sudahkah kamu menjalankan programnya dengan contoh masukan dari berkas, bukan mengetik ulang angkanya?
- Kalau angkanya benar tetapi formatnya tidak: keluaranmu berisi lima baris saja, tanpa kalimat, tanpa spasi tambahan di akhir baris?
- Kalau rata-ratanya bulat: apakah pembagiannya memakai
double, danfixedsudah ditulis sebelumsetprecision(2)? - Kalau cacahan hurufnya meleset: telusuri satu nilai di batas,
misalnya tepat
90dan tepat89, lewat fungsihuruf-mu dengan tangan. - Kalau jumlahnya salah untuk data besar: tipe apa yang dipakai untuk
penampung jumlah? Nilai 100.000 × 100 masih muat di
int, tetapi membiasakanlong longdi sini akan menghemat satu kesalahan nanti.
File
Versi starter dan versi selesai ada di
projects/01-statistik-nilai/:
starter.cpp— kerangka dengan komentar TODO.finished.cpp— versi yang sudah berjalan. Lihat sesudah mencoba punyamu sendiri.
Compile dan jalankan:
g++ -std=c++17 -O2 -o statistik projects/01-statistik-nilai/starter.cpp
./statistik < projects/01-statistik-nilai/contoh-masukan.txt
Tanda < memberi isi berkas sebagai masukan, persis
seperti yang dilakukan penilai daring. Dengan begitu kamu tidak perlu
mengetik ulang angkanya setiap kali menguji.
PowerShell tidak mengenal tanda <. Di sana pakai
bentuk ini:
Get-Content projects/01-statistik-nilai/contoh-masukan.txt | ./statistik
Atau jalankan cmd lebih dulu, lalu bentuk dengan
< bekerja seperti biasa. Bentuk <
dipakai di seluruh buku karena itulah yang tertulis di hampir semua soal
dan dokumentasi lomba.
Petunjuk
- Simpan nilainya di array global berukuran
100005. - Terendah, tertinggi, dan jumlah bisa dihitung dalam satu penelusuran. Banyaknya siswa di atas rata-rata butuh penelusuran kedua, karena rata-ratanya baru diketahui sesudah semua data terbaca.
- Bandingkan dengan rata-rata memakai
double, bukanint. - Buat satu fungsi
char huruf(int nilai)yang mengembalikan'A'sampai'E', lalu cacah hasilnya dengan lima penghitung atau sebuah array berukuran 5. - Jangan mencetak kalimat pengantar apa pun.
Yang belum bisa dipakai
map,set, atau struktur data lain yang belum diajarkan. Array sudah cukup.sort. Boleh dipakai, tetapi tidak dibutuhkan: semua jawabannya bisa diperoleh dengan penelusuran biasa.
Sudah selesai?
Daftar periksa sebelum menyatakan selesai:
Pengembangan opsional
Kalau semuanya sudah jalan dan ingin menambah latihan:
- Cetak juga median-nya. Ini memerlukan
sortdan perlakuan berbeda untukngenap dan ganjil. - Cetak modus, yaitu nilai yang paling sering muncul.
Karena nilainya hanya
0..100, satu array berukuran 101 sudah cukup — dan itu pola "array sebagai penanda" dari Bab 07. - Ukur waktu programmu dengan
clock()untukn = 100.000, lalu bandingkan dengan perkiraan jumlah langkahmu sendiri.
Lanjut ke Bab 08 — Apa itu berpikir komputasional, tempat perhatian berpindah dari menulis kode ke merancang cara menyelesaikannya.