Aplikasi Kalkulator & Koversi Suhu 📱

  Furstin Aprilavia Putri - 5025221234 - PPB D

Membuat Aplikasi Kalkulator dengan menggunakan Kotlin

1. Pendahuluan

Kali ini saya membuat aplikasi Android sederhana menggunakan Jetpack Compose yang memiliki dua fitur utama, yaitu :

    1. Kalkulator Aritmatika Dasar

    2. Konversi Suhu dari Celsius ke Fahrenheit dan Kelvin

2. Aplikasi Sederhana

Kode lengkap bisa dilihat di GitHub : https://github.com/furstinvia/ppb-d-5-calculator.git



🧮 Kalkulator Aritmatika Dasar (CalculatorUI())

Fitur kalkulator memanfaatkan dua TextField untuk input angka, serta tombol operasi (+, -, *, /) yang memanggil fungsi calculate().

var num1 by remember { mutableStateOf("0") }
var num2 by remember { mutableStateOf("0") }
var result by remember { mutableStateOf<String?>(null) }

Input & Tombol Operasi:

TextField(value = num1, onValueChange = { num1 = it }, label = { Text("Angka Pertama") })
TextField(value = num2, onValueChange = { num2 = it }, label = { Text("Angka Kedua") })

Row {
    Button(onClick = { result = calculate(num1, num2, "+") }) { Text("Add") }
    Button(onClick = { result = calculate(num1, num2, "-") }) { Text("Sub") }
    Button(onClick = { result = calculate(num1, num2, "*") }) { Text("Mul") }
    Button(onClick = { result = calculate(num1, num2, "/") }) { Text("Div") }
}

Fungsi Hitung:

private fun calculate(n1: String, n2: String, operator: String): String {
    return try {
        val a = n1.toInt()
        val b = n2.toInt()
        when (operator) {
            "+" -> (a + b).toString()
            "-" -> (a - b).toString()
            "*" -> (a * b).toString()
            "/" -> if (b != 0) (a / b).toString() else "Error: divide by zero"
            else -> "Invalid"
        }
    } catch (e: NumberFormatException) {
        "Invalid input"
    }
}

🌡️ Konversi Suhu (TemperatureConverterUI())

Fitur ini mengkonversi suhu dari Celsius ke Fahrenheit dan Kelvin dengan tombol aksi masing-masing.

var inputTemp by remember { mutableStateOf("0") }
var resultTemp by remember { mutableStateOf("") }

Input & Tombol Konversi:

TextField(
    value = inputTemp,
    onValueChange = { inputTemp = it },
    label = { Text("Suhu dalam Celcius") }
)

Button(onClick = {
    val c = inputTemp.toDoubleOrNull()
    resultTemp = if (c != null) {
        val f = c * 9 / 5 + 32
        "Fahrenheit: %.2f".format(f)
    } else "Invalid input"
}) { Text("To Fahrenheit") }

Button(onClick = {
    val c = inputTemp.toDoubleOrNull()
    resultTemp = if (c != null) {
        val k = c + 273.15
        "Kelvin: %.2f".format(k)
    } else "Invalid input"
}) { Text("To Kelvin") }

Aplikasi ini merupakan contoh implementasi dua fitur interaktif dalam satu aplikasi Compose:

- Kalkulator Aritmatika (add, sub, mul, div)

- Konversi Suhu (Celsius → Fahrenheit/Kelvin)

Menggunakan Jetpack Compose membuat struktur UI lebih bersih dan terpisah dari logika.

3. Video Presentasi

atau klik disini

Kode Lengkap

package com.example.calculator

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.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.calculator.ui.theme.CalculatorTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            CalculatorTheme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                    Column(
                        modifier = Modifier
                            .padding(innerPadding)
                            .padding(16.dp)
                            .fillMaxSize(),
                        verticalArrangement = Arrangement.Top,
                        horizontalAlignment = Alignment.CenterHorizontally
                    ) {
                        CalculatorUI()
                        Spacer(modifier = Modifier.height(32.dp))
                        Divider()
                        Spacer(modifier = Modifier.height(32.dp))
                        TemperatureConverterUI()
                    }
                }
            }
        }
    }

    @Composable
    fun CalculatorUI() {
        var num1 by remember { mutableStateOf("0") }
        var num2 by remember { mutableStateOf("0") }
        var result by remember { mutableStateOf<String?>(null) }

        Column(
            modifier = Modifier.fillMaxWidth(),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(
                text = "Calculator by Furstin Aprilavia",
                fontSize = 20.sp,
                fontWeight = FontWeight.Bold
            )
            Spacer(modifier = Modifier.height(16.dp))

            TextField(
                value = num1,
                onValueChange = { num1 = it },
                label = { Text("Angka Pertama") },
                modifier = Modifier.fillMaxWidth()
            )
            Spacer(modifier = Modifier.height(8.dp))
            TextField(
                value = num2,
                onValueChange = { num2 = it },
                label = { Text("Angka Kedua") },
                modifier = Modifier.fillMaxWidth()
            )
            Spacer(modifier = Modifier.height(16.dp))

            Row(
                horizontalArrangement = Arrangement.SpaceBetween,
                modifier = Modifier.fillMaxWidth()
            ) {
                Button(onClick = {
                    result = calculate(num1, num2, "+")
                }) {
                    Text("Add")
                }
                Button(onClick = {
                    result = calculate(num1, num2, "-")
                }) {
                    Text("Sub")
                }
                Button(onClick = {
                    result = calculate(num1, num2, "*")
                }) {
                    Text("Mul")
                }
                Button(onClick = {
                    result = calculate(num1, num2, "/")
                }) {
                    Text("Div")
                }
            }

            Spacer(modifier = Modifier.height(24.dp))

            Text(
                text = "Result: ${result ?: ""}",
                style = MaterialTheme.typography.bodyLarge,
                fontSize = 18.sp
            )
        }
    }

    private fun calculate(n1: String, n2: String, operator: String): String {
        return try {
            val a = n1.toInt()
            val b = n2.toInt()
            when (operator) {
                "+" -> (a + b).toString()
                "-" -> (a - b).toString()
                "*" -> (a * b).toString()
                "/" -> if (b != 0) (a / b).toString() else "Error: divide by zero"
                else -> "Invalid"
            }
        } catch (e: NumberFormatException) {
            "Invalid input"
        }
    }

    @Composable
    fun TemperatureConverterUI() {
        var inputTemp by remember { mutableStateOf("0") }
        var resultTemp by remember { mutableStateOf("") }

        Column(
            modifier = Modifier.fillMaxWidth(),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(
                text = "Konversi Suhu by Furstin Aprilavia",
                fontSize = 20.sp,
                fontWeight = FontWeight.Bold
            )
            Spacer(modifier = Modifier.height(16.dp))

            TextField(
                value = inputTemp,
                onValueChange = { inputTemp = it },
                label = { Text("Suhu dalam Celcius") },
                modifier = Modifier.fillMaxWidth()
            )
            Spacer(modifier = Modifier.height(16.dp))

            Row(
                horizontalArrangement = Arrangement.SpaceEvenly,
                modifier = Modifier.fillMaxWidth()
            ) {
                Button(onClick = {
                    val c = inputTemp.toDoubleOrNull()
                    resultTemp = if (c != null) {
                        val f = c * 9 / 5 + 32
                        "Fahrenheit: %.2f".format(f)
                    } else {
                        "Invalid input"
                    }
                }) {
                    Text("To Fahrenheit")
                }

                Button(onClick = {
                    val c = inputTemp.toDoubleOrNull()
                    resultTemp = if (c != null) {
                        val k = c + 273.15
                        "Kelvin: %.2f".format(k)
                    } else {
                        "Invalid input"
                    }
                }) {
                    Text("To Kelvin")
                }
            }

            Spacer(modifier = Modifier.height(16.dp))

            Text(
                text = resultTemp,
                style = MaterialTheme.typography.bodyLarge,
                fontSize = 18.sp
            )
        }
    }
}

Comments