Menguasai Pemrograman Desktop: Kumpulan Soal Ujian Akhir Semester (UAS) Kelas XI Semester 2 Beserta Pembahasan Mendalam

Pemrograman desktop menjadi salah satu pondasi penting bagi siswa SMK, khususnya di kelas XI semester 2. Pada jenjang ini, materi yang diajarkan seringkali berfokus pada pengembangan aplikasi yang lebih kompleks, memanfaatkan fitur-fitur antarmuka pengguna (UI) yang kaya, pengelolaan basis data, hingga konsep-konsep pemrograman berorientasi objek (OOP) yang lebih mendalam. Ujian Akhir Semester (UAS) menjadi tolok ukur sejauh mana pemahaman dan keterampilan siswa dalam mengimplementasikan pengetahuan tersebut.

Artikel ini hadir untuk membantu para siswa kelas XI semester 2 dalam mempersiapkan diri menghadapi UAS Pemrograman Desktop. Kami akan menyajikan kumpulan contoh soal yang mencakup berbagai aspek penting, mulai dari konsep dasar hingga studi kasus penerapan. Selain itu, setiap soal akan disertai dengan pembahasan mendalam untuk membantu Anda memahami logika di baliknya, solusi yang mungkin, dan tips-tips penting yang perlu diperhatikan.

Mari kita selami lebih dalam materi-materi yang seringkali diujikan dan bagaimana menguasainya.

Bagian 1: Konsep Dasar dan Komponen Antarmuka Pengguna (UI)

Pada semester 2, pemahaman tentang komponen-komponen UI dan bagaimana memanipulasinya secara efektif sangat krusial. Soal-soal di bagian ini akan menguji kemampuan Anda dalam memilih dan menggunakan kontrol yang tepat untuk membangun antarmuka yang intuitif.

Menguasai Pemrograman Desktop: Kumpulan Soal Ujian Akhir Semester (UAS) Kelas XI Semester 2 Beserta Pembahasan Mendalam

Contoh Soal 1:

Anda diminta untuk membuat sebuah formulir pendaftaran sederhana. Formulir ini memerlukan input nama lengkap, alamat email, dan pilihan jenis kelamin. Kontrol antarmuka apa saja yang paling tepat Anda gunakan untuk setiap elemen input tersebut? Jelaskan alasan pemilihan Anda.

Pembahasan Soal 1:

Untuk input nama lengkap, TextBox (atau EditText di beberapa platform) adalah pilihan yang paling tepat. Kontrol ini memungkinkan pengguna memasukkan teks secara bebas.

Untuk input alamat email, TextBox juga merupakan pilihan utama. Namun, dalam pengembangan aplikasi yang lebih canggih, seringkali ditambahkan validasi di sisi klien atau server untuk memastikan format email yang dimasukkan sudah benar.

Untuk pilihan jenis kelamin, ada beberapa opsi yang bisa dipertimbangkan:

  1. RadioButtons: Jika hanya ada dua pilihan yang eksklusif (misalnya, "Laki-laki" dan "Perempuan"), RadioButtons adalah solusi yang sangat baik. Pengguna hanya bisa memilih salah satu.
  2. ComboBox (atau Dropdown List): Jika ada lebih dari dua pilihan, atau jika Anda ingin menghemat ruang di antarmuka, ComboBox sangat berguna. Pengguna dapat mengklik untuk membuka daftar pilihan dan memilih salah satunya.
  3. CheckBoxes: CheckBoxes digunakan untuk pilihan yang tidak eksklusif, di mana pengguna bisa memilih satu, beberapa, atau bahkan tidak sama sekali. Ini tidak cocok untuk jenis kelamin tunggal.

Alasan Pemilihan:

  • TextBox: Fleksibel untuk input teks bebas.
  • RadioButtons: Ideal untuk pilihan tunggal dari sekumpulan opsi yang terbatas dan saling eksklusif.
  • ComboBox: Efisien untuk menampilkan daftar pilihan yang lebih panjang atau untuk menghemat ruang antarmuka.

Tips: Selalu pertimbangkan interaksi pengguna. Pilihlah kontrol yang paling intuitif dan meminimalkan kemungkinan kesalahan input.

Contoh Soal 2:

Dalam sebuah aplikasi kasir, Anda perlu menampilkan daftar produk yang tersedia beserta harganya. Pengguna harus dapat memilih produk yang ingin dibeli dan melihat total harga. Kontrol antarmuka apa yang paling sesuai untuk menampilkan daftar produk dan bagaimana Anda dapat mengimplementasikan fungsionalitas pemilihan dan perhitungan total?

Pembahasan Soal 2:

Untuk menampilkan daftar produk beserta harganya, ListView atau DataGridView (tergantung pada framework yang digunakan, seperti WinForms atau WPF di .NET) adalah pilihan yang paling tepat. Kontrol ini dapat menampilkan data dalam bentuk baris dan kolom, yang sangat cocok untuk menampilkan daftar item dengan informasi terkait.

Implementasi Fungsionalitas Pemilihan dan Perhitungan Total:

  1. Menampilkan Data: Isi ListView atau DataGridView dengan data produk yang diambil dari database atau sumber data lainnya. Setiap baris akan merepresentasikan satu produk, dengan kolom untuk nama produk, harga, dan mungkin stok.
  2. Mekanisme Pemilihan:
    • ListView/DataGridView: Kontrol ini biasanya memiliki properti untuk memungkinkan pemilihan baris. Anda bisa mengaktifkan SelectionMode ke Single atau Multiple sesuai kebutuhan.
    • Tombol "Tambah ke Keranjang": Seringkali, ada tombol terpisah di sebelah setiap produk atau di bawah daftar produk. Ketika tombol ini diklik, item yang dipilih dari daftar akan ditambahkan ke daftar "pesanan" atau "keranjang belanja".
  3. Menyimpan Pesanan: Anda memerlukan sebuah struktur data (misalnya, List<OrderItem>) untuk menyimpan produk yang dipilih oleh pengguna. Setiap OrderItem bisa menyimpan informasi tentang produk (ID, nama, harga) dan kuantitas.
  4. Menampilkan Keranjang Belanja: Gunakan ListView atau DataGridView lain untuk menampilkan item-item yang ada di keranjang belanja, beserta kuantitas dan subtotal per item.
  5. Perhitungan Total Harga: Buat sebuah variabel totalHarga (misalnya, tipe decimal). Ketika sebuah item ditambahkan ke keranjang atau kuantitasnya diubah, perbarui totalHarga dengan menambahkan harga item dikalikan kuantitasnya. Tampilkan totalHarga ini pada sebuah Label atau TextBox yang bersifat read-only.

Tips: Gunakan event handler (misalnya, CellClick atau SelectedIndexChanged) pada ListView/DataGridView untuk mendeteksi kapan pengguna memilih sebuah produk dan memicu aksi selanjutnya.

Bagian 2: Pemrograman Berorientasi Objek (OOP) dan Struktur Data

Konsep OOP seperti enkapsulasi, pewarisan, dan polimorfisme, serta penggunaan struktur data yang tepat, menjadi fokus utama pada semester ini. Soal-soal di bagian ini akan menguji kemampuan Anda dalam merancang dan mengimplementasikan kode yang modular, reusable, dan efisien.

Contoh Soal 3:

Buatlah sebuah kelas Buku dengan atribut judul (string), penulis (string), dan tahunTerbit (int). Kelas ini harus memiliki metode tampilkanInfo() yang akan mencetak informasi lengkap buku ke konsol. Selanjutnya, buatlah sebuah kelas turunan BukuFiksi yang mewarisi dari kelas Buku dan menambahkan atribut genre (string). Kelas BukuFiksi juga harus meng-override metode tampilkanInfo() untuk menyertakan informasi genre. Tuliskan kode programnya dalam bahasa C# (atau bahasa pemrograman desktop pilihan Anda).

Pembahasan Soal 3:

Ini adalah contoh klasik penerapan konsep pewarisan (inheritance) dan polimorfisme (melalui overriding).

using System;

// Kelas Induk
public class Buku

    public string judul;
    public string penulis;
    public int tahunTerbit;

    public Buku(string judul, string penulis, int tahunTerbit)
    
        this.judul = judul;
        this.penulis = penulis;
        this.tahunTerbit = tahunTerbit;
    

    // Metode virtual agar bisa di-override oleh kelas turunan
    public virtual void tampilkanInfo()
    
        Console.WriteLine($" judul");
        Console.WriteLine($"Penulis: penulis");
        Console.WriteLine($"Tahun Terbit: tahunTerbit");
    


// Kelas Turunan
public class BukuFiksi : Buku

    public string genre;

    // Konstruktor kelas turunan memanggil konstruktor kelas induk
    public BukuFiksi(string judul, string penulis, int tahunTerbit, string genre)
        : base(judul, penulis, tahunTerbit) // Memanggil konstruktor kelas induk
    
        this.genre = genre;
    

    // Meng-override metode tampilkanInfo dari kelas induk
    public override void tampilkanInfo()
    
        base.tampilkanInfo(); // Memanggil metode tampilkanInfo dari kelas induk terlebih dahulu
        Console.WriteLine($"Genre: genre");
    


public class Program

    public static void Main(string args)
    
        // Membuat objek dari kelas Buku
        Buku bukuNonFiksi = new Buku("Ensiklopedia", "Tim Penulis", 2020);
        Console.WriteLine("--- Informasi Buku Non-Fiksi ---");
        bukuNonFiksi.tampilkanInfo();
        Console.WriteLine();

        // Membuat objek dari kelas BukuFiksi
        BukuFiksi bukuFantasi = new BukuFiksi("Harry Potter", "J.K. Rowling", 1997, "Fantasi");
        Console.WriteLine("--- Informasi Buku Fiksi ---");
        bukuFantasi.tampilkanInfo();
        Console.WriteLine();

        // Contoh penggunaan polimorfisme:
        // Objek dari kelas turunan dapat disimpan dalam variabel tipe kelas induk
        Buku bukuReferensi = bukuFantasi;
        Console.WriteLine("--- Informasi Buku melalui Referensi Kelas Induk ---");
        bukuReferensi.tampilkanInfo(); // Tetap memanggil metode override dari kelas turunan
    

Penjelasan Kode:

  • Kelas Buku: Memiliki properti judul, penulis, tahunTerbit. Metode tampilkanInfo() ditandai sebagai virtual agar kelas turunan dapat mengubah perilakunya.
  • Kelas BukuFiksi: Mewarisi dari Buku menggunakan : Buku. Konstruktornya menggunakan : base(...) untuk memanggil konstruktor kelas induk, memastikan properti dari kelas induk terinisialisasi. Metode tampilkanInfo() di-override menggunakan override untuk menambahkan informasi genre. base.tampilkanInfo() digunakan untuk memanggil implementasi metode dari kelas induk terlebih dahulu.
  • Main Method: Mendemonstrasikan pembuatan objek dari kedua kelas dan pemanggilan metode tampilkanInfo(). Bagian polimorfisme menunjukkan bagaimana objek BukuFiksi dapat diperlakukan sebagai objek Buku, namun tetap menjalankan metode yang di-override.

Tips: Pahami perbedaan antara virtual, override, dan new dalam konteks pewarisan. Gunakan virtual pada metode kelas induk yang ingin Anda izinkan untuk diubah oleh kelas turunan, dan override pada kelas turunan untuk melakukan perubahan tersebut.

Contoh Soal 4:

Anda sedang mengembangkan aplikasi manajemen inventaris. Anda perlu menyimpan daftar produk dengan nama, kode produk, dan stok. Gunakan struktur data yang tepat untuk menyimpan koleksi produk ini agar pencarian produk berdasarkan kode produk menjadi efisien. Jelaskan mengapa Anda memilih struktur data tersebut.

Pembahasan Soal 4:

Untuk menyimpan koleksi produk dan memungkinkan pencarian yang efisien berdasarkan kode produk, struktur data yang paling direkomendasikan adalah Dictionary (Kamus) atau HashTable.

Alasan Pemilihan:

  • Efisiensi Pencarian: Dictionary menyimpan pasangan kunci-nilai (key-value pairs). Dalam kasus ini, kode produk akan menjadi kunci (key) dan objek produk (misalnya, sebuah kelas Produk yang memiliki atribut nama, kode, dan stok) akan menjadi nilai (value). Keunggulan utama Dictionary adalah pencarian elemen berdasarkan kuncinya memiliki kompleksitas waktu rata-rata O(1) (konstan). Ini berarti, seberapa banyak pun data produk yang Anda miliki, waktu yang dibutuhkan untuk mencari satu produk berdasarkan kodenya akan tetap sama.
  • Unik Kunci: Kunci dalam Dictionary harus unik. Ini sangat cocok untuk kode produk yang seharusnya unik untuk setiap produk dalam inventaris.
  • Penambahan dan Penghapusan Efisien: Penambahan dan penghapusan elemen dalam Dictionary juga memiliki kompleksitas waktu rata-rata O(1).

Alternatif yang Kurang Efisien:

  • List/Array: Jika Anda menggunakan List<Produk> atau array, pencarian produk berdasarkan kode produk akan memerlukan iterasi melalui setiap elemen (linear search), yang memiliki kompleksitas waktu O(n), di mana n adalah jumlah produk. Semakin banyak produk, semakin lambat pencariannya.

Implementasi Sederhana (dalam C#):

using System;
using System.Collections.Generic;

public class Produk

    public string KodeProduk  get; set; 
    public string NamaProduk  get; set; 
    public int Stok  get; set; 

    public Produk(string kode, string nama, int stok)
    
        KodeProduk = kode;
        NamaProduk = nama;
        Stok = stok;
    

    public void TampilkanDetail()
    
        Console.WriteLine($"Kode: KodeProduk, Nama: NamaProduk, Stok: Stok");
    


public class Inventaris

    // Menggunakan Dictionary<string, Produk> di mana string adalah KodeProduk
    private Dictionary<string, Produk> daftarProduk = new Dictionary<string, Produk>();

    public void TambahProduk(Produk produk)
    
        if (!daftarProduk.ContainsKey(produk.KodeProduk))
        
            daftarProduk.Add(produk.KodeProduk, produk);
            Console.WriteLine($"Produk 'produk.NamaProduk' berhasil ditambahkan.");
        
        else
        
            Console.WriteLine($"Produk dengan kode 'produk.KodeProduk' sudah ada.");
        
    

    public Produk CariProduk(string kodeProduk)
    
        if (daftarProduk.TryGetValue(kodeProduk, out Produk produk))
        
            return produk; // Produk ditemukan
        
        else
        
            return null; // Produk tidak ditemukan
        
    

    public void TampilkanSemuaProduk()
    
        Console.WriteLine("n--- Daftar Semua Produk ---");
        if (daftarProduk.Count == 0)
        
            Console.WriteLine("Inventaris kosong.");
            return;
        
        foreach (var kvp in daftarProduk)
        
            kvp.Value.TampilkanDetail();
        
    


public class Program

    public static void Main(string args)
    
        Inventaris inventaris = new Inventaris();

        Produk p1 = new Produk("P001", "Laptop", 50);
        Produk p2 = new Produk("P002", "Mouse", 200);
        Produk p3 = new Produk("P003", "Keyboard", 150);

        inventaris.TambahProduk(p1);
        inventaris.TambahProduk(p2);
        inventaris.TambahProduk(p3);
        inventaris.TambahProduk(p1); // Mencoba menambahkan duplikat

        inventaris.TampilkanSemuaProduk();

        string kodeCari = "P002";
        Produk ditemukan = inventaris.CariProduk(kodeCari);
        if (ditemukan != null)
        
            Console.WriteLine($"nProduk ditemukan dengan kode kodeCari:");
            ditemukan.TampilkanDetail();
        
        else
        
            Console.WriteLine($"nProduk dengan kode kodeCari tidak ditemukan.");
        

        kodeCari = "P999";
        ditemukan = inventaris.CariProduk(kodeCari);
        if (ditemukan != null)
        
            Console.WriteLine($"nProduk ditemukan dengan kode kodeCari:");
            ditemukan.TampilkanDetail();
        
        else
        
            Console.WriteLine($"nProduk dengan kode kodeCari tidak ditemukan.");
        
    

Tips: Memilih struktur data yang tepat adalah kunci untuk membuat aplikasi yang efisien. Pikirkan operasi apa yang paling sering dilakukan (menambah, menghapus, mencari) dan pilih struktur data yang mengoptimalkan operasi tersebut.

Bagian 3: Interaksi dengan Basis Data

Pengembangan aplikasi desktop seringkali melibatkan penyimpanan dan pengambilan data dari basis data. Soal-soal di bagian ini akan menguji pemahaman Anda tentang cara menghubungkan aplikasi ke database, melakukan operasi CRUD (Create, Read, Update, Delete), dan mengelola koneksi.

Contoh Soal 5:

Anda diminta untuk membuat fitur dalam aplikasi manajemen pelanggan yang memungkinkan penambahan data pelanggan baru. Data pelanggan yang perlu disimpan meliputi IDPelanggan (otomatis tergenerate), Nama (string), Alamat (string), dan NomorTelepon (string). Asumsikan Anda menggunakan database SQL Server dan tabel bernama Pelanggan dengan kolom yang sesuai. Tuliskan kode C# untuk menambahkan data pelanggan baru ke dalam tabel tersebut menggunakan ADO.NET.

Pembahasan Soal 5:

Untuk menghubungkan ke database dan melakukan operasi, kita akan menggunakan ADO.NET. Ini melibatkan pembuatan objek koneksi, perintah SQL, dan eksekusi perintah.

using System;
using System.Data;
using System.Data.SqlClient; // Namespace untuk SQL Server

public class DatabaseHelper

    private string connectionString = "Server=your_server_name;Database=your_database_name;Integrated Security=True;"; // Sesuaikan dengan pengaturan Anda

    public bool TambahPelanggan(string nama, string alamat, string nomorTelepon)
    
        using (SqlConnection connection = new SqlConnection(connectionString))
        
            try
            
                connection.Open();
                // Perintah SQL untuk INSERT data. IDPelanggan diasumsikan auto-increment.
                string query = "INSERT INTO Pelanggan (Nama, Alamat, NomorTelepon) VALUES (@Nama, @Alamat, @NomorTelepon)";

                using (SqlCommand command = new SqlCommand(query, connection))
                
                    // Menambahkan parameter untuk mencegah SQL Injection
                    command.Parameters.AddWithValue("@Nama", nama);
                    command.Parameters.AddWithValue("@Alamat", alamat);
                    command.Parameters.AddWithValue("@NomorTelepon", nomorTelepon);

                    int rowsAffected = command.ExecuteNonQuery(); // Mengembalikan jumlah baris yang terpengaruh

                    return rowsAffected > 0; // Mengembalikan true jika data berhasil ditambahkan
                
            
            catch (SqlException ex)
            
                Console.WriteLine($"Error saat menambahkan pelanggan: ex.Message");
                return false;
            
        
    

    // Anda bisa menambahkan metode lain seperti GetPelanggan, UpdatePelanggan, DeletePelanggan di sini


public class Program

    public static void Main(string args)
    
        DatabaseHelper dbHelper = new DatabaseHelper();

        // Contoh penggunaan untuk menambahkan pelanggan baru
        string namaPelanggan = "Budi Santoso";
        string alamatPelanggan = "Jl. Mawar No. 10, Jakarta";
        string noTelpPelanggan = "081234567890";

        if (dbHelper.TambahPelanggan(namaPelanggan, alamatPelanggan, noTelpPelanggan))
        
            Console.WriteLine($"Pelanggan 'namaPelanggan' berhasil ditambahkan ke database.");
        
        else
        
            Console.WriteLine($"Gagal menambahkan pelanggan 'namaPelanggan'.");
        

        // Tambahkan data pelanggan lain jika diperlukan
    

Penjelasan Kode:

  • connectionString: String ini berisi informasi untuk terhubung ke database Anda (server, nama database, autentikasi). Penting: Ganti your_server_name dan your_database_name dengan detail database Anda. Integrated Security=True; biasanya digunakan untuk autentikasi Windows. Jika menggunakan SQL Server Authentication, Anda perlu menambahkan User ID=your_username;Password=your_password;.
  • using (SqlConnection ...): Blok using memastikan bahwa koneksi database ditutup secara otomatis dan sumber daya dibebaskan, bahkan jika terjadi kesalahan.
  • connection.Open(): Membuka koneksi ke database.
  • string query = ...: Pernyataan SQL INSERT untuk menambahkan data. Penggunaan placeholder @Nama, @Alamat, @NomorTelepon sangat penting.
  • using (SqlCommand ...): Membuat objek perintah SQL.
  • command.Parameters.AddWithValue(...): Menambahkan nilai ke placeholder dalam query. Ini adalah cara yang aman untuk memasukkan data ke dalam database karena mencegah serangan SQL Injection.
  • command.ExecuteNonQuery(): Mengeksekusi perintah SQL yang tidak mengembalikan hasil (seperti INSERT, UPDATE, DELETE). Metode ini mengembalikan jumlah baris yang terpengaruh oleh perintah tersebut.
  • Penanganan Kesalahan (try-catch): Blok try-catch menangkap SqlException yang mungkin terjadi selama operasi database, seperti koneksi gagal atau kesalahan sintaks SQL.

Tips:

  • Selalu gunakan parameterized queries (dengan Parameters.AddWithValue atau metode serupa) untuk mencegah SQL Injection.
  • Pastikan connectionString Anda dikonfigurasi dengan benar.
  • Gunakan blok using untuk manajemen koneksi dan perintah agar sumber daya dikelola dengan baik.
  • Pertimbangkan untuk menggunakan ORM (Object-Relational Mapper) seperti Entity Framework untuk skenario yang lebih kompleks, meskipun ADO.NET masih fundamental untuk dipahami.

Bagian 4: Studi Kasus dan Pemecahan Masalah

Soal-soal studi kasus menguji kemampuan Anda dalam mengintegrasikan berbagai konsep yang telah dipelajari untuk menyelesaikan masalah nyata.

Contoh Soal 6 (Studi Kasus):

Anda diminta membuat sebuah aplikasi sederhana untuk manajemen tugas (To-Do List). Aplikasi ini harus memiliki fitur untuk:

  1. Menambahkan tugas baru dengan deskripsi dan batas waktu.
  2. Menampilkan daftar semua tugas.
  3. Menandai tugas sebagai "Selesai".
  4. Menghapus tugas.
  5. Menyimpan data tugas ke dalam file teks sederhana (misalnya, CSV) agar data tidak hilang saat aplikasi ditutup.

Rancangkan struktur program Anda, jelaskan komponen-komponen utama yang akan digunakan, dan berikan contoh pseudocode atau kerangka kode untuk fungsi utama.

Pembahasan Soal 6:

Ini adalah studi kasus yang mengintegrasikan UI, logika aplikasi, dan persistensi data sederhana.

Komponen Utama yang Digunakan:

  • Form/Window Utama: Akan berisi elemen UI untuk menampilkan daftar tugas dan tombol-tombol aksi.
  • TextBox: Untuk input deskripsi tugas.
  • DateTimePicker: Untuk memilih batas waktu tugas.
  • ListView atau DataGridView: Untuk menampilkan daftar tugas. Setiap baris akan menunjukkan deskripsi, batas waktu, dan status (belum selesai/selesai).
  • Tombol: "Tambah Tugas", "Tandai Selesai", "Hapus Tugas".
  • Kelas Tugas: Sebuah kelas untuk merepresentasikan satu item tugas dengan properti Deskripsi (string), BatasWaktu (DateTime), dan SudahSelesai (boolean).
  • Struktur Data: List<Tugas> untuk menyimpan koleksi tugas saat aplikasi berjalan.
  • Fungsi Input/Output File: Untuk membaca dan menulis data tugas ke/dari file teks (CSV).

Pseudocode/Kerangka Kode:

// Definisi Kelas Tugas
Class Tugas 
    String Deskripsi
    DateTime BatasWaktu
    Boolean SudahSelesai = false


// Variabel Global untuk Menyimpan Daftar Tugas
List<Tugas> daftarTugas = new List<Tugas>()

// Fungsi untuk Memuat Tugas dari File saat Aplikasi Dimulai
Function MuatTugasDariFile(namaFile) 
    Jika file namaFile ada 
        Baca setiap baris dari namaFile
        Untuk setiap baris 
            Pisahkan baris menjadi Deskripsi, BatasWaktu, SudahSelesai
            Buat objek Tugas baru
            Set properti objek Tugas
            Tambahkan objek Tugas ke daftarTugas
        
        Perbarui tampilan daftar tugas di UI
    


// Fungsi untuk Menyimpan Tugas ke File saat Aplikasi Ditutup
Function SimpanTugasKeFile(namaFile) 
    Buka file namaFile untuk ditulis
    Untuk setiap tugas dalam daftarTugas 
        Tulis Deskripsi, BatasWaktu, SudahSelesai ke baris terpisah (format CSV)
    
    Tutup file


// Event Handler untuk Tombol "Tambah Tugas"
On Click "Tambah Tugas" 
    Dapatkan Deskripsi dari TextBox
    Dapatkan BatasWaktu dari DateTimePicker
    Buat objek Tugas baru dengan Deskripsi dan BatasWaktu
    Tambahkan objek Tugas ke daftarTugas
    Perbarui tampilan daftar tugas di UI
    // Opsional: Panggil SimpanTugasKeFile() jika ingin auto-save


// Event Handler untuk Tombol "Tandai Selesai"
On Click "Tandai Selesai" 
    Dapatkan tugas yang dipilih dari ListView/DataGridView
    Ubah properti SudahSelesai tugas tersebut menjadi true
    Perbarui tampilan tugas yang dipilih di UI (misalnya, tambahkan coretan atau ubah warna)
    // Opsional: Panggil SimpanTugasKeFile()


// Event Handler untuk Tombol "Hapus Tugas"
On Click "Hapus Tugas" 
    Dapatkan tugas yang dipilih dari ListView/DataGridView
    Hapus tugas tersebut dari daftarTugas
    Hapus tugas tersebut dari tampilan UI
    // Opsional: Panggil SimpanTugasKeFile()


// Saat Aplikasi Dimulai (misalnya, di Form_Load event)
    MuatTugasDariFile("tugas.csv")

// Saat Aplikasi Ditutup (misalnya, di Form_Closing event)
    SimpanTugasKeFile("tugas.csv")

Penjelasan Tambahan:

  • Format CSV: Data akan disimpan dalam format Comma Separated Values. Contoh: Membeli bahan makanan,2023-12-31 17:00:00,False.
  • Update UI: Setelah operasi penambahan, penandaan selesai, atau penghapusan, tampilan daftar tugas di UI harus diperbarui agar mencerminkan perubahan. Ini bisa dilakukan dengan cara membersihkan dan mengisi ulang ListView/DataGridView dari daftarTugas.
  • Penanganan Kesalahan: Dalam implementasi nyata, Anda perlu menambahkan penanganan kesalahan untuk operasi file (misalnya, file tidak bisa ditulis).

Tips: Pecah masalah besar menjadi bagian-bagian kecil yang lebih mudah dikelola. Rancang struktur data dan kelas sebelum menulis kode UI. Pertimbangkan bagaimana data akan disimpan dan diambil kembali.

Penutup

Mempersiapkan diri untuk UAS Pemrograman Desktop memerlukan pemahaman yang solid tentang konsep-konsep inti, kemampuan implementasi, dan kemampuan pemecahan masalah. Contoh soal dan pembahasan yang disajikan di atas mencakup berbagai aspek penting yang sering diujikan.

Ingatlah bahwa latihan adalah kunci utama. Cobalah untuk mengimplementasikan solusi dari soal-soal ini menggunakan IDE (Integrated Development Environment) pilihan Anda. Eksplorasi lebih jauh, coba modifikasi soal, dan cari sumber belajar tambahan. Dengan persiapan yang matang, Anda akan dapat menghadapi UAS Pemrograman Desktop dengan percaya diri dan meraih hasil yang memuaskan. Selamat belajar!

Leave a Reply

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *