Mini Project: Aplikasi Daftar Nilai Siswa
Tujuan Pembelajaran
Section titled “Tujuan Pembelajaran”Setelah mini project ini, kamu dapat membangun program terminal yang mengolah data banyak siswa menggunakan array, loop, kondisi, dan template literal.
Pendahuluan
Section titled “Pendahuluan”Di BAB sebelumnya kita sudah membuat program untuk satu siswa. Sekarang kita akan membangun Aplikasi Daftar Nilai yang menangani banyak siswa sekaligus, menghitung statistik, menentukan peringkat, dan menampilkan laporan lengkap.
Fitur Aplikasi
Section titled “Fitur Aplikasi”- Menyimpan data beberapa siswa (nama + nilai tiga mata pelajaran)
- Menghitung rata-rata nilai setiap siswa
- Menentukan status: Lulus, Remedial, atau Perlu Bimbingan
- Menentukan grade A, B, C, D, atau E
- Mencari nilai rata-rata tertinggi dan terendah
- Menghitung rata-rata kelas
- Menampilkan laporan lengkap di terminal
Visual Illustration
Section titled “Visual Illustration”Data Siswa (array) │ ▼for loop → proses setiap siswa │ ├── hitung rata-rata (aritmatika) ├── tentukan grade (else if) └── tentukan status (perbandingan) │ ▼Simpan hasil ke array baru │ ▼Loop kedua → tampilkan laporan │ ▼Hitung statistik kelas (total, maks, min)Mari Mencoba
Section titled “Mari Mencoba”Buat src/bab3/aplikasi-daftar-nilai.ts:
// =====================================================// MINI PROJECT: APLIKASI DAFTAR NILAI SISWA// Menggabungkan BAB 1, BAB 2, dan BAB 3// =====================================================
// Tipe data untuk satu siswatype DataSiswa = { nama: string matematika: number indonesia: number pemrograman: number}
type HasilSiswa = { nama: string rataRata: number grade: string status: string}
// Konstantaconst BATAS_LULUS: number = 75const TAHUN_PELAJARAN: string = "2025/2026"
// Data seluruh siswaconst daftarSiswa: DataSiswa[] = [ { nama: "Andi", matematika: 88, indonesia: 90, pemrograman: 92 }, { nama: "Budi", matematika: 60, indonesia: 70, pemrograman: 65 }, { nama: "Citra", matematika: 95, indonesia: 88, pemrograman: 97 }, { nama: "Dian", matematika: 72, indonesia: 68, pemrograman: 74 }, { nama: "Eko", matematika: 50, indonesia: 55, pemrograman: 48 }, { nama: "Fira", matematika: 80, indonesia: 85, pemrograman: 82 },]
// ── Proses setiap siswa ──────────────────────────────const hasilSemua: HasilSiswa[] = []
for (const siswa of daftarSiswa) { const rataRata = (siswa.matematika + siswa.indonesia + siswa.pemrograman) / 3 const rataRataBulat = Math.round(rataRata)
let grade: string if (rataRataBulat >= 90) { grade = "A" } else if (rataRataBulat >= 80) { grade = "B" } else if (rataRataBulat >= 70) { grade = "C" } else if (rataRataBulat >= 60) { grade = "D" } else { grade = "E" }
const status: string = rataRataBulat >= BATAS_LULUS ? "Lulus" : "Perlu Bimbingan"
hasilSemua.push({ nama: siswa.nama, rataRata: parseFloat(rataRata.toFixed(2)), grade, status, })}
// ── Hitung statistik kelas ───────────────────────────let totalRataRataKelas: number = 0let nilaiTertinggi: number = hasilSemua[0].rataRatalet nilaiTerendah: number = hasilSemua[0].rataRatalet namaTertinggi: string = hasilSemua[0].namalet namaTerendah: string = hasilSemua[0].namalet jumlahLulus: number = 0
for (const hasil of hasilSemua) { totalRataRataKelas += hasil.rataRata
if (hasil.rataRata > nilaiTertinggi) { nilaiTertinggi = hasil.rataRata namaTertinggi = hasil.nama } if (hasil.rataRata < nilaiTerendah) { nilaiTerendah = hasil.rataRata namaTerendah = hasil.nama } if (hasil.status === "Lulus") { jumlahLulus++ }}
const rataRataKelas = (totalRataRataKelas / hasilSemua.length).toFixed(2)
// ── Tampilkan laporan ────────────────────────────────console.log("=".repeat(55))console.log(` LAPORAN NILAI KELAS — Tahun Pelajaran ${TAHUN_PELAJARAN}`)console.log("=".repeat(55))console.log( "No".padEnd(4) + "Nama".padEnd(10) + "Rata-rata".padEnd(12) + "Grade".padEnd(8) + "Status")console.log("-".repeat(55))
for (let i = 0; i < hasilSemua.length; i++) { const h = hasilSemua[i] console.log( `${(i + 1).toString().padEnd(4)}` + `${h.nama.padEnd(10)}` + `${h.rataRata.toString().padEnd(12)}` + `${h.grade.padEnd(8)}` + `${h.status}` )}
console.log("=".repeat(55))console.log(`Rata-rata kelas : ${rataRataKelas}`)console.log(`Nilai tertinggi : ${nilaiTertinggi} (${namaTertinggi})`)console.log(`Nilai terendah : ${nilaiTerendah} (${namaTerendah})`)console.log(`Jumlah lulus : ${jumlahLulus} dari ${hasilSemua.length} siswa`)console.log(`Persentase lulus : ${(jumlahLulus / hasilSemua.length * 100).toFixed(1)}%`)console.log("=".repeat(55))Jalankan:
tsx src/bab3/aplikasi-daftar-nilai.tsOutput
Section titled “Output”======================================================= LAPORAN NILAI KELAS — Tahun Pelajaran 2025/2026=======================================================No Nama Rata-rata Grade Status---
----------------------------------------------------1 Andi 90 A Lulus2 Budi 65 D Perlu Bimbingan3 Citra 93.33 A Lulus4 Dian 71.33 C Perlu Bimbingan5 Eko 51 E Perlu Bimbingan6 Fira 82.33 B Lulus=======================================================Rata-rata kelas : 75.5Nilai tertinggi : 93.33 (Citra)Nilai terendah : 51 (Eko)Jumlah lulus : 3 dari 6 siswaPersentase lulus : 50.0%=======================================================Penjelasan Bagian Penting
Section titled “Penjelasan Bagian Penting”Type alias untuk struktur data
Section titled “Type alias untuk struktur data”type DataSiswa = { nama: string matematika: number indonesia: number pemrograman: number}Membuat tipe khusus sehingga setiap object siswa punya struktur yang konsisten dan TypeScript bisa memeriksa kesalahan.
push() — menambah elemen ke array
Section titled “push() — menambah elemen ke array”hasilSemua.push({ ... })push() menambah elemen baru ke akhir array. Ini cara mengumpulkan hasil pemrosesan setiap siswa.
padEnd() — merapikan kolom
Section titled “padEnd() — merapikan kolom”h.nama.padEnd(10)padEnd(n) menambah spasi di kanan string sampai panjangnya n karakter. Berguna membuat kolom rapi di terminal.
Loop kedua untuk statistik
Section titled “Loop kedua untuk statistik”Loop pertama memproses setiap siswa. Loop kedua menghitung statistik dari hasil loop pertama. Memisahkan keduanya membuat kode lebih terorganisir.
Eksperimen
Section titled “Eksperimen”- Tambahkan dua siswa lagi dengan nilai berbeda.
- Tambahkan satu mata pelajaran (misal: Bahasa Inggris) dan sesuaikan perhitungan.
- Tampilkan urutan peringkat dari nilai tertinggi ke terendah.
Kesalahan yang Sering Terjadi
Section titled “Kesalahan yang Sering Terjadi”const hasilSemua: HasilSiswa[] = []// loop tanpa pushfor (const s of daftarSiswa) { const h = { ... } // lupa hasilSemua.push(h)}// hasilSemua masih kosong!Pastikan push() dipanggil di dalam loop untuk setiap elemen yang ingin disimpan.
Latihan
Section titled “Latihan”Tambahkan fitur ke aplikasi:
- Tampilkan hanya siswa yang nilai rata-ratanya di bawah 70 sebagai daftar “Perlu Bimbingan Khusus”.
- Hitung dan tampilkan berapa persen siswa yang mendapat grade A atau B.
Ringkasan
Section titled “Ringkasan”typealias membuat struktur data konsisten dan mudah diperiksa TypeScript.- Dua loop terpisah: satu untuk proses, satu untuk tampilkan — membuat kode lebih rapi.
push()menambah hasil ke array baru.padEnd()danrepeat()membantu memformat output terminal.