# Fungsi Sequential Boolean
seq_boolean <- function(data, target) {
if (any(is.na(data))) {
stop("Data tidak boleh mengandung NA!")
}
ketemu <- FALSE
posisi <- NA
for (i in seq_along(data)) {
if (data[i] == target) {
ketemu <- TRUE
posisi <- i
break
}
}
return(posisi)
}
# Fungsi Sequential Tanpa Boolean
seq_tanpa_boolean <- function(data, target) {
if (any(is.na(data))) {
stop("Data tidak boleh mengandung NA!")
}
for (i in seq_along(data)) {
if (data[i] == target) {
return(i)
}
}
return(NA)
}
# Fungsi Sequential Terurut
seq_terurut <- function(data, target) {
if (any(is.na(data))) {
stop("Data tidak boleh mengandung NA!")
}
if (is.unsorted(data)) {
stop("Data harus terurut!")
}
for (i in seq_along(data)) {
if (data[i] == target) {
return(i)
} else if (data[i] > target) {
break
}
}
return(NA)
}
# Fungsi Sequential dengan Sentinel
seq_sentinel <- function(data, target) {
if (any(is.na(data))) {
stop("Data tidak boleh mengandung NA!")
}
data_baru <- c(data, target)
posisi <- 1
while (data_baru[posisi] != target) {
posisi <- posisi + 1
}
if (posisi > length(data)) {
return(NA)
}
return(posisi)
}
# 11A Sequential Boolean
lat_x <- c(12, 7, 19, 7, 25)
hasil_11A <- seq_boolean(lat_x, 7)
print(hasil_11A)
## [1] 2
cat("Target 7 ditemukan pada posisi", hasil_11A, "\n")
## Target 7 ditemukan pada posisi 2
cat("Status ketemu berubah menjadi TRUE setelah elemen kedua diperiksa.\n")
## Status ketemu berubah menjadi TRUE setelah elemen kedua diperiksa.
# 11B Sequential Tanpa Boolean
hasil_11B_data <- seq_tanpa_boolean(lat_x, 8)
hasil_11B_kosong <- seq_tanpa_boolean(numeric(), 8)
cat("Hasil pada data Latihan 11A:\n")
## Hasil pada data Latihan 11A:
print(hasil_11B_data)
## [1] NA
cat("Hasil pada larik kosong:\n")
## Hasil pada larik kosong:
print(hasil_11B_kosong)
## [1] NA
# 11C Sequential Terurut
data_11C <- c(5, 10, 15, 20, 25)
hasil_11C <- seq_terurut(data_11C, 12)
print(hasil_11C)
## [1] NA
cat("Pencarian berhenti ketika membaca nilai 15 karena 15 lebih besar dari target 12.\n")
## Pencarian berhenti ketika membaca nilai 15 karena 15 lebih besar dari target 12.
# 11D Sequential Sentinel
lat_awal <- lat_x
hasil_11D <- seq_sentinel(lat_x, 99)
data_tetap <- identical(lat_x, lat_awal)
cat("Hasil pencarian:\n")
## Hasil pencarian:
print(hasil_11D)
## [1] NA
cat("Apakah data awal tidak berubah?\n")
## Apakah data awal tidak berubah?
print(data_tetap)
## [1] TRUE
cat("Sentinel ditambahkan pada posisi", length(lat_x) + 1, "\n")
## Sentinel ditambahkan pada posisi 6
# 11E Match dan Which
hasil_match <- match(7, lat_x)
hasil_which <- which(lat_x == 7)
cat("Posisi pertama dengan match():\n")
## Posisi pertama dengan match():
print(hasil_match)
## [1] 2
cat("Seluruh posisi dengan which():\n")
## Seluruh posisi dengan which():
print(hasil_which)
## [1] 2 4
# 11F Penanganan NA
hasil_11F <- tryCatch(
seq_boolean(c(12, NA, 19), 19),
error = function(e) conditionMessage(e)
)
print(hasil_11F)
## [1] "Data tidak boleh mengandung NA!"