Presentation is loading. Please wait.

Presentation is loading. Please wait.

제 7 장 문장 구조화 제어문 지정문 조건문 반복문 GOTO 문 비결정적문.

Similar presentations


Presentation on theme: "제 7 장 문장 구조화 제어문 지정문 조건문 반복문 GOTO 문 비결정적문."— Presentation transcript:

1 제 7 장 문장 구조화 제어문 지정문 조건문 반복문 GOTO 문 비결정적문

2 7.2 지정문(Assignment statement)
변수 내용을 변경시키는 명령형 언어(imperative language)의 기본 연산 지정문에 관한 연구 주제 첫 번째 주제는 =, :=, ← 등의 지정문에서 사용되는 심볼의 선택. 두 번째 주제는 지정문의 평가 순서와 부작용(side effect). 세 번째 주제는 의미 구조(semantics). 명령형 언어는 지정문을 이용하려 변수의 상태를 변화시킴으로써 기본적인 효과를 달성하는 반면 함수형(적용형) 언어는 함수를 재귀적으로 적용하거나 결합함으로써 기본적인 효과를 달성

3 지정문(Assignment statement)(2)
각종 지정 연산자 C, Java, Fortran A = B Algol, Pascal A := B APL A B Basic LET A = B Cobol MOVE B TO A l-values와 r-values 지정 연산자의 왼쪽(l-value)과 오른쪽(r-value)을 의미 예) A := B l-value r-value

4 단순 지정문 일반적인 구문 <목적지_변수> <지정_연산자> <식>
Fortran, Basic, PL/I, C, C++, Java에서는 지정 연산자에 대하여 동등 기호(“=“) 사용 관계 연산자로 사용될 경우 혼돈을 초래 예) PL/l의 지정문 A = B = C C, Java처럼 일부 언어들은 동등 연산자를 위해 “==“등을 사용한다. Agol 60은 지정 연산자로 “:=“을 사용한다. A에 관계식 B = C의 불리안 값을 설정.

5 다중 지정문 다중 지정문 조건 지정문 한 개 이상의 변수에 지정을 허용 예) PL/I 에서 SUM , TOTAL = 0
한 개 이상의 변수에 지정을 허용 예) PL/I 에서 SUM , TOTAL = 0 C, C++, Java에서는 지정 연산자를 여러 번 사용 조건 지정문 C++, Java에서는 지정문에 조건 연산자를 허용 예) flag ? count1 : count2 = 0 SUM과 TOTAL 모두에 0을 지정 If (flag) count1 = 0; else count2 = 0; 과 동일하다.

6 복합 지정 연산자 복합 지정 연산자 (compound assignment operator) 필요한 형태를 표현하는 축약 방법
축약되어 표현 될 수 있는 지정문의 형태 : 예 ) a = a + b C에서의 예 sum += value ; C, C++, Java는 대부분의 이항 연산자에 대해 복합 지정 연산자를 허용 첫 번째 피 연산자로 목적지 변수가 오는 경우 sum = sum + value; 와 동일

7 단항 지정 연산자 C , C++, Java - 증가, 감소 연산을 지정과 결합한 단항 지정 연산자를 허용
증가 연산을 위한 ++ 연산자와 감소 연산을 위한 -- 연산자 사용 전위 연산자 (prefix operator) : 예) sum = ++ count ; 후위 연산자 (postfix operator) : sum = count ++ ; 단항 연산자와의 우선순위 : 오른쪽에서 왼쪽의 순서 예) - count ++; count값을 1만큼 증가 후 sum에 지정 count = count +1; sum = count; 와 동일 count값을 sum에 지정한 후 count 증가 sum = count; count = count +1; 와 동일 count 증가 후 음수화, 즉 “-(count++)”로 평가된다.

8 식으로서의 지정문 C, C++, java에서 지정문은 목적지에 배정된 값과 동일한 결과 생성
지정문은 식 또는 다른 식에 포함된 피연산자로 사용 할 수 있음 예) while (( ch = getchar()) != EOF ) { } *Java의 경우 지정 연산자의 우선순위가 관계연산자의 우선 순위보다 낮기 때문에 지정문이 괄호 안에 표현되어야 한다는 것에 유의 C는 다중 지정문의 효과를 낼 수 있다는 것에 유의 예) sum = count = 0 ; count에 먼저 0을 지정하고 count값이 sum에 지정된다.

9 혼합형 지정문 혼합형 지정문 – 지정문의 양쪽 데이터 형이 서로 다를 때
Fortran , C, C++은 묵시적 형 변환 규칙을 혼합형 지정문에서 사용한다. Pascal은 몇 개의 묵시적 형 변환을 허용 integer는 real에 배정될 수 있다 (역은 허용되지 않는다.). Ada와 modula-2는 혼합형 지정을 허용하지 않는다. Java는 요구된 형 변환이 확장 형 변환인 경우에만 혼합형 지정을 허용 Case 1) 묵시적 형 변환은 우변 식이 평가된 후에 일어난다. Case 2) 묵시적 형 변환은 우변의 모든 피연산자를 평가하기 전에 일어난다. 예) int a, b ; float c ; . . . c = a / b ; c가 float형이기 때문에 나눗셈이 이루어지기 전에 a와 b의 값이 float형으로 묵시적 형 변환된다.

10 7.3 조건문(Conditional Statements)
FORTRAN IF (BCOND) L1 , L IF (BCOND) <STMT> IF (ACOND) L1 , L2 , L3 GOTO문 요구 판독성 저하

11 조건문(Conditional Statements)(2)
선택문 처리, dangling else 조건문(Conditional Statements)(2) Dangling else 문제는 if 문의 then 절(clause) 내의 if 문이 어떻게 취급되는가에 관한 문제로, if 보다 else가 더 적을 때 발생 Algol 60에서는 if c1 then if c2 then A else B이 금지, 다음은 허용 if c1 then begin if c2 then A end else B Algol 68에서는 모든 if 는 fi에 의해 종결 if C1 then if C2 then A fi else B fi PL/I과 Pascal은 가장 내부의 if와 함께 해석 if C1 then (if C2 then A; else B;) 다양한 의미를 위해서 null ELSE 문이 필요 if C1 then if C2 then A; else; else B; Fortran 77에서는 dangling else의 해결을 위해 ENDIF 사용

12 조건문(Conditional Statements)(3)
중첩 if 문 nested if 문 구조 if C1 then S1 else if C2 then S2 else if C3 then S3 else if Cn then Sn else Sn+1 end if

13 조건문(Conditional Statements) (4)
다수의 endif 사용을 줄이고 판독성을 증가시키기 위해 새 구문 형태 도입 예) Algol 68의 elif (최초 시도), Ada의 elsif Ada의 elsif 사용 예 if C1 then S1 elsif C2 then S2 elsif C3 then S3 elsif Cn then Sn else Sn+1 end if;

14 조건문(Conditional Statements) (5)
CASE 문 - if-then-else를 확장한 선택문 Algol-w (Hoare, Wirth) case <integer expression > of begin S1;S2;. . .;Sn end Pascal case < expr > of <case label list>:<stmt> ... <integer expression > : (1 ~ n) 정수 임의 i 이면 Si 실행 < expr >: 정수, 불리안, 문자,열거형 도입 <case label list>는 <expr>의 상수

15 조건문(Conditional Statements) (6)
다음 문장이 정의되었다고 가정 type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); var thismonth : months; Pascal case문 사용 예 case thismonth of Feb, Apr, Jun, Jul, Aug : birthday := 4; Sep : birthday := 1; Jan, Mar, May, Oct, Nov, Dec :birthday := 0; end; Ada others절 도입 (변형된 Pascal에서 도입) 열거형과 부분 범위(range)형 case thismonth is when Feb|Apr|Jun..Aug ⇒ birthday := 4; when Sep ⇒ birthday := 1; when others ⇒ birthday := 0; endcase;

16 조건문(Conditional Statements) (7)
case 문 연구 주제 레이블을 선택하는 식의 형 선택자 식(selector expression)으로 허용된 데이터 형은 무엇인가? (2) 레이블의 형 case 레이블에 허용되는 데이터 형은 무엇인가? (3) 레이블로의 분기 가능성 case문의 내부 또는 외부로부터 case 레이블로 분기될 수 있는가? (4) 레이블이 상호 배타적이어야 할 필요성 레이블간의 상호 배제를 요구하는가? (5) 레이블 중 하나가 반드시 선택되어야 할 필요성 식으로부터 발생되는 모든 경우들을 처리해야 하는가? Pascal의 경우는 ?(pp )

17 조건문(Conditional Statements) (9)
C와 Java에서는 case문이 switch문으로 제공. C와 Java의 경우는(연구 주제) ? switch (<식>) { case <상수식1> : <문장 1> case <상수식2> : <문장 2> case <상수식n> : <문장 n> default : <문장n+1> }

18 조건문(Conditional Statements) (10)
switch 문의 번역 조건 구조(conditionals)를 이용 if (상수식1 == 식) then S1 else if (상수식2 == 식) then S2 ... case의 범위가 매우 크지 않으면, 각 case에 대해 표를 생성 case1 loc1 case2 loc2 ... casen locn 여기에서 loci는 casei에 관한 코드의 위치. 코드로의 분기가 빠르게 진행. 많은 수의 case들을 위해, 각 case에 대한 해쉬 테이블(hash table)이 생성

19 7.4 반복문(Iterative Statements)
반복 수행 - 컴퓨터 고안 목적, 프로그래밍 중요 특성, 초기 언어부터 사용 종류 ① 가장 간결한 형태는 괄호 사용이지만, 가독성을 위해 loop-repeat 문 (구현 예) 탈출 방법(조건/무조건 분기문 이용) goto(비구조적) -> exit(제한적 goto) Bliss-10 (다양한 exit 제공) - exit, exitblock, exitcase, exitcommand, exitselect, exitloop, exitset 사용 Bliss II (label을 사용하여 중첩된 scope을 한번에 탈출 가능) - exit<label> : label은 scope 이름 반복문 몸체, 복합문, case 문 등 <loop-repeat 예> loop if not <조건> then exit <statement> repeat

20 반복문 (2) - C 나 Java의 경우 ② while 문 - 시작 부분에서 반복 조건 검사 (0번 이상 반복 가능) 형태)
- 시작 부분에서 반복 조건 검사 (0번 이상 반복 가능) - C 나 Java의 경우 형태) While ( <조건식>) <문장> 실행 순서) while ( <조건식> ) < 문장 > ②참 ④거짓

21 반복문 (3) ③ repeat-until 문 - 마지막 부분에서 반복 조건 검사 (1번 이상 반복 가능) - 형태)
- 마지막 부분에서 반복 조건 검사 (1번 이상 반복 가능) - 형태) repeat <statement> until <bcond> C와 Java에서 do- while문으로 제공 형태) until문과 조건이 반대로 작용한다. do <문장> while (<조건식>)

22 반복문 (4) ④ FOR 문: 루프 제어 변수 사용 반복문 예) Fortran의 DO문, Pascal, C, Ada, Algol 등의 for 문 for <변수> := <초기값> to <최종값> step <변위값> do <문> for 문의 연구 주제 <변수>가 택할 수 있는 값들의 데이터 형은? <초기값>, <최종값>, <변위값>에 수식의 허용 여부와 수식 결과의 데이터 형은? 반복시 <최종값>과 <변위값>은 얼마나 자주 평가되는가? <변수>와 <최종값>은 언제 비교되나? <문> 내에서 지정문으로 <변수>가 변경될 수 있나? 반복문 종료 후 <변수>가 갖는 값은? 반복문 내외로 제어 이동이 허용되나? <변수>의 영역(scope)은?

23 반복문 (5) Algol 60 (Alogol60 보고서 내용) 보고서의 설명 예
<변수>와 <최종값> 먼저 비교 <초기값>, <최종값>, <변위값(임의 수식)> 데이터 형 : 실수형, 정수형, 혼합형 연산 허용 <최종값>, <변위값>은 비교시 매번 재평가 보고서의 설명 예 for v := a step b until c do < stmt> v := a L1 : if (v - c) * sign(b) > 0 then goto out ; <stmt> v := v + b goto L1; out : 반복문 정상 종료시 <변수> 값 정의되지 않음 < stmt> 에서 goto문 탈출시 <변수> 값 유지 for 문 내부로 제어 이동시 결과 미정의 for <var> :=<init> step <incr> until <final> do <stmt>

24 반복문 (6) Pascal Fortran II의 DO문 (최초의 반복문) Pascal의 for문 구문
<변수>의 <초기값>, <최종값>은 동일 데이터 형(스칼라형, 실수형 제외) <초기값>, <최종값>은 시작전 한번만 계산 <변수>와 <최종값> 비교 먼저 종료후 <변수>의 값 미정의 반복문 <변수> 열거형 사용 <변위값> : to, downto Fortran II의 DO문 (최초의 반복문) DO 문 몸체가 적어도 한번 수행 <초기값>, <변위값>, <최종값> : 정수형 상수나 변수 반복문 수행 후 <변수>의 값 언급 없음 Algol 68의 for문 Exp1, Exp2, Exp3 : 정수 수식, 한 번만 평가 (Algol 60은 임의 수식, 매번 평가) <변수> 영역 : 몸체부 국한 (Ada도 동일) Pascal의 for문 구문 for <var> :=<init> to <final> do <stmt> 또는 for <var> :=<init> downto <final> do <stmt> Algol 68의 for문 구문 [ for <vble> ][ from <Exp1>][ by <Exp2>][ to <Exp3>] [while <Exp4>] do <S> od

25 for (<식1> : <식2> : <식3>)
반복문 (7) C와 Java의 for 문 형태) 실행 순서) <식1> : 반복 변수의 초기화 식 <식2> : 조건식 <식3> : 제어변수의 값을 수정하는 식 for (<식1> : <식2> : <식3>) <문장>

26 반복문 (8) 반복문의 형식 DO 루프제어 블록 END DO
FORTRAN 90 반복문의 형식 DO 루프제어 블록 END DO 루프제어가 생략되면 무한 반복, 반복에서 벗어나기 위해 반드시 EXIT 문을 이용 다른 언어의 for 문과 같은 고정된 횟수의 반복문 DO <레이블> <변수> = <초기값>, <최종값>, <증분값> <변수>는 단순한 정수 변수. <초기값>은 반복의 초기값을, <최종값>은 마지막값을 지정한다. <최종값>에 도달하면 반복은 끝남. <증분값>은 매 반복시에 <초기값>에 더해질 값으로, 생략되면 1의 의미. <변수>는 반복의 수행동안 변경될 수 없고, <초기값>과 <최종값>은 반복의 시작에서 한 번만 평가된다.

27 7.5 GOTO 문 GOTO문의 장단점 장점 GOTO문 제어구조를 하드웨어가 제공
소규모의 프로그램에서는 간단하고 이해하기 쉬움 어셈블리어나 기존의 언어에 익숙한 사람들에게 친숙한 구조 GOTO문 제어 구조의 완벽한 범용성 (모든 알고리즘 표현 가능) 단점 계층적인 프로그램(그룹화) 작성이 방해 받아 프로그램 질 저하 유도 프로그램의 문장 순서와 실행 순서가 달라져서 판독성 저하(비구조적) 프로그램 유지보수의 어려움 goto문의 잔존 여부 : 논란의 대상 Fortran, Basic의 if문은 goto문임 pure LISP, Bliss : goto문 사용 금지 Pascal : 제한적 사용 goto문 제거 - 다양한 제어문 요구

28 GOTO 문 (2) Java의 break 문과 continue 문(pp. 220-221) ? Exit와 Break 문
반복문에서 break 문이 사용되면 현재 break 문을 감싸고 있는 반복문의 루프를 빠져 나오게 한다. 만약 반복문이 여러 개 중첩되어 있다면 break 문은 현재 자신을 포함하고 있는 반복문만을 빠져 나오고 반복문 밖의 다음 명령문으로 제어를 이동한다. continue 문도 continue 문 이후의 모든 명령문을 실행하지 않고 제어를 반복문의 시작 위치로 이동시킨다. 즉, break는 반복문의 블록을 완전히 종료하게 하지만 continue 문은 반복의 시작 위치로 제어를 이동시킨다는 것이다. Ada의 exit 문은 end-loop 다음의 문으로 제어를 바로 이동하게 된다. 만일 루프에 X란 레이블이 붙으면, 루프내의 임의의 장소에서 exit X; 라고 기술할 수 있다. Java의 break 문과 continue 문(pp ) ?


Download ppt "제 7 장 문장 구조화 제어문 지정문 조건문 반복문 GOTO 문 비결정적문."

Similar presentations


Ads by Google