게시판 인덱스

 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

사소한 질문일수있는데요,,,,

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2008)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
구본영
손님





올리기올려짐: 2008년9월4일 11:59    주제: 사소한 질문일수있는데요,,,, 인용과 함께 답변

> (define biggest (lambda (x y z) (cond (>= (ads x) (ads y)
(if (> (ads x) (ads z))
(ads x) (ads z)))

(<= (ads x) (ads y)
(if (> (ads x) (ads z))
(ads y)
(if (> (ads y) (ads z))
(ads y) (ads z)))))))



> (define biggest (lambda (x y z) (cond (> (ads x) (ads y)
(if (> (ads x) (ads z))
(ads x) (ads z)))

(< (ads x) (ads y)
(if (> (ads x) (ads z))
(ads y)
(if (> (ads y) (ads z))
(ads y) (ads z)))))))

첫 실습 핸드아웃의 4번문제요,,,세 값을 받아서 절대값이 가장큰걸 출력하는 함수인데요,,,

cond를 써서하는데 등호가 붙지 않아도

> (biggest 8 8 9)
9

x와y가 같을때에도 정상적인 출력을 하더라구요,,죄송한데 답변좀요 초보라서ㅠㅠ
위로
정영범



가입: 2005년 9월 5일
올린 글: 167

올리기올려짐: 2008년9월4일 12:43    주제: cond 구문의 예외 처리 인용과 함께 답변

일단 올려주신 프로그램은 오류가 있습니다. 아래가 맞는 프로그램입니다.

코드:

(define biggest
  (lambda (x y z)
    (cond ((>= (ads x) (ads y))
        (if (>= (ads x) (ads z))
       (ads x) (ads z)))
     ((< (ads x) (ads y))
        (if (> (ads x) (ads z))
       (ads y)
       (if (> (ads y) (ads z))
           (ads y) (ads z)))))))


3번째 줄에 (>= (ads x) (ads y))을 감싸는 괄호가 빠져 있습니다. 6번째 줄도 마찬가지입니다. 따라서, 작성하신 프로그램은 원하는 대로 동작하지 않습니다.

1. cond를 사용하실때는 항상 예외 사항이 없도록 프로그래밍을 하셔야 합니다.
코드:

1 ]=> (define cond_test (lambda (x) (cond ((= x 0) 1))))

;Value: cond_test

1 ]=> (cond_test 0)

;Value: 1

1 ]=> (cond_test 1)

;Unspecified return value

1 ]=>


위에 예에서 cond_test는 인자가 0일때만 제대로 작동합니다.
따라서, cond를 쓰실때는 항상 마지막 condition expression은 else를 사용하시길 권장합니다. 또, branch가 2개일때는 가급적 if expression을 사용하세요.

2. 질문자께서 작성한 코드가 신기하게도 돌아가는 이유는 scheme의 조금은 엉성해 보이는 의미(semantics) 때문입니다. 약한 타입 시스템같은..

코드:

13 error> (if > 0 1)

;Value: 0

13 error> (if () 0 1)

;Value: 0

13 error> (if (+ 1 1) 0 1)

;Value: 0

13 error>


위의 예를 보시면 if 문의 조건식(conditional expression)이 와야할 자리에 참,거짓을 판단할 수 없는 expression들이 들어가 있습니다. Type이 맞지 않는 것이죠. 하지만, scheme에서는 조건문이 정확히 거짓값이 아니면 무조건 첫번째 expression을 전체의 값으로 돌려줍니다. 그렇기 때문에, 질문자께서 작성한 프로그램이 작동하는 것처럼 보이는 것이죠. 위와 같은 사실을 알고 잘 따져보면 잘못된 값을 내는 테스트를 찾으실 수 있을 겁니다. 찾으시면 답변을 달아주세요. 좋은 질문 감사합니다. Very Happy
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2008) 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
Translated by kss & drssay