Ekskul CSSE · SMAS St. John — BINUSPertemuan 14 · 120 menit
14
Proyek · Sesi 14 — Mini Project 2
Mini Project 2:
Simple Application

Dua belas sesi, satu kotak peralatan. Hari ini semuanya dirakit jadi satu aplikasi menu yang benar-benar jalan — gladi bersih Final Project.

TUJUAN 01
Gabungkan list, loop, fungsi & if jadi aplikasi utuh
TUJUAN 02
Rancang menu while True — lihat · tambah · hapus · cari · keluar
TUJUAN 03
Modular: 1 fungsi = 1 menu — struktur rapi siap Final Project
Target hari ini — dari potongan jadi aplikasi

Hari ini kamu lulus jadi developer mini

Tujuan Pembelajaran
  • Menggabungkan list, while True, def & if/elif jadi satu aplikasi kecil
  • Merancang aplikasi menu CLI — list sebagai data selama program jalan
  • Termodular — satu fungsi satu menu: tampilkan · tambah · hapus · cari
  • Menguji — skenario lengkap sampai pilihan tak dikenal pun tak bikin crash
while Truelistfungsi per menuanti crash
Baseline lulus hari ini

Minimal 2 fitur jalan

Menu lihat / tambah / hapus / keluar hidup, termodular per fungsi, data tersimpan di list selama program berputar.

!
Kenapa sesi ini penting

Ini gladi bersih Final Project — pola menu + list + fungsi yang sama dipakai Sesi 16, tinggal ganti domain data.

Sebelum gas — minggu lalu kamu ndapetin apa?

Rekap Sesi 13 · String Manipulation

Yang sudah kamu pegang
  • strip().title() — ritual pembersih input: nama kotor jadi rapi
  • lower() — samakan bentuk teks agar perbandingan adil
  • in · find() · count() — detektif teks: ada, di mana, berapa kali
  • split() & join() — gunting & lem: teks ↔ list

Hari ini strip() jadi kebiasaan di setiap input(), dan in + lower() jadi mesin fitur Cari aplikasimu.

Kuis kilat — coba jawab dulu!
AAplikasi chat-mu: user ketik " 4 " lalu tekan enter. Kenapa program bisa gagal membacanya?
jawaban di slide berikutnya Spasi diam-diam ikut masuk — " 4 " == "4" itu False. Jawabannya satu huruf kecil: .strip(). Sesi 13 langsung kepakai di menit-menit pertama!
!

Posisimu: 14 dari 17 — 82% perjalanan. Final Project sudah terlihat!

Sebelum ngetik satu baris — rancang dulu seperti developer

Papan menu — wajah aplikasimu

Tampilan menu yang akan kita bangun
=== TODO LIST ===
1. Lihat  2. Tambah  3. Hapus
4. Cari  5. Keluar
Pilih menu: _
Pilih domain

Todo List (default hari ini) atau Kasir Warung Mini — polanya identik, ganti nama data saja.

Menu muncul berulang-ulang sampai user pilih Keluar — bukan sekali jalan lalu selesai.

5 fitur — peta hari ini
  1. Lihat — cetak semua tugas bernomor
  2. Tambah — input() + append()
  3. Hapus — pilih nomor, pop() yang aman
  4. Cari — in + lower() dari Sesi 13
  5. Keluar — break, satu-satunya pintu keluar
→

Brainstorm dulu di kertas — daftar fitur + fungsi apa saja. Sketsa 5 menit menghemat 50 menit debugging.

Rahasia aplikasi yang tidak berantakan

1 fungsi = 1 menu — dapur yang rapi

Peta fungsi — siapa ngapain
def tampilkan(items): # menu 1 — loop + print def tambah_tugas(items): # menu 2 — input + append def hapus_tugas(items): # menu 3 — cek nomor + pop def cari_tugas(items, kata): # menu 4 — in + lower # lalu mesinnya: while True: # menu tampil terus # if/elif memanggil fungsi di atas
Aturan emas hari ini

Menu = loop + if. Logika fitur = di fungsi. Loop hanya memanggil — bukan mengolah.

Kenapa harus dipecah fungsi?
  • Gampang dites — uji tambah_tugas sendirian, tanpa menjalankan seluruh menu
  • Gampang diperbaiki — fitur rusak? Cukup buka satu fungsi, sisanya aman
  • Gampang dikembangkan — menu baru = fungsi baru + satu baris elif
!

Kriteria lulus hari ini bukan "keren", tapi "rapi & jalan" — struktur ini wajib di Final Project Sesi 16.

Di mana data aplikasimu tinggal?

list — memori aplikasimu

Code — data hidup selama program jalan
tugas = [
    "Matematika PR",
    "Fisika laporan",
]

tugas.append("Kimia PR")   # jadi 3 item
print(len(tugas))           # 3
print(tugas[0])            # Matematika PR
Kasir Warung? Pola sama

Ganti isi saja: barang = ["Roti", "Susu"] — menu lihat/tambah/hapus bekerja persis sama. Pola yang dipelajari sekali, dipakai di mana-mana.

Sifat data hari ini
  • Urutan dijaga — tugas masuk pertama, tampil pertama
  • Bisa tumbuh — append() tiap user menambah
  • Bisa dirapihkan — pop() buang sesuai nomor
  • Bisa dicari — in + lower() telusuri isinya
!

Jujur dulu: list hilang saat program ditutup — wajar! Menyimpan ke file itu materi Final Project (Sesi 16). Hari ini fokus: aplikasinya hidup dulu.

Dapur dulu sebelum ruang tunggu — dua fungsi pertama

Fungsi tampilkan & tambah

Code — dua fitur dasar
def tampilkan(items):
    if not items:
        print("(kosong)")
        return
    for nomor, item in enumerate(items, 1):
        print(f"{nomor}. {item}")

def tambah_tugas(items):
    baru = input("Tugas baru: ").strip()
    if baru:
        items.append(baru)
        print("Ditambahkan:", baru)
    else:
        print("Tugas kosong, tidak jadi.")
Detail yang gampang terlewat
  • enumerate(items, 1) — nomor mulai dari 1 (bahasa user), bukan 0 (bahasa Python)
  • .strip() — Sesi 13 langsung dipakai: spasi dienter tak ikut tersimpan
  • if not items — list kosong ditangani sopan, bukan tampil kosong membingungkan
Uji sebelum lanjut
tampilkan(tugas) # 1. Matematika PR tambah_tugas(tugas) # coba juga enter kosong

Dapur harus jalan dulu — baru ruang tunggunya dibangun.

Giliran kamu — tahap pertama pengerjaan

Kerja Tahap 1 · Dapur: lihat & tambah

Kerjakan berurutan — di file project2.py
  1. Data dulu — bikin tugas = ["Matematika PR", "Fisika laporan"] di baris paling atas
  2. Fungsi tampilkan — salin pola slide 07: enumerate + penanganan list kosong
  3. Fungsi tambah_tugas — input().strip(), tolak entri kosong
  4. Uji kedua fungsi — panggil langsung: tampilkan(tugas) lalu tambah_tugas(tugas) — coba juga Enter kosong!
Target tahap ini

Dua fungsi jalan tanpa error — belum ada menu. Yang jalan duluan di sini = fondasi 2 fitur dari baseline lulus.

Output yang harus muncul
1. Matematika PR
2. Fisika laporan
Tugas baru: Kimia PR
Ditambahkan: Kimia PR
⏱

Waktu: 15 menit. Mentok? Angkat tangan — jangan tunggu sampai bingungnya menumpuk.

Dapur jalan — sekarang bangun ruang tunggunya

Mesin menu — while True

Code — loop yang sengaja tak pernah berhenti sendiri
while True:
    print()
    print("=== TODO LIST ===")
    print("1. Lihat  2. Tambah  3. Hapus  4. Cari  5. Keluar")
    pilih = input("Pilih menu: ").strip()
    if pilih == "1":
        tampilkan(tugas)
    elif pilih == "2":
        tambah_tugas(tugas)
    elif pilih == "5":
        print("Sampai jumpa!")
        break
    else:
        print("Menu tidak ada, coba lagi.")
Tiga keputusan desain di kode ini
  • pilih == "5" — string, bukan int! Menu tidak butuh int() — lebih aman dari input ngaco
  • break hanya di cabang Keluar — satu-satunya pintu; di Sesi 09 break itu bug, di sini break itu fitur
  • else ramah — pilihan ngawur tidak crash, cuma diajak coba lagi
→

Inget Sesi 09: while True tanpa pintu keluar = infinite loop. Bedanya sekarang: pintu keluarnya sengaja kamu rancang.

Menghapus itu berbahaya — kalau tidak dicek dulu

Hapus yang aman — cek dulu, baru pop

Code — tampilkan dulu, validasi nomor, baru hapus
def hapus_tugas(items):
    if not items:
        print("(kosong - tidak ada yang bisa dihapus)")
        return
    tampilkan(items)
    nomor = int(input("Hapus nomor berapa? "))
    if 1 <= nomor <= len(items):
        dihapus = items.pop(nomor - 1)
        print("Terhapus:", dihapus)
    else:
        print("Nomor tidak ada.")
Kenapa ada dua pagar pengaman?
  • if not items — kosong tak bisa dihapus; tanpa ini, pop dari list kosong = crash
  • 1 <= nomor <= len(items) — nomor 99 di daftar 3 item ditolak sebelum menyentuh list
  • nomor - 1 — user berhitung dari 1, Python dari 0: satu jembatan kecil, wajib ada
Kalau pagarnya dilupakan
items.pop(99)
IndexError: pop index out of range

Aplikasi mati total di depan user. Pagar 2 baris menyelamatkan semuanya.

Fitur keempat — pinjaman langsung dari Sesi 13

Cari — in + lower() jadi fitur

Code — telusuri list, samakan bentuk, kumpulkan hasil
def cari_tugas(items, kata):
    hasil = []
    for item in items:
        if kata.lower() in item.lower():
            hasil.append(item)
    return hasil

# di dalam menu:
elif pilih == "4":
    kata = input("Cari kata: ").strip()
    hasil = cari_tugas(tugas, kata)
    if hasil:
        tampilkan(hasil)
    else:
        print("Tidak ada yang cocok.")
Kenapa lower() dua-duanya?

Cari "kimia" harus tetap ketemu "Kimia PR" — pencarian longgar: kedua sisi direndahkan dulu sebelum dibandingkan.

  • kata.lower() in item.lower() — cari sebagian kata pun ketemu
  • return hasil — fungsi memberi nilai (Sesi 12), bukan sekadar mencetak
!

Ini fitur menu ke-4 — baseline kurikulummu: lihat / tambah / hapus / keluar plus Cari. Cuma satu baris elif lagi di mesin menu.

Semua bahan sudah ada — rakit aplikasi utuhnya

Kerja Tahap 2 · Rakit mesin menu

Kerjakan berurutan — lanjut di project2.py
  1. Menu 1 & 2 dulu — while True + tampilan menu + cabang if/elif untuk Lihat dan Tambah. Uji keduanya!
  2. Menu 3 Hapus — tulis hapus_tugas sendiri mengikuti pola slide 10: dua pagar pengaman + nomor - 1
  3. Menu 4 Cari — pasang cari_tugas + satu baris elif
  4. Menu 5 Keluar — break + else ramah untuk pilihan ngawur
Ritual uji tiap tahap

Tambah 3 tugas → lihat → hapus nomor 2 → lihat lagi → cari → keluar → jalankan ulang. Data hilang setelah ditutup? Wajar — itu perilaku list, bukan bug.

Output yang harus muncul (skenario penuh)
=== TODO LIST ===
1. Lihat 2. Tambah ... 5. Keluar
Pilih menu: 2
Tugas baru: Kimia PR
Ditambahkan: Kimia PR
...
Pilih menu: 5
Sampai jumpa!
⏱

Waktu: 35 menit — inti 120 menit hari ini. Keluar satu-satu: menu 1-2 dulu jalan, baru lanjut. Jangan rakit semua sekaligus!

Aplikasimu hidup — sekarang buktikan nilainya

Challenge · Statistik / cetak struk

Misi A — Todo — statistik

Tambah menu Statistik: cetak jumlah tugas (len), tugas pertama & terakhir ([0] / [-1]), dan yang cocok satu kata kunci — semuanya olah list yang sudah ada.

=== STATISTIK ===
Total tugas : 3
Pertama : Matematika PR
Terakhir : Kimia PR
Misi B — Kasir — cetak struk

Kamu pilih Kasir Warung? Tambah menu Struk: cetak semua barang bernomor + total belanja — pola akumulasi total = total + harga dari Sesi 09.

=== STRUK ===
1. Roti 2000
2. Susu 5000
TOTAL 7000
Waktu 20 menit · pilih salah satu misi. Ini latihan menambah fitur ke aplikasi yang sudah jalan — keahlian yang sama saat Final Project menuntut fitur baru.
Gimana cara menyelesaikannya?

Pembahasan Challenge — kode lengkap

Solusi A — statistik
def statistik(items):
    print("=== STATISTIK ===")
    print("Total tugas :", len(items))
    if items:
        print("Pertama     :", items[0])
        print("Terakhir    :", items[-1])

# pasang di mesin menu:
elif pilih == "6":
    statistik(tugas)

Polanya selalu sama: fungsi baru + satu baris elif. if items menjaga aplikasi tetap sopan saat list kosong.

Solusi B — struk kasir
def cetak_struk(barang, harga):
    total = 0
    for i in range(len(barang)):
        print(f"{i+1}. {barang[i]}",
              harga[i])
        total += harga[i]
    print("TOTAL        ", total)

Dua list sejajar: barang[i] + harga[i]. Total pakai pola akumulasi Sesi 09 — total += harga[i] di dalam loop.

!

Perhatikan: kedua solusi tidak mengubah mesin menu — cuma menambah fungsi + satu cabang. Itulah buah modular: fitur baru tidak pernah membongkar dapur lama.

Aplikasi crash? 9 dari 10 kemungkinan salah satu dari ini

Kotak masalah — 4 jebakan menu CLI

Jebakan 01
Lupa konversi / salah tipe pilihan
pilih = input("Pilih menu: ")
if pilih == 4:      # angka, bukan string!
    break            # tak pernah terpicu

Gejala: ketik 4, menu tetap jalan terus — input() menghasilkan string, "4" == 4 itu False. Bandingkan string: pilih == "4". Bonus: tanpa int(), huruf ngawur pun tidak bikin crash.

Jebakan 02
Hapus indeks yang tidak ada
nomor = int(input("Nomor? "))
items.pop(nomor - 1)   # tanpa pagar!
# user isi 99 → IndexError

Gejala: user salah ketik → aplikasi mati total. Pagar wajib: 1 <= nomor <= len(items) sebelum pop. Dan hapus selalu lewat nomor user (1-based) dikurangi 1, bukan indeks mentah.

Jebakan 03
Semua logika ditumpuk di loop
while True:
    print("1. Lihat...")
    pilih = input()
    if pilih == "1":
        # 30 baris logika di sini!

Gejala: kode panjang menjulur, satu error membingungkan semuanya. Aturan hari ini: 1 fungsi = 1 menu — loop hanya memanggil. Final Project menuntut struktur ini.

Jebakan 04
Menu tanpa pintu keluar
while True:
    print("1. Lihat  2. Tambah")
    # tidak ada opsi Keluar
    # tidak ada break sama sekali!

Gejala: infinite loop — user tidak pernah bisa pulang, laptop di-Force-Close. Setiap menu while True wajib punya opsi Keluar + break. Terminal macet? Ctrl+C — darurat dari Sesi 09.

Senjata debug: uji satu cabang satu waktu — jalankan menu 1 saja dulu, baru tambah menu 2. Error yang muncul langsung tahu asalnya.

Panggungmu — 120 menit kerja masuk ke demo

Demo & umpan balik

Format demo — 2-3 siswa, di depan kelas
  1. Jalankan skenario penuh — tambah → lihat → hapus → cari → keluar. Biarkan kelas menyaksikan semuanya.
  2. Pamerkan satu keputusan kode yang kamu banggakan — kenapa kamu pilih cara itu?
  3. Tunjukkan satu hal yang masih goyah — jujur soal bug itu bagian kerja developer.
Checklist sebelum maju
  • Menu tampil berulang & bisa keluar lewat opsi Keluar
  • Tambah → lihat: hasilnya muncul & bertahan selama program jalan
  • Hapus nomor 99 & pilihan ngawur: pesan sopan, bukan crash
  • Setiap fitur ada di fungsi sendiri — loop hanya memanggil
Fokus umpan balik hari ini
  • Struktur — "menu di loop, logika di fungsi" — bukan sekadar jalan
  • Ketahanan — input ngacau ditangani sopan, aplikasi tetap hidup
  • Kejelasan — nama fungsi menjelaskan tugasnya: tambah_tugas, bukan proses2
!

Boleh belum sempurna — tidak boleh kacau strukturnya. Rapi hari ini = setengah Final Project lunas.

Rangkuman — yang kita bawa pulang

5 poin hari ini — aplikasi pertamamu hidup

01
Aplikasi menu = while True + if/elif — loop menjaga hidup, break hanya di cabang Keluar
02
Data = list — append tumbuh, pop buang, bertahan selama program berputar
03
Hapus & cari yang aman — cek dulu, baru aksi: pagar 1 <= nomor <= len + in/lower()
04
1 fungsi = 1 menu — tampilkan / tambah / hapus / cari terpisah; fitur baru = fungsi baru + satu elif
05
Sembuhkan 4 jebakan — pilihan string, IndexError, logika menumpuk, menu tanpa pintu keluar. Ini baseline Final Project
Aplikasi pertamamu — hidup & rapi. Next → AI-Assisted Coding
Next & Referensi — langkah selanjutnya

Minggu depan:
AI-Assisted Coding

Sesi 15 — Introduction to AI-Assisted Coding

Hari ini ngetik semua sendiri —
minggu depan AI bantu menulis, kamu yang menguji.

Prompt yang jelas → kode jadi → jangan salin buta: jalankan, cek error, pahami logikanya. Dan di situlah terasa kenapa paham kode hari ini wajib — kamu tak bisa memeriksa asisten kalau tak pernah mengerjakan sendiri.

intip:
"Buat fungsi cari_tugas(items, kata)
  yang mengembalikan semua tugas
  yang mengandung kata (abaikan kapital)."
prompt → codeverify duluetika AI
PR iseng (opsional)
  • Tambah fitur edit/update: ganti isi tugas tertentu di Todo-mu
  • Ganti domain: Todo → Kasir Warung Mini (barang + harga) — pola sama
  • Tidak ada laptop? Sketsa ulang papan menu + 5 fungsi di kertas — besok dibandingkan
Sampai jumpa di Sesi 15! pola = while + list + modular