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';
}