Praktik halaman 53-59
# CLASS (Blueprint untuk membuat objek)
class Siswa:
# VARIABEL INSTANSI (atribut yang spesifik untuk setiap objek)
def __init__(self, nis, nama, kelas) :
self.nis = nis # Variabel instansi
self.nama = nama # Variabel instansi
self.kelas = kelas # Variabel instansi
self.nilai = { # ENCAPSULATION (data dibungkus dalam objek
'Matematika': 0,
'Bahasa Indonesia': 0,
'Bahasa Inggris': 0, # Menambahkan nilai yang hilang di sini
'IPA': 0,
'IPS': 0
}
# METODE INSTANSI (operasi pada objek tertentu)
def input_nilai(self): # Metode instansi
print(f"\ninput nilai untuk siswa {self.nama}")
for mata_pelajaran in self.nilai:
while True:
try:
nilai = float(input(f"{mata_pelajaran}: "))
if 0 <= nilai <= 100:
self.nilai[mata_pelajaran] = nilai # ENCAPSULATION (akses data terproteksi
break
else:
print("Nilai harus berada di antara 0-100")
except ValueError:
print("Input harus berupa angka")
# METODE INSTANSI
def hitung_rata_rata(self): # ABSTRAKSI (sembunyikan detail perhitungan)
total = sum(self.nilai.values())
return total / len(self.nilai)
# CLASS
class Kelas:
# VARIABEL KELAS (seharusnya didefinisikan disini jika ada)
# (tidak ada variabel kelas dalam contoh ini)
def __init__(self, nama_kelas):
self.nama_kelas = nama_kelas # VARIABEL INSTANSI
self.daftar_siswa = [] # VARIABEL INSTANSI
# METODE INSTANSI
def tambah_siswa(self, siswa): # POLYMORPHISM (bisa menerima berbagai jenis objek siswa)
self.daftar_siswa.append(siswa) # OBJECT (siswa adalah objek)
# METODE INSTANSI
def input_data_siswa(self):
print(f"\nInput data siswa kelas {self.nama_kelas}:")
while True:
nis = input("\nNIS (atau 'selesai' untuk mengakhiri):")
if nis.lower() == 'selesai':
break
# These lines should be outside the 'if selesai' block
nama = input("Nama: ")
# OBJECT (pembuatan objek Siswa)
siswa = Siswa(nis, nama, self.nama_kelas) # Instansiasi objek
siswa.input_nilai() # METODE INSTANSI
self.tambah_siswa(siswa) # Menambahkan objek ke list
# METODE INSTANSI (Moved inside Kelas class)
def urutkan_peringkat(self): # Added 'self' parameter
# POLYMORPHISM (lambda sebagai parameter)
self.daftar_siswa.sort(key=lambda x: x.hitung_rata_rata(), reverse=True)
# Metode INSTANSI (Moved inside Kelas class)
def tampilkan_peringkat(self): # ABSTRAKSI (sembunyikan detail sorting)
if not self.daftar_siswa: # Add check for empty list
print(f"Tidak ada siswa untuk ditampilkan di kelas {self.nama_kelas}.")
return
self.urutkan_peringkat()
print(f"\n=== DAFTAR PERINGKAT KELAS {self.nama_kelas.upper()} ===")
print("="*50)
print("No. | Nama | Rerata Nilai | Peringkat")
print("="*50)
for idx, siswa in enumerate(self.daftar_siswa, start=1):
rata_rata = siswa.hitung_rata_rata() # METODE INSTANSI
print(
f"{idx:3d} | {siswa.nama:15} | "
f"{rata_rata:12.2f} | {idx}" # f-string for float formatting
)
def main():
print("=== APLIKASI PERINGKAT KELAS ===")
nama_kelas = input("Masukkan nama kelas: ")
# OBJECT (pembuatan objek kelas)
kelas = Kelas(nama_kelas) # Instansiasi objek
kelas.input_data_siswa() # METODE INSTANSI
if kelas.daftar_siswa:
kelas.tampilkan_peringkat() # METODE INSTANSI
with open(f"peringkat_{nama_kelas}.txt", "w") as f:
f.write(f"=== DAFTAR PERINGKAT KELAS {nama_kelas.upper()} ===\n")
f.write("="*50 + "\n")
f.write("No. | Nama | Rerata Nilai | Peringkat\n")
f.write("="*50 + "\n")
for idx, siswa in enumerate(kelas.daftar_siswa, start=1):
rata_rata = siswa.hitung_rata_rata() # METODE INSTANSI
f.write(
f"{idx:3d} | {siswa.nama:15} | "
f"{rata_rata:12.2f} | {idx}\n" # f-string for float formatting
)
print(f"\nData telah disimpan ke file 'peringkat_{nama_kelas}.txt'")
else:
print("Tidak ada data siswa yang dimasukkan.")
if __name__ == "__main__":
main()
Komentar
Posting Komentar