# Pembahasan enam latihan pertemuan 11 ----
# 11A. Sequential Boolean: Mencari posisi pertama dari target
seq_boolean <- function(arr, target) {
if (any(is.na(arr))) {
stop("Data tidak sah (mengandung NA)")
}
pos <- match(target, arr)
if (is.na(pos)) {
return(NULL)
}
return(pos)
}
# 11B. Sequential Tanpa Boolean: Mengembalikan NULL atau larik kosong jika target tidak ada
seq_tanpa_boolean <- function(arr, target) {
if (length(arr) == 0) {
return(numeric(0))
}
pos <- which(arr == target)
if (length(pos) == 0) {
return(numeric(0))
}
return(pos)
}
# 11C. Sequential Terurut: Berhenti ketika nilai melebihi target
seq_terurut <- function(arr, target) {
for (i in seq_along(arr)) {
if (arr[i] > target) {
return(i) # Mengembalikan indeks saat nilai melebihi target
}
}
return(NULL)
}
# 11D. Sentinel dan keutuhan data asli (pass-by-value aman)
seq_sentinel <- function(arr, sentinel_val) {
# Menambahkan sentinel di akhir larik secara lokal
arr_sentinel <- c(arr, sentinel_val)
return(arr_sentinel)
}
# PENGUJIAN LATIHAN (ENAM LATIHAN)
lat_x <- c(12, 7, 19, 7, 25)
# 11A Sequential Boolean posisi pertama 7.
print(seq_boolean(lat_x, 7))
## [1] 2
# 11B Tanpa Boolean target tidak ada dan larik kosong.
print(seq_tanpa_boolean(lat_x, 8))
## numeric(0)
print(seq_tanpa_boolean(numeric(), 8))
## numeric(0)
# 11C Terurut berhenti ketika nilai melebihi target.
print(seq_terurut(c(5, 10, 15, 20, 25), 12))
## [1] 3
# 11D Sentinel dan keutuhan data asli.
lat_awal <- lat_x
print(seq_sentinel(lat_x, 99))
## [1] 12 7 19 7 25 99
print(identical(lat_x, lat_awal)) # Memastikan data asli tidak berubah
## [1] TRUE
# 11E Posisi pertama berbeda dengan semua posisi.
print(match(7, lat_x))
## [1] 2
print(which(lat_x == 7))
## [1] 2 4
# 11F Data tidak sah ditolak dan pesan ditangkap.
print(tryCatch(
seq_boolean(c(12, NA, 19), 19),
error = function(e) conditionMessage(e)
))
## [1] "Data tidak sah (mengandung NA)"