\documentclass[addpoints, 
%               answers, 
               12pt]{exam}
\usepackage[total={210mm,297mm},
            top=1.5cm, left=1cm, right=1.5cm, bottom=1.5cm, includefoot]{geometry}
\usepackage{comment}
\usepackage{graphicx}
\usepackage{listings}
\lstset{numbers=left, escapechar=~}
\usepackage{amsmath}
\setlength\fillinlinelength{4cm}
\usepackage{kotex}


\begin{document}

\pagestyle{headandfoot}
%\firstpageheader{\bfseries\large Database}{\bfseries\large Midterm }{\bfseries\large \today}
\runningheader{\bfseries\large 프로그래밍 기초 2017-02}{\bfseries\large Worksheet Array and Functions}{\bfseries\large \iflastpage{Last Page}{Continued}}
\firstpagefooter{}{}{}
\runningfooter{\pointsonpage{\thepage}}{}{Page \thepage ~of \numpages}
%\firstpageheadrule
\runningheadrule

\hfill{\LARGE Worksheet - C arrays and functions }\hfill ~
\section{Arrays}

\begin{questions}


\begin{comment}
  3명이 팀 알파벳 매점에서 알파벳을 판매하고 있다. A는 1원이고, B는
  2원, C는 3원이고, 같은 식으로 Y는 25원, Z는 26원이다.  은행에서
  제공하는 문제들을 풀어 문제에 부여된 포인트를 받는다. 이 포인트를
  이용해 매점에서 알파벳을 살수 있다. 단, 매점에서는 단어 단위로만
  알파벳을 판매한다. 예를 들어 COW를 사려면 C=3, O=15, W=23원이기
  때문에 31원이 필요하다. 한 번 사용한 포인트는 소멸된다. 포인트는
  일부만 쓸 수 없다.

  사용할 수 있는 유일한 연산자는 덧셈이다.  20개의 단어를 만들어
  보자. 90원 이상되는 단어들을 최소 10개 포함하자.
\end{comment}




\question 변수는 하나의 값만 저장할 수 있고 배열은 \fillin[여러 개의 값]을 저장할 수 있다.

\question 배열은 1줄짜리 바둑판과 같다. 각 칸에 하나 이상의 정보를 저장할 수 있다. True/False \fillin[거짓; 하나의 정보 저장]

\question 배열의 길이가 저장할 수 있는 정보의 수를 정한다. A[12]이라고 하면 몇 개의 값을 저장할 수 있는가 \fillin[12개 값 저장]

\question 배열의 원소들을 접근하기 위해 인덱스를 사용한다. 사람은 시작을 늘 1부터 한다. 하지만 컴퓨터는 1이 아니라 \fillin[0] 부터 한다. 그렇기 때문에 인덱스의 시작 값은  \fillin[0]이다. 

\question C에서는 lvalue만이 값을 저장할 수 있다.  배열은 lvalue 이다. True/False \fillin[참; 배열의 원소는 lvalue가 될 수 있음]

\question 다음 코드의 하는 일은 무엇인가?

\begin{lstlisting}
int i, N = 10;
int a[N], b[N];
for (i = 0; i < N; i++){
    a[i] = i;
}
for (i = 0; i < N; i++){
    b[i] = a[9-i];
}
\end{lstlisting}


\begin{solutionorbox}[3cm]
배열 a에는 각 인덱스에 0부터 9까지 저장하고, 배열 b에는 역순 저장
\end{solutionorbox}

\question int a[8]; 이 선언되었고, 각 원소에도 값이 저장되어 있다. 이 때  a[-20] 이나 a[8]의 원소를 접근하려고 하면 어떻게 되는가?

\begin{solutionorbox}[3cm]
a[-20]이나 a[8]을 접근하면 쓰레기 값을 얻게 됨
\end{solutionorbox}

\newpage
\question  다음 코드의 하는 일은 무엇인가?

\begin{lstlisting}
#define N 10
int main(){
    int a[N];
    for (i=0 ; i< N; printf("%d\n", a[i++] = 0));
}
\end{lstlisting}


\question 다음과 같이 배열을 초기화 할 수 있다.

\begin{lstlisting}
int a[10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];  // True/False ~\fillin[거짓]~
float a[3] = [ {0} = 3.0, {1} = 4.5, {2} = 5 ]; // True/False ~\fillin[거짓]~
double a[3][3] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8} }; // True/False ~\fillin[거짓]~
double a[3][3] = {  0, 1, 2, 3, 4, 5, 6, 7, 8 }; // True/False ~\fillin[참]~
\end{lstlisting}


\question 배열 a의 길이가 7일 때에 홀수 번째 원소의 값을 3으로 초기화 하는 코드를 2가지 다른 방법으로 작성하시오. (for 등의 loop 사용 금지) 

\begin{solutionorbox}[4cm]
\begin{lstlisting}
int a = {3, 0, 3, 0, 3, 0, 3};
int a = {[0] = 3, [2] = 3, [4] = 3, [6] = 3};
\end{lstlisting}
\end{solutionorbox}


\question 배열 a의 길이가 100일 때 첫 5자리는 13으로, 10, 20, 80 은 77로 마지막 인덱스는 1로 초기화하는 코드를 작성하시오.

\begin{solutionorbox}[4cm]
\begin{lstlisting}
int a = {13, 13, 13, 13, 13, [9] =77, [19] = 77, [79]=77, [99]=1};
\end{lstlisting}
\end{solutionorbox}


\question 함수의 인자로 배열a를 전달 받았다고 가정하자. 이 때, 배열의 길이는 알지 못한다. sizeof 연산자를 사용하면 배열의 길이를 알 수 있다. 어떻게 알아 내는가? \fillin[1.	sizeof(a)/sizeof(a[0])]

\question 캐스팅이라는 용어가 있다. 이 단어의 뜻은 한 변수의 타입을 다른 변수의 타입으로 변경하는 것이다. 용법은 다음과 같다. 이 계산의 결과는 소수점을 표현할 수 있다. True/False \fillin[참]  

\begin{lstlisting}
int a, b;
printf("%f\n", (float)a/(float)b); 
\end{lstlisting}


\newpage
\question 피보나치 수열은 과거 두 수의 합이 현재의 수가 되는 반복성을 갖고 있다. 첫 두 수는 0과 1이다. 배열에 40자리까지의 피보나치 수열을 저장하고 싶다. 다음 코드에 필요한 문장은 무엇인가? 빈 자리에 맞는 글자를 넣으시오.

\begin{lstlisting}
#include <stdio.h>
int main(){
    int fib[~\fillin[40]~];
    fib[0] = 0;
    fib[1] = 1;
    for (int i = ~\fillin[2]~; i < 40; i++){
        fib[i] = fib[~\fillin[i-1]~] + fib[~\fillin[i-2]~];
    }
    return 0;
}
\end{lstlisting}

\question a[7] 일 때 배열의 모습을 도식화 하시오
\begin{solutionorbox}[4cm]
  \begin{tabular}{| c | c | c | c | c | c | c |} \hline
    0 & 1 & 2 & 3 & 4 & 5 & 6 \\ \hline
  \end{tabular}
\end{solutionorbox}

\question a[3][9] 일 때 배열의 모습을 도식화 하시오

\begin{solutionorbox}[6cm]
  \begin{tabular}{| c | c | c |} \hline
    0 & 1 & 2  \\ \hline
    3 & 4 & 5  \\ \hline    
    6 & 7 & 8  \\ \hline    
    9 &10 &11   \\ \hline    
   12 &13 &14   \\ \hline    
   15 &16 &17   \\ \hline    
   18 &19 &20   \\ \hline    
   21 &22 &23   \\ \hline    
   24 &25 &26   \\ \hline    
  \end{tabular}
\end{solutionorbox}



\question 4 x 4 길이의 배열 c를 단위 행렬로 초기화 하는 코드를  for 문을 사용하여 작성 하시오

\begin{solutionorbox}[3cm]
\begin{lstlisting}
for (int i = 0; i < 4; i++)
     c[i][i] = 1;     
\end{lstlisting}
\end{solutionorbox}

\newpage
\question 4 x 4 길이의 배열 c를 단위 행렬로 초기화 하는 코드를  C99 스타일로 작성하시오

\begin{solutionorbox}[3cm]
\begin{lstlisting}
int c[4][4] = {[0][0] = 1, [1][1] =1, [2][2] = 1, [3][3] = 1};
\end{lstlisting}
\end{solutionorbox}


\question 학생 다섯 명의 국어, 영어 수학 점수를 저장하는 코드를 작성하고 싶다. 최소한으로 필요한 변수는 몇 개인가? 학생 수나 과목의 수가 변경되더라도 답은 변경되지 않는가? 

\begin{solutionorbox}[5cm]
1개 변수로 모두 저장하는 경우 c[3][5]으로 선언하여 과목과 학생에 대해 작성할 수 있음 c[과목][학생명]

학생 수나 과목이 바뀌면 배열을 새롭게 선언해주어야 함
\end{solutionorbox}

\question 배열의 인덱스와 저장되는 값의 관계는 어떻게 되는가?

\begin{solutionorbox}[5cm]
모든 객체에는 주소가 있다. 함수, 변수, 배열 등 모두 유일한 주소를 갖고 있다. 배열의 인덱스는 배열의 주소로부터 값까지의 떨어진 정도를 알려준다. 인덱스는 배열에서의 값의 위치를 알려준다.
\end{solutionorbox}

\end{questions}


\newpage
\section{Functions}

\begin{questions}
\question 함수에 리턴 값은 꼭 필요한 것이 아니다. True/False \fillin[거짓; 리턴 값이 꼭 필요하지 않음]

\question 만들어진 함수를 실행하는 것을 호출이라고 한다. 함수 정의 전에 호출 할 수 있다. True/False \fillin[거짓; 함수의 정의 전에 호출하면 안된다.]

\question main 함수는 프로그램에서 꼭 필요한 함수이다. True/False \fillin[참; 꼭 필요한 함수이다.]

\question 함수에도 타입이 있다. True/False \fillin[참; 함수에도 타입이 있다.]

\question 다음 중 함수 선언인 것은?

\begin{lstlisting}
int sum(int , int)           // ~\fillin[]~
int sum(int , int);          // ~\fillin[참]~
int sum(int a, int)          // ~\fillin[]~
int sum(int a, int b)        // ~\fillin[]~
double sum(int a, float b);  // ~\fillin[참]~
db = sum(int a, float b);    // ~\fillin[]~
\end{lstlisting}


\question 함수에는 인자와 매개 변수라는 용어를 사용한다. 이 둘은 서로 같다. True/False \fillin[거짓; 인자와 매개변수는 의미가 다르다 ]

\question int a = 5, b = 10; sum(a, b); 이라고 할 때 a와 b는 매개 변수이다. True/False \fillin[거짓; sum(a, b) 에서 a, b는 인자이다]

\question 다음 문장에서 변수 a와 b는 매개 변수 이다. True/False \fillin[참; a와 b는 매개 변수이다]

\begin{lstlisting}
int sum(int a, int b)
{
    return a + b;
}
\end{lstlisting}



\question 함수의 인자로 변수와 수식을 쓸 수 있다. True/False \fillin[참; 함수의 인자로 변수와 수식 사용가능]

\question 함수는 수식의 일부로 쓸 수 있다. 예를 들어 두 수의 합을 구하는 sum이라는 함수가 있다고 할 때 다음의 문장은 올바른 문장이다.  True/False \fillin[참; 올바른 문장]

\begin{lstlisting}
total = sum(1, 3) + sum(5, 8);
\end{lstlisting}

\question 함수 안에서 선언된 변수는 함수 밖에서도 쓸 수 있다. True/False \fillin[거짓; 함수 안에서 선언된 변수는 함수 밖에서 존재하지 않음]

\question 다음의 함수 정의 형식에서 틀린 부분은?

\begin{lstlisting}
return-type function-name { parameters }
(
    declarations
    statements
)
\end{lstlisting}

\begin{solutionorbox}[3cm]
{ parameters} 대신 (parameters)로 중괄호 대신 괄호로 바뀌어야 함
\end{solutionorbox}

\question 다음 중 함수에 배열 a와 b를 올바르게 전달한 것은?

\begin{lstlisting}
int a[3] = {4, 5, 6}, b[3] = {1, 2, 3};     // ~\fillin[]~
sum(a, b);          // ~\fillin[배열 자체를 전달]~
sum(a[3], b[3]);    // ~\fillin[배열의 값을 전달]~
sum(a[], b[]);      // ~\fillin[잘못된 표]~
\end{lstlisting}

\question 함수의 리턴 타입은 항상 생략 가능하다. True/False \fillin[거짓; 함수의 리턴 타입은 생략하면 안됨]

\question 함수에는 인자는 두 개 이하만 있을 수 있다. True/False \fillin[거짓; 함수의 인자는 두 개 이상도 가능함]

\question 변수 타입이 void라는 것은 데이터 타입 없음이다. True/False \fillin[참; void는 타입 미지정임]

\question 다음 문장에서 함수 호출은 의미가 있는 문장인가? 있음 / 없음 \fillin[없음; 계산된 값이 메인 함수에서 활용안됨]

\begin{lstlisting}
int sum(int a, int b)
{
   return a + b;
}

int main()
{
    int val = 1, val2 = 2;
    sum(val, val2);
    return 0;
}
\end{lstlisting}


\question  함수 선언 또는 정의 전에 호출을 했을 때 변수의 타입은 기본 값으로 선언된다. 기본으로 선언한 타입과 실제 함수에서 정의한 타입이 서로 다르면 컴파일이 성공하고 오류 메시지를 보인다. True/False \fillin[거짓; 컴파일 실패하고 오류 메시지를 보인다]

\question 함수에서 사용하는 매개 변수를 바꾸면 함수의 인자로 전달 받은 변수의 값은 바뀐다. True/False \fillin[거짓; 매개 변수가 바뀌더라도 인자의 값은 바뀌지 않음]

\question 함수는 자기 자신 또는 다른 함수를 한 번 이상 호출할 수 없다. True/False \fillin[거짓; 몇 번이고 호출 가능함]




\end{questions}



\end{document}