"""Sesi 11 — List / Array | Kode Pendamping Lengkap
SMAS St. John · Ekskul CSSE (Python)

Cara pakai:
  1. Simpan file ini, buka di VS Code
  2. Tekan Run ▶ (atau ketik di terminal: python kode.py)
  3. Baca output di terminal — lalu baca komentar di dalamnya:
     setiap BAGIAN sesuai urutan slide deck Sesi 11

File ini mengikuti alur deck:
  BAGIAN 1 = list vs variabel tunggal (slide 04)
  BAGIAN 2 = indeks 0 & indeks negatif (slide 05-06)
  BAGIAN 3 = slicing [1:3]             (slide 07)
  BAGIAN 4 = tugas 1: kelola daftar nilai (slide 08)
  BAGIAN 5 = loop list & pola wadah    (slide 09)
  BAGIAN 6 = tugas 2: rekap n nilai → rata-rata (slide 10)
  BAGIAN 7 = challenge: daftar teman   (slide 11-12)
  BAGIAN 8 = jebakan IndexError & ValueError (slide 13)
"""

# ============================================================
# BAGIAN 1 — list vs variabel tunggal: keranjang, bukan kotak
# ============================================================
# Variabel tunggal = 1 kotak 1 label. Butuh 30 nilai? Capek.
# List = keranjang: satu nama, isinya banyak.

nilai1 = 85
nilai2 = 90
nilai3 = 78
print("Cara lama:", nilai1, nilai2, nilai3)   # Cara lama: 85 90 78

nilai = [85, 90, 78]
print("Cara baru:", nilai)          # Cara baru: [85, 90, 78]
print("Jumlah isi:", len(nilai))    # Jumlah isi: 3
print("Kosong boleh:", [])          # Kosong boleh: []

# ============================================================
# BAGIAN 2 — indeks mulai 0 & indeks negatif (slide 05-06)
# ============================================================
# Loker pertama bernomor 0, bukan 1!
# Indeks terakhir = len(list) - 1. Negatif = hitung mundur dari belakang.

nilai = [85, 92, 78, 88]
print(nilai[0])     # 85 — yang PERTAMA (bukan yang kedua!)
print(nilai[3])     # 88 — yang TERAKHIR (4 isi → indeks 0..3)
print(nilai[-1])    # 88 — juga terakhir, jalan pintas elegan
print(nilai[-2])    # 78 — kedua dari belakang

nilai[1] = 95       # ganti isi sekat 1
print("Setelah ganti:", nilai)   # Setelah ganti: [85, 95, 78, 88]

# JEBAKAN (slide 13) — JANGAN di-run dulu, baca dulu:
# print(nilai[4])   # IndexError! list ada 4 isi, indeksnya cuma 0-3.
# Solusi: indeks terakhir = len(nilai) - 1. Biasakan cek len() dulu.

# ============================================================
# BAGIAN 3 — slicing [1:3]: stop itu garis finis (slide 07)
# ============================================================
# Persis pola range(start, stop) dari Sesi 09: berhenti SEBELUM stop.

nilai = [85, 92, 78, 88]
print(nilai[1:3])   # [92, 78] — indeks 1 & 2 saja, 3 TIDAK ikut
print(nilai[:2])    # [85, 92] — dari awal sampai sebelum 2
print(nilai[2:])    # [78, 88] — dari 2 sampai habis
print(nilai[:])     # [85, 92, 78, 88] — salinan seluruh keranjang

# Kuis dari slide: berapa elemen nilai[0:3]? Jawab: 3 - 0 = 3 elemen.
print(nilai[0:3])   # [85, 92, 78]

# ============================================================
# BAGIAN 4 — Tugas 1: kelola daftar nilai (slide 08)
# ============================================================
# Alur: tebak dulu → run → buktikan. Lalu kelola keranjangnya.

nilai = [85, 92, 78, 88]
print(nilai[0])         # 85
print(nilai[-1])        # 88
print(nilai[1:3])       # [92, 78]

nilai.append(95)        # tambah di akhir
print("Append:", nilai) # [85, 92, 78, 88, 95] — ukuran 4 → 5
print("Ukuran:", len(nilai))    # 5

nilai.remove(78)        # buang berdasarkan NILAI (bukan indeks!)
print("Remove:", nilai) # [85, 92, 88, 95] — ukuran 5 → 4

print(90 in nilai)      # False — tidak ada
print(95 in nilai)      # True — baru saja ditambahkan

# Bonus — insert menyisip di tengah (pengayaan, di luar LO):
nilai.insert(1, 70)     # sisip 70 di indeks 1, sekat lain bergeser
print("Insert:", nilai) # [85, 70, 92, 88, 95]

# ============================================================
# BAGIAN 5 — loop di atas list & pola wadah (slide 09)
# ============================================================
# for angka in nilai: Python antre tiap isi — TANPA indeks.

nilai = [85, 70, 92]
for angka in nilai:
    print("Nilai:", angka)   # Nilai: 85 → Nilai: 70 → Nilai: 92

# POLA WADAH — mirror pola akumulasi Sesi 09. Tiga posisi wajib:
rekap = []                      # 1) wadah kosong, SEBELUM loop
for i in range(3):
    rekap.append(i * 10)        # 2) diisi DI DALAM loop
print("Rekap:", rekap)          # 3) diolah DI LUAR loop → [0, 10, 20]

# Dua jalan sah untuk loop list (dua-duanya benar):
# for angka in nilai:               <- lebih enak dibaca
# for i in range(len(nilai)):       <- kalau butuh nomor baris

# ============================================================
# BAGIAN 6 — Tugas 2: rekap n nilai → rata-rata (slide 10)
# ============================================================
# TUGAS PENILAIAN sesi ini. Hilangkan tanda # di bawah untuk mencoba
# versi interaktifnya (program akan minta input dari kamu):

# rekap = []
# n = int(input("Mau rekap berapa nilai? "))
# for i in range(n):
#     skor = int(input(f"Nilai ke-{i + 1}: "))
#     rekap.append(skor)
# print("Semua nilai:", rekap)
# rata = sum(rekap) / len(rekap)
# print("Rata-rata:", rata)
# Contoh jalannya (n = 3, isi 85, 70, 92):
#   Semua nilai: [85, 70, 92]
#   Rata-rata: 82.33333333333333

# Versi non-interaktif (jalan langsung) — datanya hardcode:
rekap = [85, 70, 92]
print("Semua nilai:", rekap)            # Semua nilai: [85, 70, 92]
rata = sum(rekap) / len(rekap)
print("Rata-rata:", rata)               # Rata-rata: 82.33333333333333

# Status tiap nilai — kondisi dari Sesi 07 duduk di atas list:
for angka in rekap:
    if angka >= 75:
        print(angka, "Lulus")           # 85 Lulus → 92 Lulus
    else:
        print(angka, "Remedial")        # 70 Remedial

# JEBAKAN (slide 13) — JANGAN di-run, baca dulu:
# rata = sum(rekap) * len(rekap)  # salah rumus! hasilnya bukan rata-rata
# Rumus yang benar: sum / len. Uji dengan data kecil yang bisa
# dihitung manual: [80, 90] harus 85.0.

# ============================================================
# BAGIAN 7 — Challenge: daftar teman (slide 11-12)
# ============================================================
# Misi A — absensi otomatis bernomor:

teman = ["Budi", "Ani", "Cici", "Dodi"]
nomor = 1
for nama in teman:
    print(nomor, nama)      # 1 Budi → 2 Ani → 3 Cici → 4 Dodi
    nomor += 1              # maju tiap putaran

# Misi B — hapus nama dengan aman: CEK DULU, BARU HAPUS.
# remove() nilai yang tidak ada → ValueError (lihat BAGIAN 8).

cari = "Ani"
if cari in teman:
    teman.remove(cari)
    print("List sekarang:", teman)   # List sekarang: ['Budi', 'Cici', 'Dodi']
else:
    print(cari, "tidak ada")

# Misi B versi interaktif — hilangkan # untuk mencoba:
# cari = input("Cari nama siapa? ")
# if cari in teman:
#     teman.remove(cari)
#     print("List sekarang:", teman)
# else:
#     print(cari, "tidak ada di daftar")

# Bonus (yang cepat selesai): hitung nama berawalan "C"
jumlah_c = 0
for nama in teman:
    if nama[0] == "C":      # huruf pertama nama — intip Sesi 13!
        jumlah_c += 1
print("Berawalan C:", jumlah_c)     # Berawalan C: 1 (Cici)

# ============================================================
# BAGIAN 8 — jebakan IndexError & ValueError (slide 13)
# ============================================================
# Ketiga jebakan ini TIDAK di-run — baca, pahami, lalu cegah.

# JEBAKAN 1 — IndexError: list index out of range
# nilai = [85, 92, 78, 88]
# print(nilai[4])      # IndexError! indeksnya cuma 0-3.
# Kamu menanya loker nomor 5 padahal cuma ada 4.
# Obat: indeks terakhir = len(nilai) - 1, dan biasakan cek len()
# sebelum akses indeks hasil hitungan.

# JEBAKAN 2 — ValueError: remove yang tidak ada
# nilai = [85, 92, 78]
# nilai.remove(99)     # ValueError: 99 not in list
# Membuang barang yang tidak ada di keranjang.
# Obat: pola "cek dulu baru hapus" → if 99 in nilai: baru remove.

# JEBAKAN 3 — rata-rata nol / ZeroDivisionError
# rekap = []
# for i in range(3):
#     skor = int(input("nilai: "))   # skor tidak pernah di-append!
# print(sum(rekap) / len(rekap))     # ZeroDivisionError — rekap kosong
# Obat: cek tiga posisi wajib pola wadah — rekap = [] di luar,
# append di dalam, sum/len di luar. Kalau rekap = [] ditulis
# DI DALAM loop, isinya ter-reset terus.

# ============================================================
# Case kumulatif — rekap pola nilai (bekal Sesi 12: Functions)
# ============================================================
# Rata-rata hari ini ditulis sekali jalan. Minggu depan kamu
# membungkusnya jadi mesin yang tinggal dipanggil:
#   def rata_rata(daftar): return sum(daftar) / len(daftar)

rekap = [70, 80, 90]
for nilai_ in rekap:
    bintang = "*" * (nilai_ // 10 - 6)   # 70→1, 80→2, 90→3 bintang
    print("Nilai", nilai_, ":", bintang)
print("Rata-rata:", sum(rekap) / len(rekap))   # Rata-rata: 80.0
