프로그래밍입문/강의자료

2013 프로그래밍입문 프로그래밍 문제

마스샘 2013. 10. 13. 21:31

 

 

 

 


  포인터 


 

------------------------------
교과서 문제
------------------------------

1. 정수 배열의 원소들을 처리하는 몇 가지 함수들을 포인터를 이용하여 작성하고 테스트하여보자.

   우선 그 예로 주어진 배열 원소 값을 화면에 출력하는 함수 print_array()가 다음에 제시되어 있다. A는 배열을

   전달 받으며 size는 배열의 크기이다.

 

#include <stdio.h>

void print_array(int *A, int size) 

{

    int i;

    printf("[");

    for(i=0; i<size; i++)

        printf("%d ", *(A+i));         // 혹은 printf("%d ", A[i]);

    printf("]");

}

int main(void)

{

    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    print_array(a, 10);

    return 0;

 

(a) 정수 배열의 원소들을 난수를 사용하여 채우는 함수를 작성하고 print_array()를 호출하여 출력하라. 난수는 rand() 를 호출하여 생성한다.

void fill_array(int *A, int size);

 

(b) 정수 배열 A[]를 다른 정수 배열 B[]에 복사하는 함수를 작성하고 테스트 하라

void copy_array(int *A, int *B, int size);

 

(c) 서로 대응되는 배열 A[]의 원소와 배열 B[]의 원소를 더하여 배열 C[]에 저장하는 함수를 작성하고 테스트 하라. 즉 모든 i에 대해 C[i] = A[i] + B[i] 가 된다.

void add_array(int *A, int *B, int *C, int size);

 

(d) 정수형 배열 원소들의 합을 구하여 반환하는 함수를 작성하고 테스트하여라.

int get_array_sum(int *A, int size);

 

(추가문제) 10개의 데이터가 들어 있는 배열 A[]를 오름차순으로 정렬하여 출력하는 함수를 작성하라. 배열을 만드는 데는 위 (a)의 fill_array()를 사용하고 출력을 위해서는 위의 print_array() 함수를 호출하라. 정렬하는 함수의 원형은 다음과 같다.

void sort_array(int *A, int size);

 

2. 실수를 입력받아서 정수 부분과 소수점 이하 부분을 분리하여 출력하는 프로그램을 작성하여 보자. 단, 정수 부분과 소수점 이하 부분으로 분리하는 함수를 작성하여 사용한다.

void get(double value, int *i_part, double *f_part);

 

실수를 입력하시오 : 3.14

정수부분은 3입니다.

소수점이하 부분은 0.14입니다.

 

 

5. 간단한 영상처리 프로그램을 작성하여 보자. 디지털 영상은 미세한 점들로 이루어져 있다. 이러한 점을 픽셀(pixel)이라 한다. 픽셀의 밝기 정보는 숫자로 표현된다. 다음은 크기가 10x10인 디지털 영상의 한 예이다.

 

   

    각 픽셀의 밝기는 0에서 9까지 변화할 수 있다고 가정하고 디지털 영상을 1차원 배열로 표현하고 각 픽셀의 밝기를 1씩 줄이는 프로그램을 작성하여 보자. 위와 같은 영상이면 int image[100] 배열을 사용하여 표현할 수 있다. 포인터에 대한 이해를 높이기 위해 영상의 밝기를 줄이는 함수를 작성하는데 영상을 담고 있는 1차원 배열을 매개 변수로 전달하도록 하라.

void reduce_brightness(int image[], int width, int height);

 

------------------------------
교과서외 문제
------------------------------

1. double vector[3] 배열에 3차원 벡터가 저장되어 있다고 하자. 이 벡터의 크기를 계산해서 리턴하는 함수를 작성하고 테스트 하라.

double vector_magnitude(int size, double vector[]);

 

2. double vector[3] 배열에 3차원 벡터가 저장되어 있다고 하자. 이 형태의 배열을 입력 받아 단위 벡터(unit vector)로 바꾸어 주는 함수를 작성하고 테스트하라.

void vector_normalize(int size, double vector[]);

 

 


 배열 


 

 

------------------------------
교과서 문제
------------------------------

 

1. 배열 days[]를 아래와 같이 초기화하고 배열 원소의 값을 다음과 같이 출력하는 프로그램을 작성하라.

 

 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31

1월은 31일까지 있습니다.

2월은 29일까지 있습니다.

...

12월은 31일까지 있습니다. 

 

3. 사용자로부터 20개의 실수자료를 읽어서 평균과 표준편차를 계산하는 프로그램을 작성하여보자. 사용자로부터 받은 자료들은 배열에 저장한다. 평균은 n개의 실수가 주어져 있을 때, 다음과 같이 계산된다.

 

    표준편차는 분산의 양의 제곱근으로 다음과 같이 계산된다. 표준편차는 자료가 평균값 주위에 어느 정도의 넓이로 분포하고 있는가를 나타내는 척도 중 하나이다.

 

 

4. 0 부터 9 까지의 난수를 100번 생성하여 가장 많이 생성된 수를 출력하는 프로그램을 작성하여 보자. 난수 발생에 관해서는 다음 기사를 참고한다.

 

http://masw.tistory.com/entry/C-프로그램에서-난수Random-Number-발생

5. 다음 표의 각 행의 합계, 각 열의 합계를 구하는 프로그램을 작성하여보자. 표는 2차원 배열을 이용하여 표현한다.

 

12

56

32

16

98

99

56

34

41

3

65

3

87

78

21

 

6. 10진수를 2진수로 변환하여 출력하는 프로그램을 작성하여보자. 최대 64자리까지 변환이 가능하도록 한다. 변환된 자릿수를 저장하는데 배열을 사용한다. 10진수를 2로 나누어서 생성된 나머지를 역순으로 나타내면 2진수로 표현할 수 있다. 주어진 정수를 임의의 진법으로 변환할 수 있는 프로그램도 작성하여 보자.

 

for(i=0; i<32 && n>0; i++)

{

    binary[i] = n % 2;

    n = n / 2;

}

 

7. 주사위를 60000번 던져서 그 결과를 배열로 요약하여 보자. 잘 만들어진 주사위라면 하나의 면이 나올 확률은 1/6이 되어야 한다. 컴퓨터에서 주사위 던지기는 난수 발생으로 한다.

 

http://masw.tistory.com/entry/C-프로그램에서-난수Random-Number-발생

 

            주사위면          빈도        확률

                1                1029        0.1715

                2                  961        0.1602

                3                 ....

                4

                5

                6

 

------------------------------
교과서외 문제
------------------------------

1. 학생 100명의 시험성적을 다음과 같이 정리하고자 한다.

                  ---------------------------------------------------------

                    학생번호              과목A               과목B              과목C

                  ---------------------------------------------------------

                         1                      63                    78                    45

                        ...

                         100                   58                    55                     67

 

    (a) 성적을 int score[100][3] 의 2차원 배열에 저장하라. 점수는 난수로 정한다.

    (b) 각 학생의 합계점수와 평균을 계산해서 int sum[100], double ave_student[100] 에 저장하라.

    (c) 각 과목의 평균점수를 계산하여 double ave_subject[3]에 저장하라.

    (d) 각 과목에 대해 최고점수와 해당 학생의 번호를 구하라.

    (e) 최고 점수를 얻은 학생의 번호를 구하라.

 

    전체 학생의 점수를 표로 출력하고, 위의 계산을 할 때마다 적절한 형태로 출력하라.

 

2. 위의 1번에서 구한 sum[100]의 배열을 내림차순으로 정렬해서 출력하라. 정렬방법은 선택정렬(selection sort)를 사용한다. 선택정렬의 기본 골격은 교과서를 참고한다.

 

3. 다음과 같은 조건을 갖는 20x20 행렬을 만드는 프로그램을 작성하라.

    - 행렬의 대각선 위 부분은 +1로 채운다

    - 행렬의 대각선 아래 부분은 -1로 채운다

    - 행렬의 대각선 부분은 0으로 채운다.

    만들어진 행렬을 화면에 적절히 출력해라.

 

 


함수


 

 

 

 

 


반복문 



------------------------------
교과서 문제
------------------------------

1. 1부터 100까지의 자연수 중에서 3의 배수를 출력하라.

 

2. 1부터 100까지의 자연수 중에서 3의 배수이면서 동시에 5의 배수인 숫자를 출력하라.

 

3. 반복문을 이용하여 화씨온도 0도부터 100도까지의 구간에 대하여 10도 간격으로
   섭씨온도로 환산하는 표를 작성하라.

 

8. 피타고라스의 정리는 직각삼각형의 세변을 a, b, c라 할 때 a2 + b2 = c2이 성립한다는 것이다.
   각변의 길이가 100보다 작은 자연수일때 피타고라스의 정리를 만족시키는 쌍은 몇개인가?
   3중 반복문을 이용하여 이를 찾는 프로그램을 작성해 구하라.

 

9. 2와 100 사이에 있는 모든 소수(prime number)를 찾는 프로그램을 작성하여라. 소수는 1과
   자기 자신외에는 약수를 가지지 않는 수이다. 즉 n이 소수가 되려면 2부터 (n-1)까지의 수로
   나누어지지 않아야 한다. 나누어지는지는 나머지 연산자 (%)를 이용하여 검사할 수 있다.

 

------------------------------
교과서외 문제
------------------------------

1. 사용자가 어떤 수를 입력하면 이의 약수의 개수를 세어 출력하는 프로그램을 작성하라.
   n의 약수의 개수는 1부터 n까지를 일일히 나누어 보면서 세어야 한다.

 

2. 1에서 10000까지의 수 중에 약수를 가장 많이 가지는 수를 구하는 프로그램을 작성하라.
   그 수와 약수의 개수를 출력하도록 한다.

 

3. 어떤 숫자가 주어졌을 때 각 자리수를 역순으로 표현한 수를 출력해주는 프로그램을
   while문을 사용해 작성하라. 예를 들어, 숫자 12345는 다음과 같이 표현되어야 한다.
   54321
   힌트 : mod 연산자를 사용해 마지막 자리의 숫자를 가져올 수 있다. 또한 n자리수의 숫자에서
          처음 n-1자리의 숫자를 얻기 위해 10으로 숫자를 나누는 방법을 사용할 수 있다.

 

4. 어떤 정수 m 팩토리얼 값은 1부터 m까지의 연속된 정수들을 곱한 것이다. 즉,
   (m팩토리얼) = m! = m * (m-1) * ... * 1
   사용자가 m을 입력하면 팩토리얼 값을 계산하고 이를 출력하는 프로그램을 작성하라.

 

5. 어떤 정수가 주어졌을 때 그 수를 이루는 각 자리의 수의 합을 구하는 프로그램을 작성하라.

 

6. 아래와 같은 수열을 피보나치 수열이라고 부른다.
   1  1  2  3  5  8  13  21 ...
   do...while 문을 사용해 처음 m 개의 피보나치 수들을 구하고 이들을 출력하는 프로그램을 작성하라.
   m은 사용자로부터 입력받으며 3이상으로 한다.

 

7. 아래와 같이 출력해주는 프로그램을 for 문을 사용해 작성하라.
   (1) 1                       (2)  * * * * *
       2  2                           * * * *
       3  3  3                          * * *
       4  4  4  4                         * *
       5  5  5  5  5                        *

 

8. 100명의 나이를 1~99 범위의 난수로 발생시키면서 50세부터 60세에 속하는 사람들의 수를
   구해주는 프로그램을 작성하라. 단, for 문과 continue 문을 사용하라.
   힌트 : 난수 발생은 교재(C언어 콘서트)의 256쪽을 참조하라.

 

9. x 값이 0.0부터 10.0까지 0.10 단위로 변해갈 때, 아래 함수 y=exp(-x)의 값을 계산하여 표로 표시하라.

   ----------------------------------------------------------
     x      0.1      0.2      0.3      0.4      ...      0.9
   ----------------------------------------------------------
    0.0
    1.0
    2.0
    3.0
    4.0
     .
     .
     .
    9.0
   ----------------------------------------------------------

 

10. 자연 로그에서 사용되는 오일러 수 e 를 아래의 전개식을 사용하여 계산하라.
    이를 위해 적절한 반복문을 선택해 사용하라. 단, 전개식에서 연속된 두 개항 사이의
    차이가 0.00001 보다 작을 경우에만 반복문이 종료될 수 있다.

    e = 1 + 1/1! + 1/2! + 1/3! + ..... + 1/n!

 

11. 아래 함수들을 0.001%의 정확도로 계산해내기 위한 프로그램을 작성하라.
    x에 0.5, 1.0, 1.5 의 테스트값을 넣어 검사해보라.

    (1) sin(x) = x - x3/3! + x5/5! - x7/7! + ...
    (2) cos(x) = 1 - x2/2! + x4/4! - x6/6! + ...

 

12. 0도 부터 180도 까지 15도 간격으로 변해가는 x값에 대해 함수 y=sin(x)의 값들을 계산하여
    출력하는 프로그램을 작성하라.

 

13. 1과 100 사이에 존재하는 모든 정수중에 2와 3으로 나누어지지 않는 정수들을 순서대로 출력해주는
    프로그램을 작성하라. 또 이들의 개수와 합도 계산하여 출력하여야 한다.
    for문을 사용하라.

 

14. 가로 세로의 크기를 입력받아 S를 출력하고 중앙에만 O를 출력하는 프로그램을 작성하라.
    크기는 3, 5, 7, ... 등의 홀수만 입력받는다고 한다. 크기가 5이면 아래와 같이 된다.
    이중 for 루프를 사용하라.

 

    S S S S S
    S S S S S
    S S O S S
    S S S S S
    S S S S S