(*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*) (* Nicolas Pécheux *) (* Sunday, 06 May 2018 *) (* http://cpge.info *) (*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*) (*** Quelques exercices sur les tableaux ***) (** Question 1 **) let init n f = let tab = Array.make n (f 0) in for i = 1 to n - 1 do tab.(i) <- f i done; tab ;; (** Question 2 **) let range n = init n (fun i -> i);; (** Question 3 **) let fibonacci_tab n = let tab = Array.make (n + 1) 0 in tab.(1) <- 1; for i = 2 to n do tab.(i) <- tab.(i - 1) + tab.(i - 2) done; tab.(n) ;; (** Question 4 **) (* C'est l'analogue de List.map, on a donc map_array f tab = [|f tab.(0), f tab.(1), ..., f tab.(n - 1)|] *) let map_array f tab = let n = Array.length tab in (* On doit traiter le cas n = 0 à part *) if n = 0 then [||] else init n (fun i -> f tab.(i)) ;; (* Cette fonction aussi est déjà définie en Caml *) Array.map;; (** Question 5 **) (* Dans la version proposée, on écrase la moitié du tableau *) let echange i j tableau = let tmp = tableau.(i) in tableau.(i) <- tableau.(j); tableau.(j) <- tmp; ;; let miroir tableau = let n = Array.length tableau in for i = 0 to (n / 2) - 1 do echange i (n - i - 1) tableau done ;; (** Question 6 **) let of_list liste = let n = List.length liste in if n = 0 then [||] else begin let t = Array.make n (List.hd liste) in let rec remplir i liste = match liste with | [] -> () | tete :: queue -> t.(i) <- tete; remplir (i + 1) queue in remplir 1 (List.tl liste); t end ;; let to_list tableau = let n = Array.length tableau in let rec ajoute i = if i = n then [] else tableau.(i) :: (ajoute (i + 1)) in ajoute 0; ;; (** Question 7 **) (* La version éronnée est un tableau de pointeurs pointant tous sur le même tableau. *) (** Question 8 **) let make_matrix nb_lignes nb_cols val_init = let matrix = Array.make nb_lignes [||] in for i = 0 to nb_lignes - 1 do matrix.(i) <- Array.make nb_cols val_init done; matrix ;; (** Question 9 **) let make_tenseur nb_lignes nb_cols nb_prof val_init = let matrix = Array.make nb_lignes [||] in for i = 0 to nb_lignes - 1 do matrix.(i) <- Array.make_matrix nb_cols nb_prof val_init done; matrix ;; (** Question 10 **) (* La version proposée est une copie superficielle : on ne copie que les pointeurs, donc une modification de l'ancienne matrice modifiera la copie. *) (** Question 11 **) let copy_matrix m = let n = Array.length m in let copie = Array.make n [||] in for i = 0 to n - 1 do copie.(i) <- Array.copy m.(i) done; copie ;; (** Question 12 **) let dimension matrice = let n = Array.length matrice in let p = Array.length matrice.(0) in for i = 0 to n - 1 do if Array.length matrice.(i) <> p then failwith "Hey, ce n'est pas une matrice, ça !!" done; (n, p) ;; (** Question 13 **) let add_matrix m1 m2 = let (n, p) = dimension m1 in let somme = Array.make_matrix n p (m1.(0).(0) +. m2.(0).(0)) in for i = 0 to n - 1 do for j = 0 to p - 1 do somme.(i).(j) <- m1.(i).(j) +. m2.(i).(j) done; done; somme ;; (** Question 14 **) let transposee m = let n, p = dimension m in let m_t = Array.make_matrix p n m.(0).(0) in for i = 0 to n - 1 do for j = 0 to p - 1 do m_t.(j).(i) <- m.(i).(j) done; done; m_t ;; let transposer m = (* Ici, la matrice doit être carrée *) let n = Array.length m in for i = 0 to n - 1 do for j = 0 to i - 1 do echange i j m; done; done ;;