안녕하세요

프로그래밍 언어 개념 연습문제 10장 본문

Study_exam/프로그래밍 언어 개념 연습문제

프로그래밍 언어 개념 연습문제 10장

godxxy1229 2023. 6. 5. 18:14

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) XY가 값 전달

초기값 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) XY가 이름 전달

초기값 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
출력: (2, 11) (1, 4, 11) (4, 2) (1, 5, 10)

 


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+XA3이 되어서 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번째 까지의 합이 결과값으로 출력되게 된다