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

Postingan populer dari blog ini

OTDR ( Optical Time Domain Reflectometer ) by Kelvin Terrence (X TJKT)

Tugas Coding Pertama (Semester 2) Kelvin Terrence XI TJKT