PPT - 프로그래밍언어 연구실

Download Report

Transcript PPT - 프로그래밍언어 연구실

명령형 프로그래밍 - II
(Imperative Programming)
박성우
2008년 6월 5일
공지사항
• 강의평가: 다음주 금요일까지
• 마지막 수업: 다음주 화요일
– 다음주 목요일: 학부 1학년 Study Day
– 반드시 참석할 것
• HW8 Contest 결과 공개
• 성적 평가에 대한 공지
• 기말고사
– 6월 18일 (수) 14:00-17:00, 대강당
– 전범위 (강의, 랩, 숙제)
2
참조자 (Reference)
• C 언어의 변수와 같음
# let x = ref 0;;
val x : int ref = {contents = 0}
# !x;;
- : int = 0
# x := !x + 1;;
- : unit = ()
# !x;;
- : int = 1
3
반복구문 (Loop)
• for, while 반복 구문 지원
# let sum n =
let s = ref 0 in
for i = 0 to n do
s := !s + i
done;
!s;;
val sum : int -> int = <fun>
# let rec sum n =
if n = 0 then 0
else (sum (n - 1)) + n;;
4
배열 (Array)
배열 (Array)
• 정의
– 같은 타입의 원소로 이루어진 집합
• 타입 'a array
– 'a 타입의 원소로 이루어진 배열의 타입
• 길이
– 일단 생성되면 변하지 않음
• 생성
# [| |] ;;
- : 'a array = [||]
# [| 1; 2; 3 |];;
- : int array = [|1; 2; 3|]
# [| 1.0; 2.0; 3.0 |];;
- : float array = [|1.; 2.; 3.|]
6
배열 원소의 이용
• 배열.(원소의 위치)
• 위치는 0부터 시작
# let x = [| 1; 2; 3 |];;
val x : int array = [|1; 2; 3|]
# x.(0);;
- : int = 1
# x.(1);;
- : int = 2
# x.(2);;
- : int = 3
# x.(3);;
Exception: Invalid_argument "index out of bounds".
7
배열 원소의 갱신
• 배열의 원소를 새로운 원소로 갱신할 수 있음
• 배열.(원소의 위치) <- 새로운 값
# let x = [| 1; 2; 3 |];;
val x : int array = [|1; 2; 3|]
# x.(0) <- 4;;
- : unit = ()
# x;;
- : int array = [|4; 2; 3|]
# x.(0);;
- : int = 4
8
Array 라이브러리
• Array.length : 'a array -> int
– Array.length l은 배열 l의 길이를 반환한다
• Array.make : int -> 'a -> 'a array
– Array.make n x은 모든 원소가 x로 초기화 된
길이 n의 배열을 생성한다
• Array.init : int -> (int -> 'a) -> 'a array
– Array.init n f는 i번째 원소가 f(i)인 길이 n의
배열을 생성한다
9
Array.length
• Array.length : 'a array -> int
– Array.length l은 배열 l의 길이를 반환한다
# let x = [| 1; 2; 3 |];;
val x : int array = [|1; 2; 3|]
# Array.length x;;
- : int = 3
10
Array.make
• Array.make : int -> 'a -> 'a array
– Array.make n x은 모든 원소가 x로 초기화 된
길이 n의 배열을 생성한다
# Array.make 3 1;;
- : int array = [|1; 1; 1|]
# Array.make 5 1.0;;
- : float array = [|1.; 1.; 1.; 1.; 1.|]
11
Array.init
• Array.init : int -> (int -> 'a) -> 'a array
– Array.init n f는 i번째 원소가 f(i)인 길이 n의
배열을 생성한다
# Array.init 5 (fun x -> x mod 2 = 0);;
- : bool array = [|true; false; true; false; true|]
# Array.init 5 (fun x -> x);;
- : int array = [|0; 1; 2; 3; 4|]
12
예: 두 배열의 더하기
#let add_vect v1 v2 =
let len = min (Array.length v1) (Array.length v2) in
let res = Array.make len 0.0 in
for i = 0 to len - 1 do
res.(i) <- v1.(i) +. v2.(i)
done;
res;;
val add_vect :
float array -> float array -> float array = <fun>
#add_vect [| 1.0; 2.0 |] [| 3.0; 4.0 |];;
- : float array = [|4.; 6.|]
13
예: 삽입정렬
#let insertion_sort a =
for i = 1 to Array.length a - 1 do
let val_i = a.(i) in
let j = ref i in
while !j > 0 && val_i < a.(!j - 1) do
a.(!j) <- a.(!j - 1);
j := !j - 1
done;
a.(!j) <- val_i
done;;
val insertion_sort : 'a array -> unit = <fun>
14
배열 vs 리스트
• 원소를 갱신할 수 있음
• 길이 고정
• 다른 원소나 배열에 연결할
수 없음
• 원소를 갱신할 수 없음
• 길이 고정
• 다른 원소나 리스트에
연결할 수 있음
– 길이를 바로 계산할 수
없음
• 지정된 위치의 원소를 바로
찾을 수 있음
• 지정된 위치의 원소를 바로
찾을 수 없음
15