函数打印不正确

问题描述 投票:0回答:1

所以我必须创建一个“熄灯”游戏。我必须创建两个函数。一功能“翻转”

val flip : bool array array -> int -> int -> bool array array = <fun>

给定一个布尔矩阵和两个整数

i
j
。它否定了价值观 (true→false, false→true) 在矩阵中的位置 i, j 处,也取反 (最多)4 个水平/垂直相邻元素的值。

这是我的代码:

let matrixz = [|
  [|true; true; false; false|];
  [|false; false; true; true|];
  [|true; false; true; false|];
  [|true; false; false; true|]
|];;
    
let flip_matrix matrix a b =
  let n = Array.length matrix in
  for i = 1 to n do 
    let n1 = Array.length matrix in
    for j = 1 to n1 do
      if i = a && j = b then begin 
        matrix.(i).(j) <- not matrix.(i).(j);
        matrix.(i+1).(j) <- not matrix.(i+1).(j);
        matrix.(i).(j+1) <- not matrix.(i).(j+1); 
        matrix.(i).(j-1) <- not matrix.(i).(j-1);
        matrix.(i-1).(j) <- not matrix.(i-1).(j);
      end;
    done;
  done;
  matrix;; 

我认为这是正确的。但我还必须做另一个功能:

val print_matrix : bool array array -> unit = <fun>

给定一个布尔矩阵,它将其打印在屏幕上(true→“T”,false→“F”)。

这是我的代码:

let print_s matrix =
  let n = Array.length matrix in
  for i = 0 to n-1 do 
    let n1 = Array.length matrix in
    for j = 0 to n1-1 do
      print_string matrix.(i).(j);
    done; 
    print_string "/n";
  done;

这将是正确的输出:

# flip matrix 1 4;;
# print_matrix matrix;;
FTFT
TFFF
FFTT

我知道第二个函数不正确。

ocaml imperative
1个回答
0
投票

首先,您的代码将更容易判断其格式是否良好。空间很便宜,所以不要犹豫,使用它们。

let matrixz =         
  [|[|true; true; false; false|];
    [|false; false; true; true|];
    [|true; false; true; false|];
    [|true; false; false; true|]|]

let flip_matrix matrix a b =
  let n = Array.length matrix in
  for i = 1 to n do 
    let n1 = Array.length matrix in
    for j = 1 to n1 do
      if i = a && j = b then 
      begin 
        matrix.(i).(j) <- not matrix.(i).(j);
        matrix.(i + 1).(j) <- not matrix.(i+1).(j);
        matrix.(i).(j + 1) <- not matrix.(i).(j + 1); 
        matrix.(i).(j - 1) <- not matrix.(i).(j - 1);
        matrix.(i - 1).(j) <- not matrix.(i - 1).(j);
      end;
    done;
  done;
  matrix

这同样适用于您的

print_s
功能。

let print_s matrix =
  let n = Array.length matrix in
  for i = 0 to n - 1 do 
    let n1 = Array.length matrix in
    for j = 0 to n1 - 1 do
      print_string matrix.(i).(j);
    done; 
    print_string "/n";
  done

这可行,但有两个问题。

print_string matrix.(i).(j)
希望
matrix.(i).(j)
是一个字符串,但它是一个布尔值。您必须将其转换为字符串。 OCaml 是非常强类型的,因此它不会为您隐式执行这种转换。

第二个非常简单,当你弄清楚类型问题时。打印

/n
不会给你换行符。打印
\n
即可。或者您可以致电
print_newline

另外,您可能希望研究一下 Array 模块中的

iter
函数来实现打印。

let print_s matrix =
  let string_of_bool b = if b then "T" else "F" in
  let n = Array.length matrix in
  for i = 0 to n - 1 do 
    Array.iter (fun b -> print_string (string_of_bool b)) matrix.(i); 
    print_endline ()
  done

或者:

let print_s matrix =
  let string_of_bool b = if b then "T" else "F" in
  Array.iter 
    (fun row ->
       Array.iter (fun b -> print_string (string_of_bool b)) matrix.(i); 
       print_endline ()) 
    matrix
© www.soinside.com 2019 - 2024. All rights reserved.