Format Dokumen Pengajaran & Panduan Siswa
BINUS University @ Bekasi SMAS St. John Pertemuan 13 dari 17

MODUL 13 — String Manipulation

Ekstrakurikuler CSSE: Computer Science & Software Engineering (Python)

Jenjang Peserta Siswa SMA (Kelas 10–12)
Alokasi Waktu 100 Menit
Fokus Materi indexing, upper/lower, strip, replace, split/join
Target Selesai Pembersih input jalan: nama rapi (strip + title) & panjang terukur
Tools VS Code & Python (Run ▶)
Prioritas sesi: Wajib: indexing & slicing string, method upper/lower/strip/replace, split/join, f-string, cek isi dengan in/find/count, dan challenge perbaiki input user (strip + title).
Materi pengayaan (opsional jika waktu cukup)

count() untuk menghitung kemunculan huruf (main tebak frekuensi huruf nama), dan method chain seperti nama.strip().title().upper() dirangkai satu baris.

1. Tujuan Pembelajaran

  1. Mengenali string sebagai deretan karakter yang bisa di-indexing dan di-slicing seperti list.
  2. Menggunakan method upper(), lower(), dan strip() untuk mengubah bentuk huruf & membersihkan spasi tepi.
  3. Mengganti potongan teks dengan replace() dan menyimpan hasilnya ke variabel baru.
  4. Memecah kalimat jadi list dengan split() dan merekatkannya kembali dengan join().
  5. Menggabungkan string dengan f-string dan + (concatenation).
  6. Mengecek isi string dengan in, find(), dan len().
  7. Menjelaskan sifat immutable: method string mengembalikan string baru, string asli tidak berubah.
  8. Membangun program pembersih input user: hapus spasi ujung, rapikan kapitalisasi, hitung panjang.

2. Peta Jalan 17 Pertemuan

Hari ini siswa menempuh barisan ke-13 dari 17 — 76% perjalanan:

[ 01-02 ] Fondasi: konsep program, algoritma, flowchart [ 03-05 ] Mulai coding: print, variabel, input/output [ 06-07 ] Operator & percabangan if/elif/else [ 08 ] Mini Project 1: Decision Making [ 09 ] Looping / Perulangan [ 10 ] Nested Loop & Pattern Programming [ 11-13 ] List, Functions, String <-- HARI INI (100 Menit) [ 14 ] Mini Project 2: Simple App [ 15 ] AI-Assisted Coding [ 16-17 ] Final Project: Development & Presentation

3. Rundown Waktu Terperinci (100 Menit)

WaktuBlokAktivitas
10'PembukaCover, tujuan sesi, rekap Sesi 12 (def, return vs print, mesin mini)
10'DemoMemproses nama & teks: input kotor " budi " diubah jadi rapi di depan kelas
25'Materi 1String = deretan karakter: indexing & slicing; method upper/lower/strip/replace; sifat immutable
30'PraktikTeks diubah UPPER/lower, ganti kata; split & join; cek isi dengan in/find
15'ChallengePerbaiki input user: strip + title + hitung panjang (penilaian sesi ini)
10'PenutupPembahasan singkat challenge, rangkuman 5 poin, preview Sesi 14

4. Pedagogi & Penjelasan Konsep

A. Analogi Gerbong Kereta

String = rangkaian gerbong kereta. Tiap karakter satu gerbong, bernomor mulai dari 0 — persis loker list di Sesi 11. nama[0] = gerbong depan, nama[-1] = gerbong terakhir, nama[0:3] = rangkaian tiga gerbong pertama (batas stop tetap garis finis yang tidak diinjak). Keuntungan besar: kalian tidak belajar sistem baru — indexing list tinggal dipindah ke string. Bedanya cuma satu: isi gerbong adalah karakter, bukan angka.

B. Pulpen Permanen — String Itu Immutable

Ini konsep paling penting hari ini (catatan pengajar kurikulum). String itu ditulis dengan spidol permanen: begitu dibuat, isinya tidak bisa dihapus atau diganti. nama[0] = "B" langsung ditolak Python. Lalu bagaimana cara "mengubah"? Fotokopi kertasnya, koreksi di salinan, simpan salinan itu: nama = nama.upper(). Konsekuensi yang wajib dipahami: semua method string mengembalikan string baru — teks.upper() yang tidak disimpan akan hilang lenyap. Kontras dengan list (Sesi 11): nilai.append(95) mengubah list langsung, tapi nama.upper() tidak mengubah apa pun kalau hasilnya dibuang.

Catatan pengajar: jebakan klasik hari ini adalah nama.upper() yang dicetak sendirian lalu siswa bertanya "kok nggak berubah?". Jangan jawab langsung — minta mereka bandingkan dengan nilai.append(95) dari Sesi 11: append mengubah aslinya, upper tidak. Dari sini lahir kebiasaan: hasil method string selalu disimpan.

C. Gunting dan Lem — split & join

split() = gunting: kalimat dipotong di tiap spasi, hasilnya list kata — kalimat kini jadi benda yang bisa diloop, dihitung, diurutkan (alat Sesi 11 semua jalan). join() = lem: list kata direkatkan kembali jadi satu kalimat dengan lem pilihanmu ("-", " ", ", "). Berdua mereka jembatan dua arah antara string dan list. Pola sehari-hari yang realistis: nama lengkap "Budi Santoso" di-split jadi ["Budi", "Santoso"] — dari situ bisa diambil inisial, dihitung jumlah katanya, atau disusun ulang.

D. Error Itu Alarm, Bukan Aib

TypeError saat nama[0] = "B" = alarm spidol permanen: "ini tidak bisa diganti, fotokopi saja". AttributeError saat nama.append(...) = alarm salah alat: string bukan list — kalau butuh list, gunting dulu dengan split(). Dan find() yang mengembalikan -1 bukan error — itu cara Python bilang "tidak ketemu" (kayak nomor loker yang memang tidak ada isinya). Semua alarm hari ini mengarah ke satu pemahaman: string dan list adalah benda berbeda dengan aturan berbeda.

Catatan pengajar: siswa sering lupa bahwa input() apa adanya mengandung spasi tak terlihat. Demo kecil yang kuat: print(len(input())) lalu ketik nama diikuti spasi — panjangnya lebih besar dari dugaan. Dari situ strip() terasa kebutuhan, bukan hafalan.

5. Panduan Praktik Langkah demi Langkah

Langkah 1: Pemanasan — String Itu Deretan (10 menit)

Minta siswa menulis dan menjalankan (dasar kode.py):

teks = "  Python itu seru  "
bersih = teks.strip()
print(bersih)        # Python itu seru - spasi tepi hilang
print(bersih[0])     # P - karakter pertama
print(bersih[0:6])   # Python - slicing, batas stop tidak ikut
print(bersih[-4:])   # seru - empat karakter terakhir
print(len(bersih))   # 15

Diskusikan: kenapa perlu strip() dulu sebelum ambil [0]? Kalau tidak, teks[0] = spasi — karakter tak terlihat yang sering bikin bingung.

Langkah 2: Bersihkan & Ubah Huruf (15 menit)

print(bersih.upper())    # PYTHON ITU SERU
print(bersih.lower())    # python itu seru
print(bersih.replace("seru", "menyenangkan"))
print(bersih)            # Python itu seru - ASLINYA TIDAK BERUBAH

Moment kunci: baris terakhir. Setelah tiga method di atasnya, bersih masih asli. Minta siswa buktikan sendiri, lalu simpan hasilnya: baru = bersih.replace("seru", "menyenangkan") — baru terpakai. Ini penemuan immutable yang harus terjadi di tangan mereka, bukan dari ceramah.

Langkah 3: Gunting & Lem (15 menit)

kata = bersih.split()
print(kata)              # ['Python', 'itu', 'seru']
print(kata[0])           # Python
print("-".join(kata))    # Python-itu-seru
print(" ".join(kata))    # Python itu seru - kembali seperti semula

Tantangan cepat: hitung berapa kata dalam kalimat (len(kata)), lalu cetak tiap kata satu per satu dengan loop — gunting dulu, sisanya alat Sesi 11. Lanjut cek isi: "Python" in teks, teks.find("itu"), teks.count("t").

Langkah 4: Demo Bersama — Input Kotor (15 menit)

Tulis bersama-sama program kecil di depan kelas:

nama_kotor = input("Masukkan nama: ")   # diketik: "   budi sanTOso   "
nama_rapi = nama_kotor.strip().title()
print("Halo,", nama_rapi)                # Halo, Budi Santoso

Tunjukkan efek tanpa strip(): " budi" dan "budi" dianggap string berbeda saat dibandingkan. Ini fondasi challenge.

Langkah 5: Challenge — Perbaiki Input User (20 menit)

Program penilaian sesi ini: membersihkan nama user. Ketikan user acak — spasi berlebih, huruf kapital kacau. Output yang diharapkan:

Masukkan nama:    budi sanTOso
Nama rapi  : Budi Santoso
Panjang    : 12
Huruf kecil: budi santoso
Awalan 'b'? True

Yakni: strip().title() untuk kebersihan, len() untuk panjang, lower() untuk versi kecil, startswith("b") atau nama_rapi[0].lower() == "b" untuk cek awalan. Tambahan untuk yang cepat: proses tiga nama dalam list pakai loop (jembatan ke kode.py bagian kumulatif).

Langkah 6: Pembahasan & Penutup (10 menit)

Bedah solusi challenge: minta satu siswa membacakan chain method-nya dan menjelaskan kenapa urutan strip() dulu baru title() penting. Tutup dengan rangkuman 5 poin + preview Sesi 14.

6. Master Solution Code (kode.py — Sesi 13)

Kode lengkap per bagian ada di kode.py. Berikut solusi utuh mandiri yang bisa dijalankan (dasar kode.py + challenge penilaian), dengan output harapan di komentar:

# ============ SESI 13 - STRING MANIPULATION ============
# String = deretan karakter, immutable - hasil method selalu string BARU.

# --- BAGIAN 1: indexing & slicing (kode.py) ---
teks = "  Python itu seru  "
bersih = teks.strip()            # spasi di kedua tepi dipotong
print(bersih)                    # Python itu seru
print(bersih[0:6])               # Python
print(bersih[-4:])               # seru

# --- BAGIAN 2: ubah bentuk (hasil disimpan ke variabel baru!) ---
huruf_besar = bersih.upper()
huruf_kecil = bersih.lower()
print(huruf_besar)               # PYTHON ITU SERU
print(huruf_kecil)               # python itu seru
ganti = bersih.replace("seru", "menyenangkan")
print(ganti)                     # Python itu menyenangkan

# --- BAGIAN 3: split & join (gunting & lem) ---
kata = bersih.split()
print(kata)                      # ['Python', 'itu', 'seru']
print("-".join(kata))            # Python-itu-seru

# --- BAGIAN 4: cek isi ---
print("Python" in teks)          # True
print(bersih.find("itu"))        # 7  (posisi karakter pertama)
print(bersih.count("t"))         # 2

# --- BAGIAN 5: challenge - perbaiki input user (penilaian) ---
nama_kotor = input("Masukkan nama: ")    # contoh diketik: "   budi sanTOso  "
nama_rapi = nama_kotor.strip().title()
print("Nama rapi  :", nama_rapi)          # Budi Santoso
print("Panjang    :", len(nama_rapi))     # 12
print("Huruf kecil:", nama_rapi.lower())  # budi santoso
print("Awalan 'b'?", nama_rapi[0].lower() == "b")   # True

# --- BAGIAN 6: case kumulatif - format daftar siswa (kode.py) ---
nama = ["budi", "ani", "cici"]
for item in nama:
    label = item.strip().title()
    print(f"Siswa: {label}")
# Siswa: Budi
# Siswa: Ani
# Siswa: Cici

# --- BAGIAN 7: bukti immutable ---
print(label)                     # Cici - aslinya tetap
print(label.upper())             # CICI - hanya hasil cetakannya

Contoh jalannya bagian challenge:

Masukkan nama:    budi sanTOso
Nama rapi  : Budi Santoso
Panjang    : 12
Huruf kecil: budi santoso
Awalan 'b'? True

Kunci pembahasan: setiap hasil method disimpan ke variabel (huruf_besar, nama_rapi) karena string tidak pernah berubah sendiri; strip().title() dirangkai karena hasil kiri menjadi bahan kanan; dan bagian 7 adalah bukti visual immutable yang wajib ditunjukkan ke kelas.

7. Troubleshooting Guide (Pegangan Guru)

Masalah Penyebab Tindakan Perbaikan
nama.upper() "tidak berfungsi" — teks tetap kecil String immutable (catatan pengajar kurikulum): hasil method dibuang karena tidak disimpan ke variabel. Analogi fotokopi: nama = nama.upper() — koreksi disimpan di salinan. Cek posisi: ada tanda = atau hasilnya langsung di-print.
TypeError: 'str' object does not support item assignment Mencoba nama[0] = "B" — string tidak bisa diganti per karakter (beda dengan list). Bangun string baru: nama = "B" + nama[1:], atau pakai method (replace/title) lalu simpan hasilnya.
AttributeError: 'str' object has no attribute 'append' Memperlakukan string seperti list: nama.append("x"). Tegaskan dua benda berbeda: string bisa + (concatenation) atau join; kalau butuh list, gunting dulu dengan split().
IndexError: string index out of range Mengakses teks[50] padahal string pendek — aturan loker Sesi 11 tetap berlaku. Cek len(teks) dulu; indeks terakhir = len(teks) - 1. Perhatikan: strip() mengubah panjang, jadi hitung setelah dibersihkan.
Nama user selalu "tidak cocok" saat dibandingkan Spasi tak terlihat & kapitalisasi acak dari input() tidak dibersihkan (" budi " ≠ "budi"). Polakan ritual input: input(...).strip() minimum, .title() untuk tampilan. Demo len(input()) untuk membuktikan spasi terhitung.
split(" ") menghasilkan string kosong '' di list Dua spasi beruntun: "budi ani".split(" ") memotong di spasi kosong juga. Pakai split() tanpa argument — Python otomatis membersihkan spasi beruntun.

8. Checklist Evaluasi Siswa

9. Jembatan ke Pertemuan Berikutnya (Sesi 14)

Tiga minggu terakhir kalian mengumpulkan alat: list (keranjang data), fungsi (mesin mini), string (pembersih teks). Minggu depan semuanya dirakit jadi satu: Mini Project 2 — aplikasi berbasis menu yang beneran dipakai: Todo List atau Kasir Warung Mini. Program dengan menu yang terus menyala, menerima perintah, dan datanya hidup selama aplikasi jalan.

while True:
    print("1. Lihat  2. Tambah  3. Hapus  4. Keluar")
    pilih = input("Pilih menu: ").strip()
    if pilih == "4":
        print("Sampai jumpa!")
        break

Pola menu sederhana ini adalah kerangka Mini Project 2 minggu depan — dan pemanasan langsung untuk Final Project (Sesi 16-17). Simpan baik-baik list, fungsi, dan kebiasaan strip() kalian.