최재승
가입: 2012년 9월 10일 올린 글: 211
|
올려짐: 2015년9월17일 17:10 주제: 숙제 2 공지 및 스펙 보충 |
|
|
안녕하세요,
숙제 2가 올라왔음을 알려드립니다.
내용 : http://ropas.snu.ac.kr/~kwang/4190.310/15/hw2.pdf
제출 : http://ropas.snu.ac.kr/~ta/4190.310/15/submit/index.pl
기한 : 9/30 밤 12시
제출 페이지에서 학번을 아이디로 하여 가입(register)하신 다음 해당 계정으로 로그인하여 숙제를 제출하시면 됩니다. 가입 기간은 9/29 까지입니다.
* 과제 관련 주의 사항
과제를 하고 제출하기에 앞서 꼭 https://ropas.snu.ac.kr/phpbb/viewtopic.php?t=4922 글의 주의사항을 확인해 주세요.
* 뼈대코드
숙제 2는 뼈대코드가 없습니다
* 숙제 스펙 보충사항
(질문은 이 글에 답글로 달지 마시고, 별도의 글로 질문해 주시기 바랍니다)
Exercise 1 "k-친수"
----
Exercise 2 "친수의 합"
- 2친수를 정수로 변환해서 더한 다음, 다시 2친수로 변환하는 것은 문제의 의도에 부합하지 않습니다.
정수 더하기 연산자 + 를 사용하지 않고, 2친수 형태로 직접 더하기 연산을 하는 함수를 작성하시기 바랍니다.
----
Exercise 3 "CheckMetroMap"
- CONNECT of metro * metro는 두 metro가 모두 제대로 생겼을 경우에 제대로 생긴 것입니다.
----
Exercise 4 "짚-짚-나무"
- 아래 NOMOVE 예외를 선언해 주셔야 합니다.
코드: | exception NOMOVE of string |
-그리고, goLeft함수의 마지막 줄(네번째 줄)은 아래와 같이 수정해야 합니다.
(raise의 인자를 괄호로 감싸야 합니다.)
코드: | | LOC(t, HAND([],up,right)) -> raise (NOMOVE "left of first") |
- goDown은 자식 노드의 맨 왼쪽 으로 가는 것으로 하겠습니다. 갈 수 없을 경우 NOMOVE 예외로 처리해 주세요
----
Exercise 5 "Galculator"
- 계산 식의 SIGMA, INTEGRAL 등의 의미는 우리가 수학적으로 알고 있는 그것과 동일합니다. 헷갈리기 쉬운 몇몇 경우에 대해서는 다음과 같이 정하겠습니다.
(1) SIGMA 계산시 시작 값이 끝 값보다 클 경우 0을 리턴합니다.
(2) INTEGRAL(a, b, f)에서 a>b인 경우, -INTEGRAL(b,a, f) 의 값을 계산하시면 됩니다.
(3) INTEGRAL 계산시 시작과 끝 값의 차가 0.1 미만인 경우 0을 리턴합니다.
(4) SIGMA, INTEGRAL 는 구간을 정의하는 첨자로 어떤 exp든 받을 수 있습니다.
SIGMA에서 이 첨자로 실수(float)가 들어올 경우, 이를 정수로 바꾸어 계산합니다.
실수 -> 정수 변환에는 OCaml 내장 함수인 int_of_float 을 사용하는 것으로 하겠습니다.
(5) INTEGRAL 계산시 구분구적법 형태로 계산하게 되는데, 이 때 고려하는 직사각형의 높이는 왼쪽 함수값을 기준으로 합니다.
즉, f 함수의 적분 계산시 구분구적법에서 구간 [a, b]를 만나면 해당하는 직사각형의 높이는 f(a) 가 됩니다.
(6) SIGMA(1.9, 1.1, f)와 같은 식의 경우 위의 (1)과 (4) 중에 어떤 것을 먼저 적용하는지에 따라 결과값이 0이 될 수도 있고 f(1)이 될 수도 있습니다.
이런 경우는 테스트하지 않겠습니다. 즉, 어떻게 구현해도 무방합니다.
- OCaml floating-point arithmetic 의 불확실성에 의해 발생할 수 있는 계산 오차는 무시하셔도 됩니다.
(예를 들어, 1.1 -. 1.0 > 0.1 식이 true 가 리턴되는 현상)
결과로 계산된 값에 오차 범위를 주어 채점할 예정이며, 테스트 케이스 또한 논란의 여지가 없는 식을 사용할 예정입니다.
- 변수로 주어지는 X는 항상 변수를 감싸고 있는 가장 안쪽의 SIGMA 또는 INTEGRAL 에 묶이는 것으로 합니다.
가장 안쪽의 어떤 SIGMA, INTEGRAL 도 없다면 FreeVariable 예외 예외를 내시면 됩니다.
FreeVariable예외를 아래 코드처럼 정의하시고, 숙제 제출시 포함해 주세요.
코드: | exception FreeVariable |
- 사칙 연산에는 OCaml의 실수(float) 연산을 사용하도록 합니다.
float 의 infinity/neg_infinity/nan 을 그대로 계산에 사용하며, 정수 -> 실수 변환에는 OCaml 내장 함수인 float_of_int 를 사용하도록 하겠습니다.
--
Exercise 6 "Queue = 2 Stacks"
- 어떤 코드를 작성해야 하는지에 대해서 : 숙제의 템플릿을 그대로 따라가는 IntListQ 모듈을 구현하는 것으로 하겠습니다.
숙제 문서에 정의된 module type Queue를 숙제 파일에 포함하시고, 제시된 IntListQ 모듈을 완성하세요.
- 구현하신 IntListQ가 Queue 모듈 타입을 만족하는지 확인해 보시려면, 끝에 아래와 같이 한 줄을 추가하고 제대로 컴파일되는지 확인해 보시면 됩니다.
물론 제출하실 때에는 이 라인은 지워주셔야 합니다.
코드: | module ValidIntListQ = (IntListQ : Queue) |
--
Exercise 7 "계산실행"
- 숙제 문서에 나온 예제의 1, 2 등의 숫자를 모두 NUM 1, NUM 2 등으로 수정.
- 모듈 타입(시그니쳐) ZEXPR를 아래와 같이 변경하는 것으로 하겠습니다. 숙제 문서에 나온 대로, 이러한 모듈 타입을 갖는 모듈 Zexpr을 작성하시면 됩니다.
코드: |
module type ZEXPR =
sig
exception Error of string
type id = string
type expr =
| NUM of int
| PLUS of expr * expr
| MINUS of expr * expr
| MULT of expr * expr
| DIVIDE of expr * expr
| MAX of expr list
| VAR of id
| LET of id * expr * expr
type environment
type value
val emptyEnv : environment
val eval : environment * expr -> value
val print_value : value -> unit
end
module Zexpr : ZEXPR =
struct
(* Implement this module *)
end
|
1) 문법을 ocaml에 맞게 조금 수정한 것입니다.
2) 수정된 모듈 타입(시그니처)에는 구현해야 할 함수에 print_value가 추가되어 있습니다.
숙제 문서에는 "성공적으로 끝나면 최종 값을 프린트하고 끝나게 됩니다."라고 되어있는데, 이 print_value 함수를 구현하는 것으로 하겠습니다.
print_value함수는 계산된 결과값을, 10진수 형태로 표준 출력해야 합니다. ("1", "-2", "100" 등)
뒤에 개행(newline)문자는 출력하셔도 되고, 안 붙이셔도 됩니다.
예를 들어 다음과 같이 쓰면 표준 출력으로 문자열 "1"이 출력되어야 합니다.
코드: |
let _ = Zexpr.print_value (Zexpr.eval (Zexpr.emptyEnv, Zexpr.NUM 1))
|
- Error 예외 문자열을 다음과 같이 구분합니다.
1) 현재 환경에서 정의되지 않은 이름이 사용될 때 : "FreeVariable"
- 합, 곱, 나누기 등의 모든 사칙연산은 정수 사칙 연산을 따르도록 합니다. 예를 들어, DIVIDE(3,2)의 결과값은 1.5가 아닌 1입니다. 정수에서의 Division_by_zero 예외도 따로 처리 하지 않고 그대로 예외를 내시면 됩니다.
-- |
|