Menu
CoddyTech

Platform E-Learning

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 105 dari 107.

challenge icon

Tantangan

Mudah

Mari bangun Platform E-Learning yang mengelola kursus, siswa, dan melacak progres belajar! Kamu akan menggabungkan struct, interface, composition, dan polymorphism untuk membuat sistem terpadu tempat siswa dapat mendaftar ke kursus dan menyelesaikan pelajaran.

Kamu akan mengatur kodemu dalam lima file:

  • lesson.go: Definisikan struct Lesson yang merepresentasikan unit pembelajaran individual. Setiap pelajaran memiliki ID, Title, dan Duration (dalam menit). Sertakan konstruktor NewLesson yang mengembalikan pointer ke Lesson.
  • course.go: Buat struct Course yang memiliki ID, Title, Instructor, dan slice berisi pointer *Lesson. Sertakan konstruktor NewCourse dan method AddLesson. Implementasikan juga method TotalDuration() int yang mengembalikan jumlah durasi semua pelajaran dalam kursus.
  • student.go: Definisikan struct Student dengan field ID, Name, dan Email. Sertakan konstruktor NewStudent.
  • enrollment.go: Di sinilah keajaiban pelacakan progres terjadi. Buat struct Enrollment yang menghubungkan siswa dengan kursus dan melacak pelajaran yang telah diselesaikan. Struct ini harus memiliki:
    • Pointer ke Student
    • Pointer ke Course
    • Map CompletedLessons (ID pelajaran ke boolean)

    Definisikan interface Progressable dengan method Progress() float64 yang mengembalikan persentase (0.0 hingga 100.0).

    Implementasikan method berikut pada Enrollment:

    • NewEnrollment(student *Student, course *Course) *Enrollment: konstruktor yang menginisialisasi map pelajaran selesai yang kosong
    • CompleteLesson(lessonID string) string: menandai pelajaran sebagai selesai. Mengembalikan lesson not found jika pelajaran tidak ada dalam kursus, already completed jika sudah selesai, atau completed jika berhasil
    • Progress() float64: mengembalikan persentase pelajaran yang selesai (selesai/total * 100), atau 0.0 jika kursus tidak memiliki pelajaran
  • main.go: Bangun platformmu dan proses operasi pendaftaran.

    Baca ID, judul, dan instruktur kursus. Lalu baca jumlah pelajaran serta ID, judul, dan durasi setiap pelajaran. Baca ID, nama, dan email siswa. Buat pendaftaran yang menghubungkan siswa dengan kursus.

    Lalu baca jumlah operasi. Setiap operasi berupa complete [lessonID] atau progress. Untuk operasi complete, cetak pesan hasilnya. Untuk operasi progress, cetak progres dengan format satu angka di belakang koma, diikuti tanda persen.

Input berikut akan diberikan:

  • ID Kursus, Judul, Instruktur (3 baris)
  • Jumlah pelajaran, lalu ID, Judul, Durasi setiap pelajaran (masing-masing 3 baris)
  • ID Siswa, Nama, Email (3 baris)
  • Jumlah operasi, lalu setiap operasi (masing-masing 1 baris)

Contohnya, jika diberikan:

C001
Go Fundamentals
Jane Smith
3
L001
Variables
30
L002
Functions
45
L003
Structs
60
S001
Alice
alice@learn.com
5
progress
complete L001
progress
complete L001
complete L002

Outputmu seharusnya:

0.0%
completed
33.3%
already completed
completed

Dan jika diberikan:

C100
Python Basics
Bob Teacher
2
L100
Intro
20
L101
Loops
40
S100
Charlie
charlie@edu.com
4
complete L999
complete L100
complete L101
progress

Outputmu seharusnya:

lesson not found
completed
completed
100.0%

Perhatikan bagaimana struct Enrollment menggunakan composition untuk menghubungkan siswa dan kursus, sementara interface Progressable memungkinkan tipe apa pun melaporkan status penyelesaiannya. Desain ini mudah dikembangkan. Kamu dapat menambahkan pelacakan progres pada pelajaran individual atau jalur pembelajaran secara keseluruhan menggunakan interface yang sama!

Coba sendiri

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	// Fungsi pembantu untuk membaca satu baris
	readLine := func() string {
		scanner.Scan()
		return strings.TrimSpace(scanner.Text())
	}

	// Baca informasi kursus
	courseID := readLine()
	courseTitle := readLine()
	courseInstructor := readLine()

	// TODO: Buat kursus menggunakan NewCourse
	_ = courseID
	_ = courseTitle
	_ = courseInstructor

	// Baca jumlah pelajaran
	numLessons, _ := strconv.Atoi(readLine())

	// TODO: Baca setiap pelajaran dan tambahkan ke kursus
	for i := 0; i < numLessons; i++ {
		lessonID := readLine()
		lessonTitle := readLine()
		lessonDuration, _ := strconv.Atoi(readLine())

		// TODO: Buat pelajaran dan tambahkan ke kursus
		_ = lessonID
		_ = lessonTitle
		_ = lessonDuration
	}

	// Baca informasi siswa
	studentID := readLine()
	studentName := readLine()
	studentEmail := readLine()

	// TODO: Buat siswa menggunakan NewStudent
	_ = studentID
	_ = studentName
	_ = studentEmail

	// TODO: Buat pendaftaran yang menghubungkan siswa dengan kursus

	// Baca jumlah operasi
	numOps, _ := strconv.Atoi(readLine())

	// Proses setiap operasi
	for i := 0; i < numOps; i++ {
		operation := readLine()

		if operation == "progress" {
			// TODO: Panggil Progress() dan cetak dengan format "%.1f%%"
			fmt.Println("0.0%") // Ganti dengan progres sebenarnya
		} else if strings.HasPrefix(operation, "complete ") {
			lessonID := strings.TrimPrefix(operation, "complete ")
			// TODO: Panggil CompleteLesson dan cetak hasilnya
			_ = lessonID
			fmt.Println("") // Ganti dengan hasil sebenarnya
		}
	}
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online