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