"""Sesi 04 — Variables & Data Types | 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 komentar di dalamnya: setiap BAGIAN sesuai urutan slide deck Sesi 04

File ini mengikuti alur deck:
  BAGIAN 1 = variabel = kotak berlabel       (slide 04)
  BAGIAN 2 = umur = umur + 1 — bukan salah ketik (slide 05)
  BAGIAN 3 = 4 tipe data utama               (slide 06)
  BAGIAN 4 = "16" vs 16 — uji kutip          (slide 07)
  BAGIAN 5 = type() — scanner tipe           (slide 08)
  BAGIAN 6 = konversi int / float / str      (slide 09)
  BAGIAN 7 = tugas 1: eksperimen tipe        (slide 10)
  BAGIAN 8 = snake_case                      (slide 11)
  BAGIAN 9 = tugas 2: kartu siswa + pembahasan (slide 12-13)
"""

# ============================================================
# BAGIAN 1 — variabel: kotak berlabel (slide 04)
# ============================================================
# Ambil kotak, tempel label, taruh isinya. Labelnya tetap,
# isinya bisa diganti kapan pun.

nama = "Kevin"
umur = 16
hobi = "Gambar"

print(nama, umur, hobi)     # Kevin 16 Gambar

umur = 17                   # isi baru, kotaknya sama
print("Tahun depan:", umur) # Tahun depan: 17

# JEBAKAN — jangan di-run dulu, baca dulu:
# 16 = umur   # SyntaxError! = artinya SIMPAN kanan -> kiri.
#             # Angka tidak punya kotak, jadi tidak bisa "diberi isi".

# ============================================================
# BAGIAN 2 — umur = umur + 1: bukan salah ketik (slide 05)
# ============================================================
# Di matematika itu mustahil. Di Python dua langkah:
# hitung kanan dulu, timpa kotak kiri belakangan.

umur = 16
umur = umur + 1             # ambil 16, tambah 1 -> 17, simpan balik
print(umur)                 # 17

# Prediksi dulu sebelum run: kalau baris umur = umur + 1 dihapus,
# berapa yang tercetak? (Jawab: 16 — kotak tidak pernah ditimpa.)

# ============================================================
# BAGIAN 3 — 4 tipe data utama (slide 06)
# ============================================================
# int = bulat · float = titik desimal · str = berkutip · bool = True/False

umur = 16            # int   - bulat, tanpa koma
tinggi = 1.65        # float - desimal pakai TITIK, bukan koma
nama = "Maria"       # str   - teks, wajib berkutip
aktif = True         # bool  - hanya True / False, kapital di awal

# Satu kalimat pembeda: ada kutip = teks, polos = angka.

# ============================================================
# BAGIAN 4 — "16" vs 16: uji kutip (slide 07)
# ============================================================
# Tebak dulu output-nya, baru Run!

a = 16
b = "16"
print(type(a))       # <class 'int'>  — angka polos
print(type(b))       # <class 'str'>  — berkutip = TEKS

print(a + a)         # 32   — angka dijumlah
print(b + b)         # 1616 — teks disambung!

# Uji kilat: 'True' dengan kutip itu bool atau str? (Run untuk membuktikan.)
print(type('True'))  # <class 'str'> — kutip mengubah segalanya

# ============================================================
# BAGIAN 5 — type(): scanner tipe (slide 08)
# ============================================================
# Scanner di pintu gudang: arahkan ke kotak mana pun,
# dia lapor isinya jenis apa. Tanya, jangan duga.

print(type(nama))    # <class 'str'>
print(type(umur))    # <class 'int'>
print(type(tinggi))  # <class 'float'>
print(type(aktif))   # <class 'bool'>

# ============================================================
# BAGIAN 6 — konversi: ubah dulu, baru hitung (slide 09)
# ============================================================
# int() / float() / str() = penerjemah antar jenis.
# Dipanggil SEBELUM operasi, bukan sesudah meledak.

umur_teks = "17"
umur = int(umur_teks)       # terjemahkan teks jadi angka
print(umur + 1)             # 18 — sekarang bisa dihitung

print(float("1.65") + 0.1)  # 1.75
print(str(100) + " poin")   # 100 poin — angka jadi teks untuk dirangkai

# JEBAKAN (slide 09 & 14) — penerjemah bukan tukang sulap:
# int("budi")   # ValueError: invalid literal for int() with base 10: 'budi'
# int("")       # ValueError juga — kosong bukan angka.
# Pesannya bahkan menunjukkan teks yang gagal diterjemahkan.

# JEBAKAN (slide 14) — campur tipe tanpa konversi:
# print("Umur: " + 16)  # TypeError! Dua obat:
#   1. print("Umur: " + str(16))
#   2. print("Umur:", 16)          # koma = jembatan

# ============================================================
# BAGIAN 7 — Tugas 1: eksperimen tipe (slide 10)
# ============================================================
# Level 1: buat 4 variabel beda tipe + tulis PREDIKSI type()-nya
#          di komentar dulu, baru Run.
# Level 2: cocokkan prediksi vs kenyataan — scanner tidak pernah bohong.
# Level 3: uji penerjemah + errornya yang disengaja.

kelas = "CSSE"           # prediksi: <class 'str'>
jajan = 10000            # prediksi: <class 'int'>
berat = 47.5             # prediksi: <class 'float'>
lulus = True             # prediksi: <class 'bool'>

print(type(kelas))       # <class 'str'>
print(type(jajan))       # <class 'int'>
print(type(berat))       # <class 'float'>
print(type(lulus))       # <class 'bool'>

# Level 3 — sengaja error (baca pesannya, jangan takut):
# int("budi")  # ValueError — teks 'budi' muncul di dalam pesan!

# ============================================================
# BAGIAN 8 — snake_case: label yang sopan (slide 11)
# ============================================================
# Huruf kecil semua + garis bawah + deskriptif. Python peka kapital:
# nama dan Nama itu dua kotak berbeda.

nama_lengkap = "Maria Ferrari"   # sahih
umur_siswa = 16                  # sahih
nilai_rata_rata = 87.5           # sahih

# JEBAKAN (slide 14) — yang ini BOOM, jangan di-run:
# nama lengkap = "Budi"   # SyntaxError — ada spasi
# 2hobi = "Gambar"        # SyntaxError — angka di depan
# print(Nama)             # NameError — kapital = kotak lain

print(nama_lengkap, umur_siswa, nilai_rata_rata)
# Maria Ferrari 16 87.5

# ============================================================
# BAGIAN 9 — Tugas 2: kartu siswa (slide 12-13)
# ============================================================
# Praktik penilaian: 4 variabel beda tipe + snake_case deskriptif
# + tampilan rapi + bukti type(). Kerangka — lengkapi sendiri dulu!

nama = "Maria"
umur = 16
tinggi = 168.5
aktif = True

print("=== KARTU SISWA ===")
print("Nama  :", nama)
print("Umur  :", umur)
print("Tinggi:", tinggi, "cm")
print("Status:", aktif)

print(type(nama))
print(type(umur))
print(type(tinggi))
print(type(aktif))

# Output harapan:
# === KARTU SISWA ===
# Nama  : Maria
# Umur  : 16
# Tinggi: 168.5 cm
# Status: True
# <class 'str'>
# <class 'int'>
# <class 'float'>
# <class 'bool'>

# ============================================================
# Case kumulatif — bekal Sesi 05 (Input & Output)
# ============================================================
# Minggu depan kartu ini diisi oleh PENGGUNA, bukan ditulis di kode.
# Intip cara kerjanya sekarang — jalankan dan jawab pertanyaannya:

nama = input("Siapa namamu? ")
print("Halo,", nama, "! Sampai jumpa di Sesi 05.")

# Contoh jalan (ketik: Budi):
# Siapa namamu? Budi
# Halo, Budi ! Sampai jumpa di Sesi 05.
# (Spasi sebelum "!" itu alat bantu print versi koma — besok diganti f-string.)
