로파스 Site Admin
가입: 2012년 9월 9일 올린 글: 280
|
올려짐: 2017년9월11일 20:09 주제: 숙제 2 공개 및 보충스펙 공지입니다.(0918 추가) |
|
|
안녕하세요,
숙제 2가 올라왔음을 알려드립니다.
내용 : http://ropas.snu.ac.kr/~kwang/4190.310/17/hw2.pdf
제출 : http://ropas.snu.ac.kr/~ta/4190.310/17/submit/index.pl
기한 : 9/28 밤 11시 59분
제출 페이지에서 학번을 아이디로 하여 가입(register)하신 다음 해당 계정으로 로그인하여 숙제를 제출하시면 됩니다. 가입 기간은 9/29 까지입니다.
* 과제 관련 주의 사항
과제를 하고 제출하기에 앞서 꼭 https://ropas.snu.ac.kr/phpbb/viewtopic.php?t=5853 글의 주의사항을 확인해 주세요.
* 뼈대코드
숙제 2는 뼈대코드가 없습니다
* 숙제 스펙 보충사항
(질문은 이 글에 답글로 달지 마시고, 별도의 글로 질문해 주시기 바랍니다)
Exercise 1 "참거짓"
----
Exercise 2 "k-친수"
----
Exercise 3 "친수의 합"
- 2친수를 정수로 변환해서 더한 다음, 다시 2친수로 변환하는 것은 문제의 의도에 부합하지 않습니다.
정수 더하기 연산자 + 를 사용하지 않고, 2친수 형태로 직접 더하기 연산을 하는 함수를 작성하시기 바랍니다.
----
Exercise 4 "CheckMetroMap"
- CONNECT of metro * metro는 두 metro가 모두 제대로 생겼을 경우에 제대로 생긴 것입니다.
----
Exercise 5 "짚-짚-나무"
- 아래 NOMOVE 예외를 선언해 주셔야 합니다.
코드: | exception NOMOVE of string |
-그리고, goLeft함수의 마지막 줄(네번째 줄)은 아래와 같이 수정해야 합니다.
(raise의 인자를 괄호로 감싸야 합니다.)
코드: | | LOC(t, HAND([],up,right)) -> raise (NOMOVE "left of first") |
- goDown은 자식 노드의 맨 왼쪽 으로 가는 것으로 하겠습니다. 갈 수 없을 경우 NOMOVE 예외로 처리해 주세요
(0918 추가)
goLeft와 goRight의 뜻에 대한 질문이 들어와서 보충합니다.
goLeft는 현재 위치의 sibling(같은 부모노드를 가지는 형제노드)중 가장 가까운 왼쪽 sibling으로 옮겨가는 함수입니다.
goRight도 마찬가지로 가장 가까운 오른쪽 형제노드로 옮겨가는 함수입니다.
goDown에 대한 위의 보충스펙과 함께 생각해보시면, goUp, goDown, goRight, goLeft 네 함수로, 트리의 모든 노드를 방문할 수 있다는 것을 알 수 있습니다.
----
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 예외도 따로 처리 하지 않고 그대로 예외를 내시면 됩니다. |
|