안녕하세요
프로그래밍 언어 개념 연습문제 10장 본문
01. 다음 매개변수 전달 기법들의 장단점을 나열하여라.
① 참조 전달
② 값 전달
③ 이름 전달
④ 값-결과 전달
02. C++와 Ada의 사용자정의 연산자 중복의 방법을 공부하고 언어를 평가하는 우리의 기준을 사용하여 두 언어를 비교하는 보고서를 작성하시오.
03. FORTRAN IV 구현에서 매개변수는 접근 통로만을 사용하는 참조 전달이었다. 이런 설계 선택의 장단점을 말하시오.
04. 구현자에게 in out 모드 매개변수 구현을 복사-전달 또는 참조-전달 중에서 선택하게 하는 Ada 83 설계자의 결정에 찬반론을 펴시오.(이는 Pascal의 var도 같음)
05. FORTRAN은 부프로그램이 다중 진입점을 갖는 것을 허용한다. 왜 이것이 때때로 값진 능력인가?
06. 다음 Algol 형태의 프로그램을 가지고 아래 물음에 답하여라.
begin integer I ; integer array A[1:2];
procedure F(X,Y); integer X, Y;
begin X:=Y+1;
Y:=Y+1;
print(X,Y);
X:=X-1;
Y:=Y-1;
end F;
I:=1;
A[1]:=5;
A[2]:=10;
F(I,A[I]);
print(I,A[1],A[2]);
F(A[I],I);
print(I,A[1],A[2]);
end.
다음 매개변수 전달 기법에 따라 출력되는 변수의 값을 써라.
(1) X와 Y가 값 전달
초기값 | F Procedure 호출 | 출력 | F Procedure 호출 | 출력 | |||||
X:=X+1; Y:=Y+1; |
출력 | X:=X-1; Y:=Y-1; |
X:=X+1; Y:=Y+1; |
출력 | X:=X-1; Y:=Y-1; |
||||
A[1] | 5 | 5 | 5 | ||||||
A[2] | 10 | 10 | 10 | ||||||
X | 2 | 2 | 1 | 2 | 2 | 1 | |||
Y | 6 | 6 | 5 | 6 | 6 | 5 | |||
I | 1 | 2 | 2 | 1 | 1 | 2 | 2 | 1 | 1 |
출력: (2, 6) (1, 5, 10) (2, 6) (1, 5, 10)
(2) X는 참조 전달, Y는 이름 전달
초기값 | F Procedure 호출 | 출력 | F Procedure 호출 | 출력 | |||||
X:=X+1; Y:=Y+1; |
출력 | X:=X-1; Y:=Y-1; |
X:=X+1; Y:=Y+1; |
출력 | X:=X-1; Y:=Y-1; |
||||
A[1] | 5 | 5 | 4 | 4 | 5 | 4 | 4 | ||
A[2] | 10 | 11 | 11 | 11 | 11 | 11 | 11 | ||
X | 2 | 2 | 1 | 5 | 5 | 4 | |||
Y | 11 | 11 | 4 | 2 | 2 | 1 | |||
I | 1 | 2 | 2 | 1 | 1 | 2 | 2 | 1 | 1 |
출력: (2, 11) (1, 4, 11) (5, 2) (1, 4, 11)
(3) X는 이름 전달, Y는 참조 전달
초기값 | F Procedure 호출 | 출력 | F Procedure 호출 | 출력 | |||||
X:=X+1; Y:=Y+1; |
출력 | X:=X-1; Y:=Y-1; |
X:=X+1; Y:=Y+1; |
출력 | X:=X-1; Y:=Y-1; |
||||
A[1] | 5 | 6 | 5 | 5 | 6 | 6 | 6 | ||
A[2] | 10 | 10 | 10 | 10 | 10 | 10 | 9 | ||
X | 2 | 2 | 1 | 10 | 10 | 9 | |||
Y | 6 | 6 | 5 | 2 | 2 | 1 | |||
I | 1 | 2 | 2 | 1 | 1 | 2 | 2 | 1 | 1 |
출력: (2, 6) (1, 5, 10) (10, 2) (1, 6, 9)
(4) X와 Y가 이름 전달
초기값 | F Procedure 호출 | 출력 | F Procedure 호출 | 출력 | |||||
X:=X+1; Y:=Y+1; |
출력 | X:=X-1; Y:=Y-1; |
X:=X+1; Y:=Y+1; |
출력 | X:=X-1; Y:=Y-1; |
||||
A[1] | 5 | 5 | 4 | 4 | 5 | 5 | 5 | ||
A[2] | 10 | 11 | 11 | 11 | 11 | 10 | 10 | ||
X | 2 | 2 | 1 | 5 | 4 | 10 | |||
Y | 11 | 11 | 4 | 2 | 2 | 1 | |||
I | 1 | 2 | 2 | 1 | 1 | 2 | 2 | 1 | 1 |
07. 다음 프로그램에서 매개변수를 값에 의한 호출, 참조에 의한 호출, 그리고 값-결과에 의한 호출로 처리했을 때, 출력되는 결과는 무엇인가?
begin integer a;
procedure P(b);
begin b:=b+1; print(b,a) end
a:=1;
P(a);
print (a);
end
① 값에 의한 호출
초기값 | procedure P | 출력 | ||
b=b+1 | 출력 | |||
a | 1 | 1 | 1 | 1 |
b | 2 | 2 | ․ |
② 참조에 의한 호출
초기값 | procedure P | 출력 | ||
b=b+1 | 출력 | |||
a | 1 | 2 | 2 | 2 |
b | 2 | 2 | ․ |
b는 참조에 의해 a=a+1이 계산됨
③ 값-결과에 의한 호출
초기값 | procedure P | 출력 | ||
b=b+1 | 출력 | |||
a | 1 | 1 | 1 | 리턴시 a=a+1이 되어서 2 |
b | 2 | 2 | ․ |
main에서 출력 되는 a는 함수에서 a=a+1이라는 결과를 넘겨 줘서 2가 출력 된다.
08. 다음 Algol 형태의 프로그램을 가지고 아래 물음에 답하여라.
begin integer A,B;
procedure F(X, Y, Z) : integer X, Y, Z;
begin Y:=Y+1;
Z:=Z+X;
end F;
A:=2;
B:=3;
F(A+B,A,A);
print A;
end.
다음 매개변수 전달 기법에 따라 출력되는 값을 써라.
① 값 전달
초기값 | procedure F | 출력 | |||
매개변수 | 연산후 | ||||
A | 2 | X(A+B) | 5 | 2 | |
B | 3 | Y(A) | 2 | 3 | |
A+B | 5 | Z(A) | 2 | 7 |
② 이름 전달
초기값 | procedure F | 출력 | |||
매개변수 | 연산후 | ||||
A | 2 | X(A+B) | 5 | 6 | 9 |
B | 3 | Y(A) | 2 | 3 | |
A+B | 5 | Z(A) | 2 | 9 |
Z=Z+X는 A가 3이 되어서 X(A+B)도 1증가되어 6이 되게 된다 따라서 A의 값은 9가 된다.
③ 참조 전달
초기값 | procedure F | 출력 | |||
매개변수 | 연산후 | ||||
A | 2 | X(A+B) | 5 | 5 | 8 |
B | 3 | Y(A) | 2 | 3 | |
A+B | 5 | Z(A) | 2 | 8 |
09. 본문에서 설명된 5종류의 매개변수 전달 방법을 사용하여, (Pascal 구문으로 쓰여진) 다음 프로그램의 결과를 제시하라.
program main
var i : integer;
a : array[1..2] of integer;
procedure p(x,y:integer;);
begin
x := x + 1 ;
i := i + 1 ;
y := y + 1 ;
end; (* end p *)
begin
a[1] :=1;
a[2] :=1;
i := 1;
p(a[i], a[i]);
writeln(a[1]);
writeln(a[2]);
end. (* main *)
① call by value
초기값 | procedure p | 출력값 | |||
매개 변수의 값 | 함수 실행 | ||||
A[1] | 1 | x | a[i]=1 | 2 | 1 |
A[2] | 1 | y | a[i]=1 | 2 | 1 |
i | 1 | 2 |
② call by reference
초기값 | procedure p | 출력값 | |||
매개 변수의 값 | 함수 실행 | ||||
A[1] | 1 | x | a[1]=1 | 2 | 3 |
A[2] | 1 | y | a[1]=1 | 3 | 1 |
i | 1 | 2 |
③ call by name
초기값 | procedure p | 출력값 | |||
매개 변수의 값 | 함수 실행 | ||||
A[1] | 1 | x | a[i]=1 | 2 | 2 |
A[2] | 1 | y | a[i]=1 | 2 | 2 |
i | 1 | 2 |
④ call by result
초기값 | procedure p | 출력값 | |||
매개 변수의 값 | 함수 실행 | ||||
A[1] | 1 | x | a[i]=1 | 2 | ?+2 |
A[2] | 1 | y | a[i]=1 | 2 | 1 |
i | 1 | 2 |
⑤ call by value-result
초기값 | procedure p | 출력값 | |||
매개 변수의 값 | 함수 실행 | ||||
A[1] | 1 | x | a[i]=1 | 2 | 2 |
A[2] | 1 | y | a[i]=1 | 2 | 1 |
i | 1 | 2 |
10. Ada는 값 전달인 in 매개변수 읽기-전용이라는 규칙을 갖는다. 즉, 그들은 지역 변수로 사용될 수 없다. 따라서 다음 코드는 Ada에서 비합법적이다.
procedure p (x: in INTEGER) is
begin
x := x + 1;
end p;
① 3장의 설계 기준을 참조하여 이 규칙을 논하라.
② Ada는 함수 선언에서 매개변수들은 in 매개변수이어야 한다. 그 이유는?
11. C 구문으로 작성된 다음 프로그램을 보자.
void main() {
int value = 2, list [5] = {1, 3, 5, 7, 9};
swap(value, list[0]);
swap(list[0], list[1]);
swap(value, list[value]);
}
void swap(int a, int b) {
int temp;
temp = a;
a = b;
b = temp;
}
다음 매개변수-전달 방법에 대해 swap을 3번 호출한 후에 변수 value와 list의 은 무엇인가?
① 값-전달
=> 함수에서는 변환이 일어 날지라도 값은 전혀 변하지 않는다.
따라서 list={1,3,5,7,9}, value=2
② 참조-전달
=> 함수에서 주소에 의해서 주소가 바뀌므로 main 함수에서는 값의 변화가 일어 난다.
swap(value, list[0]); => value = 1, list={2,3,5,7,9}
swap(list[0], list[1]);=> value = 1, list={3,2,5,7,9}
swap(value, list[value]);=> value = 2, list={3,1,5,7,9}
③ 이름-전달
=> 마찬가지로 값의 변화는 다음과 같이 일어 난다.
swap(value, list[0]); => value = 1, list={2,3,5,7,9}
swap(list[0], list[1]);=> value = 1, list={3,2,5,7,9}
swap(value, list[value]);=> value =2, list={3,2,1,7,9}
④ 값-결과-전달
=> 값을 형식 매개 변수로 넘겨 주게 되나 결과를 다시 리턴하게 되므로 다음과 같이 된다.
swap(value, list[0]); => value = 1, list={2,3,5,7,9}
swap(list[0], list[1]);=> value = 1, list={3,2,5,7,9}
swap(value, list[value]);=> value = 2, list={3,1,5,7,9}
12. 단지 함수 부프로그램만을 제공하는 C 설계에 반대하는 의견을 제시하시오.
13. Jenson의 장치라 불리는 다음 ALGOL 60 프로시저를 보자. 이 장치는 1960년에 이 장치를 고안한 코펜하겐(Copenhagen), 레그네센트라렌(Regnecentralen)의 J.Jenson이라는 사람의 이름을 본따서 만든 장치이다.
real procedure SUM(ADDER, INDEX, LENGTH);
value length;
real ADDER;
integer INDEX, LENGTH;
begin
real TEMPSUM;
for INDEX:=1 step 1 until LENGTH do
TEMPSUM : = TEMPSUM + ADDER;
SUM : = TEMPSUM;
end;
SUM에 대한 다음 호출의 결과는 무엇인가? 매개변수는 이름으로 전달되고 결과는 부프로그램의 이름에 배정함으로서 반환된다.
① SUM(A, I, 100), 단 A는 스칼라 변수
INDEX 가 I의 값으로 인식되어 1부터 LENGTH=100까지 100번의 루프를 돌게 된다.
따라서 ADDER로 인식되는 값 A값을 100번 합한것과 같게 되어서
A×100의 값이 나오게 된다.
② SUM(A[I]*A[I], I, 100), 단 A는 100개의 원소를 갖는 배열
위와 마찬가지로, A[I]*A[I]의 100번 합한 값이 나오게 되는데, C의 구문으로 표현하자면
for (i=1;i<=100;i++)
result+=A[i]*A[i];
printf("%f",result);
그렇기 때문에 A의 I번째 제곱의 인덱스 1~100번째 까지의 합이 결과값으로 출력되게 된다.
③ SUM(A[I]*B[I], I, 100), 단 A와 B는 100개의 원소를 갖는 배열
마찬가지로, B[I]*A[I]의 100번 합한 값이 나오게 되는데, C의 구문으로 표현하자면
for (i=1;i<=100;i++)
result+=B[i]*A[i];
printf("%f",result);
그렇기 때문에 A의 I번째와 B의 I번째의 곱을 인덱스 1~100번째 까지의 합이 결과값으로 출력되게 된다
'Study_exam > 프로그래밍 언어 개념 연습문제' 카테고리의 다른 글
프로그래밍 언어 개념 연습문제 9장 (0) | 2023.06.05 |
---|---|
프로그래밍 언어 개념 연습문제 8장 (0) | 2023.06.05 |
프로그래밍 언어 개념 연습문제 7장 (0) | 2023.06.05 |
프로그래밍 언어 개념 연습문제 6장 (0) | 2023.06.05 |
프로그래밍 언어 개념 연습문제 5장 (0) | 2023.04.20 |