Ekskul CSSE · SMAS St. John — BINUSPertemuan 16 · 120 menit
16
Pertemuan 16 dari 17 · Sesi 16 — Final Project Development
Final Project
Development

Hari ini 15 pertemuan dirangkai jadi satu aplikasi utuh — dan minggu depan kamu berdiri di panggung mempresentasikannya.

TUJUAN 01
Merancang aplikasi Pengelola Data berbasis menu + file (CLI)
TUJUAN 02
Membangun bertahap per fungsi — 1 fitur selesai > 5 fitur setengah jadi
TUJUAN 03
Self-test & rubrik — program tahan banting siap demo
Target hari ini — dari potongan-potongan jadi aplikasi

Hari ini kamu berhenti jadi siswa latihan

Tujuan Pembelajaran
  • Memilih domain proyek & menetapkan scope yang realistis
  • Merancang alur menu & daftar fungsi sebelum mengetik
  • Membangun baseline B: menu loop + list[dict] + file + modular
  • Menguji sendiri semua cabang menu & cek diri terhadap rubrik
while True menulist[dict]file I/Otry-except

* baseline = standar minimum lulus (nilai B) · stretch = level bonus di atasnya (menuju A) · CLI = Command Line Interface, aplikasi berbasis teks di terminal.

!
Yang berubah hari ini

Sebelumnya: latihan per konsep.
Sekarang: proyek utuh milikmu.

Bekal bawaan dari Sesi 15

Prompt KBT-mu untuk satu fitur — sekarang waktunya dipakai. AI boleh jadi asisten, tapi verifikasi tetap wajib: kamu bosnya.

Sebelum gas — minggu lalu kamu ndapetin apa?

Rekap Sesi 15 · AI-Assisted Coding

Yang sudah kamu pegang
  • Prompt KBT — Konteks + Bahasa + Tujuan: AI tahu persis mau ke mana
  • Verifikasi 3 langkah — jalankan, cek error, cek logika (uji kasus tepi)
  • Etika — AI membantu, kamu yang paham; anti salin buta

Dalam proyek hari ini AI boleh dipakai sebagai asisten — bukan gendongan. Setiap baris yang masuk file-mu wajib bisa kamu jelaskan saat demo minggu depan.

Kuis kilat — jawab dulu!
AProgram ditutup, lalu dijalankan lagi — bagian mana yang menyelamatkan datamu?
jawaban slide berikutnya Kalau jawabanmu "file" / simpan ke disk — tepat. List itu memori: mati program, hilang semua. File itu buku catatan yang tersimpan. Itu jantung proyek hari ini.
!

Posisimu: 16 dari 17 — 94% perjalanan. Satu langkah lagi sebelum Demo Day!

Satu resep aplikasi — lima rasa yang boleh kamu pilih

Pengelola Data CLI — pilih domainmu

5 domain — pilih 1, tulis field dict-nya dulu
DomainStruktur dict-nya
1 · Nilai Siswa default demo{"nama": "Budi", "nilai": 85} — turunkan huruf & lulus/tidak saat tampil
2 · Perpustakaan Mini{"judul": "...", "penulis": "...", "status": "tersedia"}
3 · Kasir Warung challenge{"barang": "...", "harga": 5000, "stok": 12} + cetak struk
4 · Kontak / Buku Alamat{"nama": "...", "hp": "...", "email": "..."}
5 · Todo / Agenda{"tugas": "...", "deadline": "...", "status": "belum"}
Kalimat scope-mu — tulis di kertas kerja
"Aplikasiku bernama ___,
datanya ___,
fitur wajibnya ___."

Semua domain pakai mesin yang sama: menu, list[dict], file. Yang beda cuma field dict-nya — ganti mesinnya nggak perlu.

→

Analogi hari ini: aplikasimu = restoran. Menu = pelayan yang standby · data = dapur · fungsi = juragan masak per pesanan.

Sebelum mimpi jadi A — standar lulusnya apa?

Baseline wajib — kriteria lulus B

5 pilar — semua harus ada

1 · Menu loop while True — 5 opsi: Lihat, Tambah, Cari, Hapus + Statistik, dan Keluar (break)

2 · Data di list[dict] — satu sumber kebenaran, contoh: [{"nama": "Budi", "nilai": 85}]

3 · Modular — 1 menu = 1 fungsi: tampilkan_data, tambah_data, cari_data, hapus_data, statistik, simpan_file, load_file

4 · File I/O — with open, write / read / readlines: data selamat setelah program ditutup

5 · try-except — input angka (ValueError) & file not found (FileNotFoundError) tidak boleh menjatuhkan program

Level stretch — untuk A
  • Search + filter — cari per kategori, bukan cuma per nama
  • Sort — sort() / sorted() nilai tertinggi dulu
  • Statistik lengkap — max, min, rata-rata, terlulus
  • Edit/update data yang sudah ada
  • Laporan ke file terpisah — laporan.txt dibuat otomatis
!

Rubrik menilai fungsi yang jalan, bukan daftar mimpi. Baseline yang solid mengalahkan lima fitur error.

Developer pro merancang dulu — baru ngetik

Rencana fitur — flowchart menu & kontrak fungsi

Alur aplikasi — gambar dulu di kertas
Mulai
→ load_file() ← sekali di awal
→ tampilkan menu → baca pilihan
→ cabang ke fungsi sesuai pilihan
→ kembali ke menu (loop)
→ pilih Keluar → break → selesai
Urutan kerja yang disarankan

kerangka menu → tambah → lihat → cari → hapus → statistik → file I/O. Tambah dulu karena fitur lain butuh data buat diuji.

Kontrak fungsi — 1 menu = 1 fungsi
def load_file():      # baca data.txt -> list[dict]
def simpan_file():   # tulis list[dict] -> data.txt
def tampilkan_data(): # cetak semua data rapi
def tambah_data():   # input, validasi, append, save
def cari_data(kata):  # hasil pencarian (case-insensitive)
def hapus_data():    # cari index, del, save
def statistik():     # jumlah, max, min, rata-rata

Kontrak satu baris = pengganti flowchart detail. Yang penting: gambar besar ada sebelum mengetik.

!

Finalisasi ide 15' + rencana fitur 20' — baru masuk kerja coding 60 menit. Rencana itu bukan formalitas — itu penghemat jam.

Giliran kamu — bangun tulang punggungnya dulu

Tugas 1 · Kerangka menu yang jalan

Kerjakan berurutan — 3 level
  1. Pilih domain & tulis kalimat scope — "Aplikasiku bernama ___, datanya ___, fitur wajibnya ___"
  2. Bangun menu while True — 5 opsi + Keluar. Fitur yang belum dibuat boleh placeholder: print("(fitur menyusul)")
  3. Run ▶ sekarang — menu harus muncul berulang dan berhenti rapi di Keluar
Kenapa kerangka dulu?

Menu yang jalan (walau kosong) = kerangka aman. Sisa pekerjaan tinggal mengisi kotak-kotaknya — satu kotak selesai, aplikasi tetap utuh.

Kerangka mulai — salin & sesuaikan domainmu
data = []   # list[dict] — dapur aplikasimu
while True:
    print("\n=== APLIKASI NILAI SISWA ===")
    print("1. Lihat  2. Tambah  3. Cari")
    print("4. Hapus  5. Statistik  6. Keluar")
    pilihan = input("Pilih menu (1-6): ")
    if pilihan == "6":
        print("Sampai jumpa!")
        break
    else:
        print("Menu belum tersedia.")
!

Waktu: 20 menit. Output yang benar: menu berulang tanpa crash, pilih 6 → berhenti rapi.

60 menit coding — naik tangga, bukan lompat

Kerja bertahap — 1 fitur selesai > 5 fitur setengah jadi

Tangga kerja — tiap anak tangga wajib di-Run ▶ dulu
1

Menu jalan — kerangka dari Tugas 1, semua pilihan tidak crash

2

tambah_data() — input + validasi + append + save

3

tampilkan_data() — cetak semua data rapi bernomor

4

cari_data() + hapus_data() — temukan, lalu del dengan pesan jujur

5

statistik() — jumlah, max, min, rata-rata

6

File I/O — load_file() + simpan_file() + try-except

Aturan tangga
  • Selesaikan satu fitur sampai sempurna — baru naik
  • Selesai = di-Run ▶ dan diuji, bukan "sudah diketik"
  • Waktu menipis? berhenti di anak tangga mana pun — aplikasi tetap jalan utuh
  • Jangan buka fitur baru saat fitur lama masih error
!

Jebakan terbesar hari ini bukan kode sulit — tapi nafsu fitur: tiba-tiba mau login, gambar, database. Rubrik menilai yang jalan.

Satu dapur untuk semua bahan — begini isinya

Data hidup di list[dict]

Code — pola dasar yang dipakai semua fungsi
data = [# list berisi dict — 1 dict = 1 catatan
    {"nama": "Budi", "nilai": 85},
    {"nama": "Sari", "nilai": 72},
]

# menambah: fungsi tambah panggil append
data.append({"nama": "Rina", "nilai": 90})

# membaca field dict: pakai kunci (bukan index!)
print(data[0]["nama"])   # Budi
print(data[0]["nilai"])  # 85
Pola akses yang dipakai di semua fitur
  • Loop semua data — for item in data: (Lihat, Statistik)
  • Cari — kata.lower() in item["nama"].lower() → "budi" ketemu "Budi"
  • Hapus — enumerate(data) dapat index → del data[i]
!

Kunci dict harus persis — item["Nama"] saat kuncinya "nama" = KeyError, jebakan paling sering hari ini.

Program mati, data nggak boleh mati

File I/O — load di awal, save tiap berubah

Code — kontrak dua arah
FILE = "data.txt"

def simpan_file():
    with open(FILE, "w", encoding="utf-8") as f:
        for item in data:
            f.write(f"{item['nama']},{item['nilai']}\n")

def load_file():
    try:
        with open(FILE, "r", encoding="utf-8") as f:
            for baris in f.readlines():
                baris = baris.strip()
                if baris == "":
                    continue
                nama, nilai = baris.split(",")
                data.append({"nama": nama, "nilai": int(nilai)})
    except FileNotFoundError:
        print("File belum ada — mulai dengan data kosong.")
Kontraknya cuma dua
  • load_file() — dipanggil sekali, sebelum loop menu
  • simpan_file() — dipanggil setiap kali data berubah (dalam tambah_data, hapus_data, edit)

Lupa salah satu = data palsu di sesi berikutnya. Sama seperti draft chat-mu: tersimpan karena ada save di tiap perubahan.

Uji penuhnya

Tambah 1 data → tutup program → jalan lagi → data masih ada. Itu bukti file-mu bekerja.

User nakal itu pasti datang — sambut dengan alarm sendiri

try-except — alarm yang kamu pasang sendiri

Code — tanya ulang sampai sah
def tambah_data():
    nama = input("Nama: ")
    while True:   # tanya berulang sampai angka sah
        try:
            nilai = int(input("Nilai (0-100): "))
            break
        except ValueError:
            print("Harus angka! Contoh: 85")
    data.append({"nama": nama, "nilai": nilai})
    simpan_file()
    print(f"Data {nama} ditambahkan.")
Dua alarm yang wajib terpasang
ValueErroruser ketik "lima" di kolom nilai — tanya ulang, jangan crash
FileNotFoundErrorrun pertama, data.txt belum ada — mulai dengan data kosong

Output jalan beneran: user ketik lima → Harus angka! Contoh: 85 → tanya lagi → ketik 85 → Data Budi ditambahkan. Satu huruf nakal tidak menjatuhkan aplikasi.

!

Setiap except yang kamu tulis = bukti kamu pernah jatuh di situ. Itu nilai plus saat Q&A demo minggu depan.

Isi kotak-kotaknya — satu per satu, uji per satu

Tugas 2 · Fitur inti sampai baseline B penuh

Kerjakan berurutan — 3 level
  1. tambah_data() + tampilkan_data() — masukin 2 data, tampilkan rapi: 1. Budi - nilai 85 (Lulus)
  2. cari_data() + hapus_data() — cari yang ada & yang tidak ada; hapus yang ada & yang tidak ada — semuanya tanpa crash
  3. statistik() + file I/O — jumlah/max/min/rata-rata; load di awal, save tiap perubahan; uji tutup-buka program
Definisi selesai

Fitur selesai = jalan + diuji normal + diuji kasus aneh. Fitur setengah jadi = jalan untuk input yang sopan saja.

Output yang harus muncul (potongan)
=== APLIKASI NILAI SISWA ===
Pilih menu (1-6): 1
1. Budi - nilai 85 (Lulus)
2. Sari - nilai 72 (Remedial)
Pilih menu (1-6): 5
Jumlah data : 2
Nilai tertinggi : 85
Nilai terendah : 72
Rata-rata : 78.5
!

Waktu: 40 menit — sisa jam coding 60' setelah kerangka 20'. Guru berkeliling; mentok satu fitur > 10 menit? Tanya, jangan diam di situ.

Sebelum pulang — nilai dirimu sendiri dulu

Self-test & rubrik — nilai dirimu sendiri

Rubrik Sesi 16-17 — total 100%
KomponenBobot
Fungsi jalan30% — semua menu bisa dibuka & kembali tanpa crash
Struktur kode25% — modular, 1 menu = 1 fungsi, nama jelas
Logika20% — validasi input, pesan jujur saat tidak ketemu
Demo & penjelasan15% — bisa menjelaskan keputusanmu
Kreativitas10% — sentuhan di luar wajib
Self-test — jalankan sendiri, centang satu per satu
  • Semua menu bisa dibuka dan kembali ke menu tanpa crash
  • Tambah dengan huruf di kolom angka → ditolak sopan
  • Cari nama yang tidak ada → pesan jujur, bukan error
  • Hapus saat list kosong → tidak crash
  • Keluar → buka lagi → data masih ada (bukti file bekerja)
→

Pilih sekarang: 1 fungsi yang kamu banggakan — yang bisa kamu jelaskan paling meyakinkan. Modal terbesar Demo Day minggu depan.

Baseline sudah jalan? Naik ke level A

Challenge · Level stretch — menuju A

Misi — kerjakan SETELAH baseline aman
  1. Sort — tampilkan data urut nilai tertinggi: pelajari sorted() dengan key=lambda
  2. Edit/update — menu baru: pilih data yang mau diubah, ganti nilainya, jangan lupa save
  3. Laporan ke file terpisah — laporan.txt berisi statistik lengkap, dibuat otomatis
Syarat masuk challenge

Self-test lolos semua. Fitur wajib yang belum sempurna itu utama — stretch yang belum jadi tidak mengurangi nilai, tapi wajib yang belum jalan mengurangi.

Petunjuk sort — satu baris yang ajaib
# urutkan dari nilai tertinggi
urut = sorted(data,
             key=lambda item: item["nilai"],
             reverse=True)

for item in urut:
    print(item["nama"], item["nilai"])
# Rina 90, Budi 85, Sari 72
!

Sisa waktu sesi atau PR di rumah. Semua stretch opsional — demo tetap jalan kalau tidak ada satu pun.

Gimana cara menyelesaikannya?

Pembahasan Challenge — stretch yang rapi

STRETCH 1 — urut nilai tertinggi
urut = sorted(data,
             key=lambda item: item["nilai"],
             reverse=True)
for item in urut:
    print(item["nama"], item["nilai"])
# Rina 90, Budi 85, Sari 72

sorted(..., reverse=True) — urut menurun tanpa mengubah data aslinya.

STRETCH 2 — edit nilai + input dijaga
def edit_data():
    kata = input("Nama yang diedit: ")
    for item in data:
        if item["nama"].lower() == kata.lower():
            while True:
                try:
                    item["nilai"] = int(input("Nilai baru: "))
                    break
                except ValueError:
                    print("Harus angka! Contoh: 85")
            simpan_file()   # edit = data berubah = WAJIB save
            print("Data diperbarui.")
            return   # berhenti — pesan "tidak ketemu" tidak ikut
    print(f"Data '{kata}' tidak ditemukan.")
Aturan 1 menu = 1 fungsi · edit/hapus = save · input aneh = try-except — naik level bukan berarti ganti aturan main.
!

Yang sampai sini dengan baseline utuh — aplikasimu bukan tugas lagi, itu produk.

Empat error yang paling sering menjatuhkan proyek

Kotak masalah — 4 jebakan final project

Jebakan 01
ValueError — int(input())
nilai = int(input("Nilai: "))
# user ketik: lima
# ValueError: invalid literal...

Obat: while True + try-except ValueError — tanya ulang sampai sah (slide 11). Jangan biarkan satu huruf menjatuhkan aplikasi.

Jebakan 02
FileNotFoundError
with open("data.txt", "r") as f:
# run pertama, file belum ada!
# FileNotFoundError

Obat: bungkus load dengan try-except FileNotFoundError → "mulai dengan data kosong". File tercipta otomatis saat save pertama.

Jebakan 03
Lupa save tiap perubahan
data.append(...)   # masuk list...
# ...tapi tidak simpan_file()!
# program ditutup -> data hilang

Obat: kontrak save di dalam tiap fungsi yang mengubah data — bukan cuma saat keluar (keluar pakai Ctrl+C artinya tak pernah sampai).

Jebakan 04
Dict key salah
item["Nama"]   # KeyError! kuncinya "nama"
item["niali"]  # KeyError! typo

Obat: kunci dict persis sama dengan yang ditulis saat append. Pilih nama field sekali di awal, tulis konsisten — snake_case semua.

Plus satu kebiasaan: def semua fungsi di atas, loop menu paling bawah — Python baca atas-ke-bawah; fungsi yang dipanggil sebelum didefinisikan = NameError.

Rangkuman · Yang kita bawa pulang

5 poin hari ini — aplikasimu hidup

01
Menu while True — pelayan yang standby: Lihat, Tambah, Cari, Hapus, Statistik, Keluar (break)
02
Data di list[dict] — satu sumber kebenaran; akses pakai kunci yang persis, bukan nebak
03
Modular — 1 menu = 1 fungsi; load_file() sekali di awal, simpan_file() tiap data berubah
04
try-except — ValueError (input nakal) & FileNotFoundError (run pertama) tidak boleh crash
05
Tangga kerja — 1 fitur selesai sempurna > 5 fitur setengah jadi; rubrik: 30/25/20/15/10
Aplikasi jalan — sekarang panggungnya!Next → Presentation & Demo
Next & Referensi — langkah selanjutnya

Minggu depan:
Presentation & Demo

Sesi 17 — Final Project Presentation & Demo (120 menit)

Rumah kerja yang sama, panggung yang berbeda — Demo Day!

Tiap kelompok 5–7 menit: Masalah → Fitur → Demo Live → 1 potongan kode dibanggakan → Q&A. Rubrik sama persis dengan hari ini: Fungsi jalan 30% · Struktur 25% · Logika 20% · Demo & Penjelasan 15% · Kreativitas 10%.

cerita demo-mu — tinggal diisi:
Masalah : mencatat nilai masih pakai kertas
Demo : tambah "Budi" 85 -> lihat -> statistik
Kode : def tambah_data() — try-except-nya
Q&A : "kalau 2 orang namanya sama?"
5-7 menitdemo live1 fungsi dibanggakan
PR iseng (opsional)
  • Rapikan aplikasi di rumah — selesaikan 1 fitur yang masih setengah jadi
  • Latihan demo sendiri 3 menit di depan cermin — masalah, fitur, demo
  • Siapkan jawaban: "kalau 2 orang namanya sama, bagaimana?"
  • Tidak ada laptop? Tulis alur presentasi 5 baris di kertas
Sampai jumpa di Sesi 17! masalah · fitur · demo · Q&A