Upload Tugas 2

This commit is contained in:
202310715274 DIMAS HENDRI PAMUNGKAS 2025-10-02 16:34:55 +07:00
parent 8989a224df
commit d4005ace70

115
Tugas2/MainActivity.kt Normal file
View 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()
}
}