Upload Tugas 2
This commit is contained in:
parent
8989a224df
commit
d4005ace70
115
Tugas2/MainActivity.kt
Normal file
115
Tugas2/MainActivity.kt
Normal file
@ -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<String?>(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()
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user