SierpinskiCarpet.ob07 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. (*
  2. adapted to Oberon-07 by 0CodErr, KolibriOS team
  3. *)
  4. MODULE SierpinskiCarpet;
  5. IMPORT In, Out, Console;
  6. VAR
  7. order: INTEGER;
  8. PROCEDURE pow(b, n: INTEGER): INTEGER;
  9. VAR
  10. i, res: INTEGER;
  11. BEGIN
  12. res := 1;
  13. FOR i := 1 TO n DO
  14. res := res * b
  15. END
  16. RETURN res
  17. END pow;
  18. PROCEDURE in_carpet(x, y: INTEGER): BOOLEAN;
  19. VAR
  20. res, exit: BOOLEAN;
  21. BEGIN
  22. exit := FALSE;
  23. res := TRUE;
  24. WHILE (x > 0) & (y > 0) & (exit = FALSE) DO
  25. IF (x MOD 3 = 1) & (y MOD 3 = 1) THEN
  26. res := FALSE;
  27. exit := TRUE
  28. END;
  29. y := y DIV 3;
  30. x := x DIV 3
  31. END
  32. RETURN res
  33. END in_carpet;
  34. PROCEDURE PrintSierpinski(n: INTEGER);
  35. VAR
  36. i, j, l: INTEGER;
  37. BEGIN
  38. l := pow(3, n) - 1;
  39. FOR i := 0 TO l DO
  40. FOR j := 0 TO l DO
  41. IF in_carpet(i, j) THEN
  42. Out.Char("#")
  43. ELSE
  44. Out.Char(" ")
  45. END
  46. END;
  47. Out.Ln
  48. END
  49. END PrintSierpinski;
  50. BEGIN
  51. Console.open;
  52. Out.String("Input carpet order(0..3):");
  53. In.Int(order);
  54. PrintSierpinski(order);
  55. In.Ln;
  56. Console.exit(TRUE)
  57. END SierpinskiCarpet.