Program yang Tangguh · Pelajaran 11 dari 11

Proyek: buku nilai kelas

12 menit baca · BelajarCode

Kita akan membuat buku nilai sederhana: menyimpan nilai beberapa mapel untuk setiap siswa, menghitung rata-rata, membuat peringkat, lalu menyimpan dan memuatnya kembali dari file CSV.

Rancangan data

Data disimpan dalam dictionary bersarang: kunci luar adalah nama siswa, isinya dictionary nilai per mapel.

Contoh struktur data
{
    "Andi": {"mtk": 80, "ipa": 75, "inggris": 88},
    "Bela": {"mtk": 95, "ipa": 90, "inggris": 85},
}

Programnya

Python
1import csv234def tambah_nilai(buku, nama, mapel, nilai):5    if not 0 <= nilai <= 100:6        raise ValueError(f"nilai {nilai} untuk {nama} tidak valid")7    buku.setdefault(nama, {})[mapel] = nilai8910def rata_rata(nilai_siswa):11    return sum(nilai_siswa.values()) / len(nilai_siswa)121314def peringkat(buku):15    return sorted(buku, key=lambda nama: rata_rata(buku[nama]), reverse=True)161718def simpan(buku, nama_file):19    with open(nama_file, "w", newline="", encoding="utf-8") as f:20        penulis = csv.writer(f)21        for nama, mapel in buku.items():22            for m, n in mapel.items():23                penulis.writerow([nama, m, n])242526def muat(nama_file):27    buku = {}28    with open(nama_file, encoding="utf-8") as f:29        for nama, mapel, nilai in csv.reader(f):30            tambah_nilai(buku, nama, mapel, int(nilai))31    return buku323334buku = {}35data = [36    ("Andi", "mtk", 80), ("Andi", "ipa", 75), ("Andi", "inggris", 88),37    ("Bela", "mtk", 95), ("Bela", "ipa", 90), ("Bela", "inggris", 85),38    ("Citra", "mtk", 70), ("Citra", "ipa", 105), ("Citra", "inggris", 92),39]40for nama, mapel, nilai in data:41    try:42        tambah_nilai(buku, nama, mapel, nilai)43    except ValueError as e:44        print("Dilewati:", e)4546simpan(buku, "buku_nilai.csv")47buku_dimuat = muat("buku_nilai.csv")4849print("Peringkat kelas:")50for posisi, nama in enumerate(peringkat(buku_dimuat), start=1):51    print(f"{posisi}. {nama:<6} {rata_rata(buku_dimuat[nama]):.2f}")
Buku nilai
Keluaran
Dilewati: nilai 105 untuk Citra tidak valid
Peringkat kelas:
1. Bela   90.00
2. Andi   81.00
3. Citra  81.00

Hal penting dari proyek ini

  • buku.setdefault(nama, {}) mengembalikan dictionary nilai milik siswa, dan membuatnya dulu jika belum ada.
  • Validasi dilakukan di satu tempat, yaitu tambah_nilai. Data dari mana pun, termasuk dari file, melewati pemeriksaan yang sama.
  • Fungsi simpan dan muat adalah pasangan. Data yang disimpan lalu dimuat menghasilkan buku nilai yang sama.
  • Andi dan Citra punya rata-rata sama. sorted mempertahankan urutan semula untuk nilai yang sama, sehingga Andi tetap di atas karena datanya dimasukkan lebih dulu.

Uji fungsi satu per satu

Sebelum menggabungkan, uji setiap fungsi dengan contoh kecil. Misalnya, pastikan rata_rata({"a": 80, "b": 90}) menghasilkan 85.0. Kesalahan jauh lebih mudah ditemukan saat fungsinya masih kecil.

Cek pemahaman

Kenapa validasi nilai diletakkan di dalam fungsi tambah_nilai, bukan di tempat data dimasukkan?

Latihan

Rata-rata per mapel

Tambahkan fungsi rata_per_mapel(buku) yang mengembalikan dictionary berisi rata-rata setiap mapel untuk seluruh kelas. Uji dengan data Andi dan Bela di atas.

Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.

Tandai pelajaran ini selesai

Masuk ke aplikasi untuk mencatat kemajuan, lalu lanjutkan ke pelajaran berikutnya dari perangkat mana pun.

Buka di aplikasi