2장: 자료구조 구현을 위한 C 프로그래밍 기법
교재 표지
프로그램 작성 코드는 첨부 zip 파일에 있습니다
답안 및 코드 오류 수정: 2023.10.06
[2장 연습문제]
01. int array[2][4]의 원소 개수와 배열의 전체 용량은? (단, 시스템에 정의된 int 자료형의 크기는 4바이트이다.)
원소 개수: 2*4=8개
배열의 용량=원소개수*자료형 크기
=8*4=32
① 6개, 24바이트 ② 6개, 32바이트
③ 8개, 24바이트 ④ 8개, 32바이트
02. 다음 변수 선언이 있는 상태에서 수행할 명령어 중에서 틀린 명령어는?
사진 설명을 입력하세요.
char 형 포인터 p2, int 형 변수 j
① p1 = &i; ② p2 = &j;
③ *p1 = j; ④ i = *p1;
03. 다음 중 포인터에 주소를 지정하는 방법으로 틀린 것은?
① 주소 연산자를 사용해 변수 주소를 지정하는 방법 ptr=&a;
② 문자형 포인터에 문자열의 시작 주소를 지정하는 방법 ptr=str[0];
③ 동적 메모리를 할당하고 그 시작 주소를 포인터값으로 지정하는 방법 ptr=(char*)malloc(10*sizeof(char));
④ 변수 이름을 변수의 시작 주소로 사용하는 방법 변수 이름은 주소로 사용할 수 없음 //배열 이름은 사용 가능
int A[100]={ 0, } ;
int *ptr=A ;
04. if 문장에서 포인터 pt1과 pt2에 대한 설명으로 옳지 않은 것은?
① if (&pt1==&pt2)의 경우에 서로 다른 포인터가 동일한 주소에 있을 수 있다. 하나의 주소에는 하나의 값
② if (pt1==pt2)는 같은 대상을 가리키는지 검증한다.
③ if (*pt1==*pt2)의 경우에 가리키는 대상이 다르더라도 변수값은 같을 수 있다.
④ if (pt1==pt2)는 가리키는 대상의 주소가 동일한 것인지 검증한다.
05. 다음은 C 언어로 작성된 1차원 배열의 예제 프로그램이다. ㉠에 들어갈 수 있는 문장과 프로그램을 출력한 결과를 바르게 짝지은 것은?
사진 설명을 입력하세요.
A[ ] = { 0, 1, 2, 3, ... , 99 }
㉠ 출력
① A[j] 100 j = 98
② &A[0]+j 99 주소값에 j를 더할 수 없음
③ *(A+j) 99 .A[99]의 값
④ *A+j 100 A[0] + j = 0+99
06. 다음 프로그램의 실행 결과로 옳은 것은?
사진 설명을 입력하세요.
*ptr = 100, *(ptr+1) = 200, *(ptr+2)=300, ....
=> (ptr+3)+100 = 400 + 100 = 500
① 200 ② 300
③ 400 ④ 500
07. 구조체 변수에 대한 명령 중 바른 것은?
사진 설명을 입력하세요.
① sp = Kim; ② sp = Lee; &Lee
③ Lee = Kim; Kim은 구조체 배열 ④ Kim[0] = Kim[3];
⑤ sp = Kim[1]; Kim[0]; 포인터는 배열의 시작을 가리켜야 한다.
08. 재귀호출 방법이 적당하지 않은 것은?
① 팩토리얼 ② 피보나치 수열
③ 구조체 변수 복사 ④ 1부터 n까지 누적 합계 구하기
구조체 변수 복사는 for() 반복문을 사용하거나 구조체 배열을 사용한다.
09. 재귀호출 프로그램에 해당하는 것은?
① 한 루틴이 반복될 때
② 한 루틴이 자기를 다시 호출할 때
③ 다른 루틴을 호출할 때
④ 한 루틴에서 다른 루틴으로 갈 때
10. 다음 함수를 이용해 f1(4)를 수행한 결괏값은?
사진 설명을 입력하세요.
① 3 ② 4
③ 5 ④ 6
11. 다음 함수를 이용해 recursive(4)를 수행한 결괏값은?
사진 설명을 입력하세요.
※오타: 마지막 줄의 22는 2*2, 즉 4가 되어야 한다.
① 149 ② 265
③ 373 ④ 597
12. 함수 호출 xxx(5)에서 반환되는 결괏값은?
사진 설명을 입력하세요.
① 0 ② 4
③ 5 ④ 9
13. 순환 함수 f()에 대한 첫 번째 호출이 f(7)일 때, f(7)을 포함하여 함수 f()가 호출되는 총 횟수는?
사진 설명을 입력하세요.
① 25 ② 35
③ 41 ④ 51
14. C 언어를 사용해 100행 50열로 이루어진 행렬을 2차원 배열 A[100][50]에 저장하려고 한다. 10행 5열에 정수값 15를 저장하는 방법으로 옳지 않은 것은?
① A[9][4] = 15 ② *(A[0] + 454) = 15
③ *(&A[9][0] + 4) = 15 ④ *(&A[0][0]+904) = 15 904가 아니라 454
15. 다음 ‘하노이 탑’ 프로그램을 수행한 결과에서 8행에 출력되는 문장으로 옳은 것은?
사진 설명을 입력하세요.
① 원판 1을 C에서 B로 옮긴다. ② 원판 4을 A에서 C로 옮긴다.
③ 원판 3을 A에서 B로 옮긴다. ④ 원판 2을 B에서 C로 옮긴다.
16. 배열과 변수를 비교하여 설명하시오.
변수는 단일 값 저장에 사용되고 배열은 여러 값을 저장한다.
배열은 인덱스 형식으로 접근하지만 변수는 변수명을 통해 접근한다.
17~26번
각각 2_문제번호_요약.c 파일에 답안을 작성하였다.
2_17_성적처리.c
2_18_최대최소.c
2_19_문자열5개.c
2_20_문자열일치.c
2_21_포인터교환.c
2_22_대소문자.c 코드 수정(23.10.06)
2_23_역순출력.c
2_24_주소록.c
2_25_가우스.c
2_26_피보나치.c
27. [예제 2-3]에서 getchar( ); 명령어의 역할을 설명하시오. (힌트 : scanf()와 입력 버퍼 비우기)
getchar()는 입력 버퍼를 직접적으로 조작하지 않는다. 입력 버퍼에서 문자를 읽어오지 않고, 사용자가 키보드로 입력한 문자를 즉시 읽어온다.
scanf()는 입력 버퍼를 사용한다. 버퍼에 남아 있는 데이터를 읽어와 정해진 형식으로 변환한 후 변수에 저장한다. 입력 버퍼에 남아 있는 데이터가 다음 scanf()에 영향을 줄 수 있다.