diff --git a/Tugas2/MainActivity.kt b/Tugas2/MainActivity.kt new file mode 100644 index 0000000..897fe31 --- /dev/null +++ b/Tugas2/MainActivity.kt @@ -0,0 +1,115 @@ +package com.example.programpengurutanangka + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.layout.* +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.example.programpengurutanangka.ui.theme.ProgramPengurutanAngkaTheme + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContent { + ProgramPengurutanAngkaTheme { + Scaffold { innerPadding -> + ProgramPengurutanAngka( + modifier = Modifier + .padding(innerPadding) + .padding(16.dp) + ) + } + } + } + } +} + +@Composable +fun ProgramPengurutanAngka(modifier: Modifier = Modifier) { + var input by remember { mutableStateOf("") } + var result by remember { mutableStateOf("") } + var error by remember { mutableStateOf(null) } + var ascending by remember { mutableStateOf(true) } + + Column( + modifier = modifier.fillMaxSize(), + verticalArrangement = Arrangement.Top, + horizontalAlignment = Alignment.Start + ) { + OutlinedTextField( + value = input, + onValueChange = { + input = it + error = null + }, + label = { Text("Masukkan angka (contoh: 9, 5, 1 atau 9 5 1 atau 9;5;1)") }, + modifier = Modifier.fillMaxWidth(), + keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Text) + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Row(verticalAlignment = Alignment.CenterVertically) { + Text("Urutkan:") + Spacer(modifier = Modifier.width(8.dp)) + RadioButton(selected = ascending, onClick = { ascending = true }) + Text("Ascending", modifier = Modifier.padding(end = 12.dp)) + RadioButton(selected = !ascending, onClick = { ascending = false }) + Text("Descending") + } + + Spacer(modifier = Modifier.height(12.dp)) + + Button(onClick = { + // Ambil semua angka yang valid (mendukung sign dan desimal, koma/dot sebagai pemisah desimal) + val regex = Regex("-?\\d+[\\.,]?\\d*") + val parsed = regex.findAll(input) + .map { it.value.replace(',', '.') } // ubah koma jadi dot supaya parseDouble berhasil + .mapNotNull { it.toDoubleOrNull() } + .toList() + + if (parsed.isEmpty()) { + error = "Tidak ditemukan angka valid. Gunakan pemisah koma/spasi/semicolon atau masukkan angka." + result = "" + } else { + val sorted = if (ascending) parsed.sorted() else parsed.sortedDescending() + result = sorted.joinToString(", ") { n -> + // tampilkan tanpa .0 jika integer + if (n % 1.0 == 0.0) n.toLong().toString() else n.toString() + } + error = null + } + }) { + Text("Urutkan") + } + + Spacer(modifier = Modifier.height(12.dp)) + + if (error != null) { + Text(text = error!!, color = MaterialTheme.colorScheme.error) + } + + Text( + text = "Hasil: $result", + style = MaterialTheme.typography.bodyLarge, + modifier = Modifier.padding(top = 8.dp) + ) + } +} + +@Preview(showBackground = true) +@Composable +fun PreviewProgram() { + ProgramPengurutanAngkaTheme { + ProgramPengurutanAngka() + } +}