C언어 프로그래밍 실습 문제 모음 (71~75세트)

71세트

1. 코드 완성 문제

텍스트 파일에 문자열, 정수, 실수를 저장한 후 다시 문자 단위로 읽어와서 화면에 표시하는 기능을 구현하세요. 라이브러러리 함수 atoi와 atof를 사용하여 문자열을 숫자로 변환합니다.

#include <stdio.h>
#include <stdlib.h>

void process_data(char *text, int num, double real)
{
    /**********found**********/
    __1__ handle;
    char buffer[128], int_str[128], dbl_str[128];
    int converted_int;
    double converted_dbl;
    
    handle = fopen("temp_data.txt", "w");
    fprintf(handle, "%s %d %f\n", text, num, real);
    /**********found**********/
    __2__;
    
    handle = fopen("temp_data.txt", "r");
    fscanf(handle, "%s %s %s", buffer, int_str, dbl_str);
    fclose(handle);
    
    converted_int = atoi(int_str);
    converted_dbl = atof(dbl_str);
    printf("\n변환 결과:\n%s %d %f\n", buffer, converted_int, converted_dbl);
}

int main()
{
    char msg[10] = "Hello!";
    int val = 12345;
    double fval = 98.76;
    process_data(msg, val, fval);
    return 0;
}

정답:

1. FILE *
2. fclose(handle)
3. handle

2. 코드 수정 문제

문자열의 각 알파벳을 다음 알파벳으로 변환하는 함수를 작성하세요. Z는 A로, z는 a로 변환합니다. 다른 문자는 그대로 유지합니다.

#include <stdio.h>

void convert_alpha(char *ptr)
{
    /**********found**********/
    while(*ptr != '@')
    {
        if((*ptr >= 'A' & *ptr <= 'Z') || (*ptr >= 'a' && *ptr <= 'z'))
        {
            if(*ptr == 'Z') *ptr = 'A';
            else if(*ptr == 'z') *ptr = 'a';
            else *ptr += 1;
        }
    /**********found**********/
        (*ptr)++;
    }
}

int main()
{
    char buffer[80];
    printf("\n80자 미만의 문자열을 입력하세요:\n");
    gets(buffer);
    printf("\n원본 문자열:\n%s\n", buffer);
    convert_alpha(buffer);
    printf("\n변환 결과:\n%s\n", buffer);
    return 0;
}

수정된 코드:

while(*ptr != '\0')  // null 문자까지 검사
...
ptr++;  // 포인터 증가 (역참조 제거)

3. 코드 설계 문제

1차원 배열의 앞부분을 회전시키는 함수를 구현하세요. 인덱스 0부터 p까지의 요소를 배열 끝으로 이동시킵니다.

#include <stdio.h>
#define SIZE 80

void rotate_array(int *arr, int p, int size)
{
    // 이곳에 코드를 작성하세요
}

int main()
{
    int data[SIZE] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    int p, n = 15;
    printf("원본 데이터:\n");
    for(int i = 0; i < n; i++) printf("%3d", data[i]);
    printf("\n\np 값 입력: ");
    scanf("%d", &p);
    rotate_array(data, p, n);
    printf("\n이동 후 데이터:\n");
    for(int i = 0; i < n; i++) printf("%3d", data[i]);
    printf("\n");
    return 0;
}

구현 예시:

void rotate_array(int *arr, int p, int size)
{
    int temp[SIZE];
    int move_count = p + 1;
    
    // 이동할 부분을 임시 저장
    for(int i = 0; i < move_count; i++)
        temp[i] = arr[i];
    
    // 나머지 요소를 앞으로 이동
    for(int i = 0; i < size - move_count; i++)
        arr[i] = arr[i + move_count];
    
    // 임시 저장한 값을 끝에 배치
    for(int i = 0; i < move_count; i++)
        arr[size - move_count + i] = temp[i];
}

72세트

1. 코드 완성 문제

문자열 배열에서 특정 패턴을 포함하는 모든 문자열을 찾아 출력하는 함수를 완성하세요. strstr 라이브러리 함수를 사용합니다.

#include <stdio.h>
#include <string.h>
#define COUNT 5
#define LENGTH 15

void find_pattern(char (*str_array)[LENGTH], char *pattern)
{
    int idx, found_flag = 0;
    /**********found**********/
    for(idx = 0; idx < __1__; idx++)
    /**********found**********/
        if(strstr(str_array[idx], __2__) != NULL)
        {
            found_flag = 1;
            puts(str_array[idx]);
            printf("\n");
        }
    /**********found**********/
    if(found_flag == __3__) printf("\n일치하는 문자열을 찾지 못했습니다!\n");
}

int main()
{
    char strings[COUNT][LENGTH] = {"BASIC", "C language", "Java", "QBASIC", "Access"};
    char pattern[LENGTH];
    printf("\n원본 문자열 목록:\n");
    for(int i = 0; i < COUNT; i++) puts(strings[i]);
    printf("\n검색할 패턴 입력: ");
    gets(pattern);
    find_pattern(strings, pattern);
    return 0;
}

정답:

1. COUNT
2. pattern
3. 0

2. 코드 수정 문제

문자열에서 모음 알파벳(A,E,I,O,U)의 출현 횟수를 계산하는 함수를 수정하세요. 대소문자를 구분하지 않습니다.

#include <stdio.h>

void count_vowels(char *input, int vowel_counts[5])
{
    int k;
    /**********found**********/
    for(k = 0; k < 5; k++) vowel_counts[k] = 0;
    
    for(char *p = input; *p; p++)
    {
        int idx = -1;
    /**********found**********/
        switch(p)
        {
            case 'a': case 'A': idx = 0; break;
            case 'e': case 'E': idx = 1; break;
            case 'i': case 'I': idx = 2; break;
            case 'o': case 'O': idx = 3; break;
            case 'u': case 'U': idx = 4; break;
        }
        if(idx >= 0) vowel_counts[idx]++;
    }
}

int main()
{
    char text[81];
    int counts[5];
    printf("\n문자열을 입력하세요: ");
    gets(text);
    count_vowels(text, counts);
    for(int i = 0; i < 5; i++) printf("%d ", counts[i]);
    printf("\n");
    return 0;
}

수정된 코드:

switch(*p)  // 포인터 역참조 추가

3. 코드 설계 문제

2차원 배열의 테두리 요소들의 합을 계산하는 함수를 작성하세요.

#include <stdio.h>
#define ROWS 4
#define COLS 5

int calculate_border_sum(int matrix[ROWS][COLS])
{
    // 이곳에 코드를 작성하세요
}

int main()
{
    int data[ROWS][COLS] = {{1,3,5,7,9},{2,9,9,9,4},{6,9,9,9,8},{1,3,5,7,0}};
    printf("원본 데이터:\n");
    for(int i = 0; i < ROWS; i++)
    {
        for(int j = 0; j < COLS; j++) printf("%6d", data[i][j]);
        printf("\n");
    }
    int sum = calculate_border_sum(data);
    printf("\n테두리 합계: %d\n", sum);
    return 0;
}

구현 예시:

int calculate_border_sum(int matrix[ROWS][COLS])
{
    int total = 0;
    // 첫 행과 마지막 행
    for(int col = 0; col < COLS; col++)
    {
        total += matrix[0][col];
        total += matrix[ROWS-1][col];
    }
    // 첫 열과 마지막 열 (중복 방지)
    for(int row = 1; row < ROWS-1; row++)
    {
        total += matrix[row][0];
        total += matrix[row][COLS-1];
    }
    return total;
}

73세트

1. 코드 완성 문제

텍스트 파일에 데이터를 저장한 후 문자 단위로 읽어 화면에 출력하는 함수를 완성하세요.

#include <stdio.h>

void char_io_demo(char *msg, int val, double fval)
{
    /**********found**********/
    __1__ handle;
    char character;
    handle = fopen("data.txt", "w");
    fprintf(handle, "%s %d %f\n", msg, val, fval);
    fclose(handle);
    
    handle = fopen("data.txt", "r");
    printf("\n파일 내용:\n\n");
    character = fgetc(handle);
    /**********found**********/
    while(!feof(__2__))
    {
    /**********found**********/
        putchar(__3__);
        character = fgetc(handle);
    }
    printf("\n");
    fclose(handle);
}

int main()
{
    char message[10] = "Hello!";
    int num = 12345;
    double real = 98.76;
    char_io_demo(message, num, real);
    return 0;
}

정답:

1. FILE *
2. handle
3. character

2. 코드 수정 문제

입력받은 문자열을 ASCII 코드 순서대로 정렬하는 함수를 수정하세요.

#include <stdio.h>
#include <string.h>
#define MAX_LEN 20

void sort_ascending(char str[])
{
    char temp;
    /**********found**********/
    for(int i = strlen(str); i > 0; i--)
        for(int j = 0; j < i; j++)
    /**********found************/
            if(str[j] < str[j+1])
            {
                temp = str[j];
                str[j] = str[j+1];
                str[j+1] = temp;
            }
}

int main()
{
    char input[81];
    printf("\n문자열 입력: ");
    gets(input);
    printf("\n정렬 전: \"%s\"", input);
    sort_ascending(input);
    printf("\n정렬 후: \"%s\"", input);
    return 0;
}

수정된 코드:

for(int i = strlen(str) - 1; i > 0; i--)  // 인덱스 조정
if(str[j] > str[j+1])  // 부등호 방향 변경 (오름차순)

3. 코드 설계 문제

학생 점수 기록에서 지정된 범위에 속하는 학생들만 필터링하는 함수를 작성하세요.

#include <stdio.h>
#define STUDENT_COUNT 16

typedef struct {
    char id[10];
    int score;
} STUDENT;

int filter_students(STUDENT *source, STUDENT *dest, int min_score, int max_score)
{
    // 이곳에 코드를 작성하세요
}

int main()
{
    STUDENT students[STUDENT_COUNT] = {
        {"GA05",85}, {"GA03",76}, {"GA02",69}, {"GA04",85},
        {"GA01",91}, {"GA07",72}, {"GA08",64}, {"GA06",87},
        {"GA015",85}, {"GA013",91}, {"GA012",64}, {"GA014",91},
        {"GA011",91}, {"GA017",64}, {"GA018",64}, {"GA016",72}
    };
    STUDENT filtered[STUDENT_COUNT];
    int low, high;
    
    printf("최소점수와 최대점수 입력: ");
    scanf("%d%d", &low, &high);
    if(high < low) { int temp = high; high = low; low = temp; }
    
    int count = filter_students(students, filtered, low, high);
    printf("\n%d점 ~ %점 사이의 학생:\n", low, high);
    for(int i = 0; i < count; i++)
        printf("%s %4d\n", filtered[i].id, filtered[i].score);
    return 0;
}

구현 예시:

int filter_students(STUDENT *source, STUDENT *dest, int min_score, int max_score)
{
    int count = 0;
    for(int i = 0; i < STUDENT_COUNT; i++)
    {
        if(source[i].score >= min_score && source[i].score <= max_score)
            dest[count++] = source[i];
    }
    return count;
}

74세트

1. 코드 완성 문제

단일 연결 리스트의 노드 데이터를 오름차순으로 정렬하는 함수를 완성하세요. 데이터 교환 방식을 사용하세요.

#include <stdio.h>
#include <stdlib.h>
#define NODE_COUNT 6

typedef struct node {
    int value;
    struct node *next;
} NODE;

void sort_linked_list(NODE *head)
{
    NODE *current, *next_node;
    int temp;
    /**********found**********/
    current = __1__;
    while(current)
    {
    /**********found**********/
        next_node = __2__;
        while(next_node)
        {
    /**********found**********/
            if(current->value __3__ next_node->value)
            {
                temp = current->value;
                current->value = next_node->value;
                next_node->value = temp;
            }
            next_node = next_node->next;
        }
        current = current->next;
    }
}

// 리스트 생성 및 출력 함수는 생략...

int main()
{
    // 테스트 코드...
    return 0;
}

정답:

1. head->next
2. current->next
3. >

2. 코드 수정 문제

세 개의 정수에 대한 최소공배수(LCM)를 계산하는 함수를 수정하세요.

#include <stdio.h>

int calculate_lcm(int x, int y, int z)
{
    int result, temp, mod1, mod2;
    /************found************/
    result = 0;
    temp = result % x;
    /************found************/
    mod1 = temp % y;
    mod2 = result % z;
    while(temp != 0 || mod1 != 0 || mod2 != 0)
    {
        result++;
        temp = result % x;
    /************found************/
        mod1 = temp % y;
        mod2 = result % z;
    }
    return result;
}

int main()
{
    int a, b, c;
    printf("세 정수 입력: ");
    scanf("%d%d%d", &a, &b, &c);
    printf("최소공배수: %d\n", calculate_lcm(a, b, c));
    return 0;
}

수정된 코드:

result = 1;  // 0이 아닌 1부터 시작
mod1 = result % y;  // result % y로 직접 계산
mod1 = result % y;  // temp가 아닌 result 사용

3. 코드 설계 문제

문자열의 앞뒤 '*' 문자만 제거하고 중간의 '*'는 유지하는 함수를 작성하세요.

#include <stdio.h>

void trim_asterisks(char *str, int length, int leading, int trailing)
{
    // 이곳에 코드를 작성하세요
}

int main()
{
    char buffer[81];
    printf("문자열 입력: ");
    gets(buffer);
    
    // 앞뒤 '*' 개수 계산
    char *start = buffer, *end = buffer;
    int len = 0, lead_cnt = 0, trail_cnt = 0;
    while(*end) { end++; len++; }
    end--;
    while(end >= buffer && *end == '*') { end--; trail_cnt++; }
    while(*start == '*') { start++; lead_cnt++; }
    
    trim_asterisks(buffer, len, lead_cnt, trail_cnt);
    printf("처리 결과: %s\n", buffer);
    return 0;
}

구현 예시:

void trim_asterisks(char *str, int length, int leading, int trailing)
{
    int new_len = length - leading - trailing;
    for(int i = 0; i < new_len; i++)
        str[i] = str[leading + i];
    str[new_len] = '\0';
}

75세트

1. 코드 완성 문제

배열을 최소값-최대값 순서로 재배치하는 함수를 완성하세요. 즉, 첫 번째는 최소값, 두 번째는 최대값, 세 번째는 두 번째 최소값, 네 번째는 두 번째 최대값 순서로 배치합니다.

#include <stdio.h>
#define ARRAY_SIZE 9

void rearrange_minmax(int arr[], int n)
{
    int i, j, max_val, min_val, max_idx, min_idx, temp;
    for(i = 0; i < n - 1; i += 2)
    {
    /**********found**********/
        max_val = min_val = __1__;
        max_idx = min_idx = i;
        for(j = i + 1; j < n; j++)
        {
    /**********found**********/
            if(max_val < __2__)
            { max_val = arr[j]; max_idx = j; }
    /**********found**********/
            if(min_val > __3__)
            { min_val = arr[j]; min_idx = j; }
        }
        if(min_idx != i)
        {
            temp = arr[i]; arr[i] = min_val; arr[min_idx] = temp;
            if(max_idx == i) max_idx = min_idx;
        }
        if(max_idx != i + 1)
        { temp = arr[i+1]; arr[i+1] = max_val; arr[max_idx] = temp; }
    }
}

int main()
{
    int data[ARRAY_SIZE] = {9,1,4,2,3,6,5,8,7};
    printf("원본 배열:\n");
    for(int i = 0; i < ARRAY_SIZE; i++) printf("%4d ", data[i]);
    rearrange_minmax(data, ARRAY_SIZE);
    printf("\n재배치 결과:\n");
    for(int i = 0; i < ARRAY_SIZE; i++) printf("%4d ", data[i]);
    printf("\n");
    return 0;
}

정답:

1. arr[i]
2. arr[j]
3. arr[j]

2. 코드 수정 문제

문자열에서 부분 문자열이 출현하는 횟수를 계산하는 함수를 수정하세요.

#include <stdio.h>
#include <string.h>
#define MAX_LEN 80

int count_substring(char *main_str, char *sub_str)
{
    int count = 0;
    char *p1, *p2;
    while(*main_str)
    {
        p1 = main_str;
    /*********found**********/
        p2 = p1;
        while(*p2)
            if(*p2 == *p1) { p2++; p1++; }
            else break;
    /*********found**********/
        if(*p2 = 0) count++;
        main_str++;
    }
    return count;
}

int main()
{
    char text[MAX_LEN], pattern[MAX_LEN];
    printf("메인 문자열: "); gets(text);
    printf("부분 문자열: "); gets(pattern);
    printf("출현 횟수: %d\n", count_substring(text, pattern));
    return 0;
}

수정된 코드:

p2 = sub_str;  // 부분 문자열로 비교
if(*p2 == '\0')  // null 문자 비교, 대입 연산자 수정

3. 코드 설계 문제

문자열 배열에 저장된 M개의 문자열을 순서대로 하나의 문자열로 결합하는 함수를 작성하세요.

#include <stdio.h>
#define STRING_COUNT 3
#define MAX_STRING_LEN 20

void concatenate_strings(char source[STRING_COUNT][MAX_STRING_LEN], char *target)
{
    // 이곳에 코드를 작성하세요
}

int main()
{
    char strings[STRING_COUNT][MAX_STRING_LEN] = {"AAAA", "BBBBBBB", "CC"};
    char result[100];
    printf("원본 문자열:\n");
    for(int i = 0; i < STRING_COUNT; i++) puts(strings[i]);
    concatenate_strings(strings, result);
    printf("\n결과: %s\n", result);
    return 0;
}

구현 예시:

void concatenate_strings(char source[STRING_COUNT][MAX_STRING_LEN], char *target)
{
    int target_idx = 0;
    for(int i = 0; i < STRING_COUNT; i++)
    {
        int j = 0;
        while(source[i][j] != '\0')
            target[target_idx++] = source[i][j++];
    }
    target[target_idx] = '\0';
}

태그: C언어 파일입출력 문자열처리 배열조작 연결리스트

8월 14일 03:37에 게시됨