2026-09-08 19:01:33 +07:00
|
|
|
---LESSON_INFO---
|
|
|
|
|
**Learning Objectives:**
|
|
|
|
|
- Memahami konsep materi komposit di Elemes (latihan koding + kuis)
|
|
|
|
|
- Menyelesaikan latihan program C/Python dan kuis evaluasi pemahaman
|
|
|
|
|
**Prerequisites:**
|
|
|
|
|
- variabel
|
|
|
|
|
---END_LESSON_INFO---
|
|
|
|
|
|
|
|
|
|
# Uji Coba Komposit (Latihan dan Kuis)
|
|
|
|
|
|
|
|
|
|
Pelajaran ini merupakan contoh materi **komposit**, yaitu materi pembelajaran yang menggabungkan:
|
|
|
|
|
1. **Latihan Pemrograman (Exercise):** Menulis kode program langsung di editor dan memverifikasi keluarannya.
|
|
|
|
|
2. **Kuis Evaluasi (Quiz):** Menjawab pertanyaan pilihan ganda terkait materi.
|
|
|
|
|
|
|
|
|
|
### Perhitungan Nilai Komposit
|
|
|
|
|
Nilai akhir siswa dihitung dari kombinasi kedua komponen:
|
|
|
|
|
- Bobot Latihan: 70%
|
|
|
|
|
- Bobot Kuis: 30%
|
|
|
|
|
- Ambang Tuntas (*Done*): $\ge$ 75%
|
|
|
|
|
|
|
|
|
|
---EXERCISE---
|
|
|
|
|
### Latihan: Pengecekan Angka Positif
|
|
|
|
|
Buatlah program yang memeriksa nilai variabel `angka`. Jika `angka > 0`, cetak:
|
|
|
|
|
```
|
|
|
|
|
Positif
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---INITIAL_CODE---
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
int angka = 10;
|
|
|
|
|
// Tulis logika percabangan if di bawah ini:
|
|
|
|
|
if (angka > 0) {
|
|
|
|
|
printf("Positif\n");
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
---END_INITIAL_CODE---
|
|
|
|
|
|
|
|
|
|
---EXPECTED_OUTPUT---
|
|
|
|
|
Positif
|
|
|
|
|
---END_EXPECTED_OUTPUT---
|
|
|
|
|
|
|
|
|
|
---INITIAL_PYTHON---
|
|
|
|
|
angka = 10
|
|
|
|
|
# Tulis logika percabangan if di bawah ini:
|
|
|
|
|
if angka > 0:
|
|
|
|
|
print("Positif")
|
|
|
|
|
---END_INITIAL_PYTHON---
|
|
|
|
|
|
|
|
|
|
---EXPECTED_OUTPUT_PYTHON---
|
|
|
|
|
Positif
|
|
|
|
|
---END_EXPECTED_OUTPUT_PYTHON---
|
|
|
|
|
|
|
|
|
|
---SOLUTION_CODE---
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
int angka = 10;
|
|
|
|
|
if (angka > 0) {
|
|
|
|
|
printf("Positif\n");
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
---END_SOLUTION_CODE---
|
|
|
|
|
|
|
|
|
|
---SOLUTION_PYTHON---
|
|
|
|
|
angka = 10
|
|
|
|
|
if angka > 0:
|
|
|
|
|
print("Positif")
|
|
|
|
|
---END_SOLUTION_PYTHON---
|
|
|
|
|
|
|
|
|
|
---KEY_TEXT---
|
|
|
|
|
if
|
|
|
|
|
printf
|
|
|
|
|
print
|
|
|
|
|
---END_KEY_TEXT---
|
|
|
|
|
|
feat(quiz): taksonomi key quiz per jenis + MCQ berbobot (partial credit)
Fitur B — setiap jenis soal kini punya key sendiri sehingga model
penilaiannya eksplisit, tidak ditebak dari isi konten:
- ---QUIZ_MCQ--- pilihan ganda biner (tepat satu [x]; larang [N])
- ---QUIZ_WEIGHTED--- pilihan ganda berbobot ([N] >= 1, minimal satu [ ],
bobot tertinggi unik = kunci; poin parsial)
- ---FLASHCARD--- kartu hafalan tanpa penilaian (larang opsi)
- legacy ---QUIZ_FLASHCARD--- / ---INITIAL_QUIZ--- tetap dibaca tanpa
perubahan perilaku (regex opsi legacy sengaja tidak berubah — baris
'- [10]' di konten lama BUKAN opsi); dihapus dari docs/template
- ::diagnostic tetap kategori di dalam QUIZ_MCQ & tetap masuk skor resmi
Model skor: rata-rata persentase per jenis yang ada, Math.round,
lulus >= 75. statusString: "X/Y" bila hanya MCQ/legacy, "P/100" bila ada
weighted, "completed" bila hanya flashcard (auto-lulus). Satu sesi/
attempt untuk semua jenis; soal flat urut dokumen.
Parser (backend & frontend mirror, ekstraksi multi-blok per key urut
dokumen via loop marker-start paling awal; id q-N deterministik):
- lesson_service.py: regex [ xX]?[0-9]* utk key baru, _iter_option_lines
kind-aware, _validate_quiz_options per kind, _parse_flashcards(kind,
id_offset), _extract_quiz_sections + guard loop maju (marker end
hilang tidak lagi infinite loop), get_lesson_quiz_total -> 100 bila
ada weighted (round-trip CSV "P/100")
- parseFlashcards.ts / index.ts / detectActiveTabs.ts / extractSections.ts:
mirror perilaku; heading soal <h3> kini fence-aware (fix fixture stale)
Payload attempt baru: quiz_type, earned_points, question_max_points —
opsional di validasi backend supaya klien lama tetap diterima; poin
di-recompute dari konten saat resume/review.
UI: QuizTab skor via statusString + alert berbasis percent, badge
weighted (✓ 10 / 🟡 7/10 / ✗ 0) di review, preview guru badge bobot +
"Berbobot (total N)", laporan guru badge MCQ/Bobot + tooltip, CSV
progress 2 kolom baru per lesson (_quiz_mcq, _quiz_weighted), template
editor konten QUIZ_MCQ/Quiz Bobot/Flashcard.
Tooling & docs: scripts/convert_quiz_keys.py (konversi legacy -> key
baru per run jenis, idempoten, verifikasi parse identik; examples/
content dikonversi), scanner mendukung semua key, docs/07 ditulis ulang,
docs/15 direvisi ke desain final, README/documentation/docs 02/04/09
diperbarui.
Tes: backend 444 lulus (+33: validasi ketat per key, urutan dokumen,
multi-blok, zero regression, field selalu di-emit), frontend 249 lulus
(+13 parser key baru, +11 model skor), parity fixture diregenerasi,
svelte-check 0 error, vite build OK.
2026-10-25 20:16:56 +07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
---QUIZ_MCQ---
|
2026-09-08 19:01:33 +07:00
|
|
|
### Manakah sintaks penulisan kondisi `if` yang benar dalam bahasa C?
|
|
|
|
|
- [x] `if (kondisi) { ... }`
|
|
|
|
|
- [] `if kondisi then { ... }`
|
|
|
|
|
- [] `if [kondisi] { ... }`
|
|
|
|
|
- [] `if {kondisi} then { ... }`
|
|
|
|
|
> Penjelasan: Dalam bahasa C, ekspresi logika kondisi pada `if` wajib berada di dalam tanda kurung biasa `( )`.
|
|
|
|
|
|
|
|
|
|
### Apa keluaran dari kode berikut jika `x = 5`?
|
|
|
|
|
```c
|
|
|
|
|
if (x > 10) {
|
|
|
|
|
printf("Besar\n");
|
|
|
|
|
} else {
|
|
|
|
|
printf("Kecil\n");
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
- [] Besar
|
|
|
|
|
- [x] Kecil
|
|
|
|
|
- [] Error sintaks
|
|
|
|
|
- [] Tidak ada keluaran
|
|
|
|
|
> Penjelasan: Karena `5 > 10` bernilai salah (false), maka blok `else` yang akan dieksekusi, menghasilkan output "Kecil".
|
|
|
|
|
|
|
|
|
|
### Berapa bobot penilaian komponen latihan koding dalam penentuan nilai komposit standar Elemes?
|
|
|
|
|
- [] 30%
|
|
|
|
|
- [] 50%
|
|
|
|
|
- [x] 70%
|
|
|
|
|
- [] 100%
|
|
|
|
|
> Penjelasan: Secara default pada konfigurasi Elemes, komponen latihan koding memiliki bobot 70% dan kuis memiliki bobot 30%.
|
feat(quiz): taksonomi key quiz per jenis + MCQ berbobot (partial credit)
Fitur B — setiap jenis soal kini punya key sendiri sehingga model
penilaiannya eksplisit, tidak ditebak dari isi konten:
- ---QUIZ_MCQ--- pilihan ganda biner (tepat satu [x]; larang [N])
- ---QUIZ_WEIGHTED--- pilihan ganda berbobot ([N] >= 1, minimal satu [ ],
bobot tertinggi unik = kunci; poin parsial)
- ---FLASHCARD--- kartu hafalan tanpa penilaian (larang opsi)
- legacy ---QUIZ_FLASHCARD--- / ---INITIAL_QUIZ--- tetap dibaca tanpa
perubahan perilaku (regex opsi legacy sengaja tidak berubah — baris
'- [10]' di konten lama BUKAN opsi); dihapus dari docs/template
- ::diagnostic tetap kategori di dalam QUIZ_MCQ & tetap masuk skor resmi
Model skor: rata-rata persentase per jenis yang ada, Math.round,
lulus >= 75. statusString: "X/Y" bila hanya MCQ/legacy, "P/100" bila ada
weighted, "completed" bila hanya flashcard (auto-lulus). Satu sesi/
attempt untuk semua jenis; soal flat urut dokumen.
Parser (backend & frontend mirror, ekstraksi multi-blok per key urut
dokumen via loop marker-start paling awal; id q-N deterministik):
- lesson_service.py: regex [ xX]?[0-9]* utk key baru, _iter_option_lines
kind-aware, _validate_quiz_options per kind, _parse_flashcards(kind,
id_offset), _extract_quiz_sections + guard loop maju (marker end
hilang tidak lagi infinite loop), get_lesson_quiz_total -> 100 bila
ada weighted (round-trip CSV "P/100")
- parseFlashcards.ts / index.ts / detectActiveTabs.ts / extractSections.ts:
mirror perilaku; heading soal <h3> kini fence-aware (fix fixture stale)
Payload attempt baru: quiz_type, earned_points, question_max_points —
opsional di validasi backend supaya klien lama tetap diterima; poin
di-recompute dari konten saat resume/review.
UI: QuizTab skor via statusString + alert berbasis percent, badge
weighted (✓ 10 / 🟡 7/10 / ✗ 0) di review, preview guru badge bobot +
"Berbobot (total N)", laporan guru badge MCQ/Bobot + tooltip, CSV
progress 2 kolom baru per lesson (_quiz_mcq, _quiz_weighted), template
editor konten QUIZ_MCQ/Quiz Bobot/Flashcard.
Tooling & docs: scripts/convert_quiz_keys.py (konversi legacy -> key
baru per run jenis, idempoten, verifikasi parse identik; examples/
content dikonversi), scanner mendukung semua key, docs/07 ditulis ulang,
docs/15 direvisi ke desain final, README/documentation/docs 02/04/09
diperbarui.
Tes: backend 444 lulus (+33: validasi ketat per key, urutan dokumen,
multi-blok, zero regression, field selalu di-emit), frontend 249 lulus
(+13 parser key baru, +11 model skor), parity fixture diregenerasi,
svelte-check 0 error, vite build OK.
2026-10-25 20:16:56 +07:00
|
|
|
---END_QUIZ_MCQ---
|
|
|
|
|
|
|
|
|
|
|