Belajar Ai
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mapel Informatika & AI - Lorensius Ndare, S.Kom</title>
<script src="https://cdn.tailwindcss.com"></script>
<style>
body {
box-sizing: border-box;
}
.fade-in {
animation: fadeIn 0.5s ease-in;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
.quiz-option:hover {
transform: translateX(5px);
transition: all 0.3s ease;
}
.correct-answer {
background: linear-gradient(135deg, #10b981, #059669);
color: white;
}
.wrong-answer {
background: linear-gradient(135deg, #ef4444, #dc2626);
color: white;
}
</style>
</head>
<body class="bg-gradient-to-br from-blue-50 to-indigo-100 min-h-full">
<!-- Header -->
<header class="bg-gradient-to-r from-blue-600 to-indigo-700 text-white shadow-lg">
<div class="container mx-auto px-6 py-4">
<div class="flex items-center justify-between">
<div>
<h1 class="text-2xl font-bold">🖥️ Informatika & AI</h1>
<p class="text-blue-100">Oleh: Lorensius Ndare, S.Kom</p>
</div>
<nav class="hidden md:flex space-x-6">
<button onclick="showSection('home')" class="hover:text-blue-200 transition-colors">Beranda</button>
<button onclick="showSection('guru')" class="hover:text-blue-200 transition-colors">Guru</button>
<button onclick="showSection('absen')" class="hover:text-blue-200 transition-colors">Absen</button>
<button onclick="showSection('materi')" class="hover:text-blue-200 transition-colors">Materi</button>
<button onclick="showSection('quiz')" class="hover:text-blue-200 transition-colors">Kuis</button>
<button onclick="showSection('latihan')" class="hover:text-blue-200 transition-colors">Latihan</button>
</nav>
</div>
</div>
</header>
<!-- Main Content -->
<main class="container mx-auto px-6 py-8">
<!-- Home Section -->
<section id="home" class="fade-in">
<div class="text-center mb-12">
<h2 class="text-4xl font-bold text-gray-800 mb-4">Selamat Datang di Pembelajaran Informatika & AI</h2>
<p class="text-xl text-gray-600 max-w-3xl mx-auto">Platform pembelajaran interaktif untuk memahami konsep dasar informatika dan kecerdasan buatan</p>
</div>
<div class="grid md:grid-cols-2 lg:grid-cols-5 gap-6 mb-12">
<div class="bg-white rounded-xl shadow-lg p-6 hover:shadow-xl transition-shadow">
<div class="text-4xl mb-4">👨🏫</div>
<h3 class="text-xl font-semibold mb-3 text-gray-800">Info Guru</h3>
<p class="text-gray-600">Lihat profil dan informasi guru informatika</p>
<button onclick="showSection('guru')" class="mt-4 bg-indigo-600 text-white px-4 py-2 rounded-lg hover:bg-indigo-700 transition-colors">Lihat Guru</button>
</div>
<div class="bg-white rounded-xl shadow-lg p-6 hover:shadow-xl transition-shadow">
<div class="text-4xl mb-4">✅</div>
<h3 class="text-xl font-semibold mb-3 text-gray-800">Absen Siswa</h3>
<p class="text-gray-600">Input nama dan foto untuk absensi harian</p>
<button onclick="showSection('absen')" class="mt-4 bg-orange-600 text-white px-4 py-2 rounded-lg hover:bg-orange-700 transition-colors">Absen Sekarang</button>
</div>
<div class="bg-white rounded-xl shadow-lg p-6 hover:shadow-xl transition-shadow">
<div class="text-4xl mb-4">📚</div>
<h3 class="text-xl font-semibold mb-3 text-gray-800">Materi Lengkap</h3>
<p class="text-gray-600">Pelajari konsep dasar informatika dan AI dengan penjelasan yang mudah dipahami</p>
<button onclick="showSection('materi')" class="mt-4 bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 transition-colors">Mulai Belajar</button>
</div>
<div class="bg-white rounded-xl shadow-lg p-6 hover:shadow-xl transition-shadow">
<div class="text-4xl mb-4">🧠</div>
<h3 class="text-xl font-semibold mb-3 text-gray-800">Kuis Interaktif</h3>
<p class="text-gray-600">Uji pemahaman Anda dengan kuis yang menarik dan mendidik</p>
<button onclick="showSection('quiz')" class="mt-4 bg-green-600 text-white px-4 py-2 rounded-lg hover:bg-green-700 transition-colors">Ikuti Kuis</button>
</div>
<div class="bg-white rounded-xl shadow-lg p-6 hover:shadow-xl transition-shadow">
<div class="text-4xl mb-4">💪</div>
<h3 class="text-xl font-semibold mb-3 text-gray-800">Soal Latihan</h3>
<p class="text-gray-600">Asah kemampuan dengan berbagai soal latihan yang menantang</p>
<button onclick="showSection('latihan')" class="mt-4 bg-purple-600 text-white px-4 py-2 rounded-lg hover:bg-purple-700 transition-colors">Berlatih</button>
</div>
</div>
<div class="bg-white rounded-xl shadow-lg p-8">
<h3 class="text-2xl font-bold text-gray-800 mb-4">Tentang Pengajar</h3>
<div class="flex items-center space-x-4">
<div class="w-16 h-16 bg-gradient-to-r from-blue-600 to-indigo-700 rounded-full flex items-center justify-center text-white text-2xl font-bold">LN</div>
<div>
<h4 class="text-xl font-semibold text-gray-800">Lorensius Ndare, S.Kom</h4>
<p class="text-gray-600">Dosen Informatika & Artificial Intelligence</p>
<p class="text-sm text-gray-500 mt-1">Berpengalaman dalam pengembangan sistem AI dan pembelajaran mesin</p>
</div>
</div>
</div>
</section>
<!-- Guru Section -->
<section id="guru" class="hidden fade-in">
<h2 class="text-3xl font-bold text-gray-800 mb-8">👨🏫 Informasi Guru</h2>
<div class="bg-white rounded-xl shadow-lg p-8 mb-8">
<div class="flex flex-col md:flex-row items-center md:items-start space-y-6 md:space-y-0 md:space-x-8">
<div class="w-32 h-32 bg-gradient-to-br from-blue-600 to-indigo-700 rounded-full flex items-center justify-center text-white text-4xl font-bold shadow-lg">
LN
</div>
<div class="flex-1 text-center md:text-left">
<h3 class="text-3xl font-bold text-gray-800 mb-2">Lorensius Ndare, S.Kom</h3>
<p class="text-xl text-blue-600 mb-4">Guru Informatika & Artificial Intelligence</p>
<div class="grid md:grid-cols-2 gap-4 mb-6">
<div class="bg-blue-50 p-4 rounded-lg">
<h4 class="font-semibold text-blue-800 mb-2">📚 Pendidikan</h4>
<p class="text-sm text-blue-700">S1 Teknik Informatika</p>
<p class="text-sm text-blue-700">Spesialisasi: AI & Machine Learning</p>
</div>
<div class="bg-green-50 p-4 rounded-lg">
<h4 class="font-semibold text-green-800 mb-2">🏆 Pengalaman</h4>
<p class="text-sm text-green-700">5+ tahun mengajar Informatika</p>
<p class="text-sm text-green-700">Expert dalam Python & AI</p>
</div>
</div>
<div class="bg-gray-50 p-4 rounded-lg">
<h4 class="font-semibold text-gray-800 mb-2">📋 Mata Pelajaran yang Diampu</h4>
<div class="flex flex-wrap gap-2">
<span class="bg-blue-100 text-blue-800 px-3 py-1 rounded-full text-sm">Algoritma & Pemrograman</span>
<span class="bg-purple-100 text-purple-800 px-3 py-1 rounded-full text-sm">Artificial Intelligence</span>
<span class="bg-green-100 text-green-800 px-3 py-1 rounded-full text-sm">Basis Data</span>
<span class="bg-orange-100 text-orange-800 px-3 py-1 rounded-full text-sm">Jaringan Komputer</span>
</div>
</div>
</div>
</div>
</div>
<div class="grid md:grid-cols-2 gap-6">
<div class="bg-white rounded-xl shadow-lg p-6">
<h3 class="text-xl font-semibold mb-4 text-gray-800">📞 Kontak</h3>
<div class="space-y-3">
<div class="flex items-center space-x-3">
<span class="text-blue-600">📧</span>
<span class="text-gray-700">lorensius.ndare@sekolah.edu</span>
</div>
<div class="flex items-center space-x-3">
<span class="text-green-600">📱</span>
<span class="text-gray-700">+62 812-3456-7890</span>
</div>
<div class="flex items-center space-x-3">
<span class="text-purple-600">🏢</span>
<span class="text-gray-700">Ruang Lab Komputer A.201</span>
</div>
</div>
</div>
<div class="bg-white rounded-xl shadow-lg p-6">
<h3 class="text-xl font-semibold mb-4 text-gray-800">⏰ Jadwal Mengajar</h3>
<div class="space-y-2 text-sm">
<div class="flex justify-between p-2 bg-blue-50 rounded">
<span class="font-medium">Senin</span>
<span>08:00 - 10:00 (Kelas XI)</span>
</div>
<div class="flex justify-between p-2 bg-green-50 rounded">
<span class="font-medium">Selasa</span>
<span>10:00 - 12:00 (Kelas XII)</span>
</div>
<div class="flex justify-between p-2 bg-purple-50 rounded">
<span class="font-medium">Rabu</span>
<span>13:00 - 15:00 (Kelas X)</span>
</div>
<div class="flex justify-between p-2 bg-orange-50 rounded">
<span class="font-medium">Kamis</span>
<span>08:00 - 10:00 (Lab AI)</span>
</div>
</div>
</div>
</div>
</section>
<!-- Absen Section -->
<section id="absen" class="hidden fade-in">
<h2 class="text-3xl font-bold text-gray-800 mb-8">✅ Absensi Siswa</h2>
<div class="bg-white rounded-xl shadow-lg p-6 mb-6">
<h3 class="text-xl font-semibold mb-4 text-gray-800">📝 Form Absensi</h3>
<form id="absenForm" class="space-y-4">
<div class="grid md:grid-cols-2 gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Nama Lengkap</label>
<input type="text" id="studentName" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" placeholder="Masukkan nama lengkap" required>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Kelas</label>
<select id="studentClass" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" required>
<option value="">Pilih Kelas</option>
<option value="X-1">X-1</option>
<option value="X-2">X-2</option>
<option value="XI-1">XI-1</option>
<option value="XI-2">XI-2</option>
<option value="XII-1">XII-1</option>
<option value="XII-2">XII-2</option>
</select>
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Foto Selfie</label>
<div class="border-2 border-dashed border-gray-300 rounded-lg p-6 text-center">
<input type="file" id="studentPhoto" accept="image/*" capture="user" class="hidden">
<div id="photoPreview" class="hidden mb-4">
<img id="previewImage" class="w-32 h-32 object-cover rounded-full mx-auto border-4 border-blue-500">
</div>
<button type="button" onclick="document.getElementById('studentPhoto').click()" class="bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 transition-colors">
📷 Ambil Foto Selfie
</button>
<p class="text-sm text-gray-500 mt-2">Klik untuk mengambil foto selfie</p>
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Status Kehadiran</label>
<div class="flex space-x-4">
<label class="flex items-center">
<input type="radio" name="attendance" value="hadir" class="mr-2" required>
<span class="text-green-700">✅ Hadir</span>
</label>
<label class="flex items-center">
<input type="radio" name="attendance" value="terlambat" class="mr-2">
<span class="text-yellow-700">⏰ Terlambat</span>
</label>
<label class="flex items-center">
<input type="radio" name="attendance" value="sakit" class="mr-2">
<span class="text-red-700">🤒 Sakit</span>
</label>
<label class="flex items-center">
<input type="radio" name="attendance" value="izin" class="mr-2">
<span class="text-blue-700">📝 Izin</span>
</label>
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Komentar (Opsional)</label>
<textarea id="studentComment" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" rows="3" placeholder="Tambahkan komentar atau keterangan tambahan..."></textarea>
<p class="text-xs text-gray-500 mt-1">Contoh: "Terlambat karena macet", "Merasa kurang sehat", dll.</p>
</div>
<button type="submit" class="w-full bg-green-600 text-white py-3 rounded-lg hover:bg-green-700 transition-colors font-semibold">
✅ Submit Absensi
</button>
</form>
</div>
<div class="bg-white rounded-xl shadow-lg p-6">
<h3 class="text-xl font-semibold mb-4 text-gray-800">📊 Daftar Absensi Hari Ini</h3>
<div class="text-sm text-gray-600 mb-4">
Tanggal: <span id="currentDate" class="font-semibold"></span>
</div>
<div id="attendanceList" class="space-y-3">
<!-- Attendance records will be displayed here -->
</div>
<div id="emptyAttendance" class="text-center text-gray-500 py-8">
<div class="text-4xl mb-2">📝</div>
<p>Belum ada siswa yang absen hari ini</p>
</div>
</div>
</section>
<!-- Materi Section -->
<section id="materi" class="hidden fade-in">
<h2 class="text-3xl font-bold text-gray-800 mb-8">📚 Materi Pembelajaran</h2>
<div class="grid md:grid-cols-2 gap-6">
<div class="bg-white rounded-xl shadow-lg p-6">
<h3 class="text-xl font-semibold mb-4 text-blue-700">🖥️ Dasar-Dasar Informatika</h3>
<ul class="space-y-3 text-gray-700">
<li class="flex items-start space-x-2">
<span class="text-blue-500">•</span>
<span>Algoritma dan Struktur Data</span>
</li>
<li class="flex items-start space-x-2">
<span class="text-blue-500">•</span>
<span>Pemrograman Dasar</span>
</li>
<li class="flex items-start space-x-2">
<span class="text-blue-500">•</span>
<span>Basis Data dan SQL</span>
</li>
<li class="flex items-start space-x-2">
<span class="text-blue-500">•</span>
<span>Jaringan Komputer</span>
</li>
<li class="flex items-start space-x-2">
<span class="text-blue-500">•</span>
<span>Sistem Operasi</span>
</li>
</ul>
</div>
<div class="bg-white rounded-xl shadow-lg p-6">
<h3 class="text-xl font-semibold mb-4 text-purple-700">🤖 Artificial Intelligence</h3>
<ul class="space-y-3 text-gray-700">
<li class="flex items-start space-x-2">
<span class="text-purple-500">•</span>
<span>Pengenalan AI dan Machine Learning</span>
</li>
<li class="flex items-start space-x-2">
<span class="text-purple-500">•</span>
<span>Neural Networks</span>
</li>
<li class="flex items-start space-x-2">
<span class="text-purple-500">•</span>
<span>Deep Learning</span>
</li>
<li class="flex items-start space-x-2">
<span class="text-purple-500">•</span>
<span>Natural Language Processing</span>
</li>
<li class="flex items-start space-x-2">
<span class="text-purple-500">•</span>
<span>Computer Vision</span>
</li>
</ul>
</div>
</div>
<div class="mt-8 bg-white rounded-xl shadow-lg p-6">
<h3 class="text-xl font-semibold mb-4 text-gray-800">📖 Materi Detail</h3>
<div class="prose max-w-none text-gray-700">
<h4 class="text-lg font-semibold text-blue-700 mb-2">Algoritma dan Struktur Data</h4>
<p class="mb-4">Algoritma adalah langkah-langkah sistematis untuk menyelesaikan masalah. Struktur data adalah cara mengorganisir dan menyimpan data agar dapat diakses dan dimodifikasi secara efisien.</p>
<h4 class="text-lg font-semibold text-purple-700 mb-2">Machine Learning</h4>
<p class="mb-4">Machine Learning adalah cabang AI yang memungkinkan komputer belajar dan membuat keputusan dari data tanpa diprogram secara eksplisit untuk setiap tugas spesifik.</p>
<div class="bg-blue-50 p-4 rounded-lg mt-4">
<h5 class="font-semibold text-blue-800 mb-2">💡 Tips Belajar:</h5>
<ul class="text-sm text-blue-700 space-y-1">
<li>• Praktikkan coding setiap hari</li>
<li>• Pahami konsep sebelum menghafal syntax</li>
<li>• Buat project kecil untuk mengaplikasikan teori</li>
</ul>
</div>
</div>
</div>
</section>
<!-- Quiz Section -->
<section id="quiz" class="hidden fade-in">
<h2 class="text-3xl font-bold text-gray-800 mb-8">🧠 Kuis Interaktif</h2>
<div class="bg-white rounded-xl shadow-lg p-6 mb-6">
<div class="flex justify-between items-center mb-4">
<h3 class="text-xl font-semibold text-gray-800">Pertanyaan <span id="questionNumber">1</span> dari <span id="totalQuestions">5</span></h3>
<div class="text-sm text-gray-600">Skor: <span id="score" class="font-semibold text-blue-600">0</span></div>
</div>
<div id="quizContainer">
<div class="mb-6">
<h4 id="questionText" class="text-lg font-medium text-gray-800 mb-4"></h4>
<div id="optionsContainer" class="space-y-3"></div>
</div>
<div class="flex justify-between">
<button id="prevBtn" onclick="previousQuestion()" class="bg-gray-500 text-white px-4 py-2 rounded-lg hover:bg-gray-600 transition-colors disabled:opacity-50" disabled>Sebelumnya</button>
<button id="nextBtn" onclick="nextQuestion()" class="bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 transition-colors">Selanjutnya</button>
</div>
</div>
<div id="quizResults" class="hidden text-center">
<h3 class="text-2xl font-bold text-gray-800 mb-4">🎉 Kuis Selesai!</h3>
<div class="text-6xl mb-4">🏆</div>
<p class="text-xl mb-4">Skor Anda: <span id="finalScore" class="font-bold text-blue-600"></span></p>
<p id="scoreMessage" class="text-gray-600 mb-6"></p>
<button onclick="restartQuiz()" class="bg-green-600 text-white px-6 py-3 rounded-lg hover:bg-green-700 transition-colors">Ulangi Kuis</button>
</div>
</div>
</section>
<!-- Latihan Section -->
<section id="latihan" class="hidden fade-in">
<h2 class="text-3xl font-bold text-gray-800 mb-8">💪 Soal Latihan</h2>
<div class="grid md:grid-cols-2 gap-6">
<div class="bg-white rounded-xl shadow-lg p-6">
<h3 class="text-xl font-semibold mb-4 text-blue-700">🔢 Latihan Algoritma</h3>
<div class="space-y-4">
<div class="border-l-4 border-blue-500 pl-4">
<h4 class="font-semibold text-gray-800">Soal 1: Sorting Algorithm</h4>
<p class="text-gray-600 text-sm mt-1">Buatlah algoritma untuk mengurutkan array [64, 34, 25, 12, 22, 11, 90] menggunakan bubble sort.</p>
<button onclick="showSolution(1)" class="mt-2 text-blue-600 hover:text-blue-800 text-sm font-medium">Lihat Solusi</button>
</div>
<div class="border-l-4 border-blue-500 pl-4">
<h4 class="font-semibold text-gray-800">Soal 2: Binary Search</h4>
<p class="text-gray-600 text-sm mt-1">Implementasikan binary search untuk mencari angka 22 dalam array terurut [11, 12, 22, 25, 34, 64, 90].</p>
<button onclick="showSolution(2)" class="mt-2 text-blue-600 hover:text-blue-800 text-sm font-medium">Lihat Solusi</button>
</div>
</div>
</div>
<div class="bg-white rounded-xl shadow-lg p-6">
<h3 class="text-xl font-semibold mb-4 text-purple-700">🤖 Latihan AI</h3>
<div class="space-y-4">
<div class="border-l-4 border-purple-500 pl-4">
<h4 class="font-semibold text-gray-800">Soal 1: Linear Regression</h4>
<p class="text-gray-600 text-sm mt-1">Jelaskan konsep linear regression dan berikan contoh implementasinya dalam prediksi harga rumah.</p>
<button onclick="showSolution(3)" class="mt-2 text-purple-600 hover:text-purple-800 text-sm font-medium">Lihat Solusi</button>
</div>
<div class="border-l-4 border-purple-500 pl-4">
<h4 class="font-semibold text-gray-800">Soal 2: Neural Network</h4>
<p class="text-gray-600 text-sm mt-1">Gambarkan arsitektur neural network sederhana dengan 3 input, 2 hidden layer, dan 1 output.</p>
<button onclick="showSolution(4)" class="mt-2 text-purple-600 hover:text-purple-800 text-sm font-medium">Lihat Solusi</button>
</div>
</div>
</div>
</div>
<!-- Solution Modal -->
<div id="solutionModal" class="hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50">
<div class="bg-white rounded-xl shadow-xl p-6 max-w-2xl w-full mx-4 max-h-96 overflow-y-auto">
<div class="flex justify-between items-center mb-4">
<h3 class="text-xl font-semibold text-gray-800">💡 Solusi</h3>
<button onclick="closeSolution()" class="text-gray-500 hover:text-gray-700 text-2xl">×</button>
</div>
<div id="solutionContent" class="text-gray-700"></div>
</div>
</div>
<div class="mt-8 bg-white rounded-xl shadow-lg p-6">
<h3 class="text-xl font-semibold mb-4 text-gray-800">📝 Kalkulator Sederhana</h3>
<p class="text-gray-600 mb-4">Latihan praktis: Gunakan kalkulator di bawah untuk menghitung kompleksitas algoritma</p>
<div class="bg-gray-50 rounded-lg p-4 max-w-xs">
<div class="mb-4">
<input type="text" id="calcDisplay" class="w-full p-2 text-right text-xl border rounded" readonly value="0">
</div>
<div class="grid grid-cols-4 gap-2">
<button onclick="clearCalc()" class="bg-red-500 text-white p-2 rounded hover:bg-red-600">C</button>
<button onclick="appendToCalc('/')" class="bg-gray-300 p-2 rounded hover:bg-gray-400">÷</button>
<button onclick="appendToCalc('*')" class="bg-gray-300 p-2 rounded hover:bg-gray-400">×</button>
<button onclick="deleteLast()" class="bg-gray-300 p-2 rounded hover:bg-gray-400">⌫</button>
<button onclick="appendToCalc('7')" class="bg-white p-2 rounded hover:bg-gray-100">7</button>
<button onclick="appendToCalc('8')" class="bg-white p-2 rounded hover:bg-gray-100">8</button>
<button onclick="appendToCalc('9')" class="bg-white p-2 rounded hover:bg-gray-100">9</button>
<button onclick="appendToCalc('-')" class="bg-gray-300 p-2 rounded hover:bg-gray-400">-</button>
<button onclick="appendToCalc('4')" class="bg-white p-2 rounded hover:bg-gray-100">4</button>
<button onclick="appendToCalc('5')" class="bg-white p-2 rounded hover:bg-gray-100">5</button>
<button onclick="appendToCalc('6')" class="bg-white p-2 rounded hover:bg-gray-100">6</button>
<button onclick="appendToCalc('+')" class="bg-gray-300 p-2 rounded hover:bg-gray-400">+</button>
<button onclick="appendToCalc('1')" class="bg-white p-2 rounded hover:bg-gray-100">1</button>
<button onclick="appendToCalc('2')" class="bg-white p-2 rounded hover:bg-gray-100">2</button>
<button onclick="appendToCalc('3')" class="bg-white p-2 rounded hover:bg-gray-100">3</button>
<button onclick="calculateResult()" class="bg-blue-600 text-white p-2 rounded hover:bg-blue-700 row-span-2">=</button>
<button onclick="appendToCalc('0')" class="bg-white p-2 rounded hover:bg-gray-100 col-span-2">0</button>
<button onclick="appendToCalc('.')" class="bg-white p-2 rounded hover:bg-gray-100">.</button>
</div>
</div>
</div>
</section>
</main>
<!-- Footer -->
<footer class="bg-gray-800 text-white py-8 mt-12">
<div class="container mx-auto px-6 text-center">
<p class="mb-2">© 2024 Mapel Informatika & AI - Lorensius Ndare, S.Kom</p>
<p class="text-gray-400 text-sm">Platform Pembelajaran Interaktif untuk Informatika dan Kecerdasan Buatan</p>
</div>
</footer>
<script>
// Quiz Data
const quizData = [
{
question: "Apa yang dimaksud dengan algoritma?",
options: [
"Bahasa pemrograman",
"Langkah-langkah sistematis untuk menyelesaikan masalah",
"Perangkat keras komputer",
"Sistem operasi"
],
correct: 1
},
{
question: "Manakah yang bukan termasuk jenis machine learning?",
options: [
"Supervised Learning",
"Unsupervised Learning",
"Reinforcement Learning",
"Database Learning"
],
correct: 3
},
{
question: "Apa kepanjangan dari AI?",
options: [
"Automatic Intelligence",
"Artificial Intelligence",
"Advanced Intelligence",
"Algorithmic Intelligence"
],
correct: 1
},
{
question: "Struktur data yang menggunakan prinsip LIFO adalah?",
options: [
"Queue",
"Array",
"Stack",
"Linked List"
],
correct: 2
},
{
question: "Neural Network terinspirasi dari?",
options: [
"Sistem komputer",
"Jaringan internet",
"Otak manusia",
"Algoritma matematika"
],
correct: 2
}
];
let currentQuestion = 0;
let score = 0;
let userAnswers = [];
// Navigation
function showSection(sectionName) {
const sections = ['home', 'guru', 'absen', 'materi', 'quiz', 'latihan'];
sections.forEach(section => {
const element = document.getElementById(section);
if (section === sectionName) {
element.classList.remove('hidden');
element.classList.add('fade-in');
} else {
element.classList.add('hidden');
}
});
if (sectionName === 'quiz') {
initQuiz();
} else if (sectionName === 'absen') {
initAttendance();
}
}
// Quiz Functions
function initQuiz() {
currentQuestion = 0;
score = 0;
userAnswers = [];
document.getElementById('quizContainer').classList.remove('hidden');
document.getElementById('quizResults').classList.add('hidden');
document.getElementById('totalQuestions').textContent = quizData.length;
showQuestion();
}
function showQuestion() {
const question = quizData[currentQuestion];
document.getElementById('questionNumber').textContent = currentQuestion + 1;
document.getElementById('questionText').textContent = question.question;
document.getElementById('score').textContent = score;
const optionsContainer = document.getElementById('optionsContainer');
optionsContainer.innerHTML = '';
question.options.forEach((option, index) => {
const optionDiv = document.createElement('div');
optionDiv.className = 'quiz-option p-3 border rounded-lg cursor-pointer hover:bg-blue-50 transition-all';
optionDiv.innerHTML = `
<label class="flex items-center cursor-pointer">
<input type="radio" name="answer" value="${index}" class="mr-3">
<span>${option}</span>
</label>
`;
optionDiv.onclick = () => selectAnswer(index);
optionsContainer.appendChild(optionDiv);
});
// Update navigation buttons
document.getElementById('prevBtn').disabled = currentQuestion === 0;
document.getElementById('nextBtn').textContent = currentQuestion === quizData.length - 1 ? 'Selesai' : 'Selanjutnya';
}
function selectAnswer(answerIndex) {
const options = document.querySelectorAll('input[name="answer"]');
options[answerIndex].checked = true;
userAnswers[currentQuestion] = answerIndex;
}
function nextQuestion() {
const selectedAnswer = document.querySelector('input[name="answer"]:checked');
if (selectedAnswer) {
const answerIndex = parseInt(selectedAnswer.value);
userAnswers[currentQuestion] = answerIndex;
if (answerIndex === quizData[currentQuestion].correct) {
score += 20;
}
}
if (currentQuestion < quizData.length - 1) {
currentQuestion++;
showQuestion();
} else {
showResults();
}
}
function previousQuestion() {
if (currentQuestion > 0) {
currentQuestion--;
showQuestion();
// Restore previous answer if exists
if (userAnswers[currentQuestion] !== undefined) {
const options = document.querySelectorAll('input[name="answer"]');
options[userAnswers[currentQuestion]].checked = true;
}
}
}
function showResults() {
document.getElementById('quizContainer').classList.add('hidden');
document.getElementById('quizResults').classList.remove('hidden');
document.getElementById('finalScore').textContent = `${score}/100`;
let message = '';
if (score >= 80) {
message = 'Excellent! Anda menguasai materi dengan sangat baik! 🌟';
} else if (score >= 60) {
message = 'Good job! Pemahaman Anda cukup baik, terus belajar! 👍';
} else {
message = 'Keep learning! Pelajari kembali materi untuk hasil yang lebih baik! 📚';
}
document.getElementById('scoreMessage').textContent = message;
}
function restartQuiz() {
initQuiz();
}
// Exercise Solutions
const solutions = {
1: `
<h4 class="font-semibold mb-2">Bubble Sort Algorithm:</h4>
<pre class="bg-gray-100 p-3 rounded text-sm overflow-x-auto">
function bubbleSort(arr) {
let n = arr.length;
for (let i = 0; i < n-1; i++) {
for (let j = 0; j < n-i-1; j++) {
if (arr[j] > arr[j+1]) {
// Swap elements
let temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
// Input: [64, 34, 25, 12, 22, 11, 90]
// Output: [11, 12, 22, 25, 34, 64, 90]</pre>
<p class="mt-2 text-sm text-gray-600">Kompleksitas waktu: O(n²), Kompleksitas ruang: O(1)</p>
`,
2: `
<h4 class="font-semibold mb-2">Binary Search Algorithm:</h4>
<pre class="bg-gray-100 p-3 rounded text-sm overflow-x-auto">
function binarySearch(arr, target) {
let left = 0;
let right = arr.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (arr[mid] === target) {
return mid; // Found at index mid
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // Not found
}
// Input: [11, 12, 22, 25, 34, 64, 90], target: 22
// Output: 2 (index of 22)</pre>
<p class="mt-2 text-sm text-gray-600">Kompleksitas waktu: O(log n), Kompleksitas ruang: O(1)</p>
`,
3: `
<h4 class="font-semibold mb-2">Linear Regression Concept:</h4>
<p class="mb-3">Linear regression adalah algoritma supervised learning yang memprediksi nilai kontinu berdasarkan hubungan linear antara variabel input dan output.</p>
<h5 class="font-medium mb-2">Contoh Prediksi Harga Rumah:</h5>
<ul class="list-disc list-inside text-sm space-y-1 mb-3">
<li>Input: Luas rumah, jumlah kamar, lokasi</li>
<li>Output: Harga rumah</li>
<li>Formula: y = mx + b</li>
</ul>
<pre class="bg-gray-100 p-3 rounded text-sm">
# Contoh implementasi sederhana
import numpy as np
from sklearn.linear_model import LinearRegression
# Data training
X = [[100], [150], [200], [250]] # Luas rumah
y = [300000, 450000, 600000, 750000] # Harga
model = LinearRegression()
model.fit(X, y)
# Prediksi harga rumah 180m²
predicted_price = model.predict([[180]])
print(f"Prediksi harga: {predicted_price[0]}")</pre>
`,
4: `
<h4 class="font-semibold mb-2">Neural Network Architecture:</h4>
<div class="mb-3">
<svg viewBox="0 0 400 200" class="w-full max-w-md border rounded">
<!-- Input Layer -->
<circle cx="50" cy="50" r="15" fill="#3b82f6" />
<circle cx="50" cy="100" r="15" fill="#3b82f6" />
<circle cx="50" cy="150" r="15" fill="#3b82f6" />
<text x="20" y="55" class="text-xs">X1</text>
<text x="20" y="105" class="text-xs">X2</text>
<text x="20" y="155" class="text-xs">X3</text>
<!-- Hidden Layer 1 -->
<circle cx="150" cy="40" r="12" fill="#10b981" />
<circle cx="150" cy="80" r="12" fill="#10b981" />
<circle cx="150" cy="120" r="12" fill="#10b981" />
<circle cx="150" cy="160" r="12" fill="#10b981" />
<!-- Hidden Layer 2 -->
<circle cx="250" cy="60" r="12" fill="#f59e0b" />
<circle cx="250" cy="100" r="12" fill="#f59e0b" />
<circle cx="250" cy="140" r="12" fill="#f59e0b" />
<!-- Output Layer -->
<circle cx="350" cy="100" r="15" fill="#ef4444" />
<text x="365" y="105" class="text-xs">Y</text>
<!-- Connections (simplified) -->
<line x1="65" y1="50" x2="135" y2="40" stroke="#666" stroke-width="1" />
<line x1="65" y1="100" x2="135" y2="80" stroke="#666" stroke-width="1" />
<line x1="162" y1="40" x2="235" y2="60" stroke="#666" stroke-width="1" />
<line x1="265" y1="100" x2="335" y2="100" stroke="#666" stroke-width="1" />
<!-- Labels -->
<text x="35" y="20" class="text-xs font-semibold">Input</text>
<text x="125" y="20" class="text-xs font-semibold">Hidden 1</text>
<text x="225" y="20" class="text-xs font-semibold">Hidden 2</text>
<text x="335" y="20" class="text-xs font-semibold">Output</text>
</svg>
</div>
<p class="text-sm text-gray-600 mb-2">Arsitektur: 3 input → 4 neurons → 3 neurons → 1 output</p>
<ul class="list-disc list-inside text-sm space-y-1">
<li>Input layer: 3 neurons (fitur input)</li>
<li>Hidden layer 1: 4 neurons dengan aktivasi ReLU</li>
<li>Hidden layer 2: 3 neurons dengan aktivasi ReLU</li>
<li>Output layer: 1 neuron dengan aktivasi sigmoid/linear</li>
</ul>
`
};
function showSolution(solutionId) {
document.getElementById('solutionContent').innerHTML = solutions[solutionId];
document.getElementById('solutionModal').classList.remove('hidden');
}
function closeSolution() {
document.getElementById('solutionModal').classList.add('hidden');
}
// Calculator Functions
let calcDisplay = document.getElementById('calcDisplay');
let currentInput = '0';
let shouldResetDisplay = false;
function updateDisplay() {
calcDisplay.value = currentInput;
}
function appendToCalc(value) {
if (shouldResetDisplay) {
currentInput = '';
shouldResetDisplay = false;
}
if (currentInput === '0' && value !== '.') {
currentInput = value;
} else {
currentInput += value;
}
updateDisplay();
}
function clearCalc() {
currentInput = '0';
updateDisplay();
}
function deleteLast() {
if (currentInput.length > 1) {
currentInput = currentInput.slice(0, -1);
} else {
currentInput = '0';
}
updateDisplay();
}
function calculateResult() {
try {
// Replace display symbols with actual operators
let expression = currentInput.replace(/×/g, '*').replace(/÷/g, '/');
let result = eval(expression);
currentInput = result.toString();
shouldResetDisplay = true;
updateDisplay();
} catch (error) {
currentInput = 'Error';
shouldResetDisplay = true;
updateDisplay();
}
}
// Attendance Functions
let attendanceData = [];
function initAttendance() {
// Set current date
const today = new Date();
const dateString = today.toLocaleDateString('id-ID', {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric'
});
document.getElementById('currentDate').textContent = dateString;
// Load existing attendance data
displayAttendanceList();
}
// Handle photo upload
document.getElementById('studentPhoto').addEventListener('change', function(e) {
const file = e.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = function(e) {
document.getElementById('previewImage').src = e.target.result;
document.getElementById('photoPreview').classList.remove('hidden');
};
reader.readAsDataURL(file);
}
});
// Handle form submission
document.getElementById('absenForm').addEventListener('submit', function(e) {
e.preventDefault();
const name = document.getElementById('studentName').value;
const studentClass = document.getElementById('studentClass').value;
const photo = document.getElementById('previewImage').src;
const attendance = document.querySelector('input[name="attendance"]:checked')?.value;
const comment = document.getElementById('studentComment').value;
if (!name || !studentClass || !attendance) {
alert('Mohon lengkapi semua data!');
return;
}
if (!photo || photo === '') {
alert('Mohon ambil foto selfie terlebih dahulu!');
return;
}
// Show loading state
const submitBtn = document.querySelector('#absenForm button[type="submit"]');
const originalText = submitBtn.innerHTML;
submitBtn.innerHTML = '⏳ Mengirim ke Database...';
submitBtn.disabled = true;
// Prepare data for database submission
const attendanceRecord = {
id: Date.now(),
name: name,
class: studentClass,
photo: photo,
status: attendance,
comment: comment || '',
timestamp: new Date().toISOString(),
time: new Date().toLocaleTimeString('id-ID'),
date: new Date().toLocaleDateString('id-ID')
};
// Simulate database submission (replace with actual API call)
submitToDatabase(attendanceRecord)
.then(response => {
// Add to local attendance data
attendanceData.push(attendanceRecord);
// Reset form
document.getElementById('absenForm').reset();
document.getElementById('photoPreview').classList.add('hidden');
document.getElementById('previewImage').src = '';
// Update display
displayAttendanceList();
// Show success message
showAttendanceSuccess(name, attendance, true);
})
.catch(error => {
console.error('Database submission error:', error);
// Still save locally as backup
attendanceData.push(attendanceRecord);
displayAttendanceList();
showAttendanceSuccess(name, attendance, false);
})
.finally(() => {
// Reset button state
submitBtn.innerHTML = originalText;
submitBtn.disabled = false;
});
});
function displayAttendanceList() {
const listContainer = document.getElementById('attendanceList');
const emptyMessage = document.getElementById('emptyAttendance');
if (attendanceData.length === 0) {
listContainer.innerHTML = '';
emptyMessage.classList.remove('hidden');
return;
}
emptyMessage.classList.add('hidden');
listContainer.innerHTML = attendanceData.map(record => {
const statusColors = {
'hadir': 'bg-green-100 text-green-800',
'terlambat': 'bg-yellow-100 text-yellow-800',
'sakit': 'bg-red-100 text-red-800',
'izin': 'bg-blue-100 text-blue-800'
};
const statusIcons = {
'hadir': '✅',
'terlambat': '⏰',
'sakit': '🤒',
'izin': '📝'
};
return `
<div class="flex items-start space-x-4 p-4 border rounded-lg hover:bg-gray-50">
<img src="${record.photo}" alt="${record.name}" class="w-12 h-12 object-cover rounded-full border-2 border-gray-300">
<div class="flex-1">
<h4 class="font-semibold text-gray-800">${record.name}</h4>
<p class="text-sm text-gray-600">Kelas: ${record.class}</p>
${record.comment ? `<p class="text-sm text-gray-500 mt-1 italic">"${record.comment}"</p>` : ''}
</div>
<div class="text-center">
<span class="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium ${statusColors[record.status]}">
${statusIcons[record.status]} ${record.status.charAt(0).toUpperCase() + record.status.slice(1)}
</span>
<p class="text-xs text-gray-500 mt-1">${record.time}</p>
<div class="text-xs text-blue-600 mt-1">📊 Database</div>
</div>
</div>
`;
}).join('');
}
// Database submission function
async function submitToDatabase(attendanceData) {
// Simulate API call to your database
// Replace this with your actual database endpoint
const API_ENDPOINT = 'https://your-api-endpoint.com/attendance';
try {
// Simulate network delay
await new Promise(resolve => setTimeout(resolve, 1500));
// In real implementation, use fetch to send data to your server:
/*
const response = await fetch(API_ENDPOINT, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-token-here'
},
body: JSON.stringify(attendanceData)
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
*/
// For demo purposes, simulate successful response
console.log('Data yang akan dikirim ke database:', attendanceData);
return {
success: true,
message: 'Attendance recorded successfully',
id: attendanceData.id
};
} catch (error) {
console.error('Error submitting to database:', error);
throw error;
}
}
function showAttendanceSuccess(name, status, databaseSuccess = true) {
// Create success notification
const notification = document.createElement('div');
const bgColor = databaseSuccess ? 'bg-green-500' : 'bg-yellow-500';
const icon = databaseSuccess ? '✅' : '⚠️';
const message = databaseSuccess
? `Absensi ${name} berhasil disimpan ke database!`
: `Absensi ${name} disimpan lokal (database tidak tersedia)`;
notification.className = `fixed top-4 right-4 ${bgColor} text-white px-6 py-3 rounded-lg shadow-lg z-50 fade-in`;
notification.innerHTML = `
<div class="flex items-center space-x-2">
<span class="text-xl">${icon}</span>
<div>
<div class="font-semibold">${message}</div>
${databaseSuccess ? '<div class="text-xs opacity-90">Data tersimpan di server</div>' : '<div class="text-xs opacity-90">Akan dikirim ulang saat koneksi tersedia</div>'}
</div>
</div>
`;
document.body.appendChild(notification);
// Remove notification after 4 seconds
setTimeout(() => {
notification.remove();
}, 4000);
}
// Initialize the page
document.addEventListener('DOMContentLoaded', function() {
showSection('home');
});
</script>
<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'98bdf3c4a45d7550',t:'MTc2MDAxMzY4Ni4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>
Komentar
Posting Komentar