2026년 8월 16일 일요일

기계공작법 정오표

 40쪽

(수정 전)




(수정 후)





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


기계공작법 51쪽 - [6] 압탕, [7] 라이저 --> [6] 압탕(라이저, feeder, riser)로 변경



📖 교재 51쪽에 서술된 '6. 압탕(feeder)'과 '7. 라이저(riser)'의 기능적 구분에 대한 오류를 정정합니다. 기존 내용은 특정 교재를 참고하였으나, 교차 검증 결과 두 용어는 사실상 동일한 대상을 지칭하고 있었습니다.

❌ 현행 내용: '압탕'은 쇳물 보충, '라이저'는 가스 배출로 기능을 분리하여 설명.
❗ 문제점: 동일한 구조물을 다른 기능을 가진 별개의 요소처럼 서술하여 혼란을 유발.

1. 교재 수정 근거

여러 전문 자료를 검토한 결과, '압탕(Feeder)''라이저(Riser)'는 동일한 요소를 가리키는 용어이며, 핵심 기능은 '응고 수축에 따른 쇳물 보충'으로 같습니다.

1) 용어의 정의

  • 압탕(押湯, Feeder): 용탕의 무게(정수압)로 쇳물을 '눌러 공급한다'는 의미의 한자어.
  • 라이저(Riser): 주형을 채운 쇳물이 마지막으로 '솟아오르는(rise)' 통로라는 의미의 영어.

결론적으로 압탕 = 라이저 = 피더는 모두 같은 요소를 지칭하는 동의어입니다.

2) 주요 교재별 정의 비교

이성형 저, 『기계공작법』(일진사)
"(7) 라이저 (riser, 덧쇳물) ... ③ 금속이 응고할 때 체적 감소로 인한 쇳물 부족을 보충한다. ⑤ ... 가스를 방출하여 수축공 ... 현상이 생기지 않는다."
(→ '라이저'의 기능에 쇳물 보충과 가스 방출이 모두 포함됨)
김낙수 옮김, 『공업 재료 가공학』
"...이때 라이저(riser)는 냉각 및 응고 수축으로 인한 용탕의 부족을 공급하는 저장소 역할을 한다."
(→ '라이저'의 핵심 역할을 '응고 수축으로 인한 용탕 공급'으로 명시함)
강기주 저, 『기계공작법』
"...압력을 가할 수 있는 기능을 하는 부분을 압탕이라 한다. ... 이 밖에도 압탕(riser), 플로 오프(flow off) 등의 역할은 매우 중요하다."
(→ '압탕'과 '라이저'를 명백히 동일한 용어로 사용함)

3) 공무원 기출문제 용례

공무원 기출문제에서도 두 용어가 '응고 수축 보상'이라는 동일 기능으로 혼용되고 있음을 확인할 수 있습니다.

  • Q. (08년 국가직 9급) 사형 주조에서 응고 중 수축으로 인한 용탕의 부족분을 보충하는 곳은?
    정답: ② 라이저(Riser)
  • Q. (15년 서울시 9급) 응고 수축에 따른 부피 감소를 막기 위해 쇳물을 계속 보급하는 기능을 하는 장치는?
    정답: ① 압탕
  • Q. (16년 지방직 9급) 응고수축에 의한 주물제품의 불량을 방지하기 위한 목적으로 주형에 설치하는 탕구계 요소는?
    정답: ② 압탕구(feeder)

4) 오류의 원인 분석

'압탕/라이저'는 쇳물 보충 외에 여러 부가 기능을 가지는데, 일부 교재에서 이 기능들을 잘못 분리하여 서술한 것이 오류의 원인으로 보입니다.

윤여권 저, 『기계공작법』(북스힐)
"6) 압탕구(feeder) ... 부족하게 되는 쇳물을 보충하기 위해 ... 설치하는 것이 압탕구이다."
"7) 가스빼기(riser) ... 가스빼기(riser)는 주형 내의 가스나 증기 등을 배출시키고..."
(→ '압탕구'는 쇳물 보충, '라이저'는 가스 배출로 잘못 구분하여 서술함)
2009 개정 고등학교 기계공작법(일진사)
"④ 피더 ... 쇳물의 부족을 보충하는 역할을 한다."
"⑤ 라이저 ... 피더의 역할도 하지만 주로 주형 내의 가스나 수증기를 분출시키는 목적으로 설치한다."
(→ '라이저'를 '주로' 가스 배출 목적이라고 구분하여 혼란을 유발함)

하지만 순수한 가스 배출 목적의 통로는 '가스 빼기(Vent)'로 별도 구분하는 것이 일반적입니다.

2. 교재 수정 내용 (51쪽)

기존 '6. 압탕'과 '7. 라이저' 항목을 아래와 같이 하나로 통합하고, 이후 항목의 번호를 조정합니다.

[수정 내용]

6. 압탕 (Riser / Feeder)

압탕(押湯)은 라이저(Riser) 또는 피더(Feeder)라고도 부르며, 주형에 쇳물이 채워진 후 응고 과정에서 발생하는 체적 수축을 보충하기 위해 설치하는 일종의 '쇳물 저장소'입니다. 주물 본체보다 늦게 응고하면서 부족해지는 쇳물을 지속적으로 공급하여 내부 결함을 방지합니다.

주요 기능:

  • 수축공 방지 (핵심 기능): 응고 시 부족한 쇳물을 보충하여 주물 내부에 빈 공간(수축공)이 생기는 것을 막습니다.
  • 조직의 치밀화: 용탕의 압력으로 주물 조직을 더욱 단단하고 치밀하게 만듭니다.
  • 가스 및 불순물 배출: 쇳물보다 가벼운 가스나 불순물을 압탕 쪽으로 떠오르게 하여 제거합니다.
  • 주입량 확인: 압탕으로 쇳물이 솟아오르는 것을 보고 주입 완료를 시각적으로 확인합니다.
💡 용어 참고
과거 일부 교재에서 '압탕'은 쇳물 보충, '라이저'는 가스 배출로 기능을 구분하기도 했으나, 이는 용어의 혼선에서 비롯된 것입니다. '압탕', '라이저', '피더'는 모두 동일한 요소를 지칭하는 동의어(한자어, 영어, 영어 동의어)입니다.

7. 냉각쇠 (Chiller, Chill metal)

(기존 8번 항목 내용과 동일) ...



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

52쪽

기계공작법 52쪽 기공 -> 수축공

구분이미지
기존 설명 그림기존 설명 그림
수정된 설명 그림수정된 설명 그림




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


59쪽

기계공작법 59쪽 오타

연번기존 문장수정 문장수정 이유
1① 주입직후: 처음 주형에 충만된 쇳물은 응고 초기에 당면이 조금씩 내려갑니다.① 주입직후: 처음 주형에 충만된 쇳물은 응고 초기에 탕면이 조금씩 내려갑니다.오타
2③ 응고완료 : 이때에는 쇳물의 쇳물 응고가 지연될 때이지만, 어느 시기가 되면 당면에도 응고가 일어나서 주물 내부에 빈 곳이 생기게 됩니다.③ 응고완료 : 이때에는 쇳물 응고가 지연될 때이지만, 어느 시기가 되면 탕면에도 응고가 일어나서 주물 내부에 빈 곳이 생기게 됩니다.오타



------

60쪽

기계공작법 60쪽 - [2] 기공 내용 중 정정 사항

연번기존 문장수정 문장수정 이유
1… 주로 일산화탄소(CO), 수소(H₂), 질소(N₂)와 같은 가스에 의해 발생합니다.
불충분한 주형 통기도, 낮은 용탕 온도, 과도한 주입 속도 …
… 주로 일산화탄소(CO), 수소(H₂), 질소(N₂)와 같은 가스에 의해 발생합니다.
불충분한 주형 통기도, 과도하게 높은 용탕 온도, 과도한 주입 속도 …
낮은 용탕 온도는 주요 원인이 아니며, 오히려 과열 시 금속의 가스 용해도 및 주형 내 가스 발생이 증가해 기공 발생 가능성이 커짐.
2낮은 용탕 온도, 과도한 주입 속도, 주형 또는 코어의 불충분한 건조 …과도하게 높은 용탕 온도, 과도한 주입 속도, 주형 또는 코어의 불충분한 건조 …동일한 오류 표현 반복. 기술적 일관성과 정확성을 위해 정정 필요.
3방지책 : 주형의 통기도를 양호하게 하고, 용탕 온도를 낮게 조절하며, 주입 시 압력을 가합니다. …방지책 : 주형의 통기도를 양호하게 하고, 용탕이 과열되지 않도록 적정 온도로 조절하며, 주입 시 탕구계를 통해 용탕의 정수압이 확보되도록 설계합니다. …“낮게 조절”은 오해 소지가 있으며, “압력을 가한다”는 표현은 일반 주조 공정과 맞지 않음. 실제로는 탕구계 설계를 통한 정수압 확보가 필요함.



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


기계공작법 75쪽 그림 내용 중 오타

구분이미지
기존 설명 그림기존 설명 그림
수정된 설명 그림수정된 설명 그림


----------


기계공작법 90쪽 공식 중 오타

구분공식
기존 공식기존 설명 그림
수정된 공식수정된 설명 그림


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

기계공작법 102쪽 루브핑 -> 루브링

 (수정 전)


(수정 후)




----------

103쪽 스프백 비(K)

 (수정전)


 (수정후)



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

기계공작법 115쪽 결합->결함

(수정전)


(수정후)



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



189쪽 그림 제목 오탈자

(수정 전)


(수정 후)

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

기계공작법 194쪽 표번호 누락

(수정 전)



(수정 후)


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

기계공작법 197쪽 구멍 기준 끼워맞춤 표 수정

(수정 전)


(수정 후)



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

기계공작법 198쪽 표번호 누락

(수정 전)


(수정 후)




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

기계공작법 209쪽 기계금속 2004년 문제 도면 및 하위 문제 번호

  (수정 전)



(수정 후)


(참고) 원본 이미지



-----------

222쪽 문제 4.25번 중 오탈자

 (수정 전)



(수정 후)


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

226쪽 문제 끼워맞춤 표 수정

 (수정 전)


(수정 후)



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

기계공작법 237쪽 현형 관련 문제 풀이

 (수정 전)


(수정 후)


* 이유 : 이 문제에서는 ④ 부분형 (Section Pattern)에 대해서도 묻고 있으므로, 현형을 포괄적 의미로서 서술


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

기계공작법 246쪽 판재 성형 관련 문제 풀이(액압 성형 -> 벌징)

  (수정 전)


(수정 후)


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

기계공작법 260쪽 정답 ㄱ,ㄷ,ㄹ -> ㄷ,ㄹ

 (수정 전)


 (수정 후)

2025년 12월 10일 수요일

기말고사 대비 C언어 모의고사 풀이

문제 1.

다음 프로그램은 10진수 50을 2진수로 변환하여 8비트로 출력하는 코드이다.

빈칸 ㉠, ㉡에 들어갈 코드를 쓰고, 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int bin[8];
    int n = 50;

    for(int i = 7; i >= 0; i--){
        bin[i] = n % 2;
        n = n / ㉠;
    }

    for(int i = 0; i < 8; i++)
        printf("%d", ㉡);

    return 0;
}
답:
㉠: 2
㉡: bin[i]
실행 결과: 00110010
풀이:
10진수를 2진수로 변환하는 과정입니다. 10진수를 2로 계속 나누며 나머지(비트)를 배열에 저장합니다.
50 ÷ 2 = 25 나머지 0
25 ÷ 2 = 12 나머지 1
12 ÷ 2 = 6 나머지 0
6 ÷ 2 = 3 나머지 0
3 ÷ 2 = 1 나머지 1
1 ÷ 2 = 0 나머지 1
따라서 50은 2진수로 110010이며, 8비트 형식이므로 앞에 0을 채워 00110010으로 출력합니다.

문제 2.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {8, 14, 22, 31, 47, 53};
    int *p = a + 2;
    int *q = a + 4;

    printf("%d\n", *(q - 3) + *p);

    p = a;
    q = p + 4;
    printf("%d\n", *q - *(p + 1));

    return 0;
}
답:
첫 번째 출력: 36
두 번째 출력: 33
풀이:
배열: {8, 14, 22, 31, 47, 53} (인덱스 0~5)

첫 번째 출력:
- p = a + 2 → p는 a[2] (22)를 가리킴
- q = a + 4 → q는 a[4] (47)을 가리킴
- *(q - 3)은 q 위치(인덱스 4)에서 3칸 앞인 a[4-3] = a[1] (14)를 의미
- 따라서 *(q - 3) + *p = 14 + 22 = 36

두 번째 출력:
- p = a → p는 a[0] (8)을 가리킴
- q = p + 4 → q는 a[4] (47)을 가리킴
- *q = 47
- *(p + 1) = a[1] = 14
- 47 - 14 = 33

문제 3.

다음 프로그램은 배열을 선택 정렬로 오름차순 정렬한 후, 값 42를 이진 탐색으로 찾아 위치를 출력하는 코드이다.

(1) ㉠에 들어갈 while문의 조건식을 쓰고,

(2) ㉡에 들어갈 비교 연산자를 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int x[] = {42, 7, 19, 56, 33};
    int n = 5;
    int key = 42;
    int l = 0, r = n - 1, m;

    for(int i = 0; i < n - 1; i++){
        int idx = i;
        for(int j = i + 1; j < n; j++)
            if(x[j] < x[idx])
                idx = j;
        int t = x[i];
        x[i] = x[idx];
        x[idx] = t;
    }

    while(㉠){
        m = (l + r) / 2;

        if(key == x[m]) break;
        else if(key < x[m])
            r = m - 1;
        else
            l = m + 1;
    }

    if(key ㉡ x[m])
        printf("%d\n", m);

    return 0;
}
답:
(1) ㉠: l <= r
(2) ㉡: ==
(3) 실행 결과: 3
풀이:
선택 정렬 과정:
초기 배열: {42, 7, 19, 56, 33}
1회전: {7, 42, 19, 56, 33}
2회전: {7, 19, 42, 56, 33}
3회전: {7, 19, 33, 56, 42}
4회전: {7, 19, 33, 42, 56}

이진 탐색 과정:
정렬된 배열 {7, 19, 33, 42, 56}에서 42를 찾습니다.
- l=0, r=4, m=2 → x[2]=33 < 42 → l=3
- l=3, r=4, m=3 → x[3]=42 (찾음!)
따라서 42는 인덱스 3에 위치합니다.

문제 4.

다음 프로그램은 3×3 정수 배열의 각 행에서 가장 작은 값을 찾아 출력하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 세 정수를 순서대로 쓰시오.

#include <stdio.h>

int main(void){
    int d[3][3] = {
        {9, 4, 7},
        {2, 15, 3},
        {6, 8, 1}
    };

    for(int i = 0; i < 3; i++){
        int m = ㉠;
        for(int j = 0; j < 3; j++)
            if(d[i][j] < m)
                m = d[i][j];
        printf("%d ", ㉡);
    }

    return 0;
}
답:
(1) ㉠: d[i][0]
(1) ㉡: m
(2) 실행 결과: 4 2 1
풀이:
각 행의 첫 번째 요소를 초기 최솟값으로 설정하고, 나머지 요소들과 비교합니다.
1행: {9, 4, 7} → 최솟값 4
2행: {2, 15, 3} → 최솟값 2
3행: {6, 8, 1} → 최솟값 1

문제 5.

다음 프로그램은 정수 5개를 입력받아 평균을 구하고, 값의 구간별 개수를 출력하는 코드이다.

사용자가 순서대로 70 55 90 40 50을 입력한다고 할 때,

(1) ㉠, ㉡, ㉢, ㉣에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int v[5];
    int tot = 0;
    int big = 0, mid = 0, small = 0;

    for(int i = 0; i < 5; i++){
        printf("%d번째 값: ", ㉠);
        scanf("%d", ㉡);
        tot += v[i];

        if(㉢)
            big++;
        else if(v[i] >= 30)
            mid++;
        else
            small++;
    }

    printf("평균: %d\n", ㉣);
    printf("50 이상: %d\n", big);
    printf("30~49: %d\n", mid);
    printf("30 미만: %d\n", small);

    return 0;
}
답:
(1) ㉠: i + 1
(1) ㉡: &v[i]
(1) ㉢: v[i] >= 50
(1) ㉣: tot / 5
(2) 실행 결과:
평균: 61
50 이상: 4
30~49: 1
30 미만: 0
풀이:
입력값: 70, 55, 90, 40, 50
합계: 70 + 55 + 90 + 40 + 50 = 305
평균: 305 / 5 = 61

구간별 분류:
- 50 이상: 70, 55, 90, 50 → 4개
- 30~49: 40 → 1개
- 30 미만: (없음) → 0개

문제 6.

다음 프로그램은 먼저 학생 수를 입력받고, 각 학생의 학번과 점수를 입력받은 뒤, 입력된 점수 중 최저 점수를 출력하는 코드이다.

입력이 다음과 같다고 할 때,

  • 첫 줄: 학생 수 4
  • 이후 입력(학번, 점수 순서로 4명):
    • 101 76
    • 102 88
    • 103 69
    • 104 90

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과로 출력되는 값을 쓰시오.

#include <stdio.h>
#define MAX 10

int main(void){
    int id[MAX], sc[MAX];
    int n;
    int min = 101;

    scanf("%d", &n);

    for(int i = 0; ㉠; i++){
        scanf("%d", &id[i]);
        scanf("%d", &sc[i]);

        if(㉡)
            min = sc[i];
    }

    printf("%d\n", ㉢);

    return 0;
}
답:
(1) ㉠: i < n
(1) ㉡: sc[i] < min
(1) ㉢: min
(2) 실행 결과: 69
풀이:
1. 조건식(㉠): 0부터 시작하는 인덱스 i가 입력받은 학생 수 n보다 작을 때까지 반복해야 하므로 i < n입니다.
2. 최솟값 갱신(㉡): 현재 입력받은 점수 sc[i]가 기존의 최솟값 min보다 작다면 min을 갱신해야 하므로 sc[i] < min입니다.
3. 출력(㉢): 최종적으로 구해진 최저 점수 변수 min을 출력합니다.

비교 과정 (초기 min = 101):
- 76 < 101 (참) → min = 76
- 88 < 76 (거짓)
- 69 < 76 (참) → min = 69
- 90 < 69 (거짓)
따라서 최저 점수는 69입니다.

문제 7.

다음 프로그램은 입력받은 정수 n의 팩토리얼(n! = 1 × 2 × ... × n)을 구하는 코드이다.
사용자가 정수 4를 입력했다고 할 때,
(1) ㉠, ㉡에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int n;
    int res = 1;

    printf("정수 입력: ");
    scanf("%d", &n);

    for(int i = 1; i <= n; i++){
        ㉠
    }

    printf("%d", ㉡);

    return 0;
}
답:
(1) ㉠: res = res * i; (또는 res *= i;)
(1) ㉡: res
(2) 실행 결과: 24
풀이:
팩토리얼(n!)은 1부터 n까지의 정수를 모두 곱한 값입니다.

1. 변수 res는 곱셈의 항등원인 1로 초기화되어 있습니다.
2. 반복문이 1부터 n까지 순회하며, 빈칸 ㉠에서 현재의 i 값을 res에 계속 곱해서 누적해야 합니다.
3. 따라서 res = res * i; 또는 복합 대입 연산자를 사용한 res *= i;가 들어갑니다.

계산 과정 (입력 4):
- i=1: res = 1 × 1 = 1
- i=2: res = 1 × 2 = 2
- i=3: res = 2 × 3 = 6
- i=4: res = 6 × 4 = 24

문제 8.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int arr[] = {3, 6, 9, 12, 15};
    int *p = &arr[1]; 
    int *q = arr + 4; 

    printf("%d\n", *q - *p);

    p++; 
    q = q - 2; 
    printf("%d\n", *p + *q);

    return 0;
}
답:
첫 번째 출력: 9
두 번째 출력: 18
풀이:
첫 번째 출력:
- p = &arr[1] → p는 arr[1] (6)을 가리킴
- q = arr + 4 → q는 arr[4] (15)를 가리킴
- *q - *p = 15 - 6 = 9

두 번째 출력:
- p++ → p는 arr[2] (9)를 가리킴
- q = q - 2 → q는 arr[2] (9)를 가리킴
- *p + *q = 9 + 9 = 18

문제 9.

다음 프로그램은 배열에서 가장 큰 값(최댓값)의 인덱스(위치)를 찾아 출력하는 코드이다.

(1) ㉠에 들어갈 비교 연산자를 쓰고,

(2) ㉡에 들어갈 코드를 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int data[] = {12, 45, 7, 23, 56, 9};
    int n = 6;
    int max_idx = 0;

    for(int i = 1; i < n; i++){
        if(data[i] ㉠ data[max_idx]){
            max_idx = ㉡;
        }
    }

    printf("%d\n", max_idx);

    return 0;
}
답:
(1) ㉠: >
(2) ㉡: i
(3) 실행 결과: 4
풀이:
배열: {12, 45, 7, 23, 56, 9}

비교 과정:
- i=1: data[1]=45 > data[0]=12 → max_idx = 1
- i=2: data[2]=7 > data[1]=45 (거짓)
- i=3: data[3]=23 > data[1]=45 (거짓)
- i=4: data[4]=56 > data[1]=45 → max_idx = 4
- i=5: data[5]=9 > data[4]=56 (거짓)

가장 큰 값 56은 인덱스 4에 있습니다.

문제 10.

다음 프로그램은 2행 3열 배열의 모든 요소를 순회하며 10보다 큰 수의 합계를 구하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int arr[2][3] = {
        {5, 12, 8},
        {15, 3, 20}
    };
    int sum = 0;

    for(int i = 0; i < 2; i++){
        for(int j = 0; j < 3; j++){
            if(arr[i][j] > 10)
                sum += ㉠;
        }
    }

    printf("%d", ㉡);

    return 0;
}
답:
(1) ㉠: arr[i][j]
(1) ㉡: sum
(2) 실행 결과: 47
풀이:
배열 요소 중 10보다 큰 값들을 찾습니다.

10보다 큰 값:
- arr[0][1] = 12
- arr[1][0] = 15
- arr[1][2] = 20

합계: 12 + 15 + 20 = 47

문제 11.

다음 프로그램은 정수 5개가 저장된 배열을 역순(거꾸로)으로 뒤집는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int arr[5] = {1, 2, 3, 4, 5};
    int temp;

    for(int i = 0; i < 2; i++){
        temp = arr[i];
        arr[i] = arr[4 - i];
        arr[4 - i] = ㉠;
    }

    for(int i = 0; i < 5; i++)
        printf("%d ", ㉡);

    return 0;
}
답:
(1) ㉠: temp
(1) ㉡: arr[i]
(2) 실행 결과: 5 4 3 2 1
풀이:
배열의 양 끝 요소를 교환하여 역순으로 만듭니다.

교환 과정:
- i=0: arr[0]과 arr[4] 교환 → {5, 2, 3, 4, 1}
- i=1: arr[1]과 arr[3] 교환 → {5, 4, 3, 2, 1}

※ 중간 요소(arr[2])는 교환 불필요

문제 12.

다음 프로그램은 1부터 입력받은 정수 n까지의 합(누적 합)을 구하여 출력하는 코드이다.
사용자가 정수 5를 입력했다고 할 때,
(1) 빈칸 ㉠, ㉡에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int n, sum = 0;
    
    printf("정수 입력: ");
    scanf("%d", &n);

    for(int i = 1; ㉠ ; i++){
        ㉡
    }

    printf("%d", sum);

    return 0;
}
답:
(1) ㉠: i <= n
(1) ㉡: sum += i; (또는 sum = sum + i;)
(2) 실행 결과: 15
풀이:
1부터 n까지의 정수를 순차적으로 더하는 과정입니다.

1. 조건식(㉠): 변수 i가 1부터 시작하여 입력받은 수 n까지 반복해야 하므로 i <= n이 됩니다.
2. 실행문(㉡): 반복할 때마다 현재의 i 값을 sum에 더해서 저장해야 하므로 sum += i;가 됩니다.

계산 과정 (입력 5):
- i=1: sum = 0 + 1 = 1
- i=2: sum = 1 + 2 = 3
- i=3: sum = 3 + 3 = 6
- i=4: sum = 6 + 4 = 10
- i=5: sum = 10 + 5 = 15

문제 13.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int arr[] = {10, 20, 30, 40, 50};
    int *p = arr;      
    int *q = arr + 3;  

    printf("%d\n", *(p + 1) + *q);

    p++;
    q--;
    printf("%d\n", *q - *p);

    return 0;
}
답:
첫 번째 출력: 60
두 번째 출력: 10
풀이:
첫 번째 출력:
- p = arr → p는 arr[0] (10)을 가리킴
- q = arr + 3 → q는 arr[3] (40)을 가리킴
- *(p + 1) = arr[1] = 20
- *q = 40
- 20 + 40 = 60

두 번째 출력:
- p++ → p는 arr[1] (20)을 가리킴
- q-- → q는 arr[2] (30)을 가리킴
- *q - *p = 30 - 20 = 10

문제 14.

다음 프로그램은 정수 배열을 버블 정렬(Bubble Sort)을 이용하여 오름차순으로 정렬하는 코드이다.

(1) ㉠에 들어갈 비교 연산자를 쓰고,

(2) ㉡에 들어갈 변수명을 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {8, 3, 5, 1, 9};
    int n = 5;
    int temp;

    for(int i = 0; i < n - 1; i++){
        for(int j = 0; j < n - 1 - i; j++){
            if(a[j] ㉠ a[j+1]){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = ㉡;
            }
        }
    }

    printf("%d\n", a[2]); 

    return 0;
}
답:
(1) ㉠: >
(2) ㉡: temp
(3) 실행 결과: 5
풀이:
버블 정렬을 통해 오름차순으로 정렬합니다.

정렬 과정:
초기: {8, 3, 5, 1, 9}
1회전: {3, 5, 1, 8, 9}
2회전: {3, 1, 5, 8, 9}
3회전: {1, 3, 5, 8, 9}
4회전: {1, 3, 5, 8, 9}

정렬 후 a[2] = 5

문제 15.

다음 프로그램은 3×3 정수 배열의 대각선 요소(왼쪽 위에서 오른쪽 아래로)의 합계를 구하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int m[3][3] = {
        {10, 2, 3},
        {4, 20, 6},
        {7, 8, 30}
    };
    int sum = 0;

    for(int i = 0; i < 3; i++){
        sum += ㉠;
    }

    printf("%d", ㉡);

    return 0;
}
답:
(1) ㉠: m[i][i]
(1) ㉡: sum
(2) 실행 결과: 60
풀이:
주 대각선 요소는 행과 열의 인덱스가 같은 요소입니다.

대각선 요소:
- m[0][0] = 10
- m[1][1] = 20
- m[2][2] = 30

합계: 10 + 20 + 30 = 60

문제 16.

다음 프로그램은 정수 5개를 입력받아 그중 짝수의 개수와 홀수의 합을 출력하는 코드이다.

사용자가 순서대로 2 5 8 11 14를 입력한다고 할 때,

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int num[5];
    int even_cnt = 0;
    int odd_sum = 0;

    for(int i = 0; i < 5; i++){
        scanf("%d", &num[i]);

        if(num[i] % 2 ㉠ 0)
            even_cnt++;
        else
            odd_sum ㉡ num[i];
    }

    printf("짝수 개수: %d\n", ㉢);
    printf("홀수 합: %d\n", odd_sum);

    return 0;
}
답:
(1) ㉠: ==
(1) ㉡: +=
(1) ㉢: even_cnt
(2) 실행 결과:
짝수 개수: 3
홀수 합: 16
풀이:
입력값: 2, 5, 8, 11, 14

짝수: 2, 8, 14 → 3개
홀수: 5, 11 → 합: 5 + 11 = 16

문제 17.

다음 프로그램은 10진수 37을 2진수로 변환하여 8비트로 출력하는 코드이다.
빈칸 ㉠, ㉡에 들어갈 코드를 쓰고, 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int bin[8];
    ㉠;

    for(int i = 7; i >= 0; i--){
        bin[i] = n % 2;
        ㉡;
    }

    for(int i = 0; i < 8; i++)
        printf("%d", bin[i]);

    return 0;
}
답:
㉠: int n = 37
㉡: n = n / 2 (또는 n /= 2)
실행 결과: 00100101
풀이:
10진수 37을 2진수로 변환하는 과정입니다.

1. 변수 선언(㉠): 코드에서 n이라는 변수를 사용하고 있으나 선언되지 않았습니다. 문제에서 10진수 37을 변환한다고 했으므로, int n = 37로 변수 선언과 동시에 값을 대입해야 합니다.
2. 값 갱신(㉡): 2진수 변환을 위해 현재의 n을 2로 나눈 몫을 다시 n에 저장해야 다음 자릿수를 계산할 수 있습니다. 따라서 n = n / 2;가 됩니다.

변환 과정:
- 37 ÷ 2 = 18 ... 나머지 1 (bin[7])
- 18 ÷ 2 = 9 ... 나머지 0 (bin[6])
- 9 ÷ 2 = 4 ... 나머지 1 (bin[5])
- 4 ÷ 2 = 2 ... 나머지 0 (bin[4])
- 2 ÷ 2 = 1 ... 나머지 0 (bin[3])
- 1 ÷ 2 = 0 ... 나머지 1 (bin[2])
- 이후 0은 계속 0 ... (bin[1], bin[0])

출력(0부터 7까지): 앞쪽 빈칸은 0으로 채워져 00100101이 출력됩니다.

문제 18.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {3, 5, 9, 12, 20, 25};
    int *p = a + 1;
    int *q = a + 4;

    printf("%d\n", *q - *(p - 1));

    p = a + 2;
    q = a + 3;
    printf("%d\n", *q + *(p + 1));

    return 0;
}
답:
첫 번째 출력: 17
두 번째 출력: 24
풀이:
첫 번째 출력:
- p = a + 1 → p는 a[1] (5)를 가리킴
- q = a + 4 → q는 a[4] (20)을 가리킴
- *(p - 1) = a[0] = 3
- *q = 20
- 20 - 3 = 17

두 번째 출력:
- p = a + 2 → p는 a[2] (9)를 가리킴
- q = a + 3 → q는 a[3] (12)를 가리킴
- *(p + 1) = a[3] = 12
- *q = 12
- 12 + 12 = 24

문제 19.

다음 프로그램은 정수 배열을 선택 정렬로 오름차순 정렬한 후, 값 25를 선형 탐색으로 찾아 위치를 출력하는 코드이다.

(1) ㉠에 들어갈 while문의 조건식을 쓰고,

(2) ㉡에 들어갈 if문의 조건식을 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int x[] = {30, 12, 7, 25, 18};
    int n = 5;
    int key = 25;
    int pos = -1;

    for(int i = 0; i < n - 1; i++){
        int idx = i;
        for(int j = i + 1; j < n; j++)
            if(x[j] < x[idx])
                idx = j;
        int t = x[i];
        x[i] = x[idx];
        x[idx] = t;
    }

    int i = 0;
    while(㉠){
        if(x[i] == key){
            pos = i;
            break;
        }
        i++;
    }

    if(㉡)
        printf("%d\n", pos);

    return 0;
}
답:
(1) ㉠: i < n
(2) ㉡: pos != -1
(3) 실행 결과: 3
풀이:
선택 정렬 과정:
초기 배열: {30, 12, 7, 25, 18}
정렬 결과: {7, 12, 18, 25, 30}

선형 탐색:
25를 찾습니다. 정렬된 배열에서 25는 인덱스 3에 위치합니다.

문제 20.

다음 프로그램은 3×3 정수 배열의 각 열에서 가장 큰 값을 찾아 출력하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 세 정수를 순서대로 쓰시오.

#include <stdio.h>

int main(void){
    int d[3][3] = {
        {5, 9, 2},
        {11, 4, 7},
        {6, 8, 10}
    };

    for(int j = 0; j < 3; j++){
        int m = ㉠;
        for(int i = 0; i < 3; i++)
            if(d[i][j] > m)
                m = d[i][j];
        printf("%d ", ㉡);
    }

    return 0;
}
답:
(1) ㉠: d[0][j]
(1) ㉡: m
(2) 실행 결과: 11 9 10
풀이:
각 열(세로)의 최댓값을 구합니다.

1열(j=0): {5, 11, 6} → 최댓값 11
2열(j=1): {9, 4, 8} → 최댓값 9
3열(j=2): {2, 7, 10} → 최댓값 10

문제 21.

다음 프로그램은 정수 5개를 입력받아 평균을 구하고, 값의 구간별 개수를 출력하는 코드이다.

사용자가 순서대로 80 35 70 55 20을 입력한다고 할 때,

(1) ㉠, ㉡, ㉢, ㉣에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int v[5];
    int tot = 0;
    int high = 0, mid = 0, low = 0;

    for(int i = 0; i < 5; i++){
        printf("%d번째 값: ", ㉠);
        scanf("%d", ㉡);
        tot += v[i];

        if(㉢)
            high++;
        else if(v[i] >= 40)
            mid++;
        else
            low++;
    }

    printf("평균: %d\n", ㉣);
    printf("70 이상: %d\n", high);
    printf("40~69: %d\n", mid);
    printf("40 미만: %d\n", low);

    return 0;
}
답:
(1) ㉠: i + 1
(1) ㉡: &v[i]
(1) ㉢: v[i] >= 70
(1) ㉣: tot / 5
(2) 실행 결과:
평균: 52
70 이상: 2
40~69: 1
40 미만: 2
풀이:
입력값: 80, 35, 70, 55, 20
합계: 80 + 35 + 70 + 55 + 20 = 260
평균: 260 / 5 = 52

구간별 분류:
- 70 이상: 80, 70 → 2개
- 40~69: 55 → 1개
- 40 미만: 35, 20 → 2개

문제 22.

다음 프로그램은 먼저 학생 수를 입력받고, 각 학생의 학번과 점수를 입력받은 뒤, 입력된 점수 중 최고 점수를 받은 학생의 학번을 출력하는 코드이다.

입력이 다음과 같다고 할 때,

  • 첫 줄: 학생 수 4
  • 이후 입력(학번, 점수 순서로 4명):
    • 101 76
    • 102 88
    • 103 69
    • 104 90

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 값을 쓰시오.

#include <stdio.h>
#define MAX 10

int main(void){
    int id[MAX], sc[MAX];
    int n;
    int max = -1;
    int max_id = 0;

    scanf("%d", &n);

    for(int i = 0; i < ㉠; i++){
        scanf("%d", &id[i]);
        scanf("%d", &sc[i]);

        if(㉡){
            max = sc[i];
            max_id = id[i];
        }
    }

    printf("%d\n", ㉢);

    return 0;
}
답:
(1) ㉠: n
(1) ㉡: sc[i] > max
(1) ㉢: max_id
(2) 실행 결과: 104
풀이:
입력: 101 76, 102 88, 103 69, 104 90

비교 과정:
- sc[0] = 76 > -1 → max = 76, max_id = 101
- sc[1] = 88 > 76 → max = 88, max_id = 102
- sc[2] = 69 > 88 (거짓)
- sc[3] = 90 > 88 → max = 90, max_id = 104

최고 점수 90점을 받은 학생의 학번은 104입니다.

문제 23.

다음 프로그램은 크기가 5인 정수 배열의 모든 요소를 왼쪽으로 한 칸씩 이동(회전)시키고, 맨 앞에 있던 값은 맨 뒤로 이동시키는 코드이다.
(1) ㉠, ㉡에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int a[5] = {10, 20, 30, 40, 50};
    int temp = a[0];

    for(int i = 0; i < 4; i++){
        a[i] = ㉠;
    }
    a[4] = ㉡;

    for(int i = 0; i < 5; i++)
        printf("%d ", a[i]);

    return 0;
}
답:
(1) ㉠: a[i + 1]
(1) ㉡: temp
(2) 실행 결과: 20 30 40 50 10
풀이:
배열의 요소를 왼쪽으로 한 칸씩 당기는(Shift) 알고리즘입니다.

1. 초기 저장: temp = a[0]을 통해 맨 앞의 값(10)을 임시 변수에 보관합니다. (덮어쓰기 방지)
2. 이동(㉠): 반복문을 통해 뒤에 있는 요소 a[i+1]을 앞의 요소 a[i]로 덮어씁니다.
- a[0] = a[1] (20)
- a[1] = a[2] (30)
- a[2] = a[3] (40)
- a[3] = a[4] (50)
3. 마무리(㉡): 반복문이 끝나면 맨 마지막 자리(a[4])가 비게 되므로(엄밀히 말하면 복사된 값), 보관해두었던 첫 번째 값 temp(10)를 대입합니다.

따라서 {10, 20, 30, 40, 50} → {20, 30, 40, 50, 10}이 됩니다.

문제 24.

다음 프로그램에서 포인터 연산을 이용하여 배열의 값을 계산하는 코드이다. 프로그램 실행 결과로 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {5, 12, 20, 27, 35, 42};
    int *p = a + 1;
    int *q = a + 4;

    printf("%d\n", *(q - 2) + 5);

    p = a;
    printf("%d\n", *(p + 3));

    return 0;
}
답:
첫 번째 출력: 25
두 번째 출력: 27
풀이:
첫 번째 출력:
- q = a + 4 → q는 a[4] (35)를 가리킴
- *(q - 2) = a[2] = 20
- 20 + 5 = 25

두 번째 출력:
- p = a → p는 a[0]을 가리킴
- *(p + 3) = a[3] = 27

문제 25.

다음 프로그램은 배열을 버블 정렬로 오름차순 정렬한 뒤, 값 25의 위치(인덱스)를 출력하는 코드이다.
(1) ㉠, ㉡에 들어갈 for문의 조건식을 쓰고,
(2) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int x[] = {25, 9, 31, 17, 40};
    int n = 5;
    int key = 25;
    int idx = -1;

    for(int i = 0; ㉠; i++){
        for(int j = 0; ㉡; j++){
            if(x[j] > x[j + 1]){
                int t = x[j];
                x[j] = x[j + 1];
                x[j + 1] = t;
            }
        }
    }

    for(int i = 0; i < n; i++){
        if(x[i] == key){
            idx = i;
            break;
        }
    }

    if(idx != -1)
        printf("%d\n", idx);

    return 0;
}
답:
(1) ㉠: i < n - 1
(1) ㉡: j < n - 1 - i
(2) 실행 결과: 2
풀이:
버블 정렬(Bubble Sort)을 수행하여 오름차순으로 정렬하는 과정입니다.

1. 바깥쪽 반복문(㉠): 배열의 요소가 n개일 때, 정렬을 완료하기 위해 총 n-1회의 회전(pass)이 필요합니다. 따라서 조건식은 i < n - 1이 됩니다.
2. 안쪽 반복문(㉡): 각 회전마다 가장 큰 수가 맨 뒤로 이동하여 고정되므로, 비교해야 할 요소의 개수는 하나씩 줄어듭니다. 따라서 전체 길이에서 현재 회전수(i)와 1을 뺀 범위까지 반복해야 하므로 j < n - 1 - i가 됩니다.

정렬 과정:
- 초기 배열: {25, 9, 31, 17, 40}
- 정렬 완료: {9, 17, 25, 31, 40}

정렬된 배열에서 값 25는 인덱스 2에 위치합니다.

문제 26.

다음 프로그램은 3×3 정수 배열에서 각 행의 합을 구하여 출력하는 코드이다.
(1) ㉠, ㉡에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과로 출력되는 세 정수를 순서대로 쓰시오.

#include <stdio.h>

int main(void){
    int d[3][3] = {
        {2, 5, 7},
        {4, 1, 9},
        {6, 3, 8}
    };

    for(int i = 0; i < 3; i++){
        int s = 0;
        for(int j = 0; j < 3; j++)
            ㉠
        printf("%d ", ㉡);
    }

    return 0;
}
답:
(1) ㉠: s += d[i][j];
(1) ㉡: s
(2) 실행 결과: 14 14 17
풀이:
이중 반복문을 사용하여 2차원 배열의 각 행(row)의 합계를 구하는 과정입니다.

1. 바깥쪽 반복문(i)이 각 행을 순회할 때마다 합계 변수 s를 0으로 초기화합니다.
2. 안쪽 반복문(j)에서는 해당 행(i)의 모든 열(0~2)을 순회합니다.
3. 따라서 빈칸 ㉠에는 현재 행(i)과 열(j)의 값 d[i][j]를 s에 계속 더해주는 누적 연산 코드 s += d[i][j];가 들어가야 합니다.

1행(i=0): 2 + 5 + 7 = 14
2행(i=1): 4 + 1 + 9 = 14
3행(i=2): 6 + 3 + 8 = 17

문제 27.

다음 프로그램은 정수 4개를 입력받아 평균을 구하고, 점수 구간별로 개수를 세어 출력하는 코드이다.

사용자가 순서대로 85 60 45 90을 입력한다고 할 때,

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int v[4];
    int tot = 0;
    int high = 0, mid = 0, low = 0;

    for(int i = 0; i < 4; i++){
        scanf("%d", &v[i]);
        tot += ㉠;

        if(v[i] >= 80)
            high++;
        else if(㉡)
            mid++;
        else
            low++;
    }

    printf("평균: %d\n", tot / ㉢);
    printf("80 이상: %d\n", high);
    printf("60~79: %d\n", mid);
    printf("60 미만: %d\n", low);

    return 0;
}
답:
(1) ㉠: v[i]
(1) ㉡: v[i] >= 60
(1) ㉢: 4
(2) 실행 결과:
평균: 70
80 이상: 2
60~79: 1
60 미만: 1
풀이:
입력값: 85, 60, 45, 90
합계: 85 + 60 + 45 + 90 = 280
평균: 280 / 4 = 70

구간별 분류:
- 80 이상: 85, 90 → 2개
- 60~79: 60 → 1개
- 60 미만: 45 → 1개

문제 28.

다음 프로그램은 먼저 학생 수를 입력받고, 각 학생의 학번과 점수를 입력받은 뒤, 최댓값을 가진 학생의 학번을 출력하는 코드이다.

입력이 다음과 같다고 할 때,

  • 첫 줄: 학생 수 4
  • 이후 입력(학번, 점수 순서로 4명):
    • 201 70
    • 202 95
    • 203 88
    • 204 95

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 값을 쓰시오.

#include <stdio.h>
#define MAX 10

int main(void){
    int id[MAX], sc[MAX];
    int n;
    int max = -1;
    int max_id = 0;

    scanf("%d", &n);

    for(int i = 0; i < n; i++){
        scanf("%d", &id[i]);
        scanf("%d", &sc[i]);

        if(㉠){
            max = sc[i];
            ㉡ = id[i];
        }
    }

    printf("%d\n", ㉢);

    return 0;
}
답:
(1) ㉠: sc[i] > max
(1) ㉡: max_id
(1) ㉢: max_id
(2) 실행 결과: 202
풀이:
입력: 201 70, 202 95, 203 88, 204 95

비교 과정:
- sc[0] = 70 > -1 → max = 70, max_id = 201
- sc[1] = 95 > 70 → max = 95, max_id = 202
- sc[2] = 88 > 95 (거짓)
- sc[3] = 95 > 95 (거짓)

※ 비교 연산자가 >이므로 같은 점수일 때는 첫 번째로 나타난 학생의 학번이 유지됩니다.
따라서 95점을 받은 학생 중 먼저 입력된 202번이 출력됩니다.

2025년 12월 9일 화요일

기말고사 대비 C언어 모의고사 문제

기말고사 대비 C언어 모의고사

문제 1.

다음 프로그램은 10진수 50을 2진수로 변환하여 8비트로 출력하는 코드이다.

빈칸 ㉠, ㉡에 들어갈 코드를 쓰고, 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int bin[8];
    int n = 50;

    for(int i = 7; i >= 0; i--){
        bin[i] = n % 2;
        n = n / ㉠;
    }

    for(int i = 0; i < 8; i++)
        printf("%d", ㉡);

    return 0;
}

문제 2.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {8, 14, 22, 31, 47, 53};
    int *p = a + 2;
    int *q = a + 5;

    printf("%d\n", *(q - 3) + *p);

    p = a;
    q = p + 4;
    printf("%d\n", *q - *(p + 1));

    return 0;
}

문제 3.

다음 프로그램은 배열을 선택 정렬로 오름차순 정렬한 후, 값 42를 이진 탐색으로 찾아 위치를 출력하는 코드이다.

(1) ㉠에 들어갈 while문의 조건식을 쓰고,

(2) ㉡에 들어갈 비교 연산자를 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int x[] = {42, 7, 19, 56, 33};
    int n = 5;
    int key = 42;
    int l = 0, r = n - 1, m;

    for(int i = 0; i < n - 1; i++){
        int idx = i;
        for(int j = i + 1; j < n; j++)
            if(x[j] < x[idx])
                idx = j;
        int t = x[i];
        x[i] = x[idx];
        x[idx] = t;
    }

    while(㉠){
        m = (l + r) / 2;

        if(key == x[m]) break;
        else if(key < x[m])
            r = m - 1;
        else
            l = m + 1;
    }

    if(key ㉡ x[m])
        printf("%d\n", m);

    return 0;
}

문제 4.

다음 프로그램은 3×3 정수 배열의 각 행에서 가장 작은 값을 찾아 출력하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 세 정수를 순서대로 쓰시오.

#include <stdio.h>

int main(void){
    int d[3][3] = {
        {9, 4, 7},
        {2, 15, 3},
        {6, 8, 1}
    };

    for(int i = 0; i < 3; i++){
        int m = ㉠;
        for(int j = 0; j < 3; j++)
            if(d[i][j] < m)
                m = d[i][j];
        printf("%d ", ㉡);
    }

    return 0;
}

문제 5.

다음 프로그램은 정수 5개를 입력받아 평균을 구하고, 값의 구간별 개수를 출력하는 코드이다.

사용자가 순서대로 70 55 90 40 50을 입력한다고 할 때,

(1) ㉠, ㉡, ㉢, ㉣에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int v[5];
    int tot = 0;
    int big = 0, mid = 0, small = 0;

    for(int i = 0; i < 5; i++){
        printf("%d번째 값: ", ㉠);
        scanf("%d", ㉡);
        tot += v[i];

        if(㉢)
            big++;
        else if(v[i] >= 30)
            mid++;
        else
            small++;
    }

    printf("평균: %d\n", ㉣);
    printf("50 이상: %d\n", big);
    printf("30~49: %d\n", mid);
    printf("30 미만: %d\n", small);

    return 0;
}

문제 6.

다음 프로그램은 먼저 학생 수를 입력받고, 각 학생의 학번과 점수를 입력받은 뒤, 입력된 점수 중 최저 점수를 출력하는 코드이다.

입력이 다음과 같다고 할 때,

  • 첫 줄: 학생 수 4
  • 이후 입력(학번, 점수 순서로 4명):
    • 101 76
    • 102 88
    • 103 69
    • 104 90

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과로 출력되는 값을 쓰시오.

#include <stdio.h>
#define MAX 10

int main(void){
    int id[MAX], sc[MAX];
    int n;
    int min = 101;

    scanf("%d", &n);

    for(int i = 0; ㉠; i++){
        scanf("%d", &id[i]);
        scanf("%d", &sc[i]);

        if(㉡)
            min = sc[i];
    }

    printf("%d\n", ㉢);

    return 0;
}

문제 7.

다음 프로그램은 입력받은 정수 n의 팩토리얼(n! = 1 × 2 × ... × n)을 구하는 코드이다.

사용자가 정수 4를 입력했다고 할 때,

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int n;
    int res = 1;

    printf("정수 입력: ");
    scanf("%d", &n);

    for(int i = 1; i <= n; i++){
        ㉠ 
    }

    printf("%d", ㉡);

    return 0;
}

문제 8.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int arr[] = {3, 6, 9, 12, 15};
    int *p = &arr[1]; 
    int *q = arr + 4; 

    printf("%d\n", *q - *p);

    p++; 
    q = q - 2; 
    printf("%d\n", *p + *q);

    return 0;
}

문제 9.

다음 프로그램은 배열에서 가장 큰 값(최댓값)의 인덱스(위치)를 찾아 출력하는 코드이다.

(1) ㉠에 들어갈 비교 연산자를 쓰고,

(2) ㉡에 들어갈 코드를 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int data[] = {12, 45, 7, 23, 56, 9};
    int n = 6;
    int max_idx = 0;

    for(int i = 1; i < n; i++){
        if(data[i] ㉠ data[max_idx]){
            max_idx = ㉡;
        }
    }

    printf("%d\n", max_idx);

    return 0;
}

문제 10.

다음 프로그램은 2행 3열 배열의 모든 요소를 순회하며 10보다 큰 수의 합계를 구하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int arr[2][3] = {
        {5, 12, 8},
        {15, 3, 20}
    };
    int sum = 0;

    for(int i = 0; i < 2; i++){
        for(int j = 0; j < 3; j++){
            if(arr[i][j] > 10)
                sum += ㉠;
        }
    }

    printf("%d", ㉡);

    return 0;
}

문제 11.

다음 프로그램은 정수 5개가 저장된 배열을 역순(거꾸로)으로 뒤집는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int arr[5] = {1, 2, 3, 4, 5};
    int temp;

    for(int i = 0; i < 2; i++){
        temp = arr[i];
        arr[i] = arr[4 - i];
        arr[4 - i] = ㉠;
    }

    for(int i = 0; i < 5; i++)
        printf("%d ", ㉡);

    return 0;
}

문제 12.

다음 프로그램은 1부터 입력받은 정수 n까지의 합(누적 합)을 구하여 출력하는 코드이다.

사용자가 정수 5를 입력했다고 할 때,

(1) 빈칸 ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int n, sum = 0;
    
    printf("정수 입력: ");
    scanf("%d", &n);

    for(int i = 1;  ㉠ ; i++){
         ㉡ 
    }

    printf("%d", sum);

    return 0;
}

문제 13.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int arr[] = {10, 20, 30, 40, 50};
    int *p = arr;      
    int *q = arr + 3;  

    printf("%d\n", *(p + 1) + *q);

    p++;
    q--;
    printf("%d\n", *q - *p);

    return 0;
}

문제 14.

다음 프로그램은 정수 배열을 버블 정렬(Bubble Sort)을 이용하여 오름차순으로 정렬하는 코드이다.

(1) ㉠에 들어갈 비교 연산자를 쓰고,

(2) ㉡에 들어갈 변수명을 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {8, 3, 5, 1, 9};
    int n = 5;
    int temp;

    for(int i = 0; i < n - 1; i++){
        for(int j = 0; j < n - 1 - i; j++){
            if(a[j] ㉠ a[j+1]){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = ㉡;
            }
        }
    }

    printf("%d\n", a[2]); 

    return 0;
}

문제 15.

다음 프로그램은 3×3 정수 배열의 대각선 요소(왼쪽 위에서 오른쪽 아래로)의 합계를 구하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int m[3][3] = {
        {10, 2, 3},
        {4, 20, 6},
        {7, 8, 30}
    };
    int sum = 0;

    for(int i = 0; i < 3; i++){
        sum += ㉠;
    }

    printf("%d", ㉡);

    return 0;
}

문제 16.

다음 프로그램은 정수 5개를 입력받아 그중 짝수의 개수와 홀수의 합을 출력하는 코드이다.

사용자가 순서대로 2 5 8 11 14를 입력한다고 할 때,

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int num[5];
    int even_cnt = 0;
    int odd_sum = 0;

    for(int i = 0; i < 5; i++){
        scanf("%d", &num[i]);

        if(num[i] % 2 ㉠ 0)
            even_cnt++;
        else
            odd_sum ㉡ num[i];
    }

    printf("짝수 개수: %d\n", ㉢);
    printf("홀수 합: %d\n", odd_sum);

    return 0;
}

문제 17.

다음 프로그램은 10진수 37을 2진수로 변환하여 8비트로 출력하는 코드이다.

빈칸 ㉠, ㉡에 들어갈 코드를 쓰고, 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int bin[8];
    ㉠;

    for(int i = 7; i >= 0; i--){
        bin[i] = n % 2;
        ㉡;
    }

    for(int i = 0; i < 8; i++)
        printf("%d", bin[i]);

    return 0;
}

문제 18.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {3, 5, 9, 12, 20, 25};
    int *p = a + 1;
    int *q = a + 4;

    printf("%d\n", *q - *(p - 1));

    p = a + 2;
    q = a + 3;
    printf("%d\n", *q + *(p + 1));

    return 0;
}

문제 19.

다음 프로그램은 정수 배열을 선택 정렬로 오름차순 정렬한 후, 값 25를 선형 탐색으로 찾아 위치를 출력하는 코드이다.

(1) ㉠에 들어갈 while문의 조건식을 쓰고,

(2) ㉡에 들어갈 if문의 조건식을 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int x[] = {30, 12, 7, 25, 18};
    int n = 5;
    int key = 25;
    int pos = -1;

    for(int i = 0; i < n - 1; i++){
        int idx = i;
        for(int j = i + 1; j < n; j++)
            if(x[j] < x[idx])
                idx = j;
        int t = x[i];
        x[i] = x[idx];
        x[idx] = t;
    }

    int i = 0;
    while(㉠){
        if(x[i] == key){
            pos = i;
            break;
        }
        i++;
    }

    if(㉡)
        printf("%d\n", pos);

    return 0;
}

문제 20.

다음 프로그램은 3×3 정수 배열의 각 열에서 가장 큰 값을 찾아 출력하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 세 정수를 순서대로 쓰시오.

#include <stdio.h>

int main(void){
    int d[3][3] = {
        {5, 9, 2},
        {11, 4, 7},
        {6, 8, 10}
    };

    for(int j = 0; j < 3; j++){
        int m = ㉠;
        for(int i = 0; i < 3; i++)
            if(d[i][j] > m)
                m = d[i][j];
        printf("%d ", ㉡);
    }

    return 0;
}

문제 21.

다음 프로그램은 정수 5개를 입력받아 평균을 구하고, 값의 구간별 개수를 출력하는 코드이다.

사용자가 순서대로 80 35 70 55 20을 입력한다고 할 때,

(1) ㉠, ㉡, ㉢, ㉣에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int v[5];
    int tot = 0;
    int high = 0, mid = 0, low = 0;

    for(int i = 0; i < 5; i++){
        printf("%d번째 값: ", ㉠);
        scanf("%d", ㉡);
        tot += v[i];

        if(㉢)
            high++;
        else if(v[i] >= 40)
            mid++;
        else
            low++;
    }

    printf("평균: %d\n", ㉣);
    printf("70 이상: %d\n", high);
    printf("40~69: %d\n", mid);
    printf("40 미만: %d\n", low);

    return 0;
}

문제 22.

다음 프로그램은 먼저 학생 수를 입력받고, 각 학생의 학번과 점수를 입력받은 뒤, 입력된 점수 중 최고 점수를 받은 학생의 학번을 출력하는 코드이다.

입력이 다음과 같다고 할 때,

  • 첫 줄: 학생 수 4
  • 이후 입력(학번, 점수 순서로 4명):
    • 101 76
    • 102 88
    • 103 69
    • 104 90

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 값을 쓰시오.

#include <stdio.h>
#define MAX 10

int main(void){
    int id[MAX], sc[MAX];
    int n;
    int max = -1;
    int max_id = 0;

    scanf("%d", &n);

    for(int i = 0; i < ㉠; i++){
        scanf("%d", &id[i]);
        scanf("%d", &sc[i]);

        if(㉡){
            max = sc[i];
            max_id = id[i];
        }
    }

    printf("%d\n", ㉢);

    return 0;
}

문제 23.

다음 프로그램은 크기가 5인 정수 배열의 모든 요소를 왼쪽으로 한 칸씩 이동(회전)시키고, 맨 앞에 있던 값은 맨 뒤로 이동시키는 코드이다.
(1) ㉠, ㉡에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int a[5] = {10, 20, 30, 40, 50};
    int temp = a[0];

    for(int i = 0; i < 4; i++){
        a[i] = ㉠;
    }
    a[4] = ㉡;

    for(int i = 0; i < 5; i++)
        printf("%d ", a[i]);

    return 0;
}

문제 24.

다음 프로그램에서 포인터 연산을 이용하여 배열의 값을 계산하는 코드이다. 프로그램 실행 결과로 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {5, 12, 20, 27, 35, 42};
    int *p = a + 1;
    int *q = a + 4;

    printf("%d\n", *(q - 2) + 5);

    p = a;
    printf("%d\n", *(p + 3));

    return 0;
}

문제 25.

다음 프로그램은 배열을 버블 정렬로 오름차순 정렬한 뒤, 값 25의 위치(인덱스)를 출력하는 코드이다.

(1) ㉠, ㉡에 들어갈 for문의 조건식을 쓰고,

(2) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int x[] = {25, 9, 31, 17, 40};
    int n = 5;
    int key = 25;
    int idx = -1;

    for(int i = 0; ㉠; i++){
        for(int j = 0;  ㉡; j++){
            if(x[j] > x[j + 1]){
                int t = x[j];
                x[j] = x[j + 1];
                x[j + 1] = t;
            }
        }
    }

    for(int i = 0; i < n; i++){
        if(x[i] == key){
            idx = i;
            break;
        }
    }

    if(idx != -1)
        printf("%d\n", idx);

    return 0;
}

문제 26.

다음 프로그램은 3×3 정수 배열에서 각 행의 합을 구하여 출력하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 세 정수를 순서대로 쓰시오.

#include <stdio.h>

int main(void){
    int d[3][3] = {
        {2, 5, 7},
        {4, 1, 9},
        {6, 3, 8}
    };

    for(int i = 0; i < 3; i++){
        int s = 0;
        for(int j = 0; j < 3; j++)
            ㉠
        printf("%d ", ㉡);
    }

    return 0;
}

문제 27.

다음 프로그램은 정수 4개를 입력받아 평균을 구하고, 점수 구간별로 개수를 세어 출력하는 코드이다.

사용자가 순서대로 85 60 45 90을 입력한다고 할 때,

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int v[4];
    int tot = 0;
    int high = 0, mid = 0, low = 0;

    for(int i = 0; i < 4; i++){
        scanf("%d", &v[i]);
        tot += ㉠;

        if(v[i] >= 80)
            high++;
        else if(㉡)
            mid++;
        else
            low++;
    }

    printf("평균: %d\n", tot / ㉢);
    printf("80 이상: %d\n", high);
    printf("60~79: %d\n", mid);
    printf("60 미만: %d\n", low);

    return 0;
}

문제 28.

다음 프로그램은 먼저 학생 수를 입력받고, 각 학생의 학번과 점수를 입력받은 뒤, 최댓값을 가진 학생의 학번을 출력하는 코드이다.

입력이 다음과 같다고 할 때,

  • 첫 줄: 학생 수 4
  • 이후 입력(학번, 점수 순서로 4명):
    • 201 70
    • 202 95
    • 203 88
    • 204 95

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 값을 쓰시오.

#include <stdio.h>
#define MAX 10

int main(void){
    int id[MAX], sc[MAX];
    int n;
    int max = -1;
    int max_id = 0;

    scanf("%d", &n);

    for(int i = 0; i < n; i++){
        scanf("%d", &id[i]);
        scanf("%d", &sc[i]);

        if(㉠){
            max = sc[i];
            ㉡ = id[i];
        }
    }

    printf("%d\n", ㉢);

    return 0;
}