이 문제는 각 부서별로 관리하는 데이터베이스를

하나로 모아 처리하는 프로시저를 만드는 문제입니다.

말은 거창하지만 그 개략적인 것만 얘기합니다.

 

c5

소스는 위와 같습니다.

 

 

a.

get-record는 위에서 만들었습니다.

(밑에 소스로 표시하겠습니다.)

get-record는 부서(division), 파일(file), 직원명(employee_name)을 인자로 받아

각 부서에 맞는 get-record 프로시저를 찾아 실행시킵니다.

따라서 각 부서 파일에는 그에 맞는 get-record 프로시저를 만들어 put하여야합니다.

 

 

b.

get-salary는 부서(division)과 기록(record)를 인자로 받습니다.

여기서 기록은 위에서 적은 get-record 프로시저를 돌린 결과입니다.

레코드가 어떤 구조를 갖추어야 하는지는 잘 모르겠습니다.

(그 문제의 뜻을 이해하지 못했다가 정답인 듯....)

 

 

c.

find-employee-record 프로시저는 인자로 직원 이름과 파일 리스트를 받으니

그 둘을 받아 각 파일에 get-record 프로시저를 돌리면 됩니다.

소스 안의 (division (car file_l))은 해당 파일의 부서를 내놓는 프로시저입니다.

 

사실 get-record 프로시저를 만들 때 file을 넣어야 하는가 고민하였습니다.

문제를 보면 '부서마다 인사 기록이 한 파일에 들어 있고'라고 되어있기에,

부서만 인자로 넘겨주면 그 파일을 찾는 것은 어렵지 않다고 생각했습니다.

하지만 c번 문제에서 파일 리스트라는 얘기를 하여 파일을 인자로 받게 하였습니다.

그럼 부서가 필요없을 듯싶지만

각 부서마다 구조가 다르기에 get-record 프로시저도 달라야합니다.

즉, 부서가 데이터 타입이 되는 것이지요.

그래서 뺄 수도 없으니 참으로 어렵습니다.;;;

 

 

d.

기록 파일에 위에서 만든 것 중 없는 것을 추가한 후

put 프로시저를 써서 표에 추가하여야합니다.

그 외에는 달라져야 할 것이 없는 듯싶습니다.

 

 

참조

해럴드 애빌슨, 김재우 역, <컴퓨터 프로그램의 구조와 해석>, 인사이트, 2007, pp. 240

 

 

 

; a
(define (get-record division file employee_name)
  ((get 'get-record division)) file employee_name)
; interface
(put 'get-record '(division_name) get-record)

; b
(define (get-salary division record)
  ((get 'get-salary division) record))
; interface
(put 'get-salary '(division_name) get-salary)

; c
(define (find-employee-record employee_name file_list)
  (define (iter file_l)
    (let ((result (get-record (division (car file_l)) (car file_l) employee_name)))
    (cond ((null? file_l) false)
          ((not (null? result)) result)
          (else (iter (cdr file_l))))))
  (iter null file_list))

; d

크리에이티브 커먼즈 라이선스
Creative Commons License

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1391

댓글을 달아 주세요

[로그인][오픈아이디란?]