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: n bilangan bulat 0..100, nilai tiap siswa.

Lalu mencetak lima baris:

  1. nilai terendah,
  2. nilai tertinggi,
  3. rata-rata dengan dua angka di belakang koma,
  4. banyaknya siswa yang nilainya di atas rata-rata,
  5. 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.

  1. Sudahkah kamu menjalankan programnya dengan contoh masukan dari berkas, bukan mengetik ulang angkanya?
  2. Kalau angkanya benar tetapi formatnya tidak: keluaranmu berisi lima baris saja, tanpa kalimat, tanpa spasi tambahan di akhir baris?
  3. Kalau rata-ratanya bulat: apakah pembagiannya memakai double, dan fixed sudah ditulis sebelum setprecision(2)?
  4. Kalau cacahan hurufnya meleset: telusuri satu nilai di batas, misalnya tepat 90 dan tepat 89, lewat fungsi huruf-mu dengan tangan.
  5. Kalau jumlahnya salah untuk data besar: tipe apa yang dipakai untuk penampung jumlah? Nilai 100.000 × 100 masih muat di int, tetapi membiasakan long long di 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, bukan int.
  • 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 sort dan perlakuan berbeda untuk n genap 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() untuk n = 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.