Tugas Pertemuan 6 Pemrograman Perangkat Bergerak B
Nama : Fadaukas Daffa Tajuddin
NRP : 5025231149
Kelas : PPB (B)
Aplikasi Kalkulator Sederhana
1. Manajemen State (Variabel Input & Hasil)
var num1 by remember { mutableStateOf("") }
var num2 by remember { mutableStateOf("") }
var result by remember { mutableStateOf<String?>(null) }
Menggunakan mutableStateOf agar UI otomatis diperbarui saat nilai variabel berubah.
2. Manajemen State (Variabel Input & Hasil)
Column(
modifier = Modifier
.fillMaxSize()
.padding(24.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Simple Calculator", style = MaterialTheme.typography.headlineMedium)
Menggunakan Column dengan Arrangement.Center untuk memposisikan semua elemen di tengah layar secara vertikal.
3. Logika Perhitungan (Mendukung Desimal)
private fun calculate(n1: String, n2: String, op: (Double, Double) -> Double): String {
return try {
val a = n1.toDouble()
val b = n2.toDouble()
val res = op(a, b)
if (res == res.toLong().toDouble()) {
res.toLong().toString()
} else {
res.toString()
}
} catch (e: NumberFormatException) {
"Invalid input"
}
Fungsi calculate menerima input string, mengubahnya menjadi Double, dan melakukan operasi. Terdapat logika tambahan untuk menghilangkan .0 jika hasilnya adalah bilangan bulat.
4. Penanganan Pembagian dengan Nol
Button(onClick = {
if (num2.toDoubleOrNull() == 0.0) {
result = "Cannot divide by zero"
} else {
result = calculate(num1, num2) { a, b -> a / b }
}
}) {
Text("Div")
}
Logika khusus di dalam tombol pembagian (Div) untuk mencegah error aplikasi.
5. Hasil
package com.example.simplecalculator
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
var num1 by remember { mutableStateOf("") }
var num2 by remember { mutableStateOf("") }
var result by remember { mutableStateOf<String?>(null) }
Column(
modifier = Modifier
.fillMaxSize()
.padding(24.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Simple Calculator", style = MaterialTheme.typography.headlineMedium)
TextField(
value = num1,
onValueChange = { num1 = it },
label = { Text("Number 1") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
modifier = Modifier.padding(bottom = 8.dp)
)
TextField(
value = num2,
onValueChange = { num2 = it },
label = { Text("Number 2") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
modifier = Modifier.padding(bottom = 16.dp)
)
Row(
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
Button(onClick = {
result = calculate(num1, num2) { a, b -> a + b }
}) {
Text("Add")
}
Button(onClick = {
result = calculate(num1, num2) { a, b -> a - b }
}) {
Text("Sub")
}
Button(onClick = {
result = calculate(num1, num2) { a, b -> a * b }
}) {
Text("Mul")
}
Button(onClick = {
if (num2.toDoubleOrNull() == 0.0) {
result = "Cannot divide by zero"
} else {
result = calculate(num1, num2) { a, b -> a / b }
}
}) {
Text("Div")
}
}
if (result != null) {
Text(
text = "Result: $result",
style = MaterialTheme.typography.titleLarge,
modifier = Modifier.padding(top = 24.dp)
)
}
}
}
}
private fun calculate(n1: String, n2: String, op: (Double, Double) -> Double): String {
return try {
val a = n1.toDouble()
val b = n2.toDouble()
val res = op(a, b)
if (res == res.toLong().toDouble()) {
res.toLong().toString()
} else {
res.toString()
}
} catch (e: NumberFormatException) {
"Invalid input"
}
}
}
Komentar
Posting Komentar