(** Programmer avec des exceptions - Correction **)

exception Success;;

let contientNeg tab =
  try
    for i = 0 to Array.length tab - 1 do
      if tab.(i) < 0 then raise Success
    done;
    false
  with
    Success -> true
;;

assert(not(contientNeg [| 1 ; 0 ; 1 ; 3|]));; (*tableau parcouru en entier *)
assert(contientNeg [| -1 ; 0 ; 1 ; 3|]);; (* seul le premier element est examiné *)
assert(contientNeg [| 1 ; -1 ; 1 ; 3|]);; (* seuls les deux premiers elements sont examinés *)
assert(contientNeg [| 1 ; -1 ; 1 ; -3|]);; (* seuls les deux premiers elements sont examinés *)
assert(contientNeg [| 1 ; 0 ; 1 ; -3|]);; (*tableau parcouru en entier *)

let contientNeg2 tab =
  let ok = ref false in
  for i = 0 to Array.length tab - 1 do
    if tab.(i) < 0 then
      ok := true
  done;
  !ok
;;

assert(not(contientNeg2 [| 1 ; 0 ; 1 ; 3|]));; 
assert(contientNeg2 [| -1 ; 0 ; 1 ; 3|]);; 
assert(contientNeg2 [| 1 ; -1 ; 1 ; 3|]);;
assert(contientNeg2 [| 1 ; -1 ; 1 ; -3|]);;
assert(contientNeg2 [| 1 ; 0 ; 1 ; -3|]);; 


let contientNeg3 tab =
  let ok = ref false in
  let i = ref 0 in
  while !i < Array.length tab && not !ok do
    if tab.(!i) < 0 then begin
      ok := true
    end;
    i := !i + 1
  done;
  !ok
;;

assert(not(contientNeg3 [| 1 ; 0 ; 1 ; 3|]));; 
assert(contientNeg3 [| -1 ; 0 ; 1 ; 3|]);; 
assert(contientNeg3 [| 1 ; -1 ; 1 ; 3|]);;
assert(contientNeg3 [| 1 ; -1 ; 1 ; -3|]);;
assert(contientNeg3 [| 1 ; 0 ; 1 ; -3|]);; 


let contientNeg4 tab =
  let n = Array.length tab in
  let rec aux i = (* teste l'élément i et la suite si besoin*)
    if i < n then
      (tab.(i) < 0) || (aux (i+1))
    else
      false
  in
  aux 0
;;

assert(not(contientNeg4 [| 1 ; 0 ; 1 ; 3|]));; 
assert(contientNeg4 [| -1 ; 0 ; 1 ; 3|]);; 
assert(contientNeg4 [| 1 ; -1 ; 1 ; 3|]);;
assert(contientNeg4 [| 1 ; -1 ; 1 ; -3|]);;
assert(contientNeg4 [| 1 ; 0 ; 1 ; -3|]);; 


let contientNeg5 tab =
  Array.exists (fun x -> x < 0) tab
;;

assert(not(contientNeg5 [| 1 ; 0 ; 1 ; 3|]));; 
assert(contientNeg5 [| -1 ; 0 ; 1 ; 3|]);; 
assert(contientNeg5 [| 1 ; -1 ; 1 ; 3|]);;
assert(contientNeg5 [| 1 ; -1 ; 1 ; -3|]);;
assert(contientNeg5 [| 1 ; 0 ; 1 ; -3|]);;