Menu
Coddy logo textTech

E-Öğrenme Platformu

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 105 / 107.

challenge icon

Görev

Kolay

Kursları, öğrencileri yöneten ve öğrenme ilerlemesini takip eden bir E-Öğrenme Platformu inşa edelim! Öğrencilerin kurslara kaydolabileceği ve dersleri tamamlayabileceği uyumlu bir sistem oluşturmak için struct'ları, arayüzleri (interfaces), kompozisyonu ve polimorfizmi birleştireceksiniz.

Kodunuzu beş dosya halinde düzenleyeceksiniz:

  • lesson.go: Bireysel öğrenme birimlerini temsil eden bir Lesson struct'ı tanımlayın. Her dersin bir ID, Title ve Duration (dakika cinsinden) bilgisi vardır. Bir Lesson'a işaretçi (pointer) döndüren bir NewLesson yapıcı metodu (constructor) ekleyin.
  • course.go: Bir ID, Title, Instructor ve *Lesson işaretçilerinden oluşan bir dilim (slice) içeren bir Course struct'ı oluşturun. Bir NewCourse yapıcı metodu ve bir AddLesson metodu ekleyin. Ayrıca, kurstaki tüm ders sürelerinin toplamını döndüren bir TotalDuration() int metodu uygulayın.
  • student.go: ID, Name ve Email alanlarına sahip bir Student struct'ı tanımlayın. Bir NewStudent yapıcı metodu ekleyin.
  • enrollment.go: İlerleme takibi sihrinin gerçekleştiği yer burasıdır. Bir öğrenciyi bir kursa bağlayan ve hangi dersleri tamamladıklarını takip eden bir Enrollment struct'ı oluşturun. Şunlara sahip olmalıdır:
    • Student için bir işaretçi
    • Course için bir işaretçi
    • Bir CompletedLessons map'i (ders ID'sinden boolean'a)

    Yüzde (0.0 ile 100.0 arası) döndüren Progress() float64 metoduna sahip bir Progressable arayüzü tanımlayın.

    Enrollment üzerinde şu metotları uygulayın:

    • NewEnrollment(student *Student, course *Course) *Enrollment — boş bir tamamlanmış dersler map'i başlatan yapıcı metot
    • CompleteLesson(lessonID string) string — bir dersi tamamlandı olarak işaretler. Ders kursta mevcut değilse lesson not found, zaten tamamlanmışsa already completed veya başarı durumunda completed döndürür
    • Progress() float64 — tamamlanan derslerin yüzdesini döndürür (tamamlanan/toplam * 100) veya kursta ders yoksa 0.0 döndürür
  • main.go: Platformunuzu oluşturun ve kayıt işlemlerini işleyin.

    Bir kursun ID'sini, başlığını ve eğitmenini okuyun. Ardından ders sayısını ve her dersin ID'sini, başlığını ve süresini okuyun. Bir öğrencinin ID'sini, adını ve e-postasını okuyun. Öğrenciyi kursa bağlayan bir kayıt (enrollment) oluşturun.

    Ardından işlem sayısını okuyun. Her işlem ya complete [lessonID] ya da progress şeklindedir. complete işlemleri için sonuç mesajını yazdırın. progress işlemleri için, bir ondalık basamak ve ardından bir yüzde işareti ile formatlanmış ilerlemeyi yazdırın.

Aşağıdaki girdiler sağlanacaktır:

  • Kurs ID, Başlık, Eğitmen (3 satır)
  • Ders sayısı, ardından her dersin ID, Başlık, Süre bilgisi (her biri için 3 satır)
  • Öğrenci ID, Ad, E-posta (3 satır)
  • İşlem sayısı, ardından her işlem (her biri için 1 satır)

Örneğin, şu girdi verildiğinde:

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

Çıktınız şu olmalıdır:

0.0%
completed
33.3%
already completed
completed

Ve şu verildiğinde:

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

Çıktınız şu olmalıdır:

lesson not found
completed
completed
100.0%

Enrollment struct'ının öğrencileri ve kursları birbirine bağlamak için kompozisyonu nasıl kullandığına, Progressable arayüzünün ise herhangi bir türün tamamlanma durumunu bildirmesine nasıl izin verdiğine dikkat edin. Bu tasarım genişletmeyi kolaylaştırır; aynı arayüzü kullanarak bireysel derslere veya tüm öğrenme yollarına ilerleme takibi ekleyebilirsiniz!

Kendin dene

package main

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

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

	// Bir satır okumak için yardımcı fonksiyon
	readLine := func() string {
		scanner.Scan()
		return strings.TrimSpace(scanner.Text())
	}

	// Kurs bilgilerini oku
	courseID := readLine()
	courseTitle := readLine()
	courseInstructor := readLine()

	// TODO: NewCourse kullanarak kursu oluştur
	_ = courseID
	_ = courseTitle
	_ = courseInstructor

	// Ders sayısını oku
	numLessons, _ := strconv.Atoi(readLine())

	// TODO: Her bir dersi oku ve kursa ekle
	for i := 0; i < numLessons; i++ {
		lessonID := readLine()
		lessonTitle := readLine()
		lessonDuration, _ := strconv.Atoi(readLine())

		// TODO: Dersi oluştur ve kursa ekle
		_ = lessonID
		_ = lessonTitle
		_ = lessonDuration
	}

	// Öğrenci bilgilerini oku
	studentID := readLine()
	studentName := readLine()
	studentEmail := readLine()

	// TODO: NewStudent kullanarak öğrenciyi oluştur
	_ = studentID
	_ = studentName
	_ = studentEmail

	// TODO: Öğrenciyi kursa bağlayan kaydı (enrollment) oluştur

	// İşlem sayısını oku
	numOps, _ := strconv.Atoi(readLine())

	// Her bir işlemi işle
	for i := 0; i < numOps; i++ {
		operation := readLine()

		if operation == "progress" {
			// TODO: Progress() fonksiyonunu çağır ve "%.1f%%" formatıyla yazdır
			fmt.Println("0.0%") // Gerçek ilerleme durumu ile değiştirin
		} else if strings.HasPrefix(operation, "complete ") {
			lessonID := strings.TrimPrefix(operation, "complete ")
			// TODO: CompleteLesson fonksiyonunu çağır ve sonucu yazdır
			_ = lessonID
			fmt.Println("") // Gerçek sonuç ile değiştirin
		}
	}
}

Nesne Yönelimli Programlama bölümündeki tüm dersler