안녕하세요
프로그래밍 언어 개념 연습문제 7장 본문
01. 몇 가지 언어들을 선택하여 그들 언어에서는 기본 자료형으로 어떠한 자료형을 채용하고 있는지 살펴보고, 선택한 언어들에서의 자료형들을 비교하여 보아라.
02. 메모리의 한 개 비트로 부울 값을 표현하는 것에 대한 찬성과 반대 의견은 각각 무엇인가?
03. 열거 자료형을 사용할 경우의 장점을 말하라.
* 열거자료형의 장점
- 판독성과 신뢰성 면에서 장점을 제공
- 열거형 상수와 열거 형 변수를 이용하면 정수값 대신에 이름을 이용해서 프로그 래밍을 할 수 있는데, 이들을 이용함으로써 입력 에러 등을 줄임 →변수가 가질 수 있는 자료의
값을 미리 열거
- 열거형 상수의경우에 열거형 상수는 기억영역을 확보하지 않는다.
(변수가 아니고 상수 이기 때문이다.)
04. 문자열에 대한 설계 고려 사항을 기술하고, 문자열의 길이를 선택하는 3가지 방법을 요약하라.
05. C의 동등 연산자 '=='을 위한 자료형 규칙과 Ada의 동등 연산자 '=' 자료형 규칙을 비교 서술하라.
06. Pascal, Modula-2, Ada 에서의 미리정의 부울형의 순서형임을 암시했다. 그렇다면 그 순서는 어떻게 될까? 이것이 프로그래머에게 어떤 쓸모가 있을까? 부울형이 순서형이어야 하는 어떤 이유를 생각할 수 있는가?
07. PL/I 프로그램에서 다음과 같은 문장을 사용했을 때,
A = 'WHAT?ME?WORRY'
"SUBSTR(A, 7, 2) = 'YOU';"
이라는 문장을 수행한 후에 A에 저장되는 값은 무엇인가?
08. n차원 배열 자료형에서 원소의 위치를 계산하는 방법을 저장 방식에 따라 수식으로 표현해 보아라. (n차원이나 3차원)
09. 배열에서 다음 사항들을 요약하라.
① 설계 고려 사항
② 행우선과 열우선
③ 배열 접근 함수
④ 슬라이스
⑤ 배열 초기화
⑥ 배열 연산
10. APL 언어에서의 중요한 자료 객체는 배열이다. APL의 배열에 대하여 그 문법 구조와 배열의 차원의 수, 배열의 크기, 배열 연산의 종류, 그리고 배열 연산의 기본 연산자 등을 조사해 보아라.
11. 포인터형의 설계 고려 사항은 무엇이고 포인터에 대한 두 가지 공통된 문제는 무엇인가?
* 포인터형의 설계 고려사항
① 포인터 변수의 스코프와 수명은 어떠한가?
② 동적 변수의 수명은 어떤한가?
③ 포인터는 특정의 타입만을 지정하도록 제한되어있는가.
④ 포인터가 동적 메모리 관리를 위해 사용되는가 아니면 indirect addressing,혹은 둘다?
* 포인터에 대한 공통된 문제점
① 몇개의 포인터 변수가 동일한 객체를 가리킬 수 있다.
② 어떤 포인터 변수도 가리키고 있지 않는 객체가 존재할 수 있다.
③ 항상 가리키고 있는 객체의 값만을 나타내야 한다
12. C++의 참조형은 무엇이고 일반적인 용도는 무엇이며, 참조형 변수가 포인터 형식 매개변수보다 더 나은 이유는 무엇인가?
* 참조형
- 새로운 데이터형으로 변수에 대한 다른 이름, 다시 말하지만 변수에 대한 별명이다.
- 내부적으로는 포인터와 같으나 외부적으로는 일반변수이다.
- 참조형 데이터는 반드시 정의와 동시에 선언을 해주어야 한다.
예외) ┌ class의 멤버로 사용될 때는 생성자에서 초기화시켜 준다.
│ 함수의 인수로 사용될 때는 함수의 호출시점에서 초기화 된다.
└ 함수의 리턴값으로 사용될 때는 리턴시에 초기화 된다.
※ 주의사항 : 참조형은 타입이 다른 변수로 초기화 시켜주면 참조형이 아닌 일반변수
가 되어버린다.
* 참조형 변수가 포인터 형식 매개 변수보다 더 나은 이유
- 메모리사용 측면.
- 포인터에 의한 방법은 중간과정을 거치게 되나,
C++ 의 참조자에 의한 방법은 하나의 변수에 대해 직접 변화하는 것이다.
13. 다른 언어의 포인터에 비해서 Java의 참조형 변수가 갖는 장점은 무엇이고, C++ 참조 변수와 Java 참조 변수의 차이점은 무엇인가?
*. C++ 포인터와 Java 참조 변수 의 차이점
- C++: 메모리 주소 참조
- Java : 클래스 인스턴스 참조(참조 변수가 다른 클래스 인스턴스를 참조하도록 지정
문이 수행될 수 있음)
*. Java의 참조형 변수가 갖는 장점
- 자료의 은닉성 제공
14. Pascal에서는 포인터 변수가 가르키는 레코드의 필드를 선택하기 위해서 참조인출 연산 '↑'과 필드 선택 연산'.'을 함께 사용해야 한다. 따라서 다음 Pascal 선언
type node = record
data: ...;
end
var x: ↑ node:
이 주어졌을 때, x가 가리키는 레코드의 data 필드에 접근하기 위해서는 x↑.data 라고 적어야 한다. C에서는 이것을 (*x).data 라고 쓰나, -> 연산이 참조인출과 필드 선택을 합친 것이기에 대신 x->data를 사용할 수 있다. Ada 에서는 필드를 선택하는 것은 자동적으로 참조인출을 뜻하므로 이 경우에는 단지 x.data 로 쓰면 된다. 이 세 가지 방식의 장점과 단점들을 토론하라.
15. Pascal의 포인터 자료형이 아래와 같이 주어졌을 때,
IntPtr = ↑integer.
IntPtr형의 변수가 가지고 있는 포인터 값(주소)을 인쇄하는 프로시저를 작성하라. 단 주소는 기계에서 읽을 수 있는 진법을 사용하고 nil 값까지 인쇄되도록 작성하시오. 이 프로시저를 이용하여 nil 값이 내부에서 어떻게 표현되는 지를 확인하시오.
16.
(a) Ada에서 부자료형(subtype)과 파생 자료형(derived type)의 차이는 무엇인가?
(b) 다음 Ada 선언과 동등한 Pascal 형 선언은 무엇인가?
subtype New_Int is integer;
(c) 다음 Ada 선언과 동등한 Pascal 형 선언은 무엇인가?
type New_Int is new integer;
17. Pascal 구문으로 된 자료형과 변수 선언이 다음과 같이 주어졌다.
type
range = -5.5;
table1= array [range] of char;
table2 = table1;
var
x, y: array [-5..5] of char;
z: table1
w: table2
i: range;
j: -5.5;
(a) 구조적 동치, (b) 이름 동치, 그리고 (c) 선언 동치 하에서 어느 변수들이 형 동등한지와 그 이유를 말하라. 주어진 정보만으로는 모호한 경우를 확실히 구별하도록 하라.
18. Pascal 구문으로 된 자료형과 변수 선언이 있다.
type
rec1 = record
x: integer;
case boolean of
true: (y;char);
false: (z:boolean);
end;
rec2 = rec1;
rec3 = record
x: integer;
case b:boolean of
true: (y:char):
false: (z:boolean);
end;
var
a, b: rec1;
c: rec2;
d: rec3;
(a) 구조적 동치, (b) 이름 동치, 그리고 (c) 선언 동치 하에서 어느 변수들이 형 동등한지와 그 이유를 말하라. 주어진 정보만으로는 모호한 경우를 확실히 구별하도록 하라.
19. C언어는 배열과 포인터에 대해서는 구조적 동치를 사용하나 스트럭쳐와 유니언을 위해서는 선언 동치를 사용한다. 그 언어 설계자가 왜 이렇게 했다고 생각하는가? 그것이 프로그래머에게 어떤 문제를 일으키는가? 설명하라.
* 구조적 동치 (structual equivalence)
자료형의 구성요소가 모든 측면에서 같다면 두 변수들은 동일형으로
인식되며 반대의 경우도 성립하는 것
* 이름 동치 (name equivalence)
두 변수를 함께 선언하거나 동일 식별자 이름을 사용해서 선언하면
두 변수는 동일형으로 인식되며 반대의 경우도 성립하는 것
* 선언 동치 (declaration equivalence)
- 함께 선언된 변수들만 동치이다.
*. 문제점
(1) 이름 동치
결정하기에는 단순하나 프로그래머에게 별도의 자료형이름을 정의하도록 강요한다
(2) 구조적 동치
순서만 다르고 모든 것이 서로 같은 두개의 열거형 정의를 어떻게 다룰 것인지가 문제인다.
*. 참고사항
- 배열과 포인터의 공통점
1. 배열과 포인터는 주소를 나타낸다.
2. 배열 계산과 포인터 연산은 동일한 결과를 나타낸다.
- 배열과 포인터의 차이점
1. 배열명은 상수이고 포인터명은 변수이다.
2. 배열명은 연산이 불가능하고 포인터명은 연산이 가능하다.
- 배열과 포인터 사용시 문제점
포인터를 사용하면 배열경계를 조사하지 않는다.
* 포인터 자료형을 사용해서 C와 C++로 구현
< C 언어 >
#include <stdio.h> main( ) { int a[3] = {11, 12, 13}; int b[2][3] = {{1,2,3},{4,5,6}}; int *pa = a; int *pb0 = b[0], *pb1 = b[1]; printf("%d\n", a); printf("%d\n", pa); printf("%d\n", *(pa+0)); //a[0], p[0] printf("%d\n", *(pa+1)); //a[1], p[1] printf("%d\n", *(pa+2)); //a[2], p[2] printf("%d\n", *(pb0+0)); //b[0][0] printf("%d\n", *(pb0+1)); //b[0][1] printf("%d\n", *(pb0+2)); //b[0][2] printf("%d\n", *(pb1+0)); //b[1][0] printf("%d\n", *(pb1+1)); //b[1][1] printf("%d\n", *(pb1+2)); //b[1][2] }
< C++ 언어>
#include <iostream.h> void main() { int a[5]={10,20,30,40,50}; int* p; p=a; cout<<"\n a[2]= " <<a[2]; cout<<"\n *(p+2)= " << *(p+2); // *(p+2) == a[2] }
20. '/'가 정수 혹은 실수 나눗셈을 뜻하고 정수와 실수간의 묵시적 변환을 허용하는 언어에서는, 식 I+J/K가 상이한 결과를 낼 수도 있다. 어떻게 그런 일이 일어날 수 있는지 묘사하라. FORTRAN은 어느 해석을 사용하는가? C는 어느 것을 사용하는가? 어느 해석이 보다 나은가?
21. C에는 부울 자료형이 없다. 대신에 a==b나 a<=b와 같은 비교에서 거짓이면 정수값 0을, 참이며 1을 반환한다. 한편으로 C의 if문은 조건이 0이 아닌 어떤 값이든 참인 것으로 생각한다. 이렇게 하는 것에 어떤 이점이 있는가? 왜 조건 a<=b가 참이면 0이 아닌 임의의 값을 반환하도록 허용하지 않는가?
22. (ANSI 이전의) C에서 e1+e2 와 같은 식에 대한 변환 규칙은 Kernighan과 Ritchie[1978]에 다음과 같이 서술되어 있다.
먼저 char 혹은 short 형인 임의의 피연산자는 int로, float 형은 double 로 변환된다. 그런 다음 두 피연산자 중 하나가 double이면 다른 것도 double로 변환되고 그것이 결과의 형이다.
그렇지 않고 두 피연산자 중 하나가 long이면 다른 것도 long으로 변환
되고 그것이 결과의 형이다.
그렇지 않고 두 피연산자 중 하나가 unsigned 이면 다른 것도 unsigned 로 변환되고 그것이 결과의 형이다. 그렇지 않다면 두 피연산자는 모두 int 여야 하고 그것이 결과의 형이다.
아래와 같은 C의 식이 주어지고 X는 1의 값을 가진 unsigned라고 가정할 때, 값을 평가하는 동안 일어나는 형 변환과 그 결과 값의 형을 서술하라. 결과 값은 얼마인가?
'0' + 1.0 * (-1 + x)
'Study_exam > 프로그래밍 언어 개념 연습문제' 카테고리의 다른 글
프로그래밍 언어 개념 연습문제 9장 (0) | 2023.06.05 |
---|---|
프로그래밍 언어 개념 연습문제 8장 (0) | 2023.06.05 |
프로그래밍 언어 개념 연습문제 6장 (0) | 2023.06.05 |
프로그래밍 언어 개념 연습문제 5장 (0) | 2023.04.20 |
프로그래밍 언어 개념 연습문제 4장 (0) | 2023.04.20 |