# 11A — Sequential search dengan boolean
seq_boolean <- function(x, target) {
  if (anyNA(x)) stop("Data mengandung NA: tidak sah")
  ditemukan <- FALSE
  posisi <- 0
  i <- 1
  while (i <= length(x) && !ditemukan) {
    if (x[i] == target) {
      ditemukan <- TRUE
      posisi <- i
    }
    i <- i + 1
  }
  return(posisi)   # 0 jika tidak ditemukan
}

# 11B — Sequential search tanpa boolean (return saat ketemu)
seq_tanpa_boolean <- function(x, target) {
  if (length(x) == 0) return(0)
  for (i in seq_along(x)) {
    if (x[i] == target) return(i)
  }
  return(0)
}

# 11C — Sequential search pada data terurut (berhenti saat melebihi target)
seq_terurut <- function(x, target) {
  for (i in seq_along(x)) {
    if (x[i] == target) return(i)
    if (x[i] > target) return(0)   # berhenti lebih awal
  }
  return(0)
}

# 11D — Sentinel (target ditaruh di akhir, data asli dijaga)
seq_sentinel <- function(x, target) {
  n <- length(x)
  x_sentinel <- c(x, target)       # salinan, bukan x asli
  i <- 1
  while (x_sentinel[i] != target) i <- i + 1
  if (i <= n) return(i) else return(0)
}



# Pembahasan enam latihan pertemuan 11 ----
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))
## [1] 0
print(seq_tanpa_boolean(numeric(), 8))
## [1] 0
# 11C Terurut berhenti ketika nilai melebihi target.
print(seq_terurut(c(5, 10, 15, 20, 25), 12))
## [1] 0
# 11D Sentinel dan keutuhan data asli.
lat_awal <- lat_x
print(seq_sentinel(lat_x, 99))
## [1] 0
print(identical(lat_x, lat_awal))
## [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 mengandung NA: tidak sah"