티스토리 뷰

반응형


안녕하세요! 오늘부터 개인적으로 공부 목적으로 풀고 있는 C언어 콘서트 문제들을 올려볼까 합니다. 이번에 올릴 문제들은 포인터와 관련된 장인 9장의 Programming 문제들입니다. 추가적으로 제가 사용하고 있는 툴은 비주얼 스튜디오 2017입니다.


1번 문제

int형 배열과 관련된 함수의 인자를 포인터로 표현하여 함수에서 배열의 값 변경과 다른 배열로 값 복사, 두 배열의 값을 더한 배열 구하기, 배열의 모든 인덱스에 있는 값의 총 합을 구하는 함수를 표현한 것입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<stdio.h>
#include<stdlib.h>
 
void fill_array(int *A, int size) {
    for (int i = 0; i < size; i++) {
        A[i] = (rand() % 10+ 1;
    }
}
 
void copy_array(int *A, int *B, int size) {
    for (int i = 0; i < size; i++) {
        B[i] = *(A + i);
    }
}
 
void add_array(int *A, int *B, int *C, int size) {
    for (int i = 0; i < size; i++) {
        C[i] = A[i] + B[i];
    }
}
 
int get_array_sum(int *A, int size) {
    int array_sum = 0;
 
    for (int i = 0; i < size; i++) {
        array_sum += A[i];
    }
 
    return array_sum;
}
 
void main(void) {
    int a[10= { 12345678910 };
    int b[10];
    int c[10];
 
    //print_array(a, 10);
    fill_array(a, 10);
    for (int i = 0; i < 10; i++)
        printf("%d\t", a[i]);
 
    printf("\n");
    copy_array(a, b, 10);
    for (int i = 0; i < 10; i++)
        printf("%d\t", b[i]);
 
    printf("\n");
    add_array(a, b, c, 10);
    for (int i = 0; i < 10; i++)
        printf("%d\t", c[i]);
 
    printf("\n");
    printf("%d",get_array_sum(a, 10));
 
}
cs



2번 문제

소수점이 포함된 실수를 입력하였을 때 정수부분과 소수점 이하 부분을 나누는 것으로 float형 값에 int형 캐스팅 연산자를 통해서 해결할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
 
void main(void) {
    float input_num;
    float underlying_dot_num;
    int integer_num;
 
    printf("실수를 입력하시오: ");
    scanf("%f"&input_num);
 
    integer_num = (int)input_num;
    underlying_dot_num = input_num - integer_num;
 
    printf("정수부분은 %d입니다.\n", integer_num);
    printf("소수점이라 부분은 %3.2f입니다.", underlying_dot_num);
}
cs


아래 문제는 제가 위의 2번 문제와 결과는 동일한데 일부러 어렵게? strtok 함수를 통해서 정수와 소수점 이하 부분을 '.'를 구분자로 사용해 분리하도록 해보았습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
#include<string.h>
 
void main(void) {
    char input_number[21];
    char below_decimal_point_num[10= "0.";
    char *integer;
    char *for_decimal;
    char seps[] = "., \t";
    int integer_num;
 
    printf("실수를 입력하시오(소수점 포함 20자리): ");
    gets(input_number);
 
    integer = strtok(input_number, seps);
    for_decimal = strtok(NULL, seps);
    strcat(below_decimal_point_num, for_decimal);
 
    sscanf(integer, "%d"&integer_num);
 
    printf("정수부분은 %d입니다.\n", integer_num);
    printf("소수점이하 부분은 %s입니다.", below_decimal_point_num);
}
cs



3번 문제

유클리드 호제법을 사용해서 구하는 최대공약수와 최소공배수 문제입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<stdio.h>
 
int greatest_common_divisor(int num1, int num2) {
    int temp;
 
    while (num2 != 0) {
        temp = num1 % num2;
        num1 = num2;
        num2 = temp;
    }
    
    return num1;
}
 
void main(void) {
    int input_num1, input_num2, temp, result;
     
    printf("첫번째 정수를 입력하시오: ");
    scanf("%d"&input_num1);
    printf("두번째 정수를 입력하시오: ");
    scanf("%d"&input_num2);
 
    if (input_num1 < input_num2) {
        temp = input_num1;
        input_num1 = input_num2;
        input_num2 = temp;
    }
 
    result = greatest_common_divisor(input_num1, input_num2);
 
    printf("최대공약수는 %d입니다.\n", result);
    printf("최대공배수는 %d입니다.\n", input_num1 * input_num2 / result);
}

cs



4번 문제

ISBN 번호가 유효한지 아닌지를 판별하는 문제로 판별하는 함수를 만들어서 짝수자리에 해당하는 숫자에 가중치를 달리하는 것은 if 문으로 구현하였습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<stdio.h>
 
int IsISBN(int *num);
 
void main(void) {
    int ISBN_num[13];
 
    printf("ISBN 번호를 입력하시오: ");
    scanf(ISBN_num);
 
    if (IsISBN(ISBN_num) == 1)
        printf("유효한 ISBN 번호입니다.");
    else
        printf("유효한 ISBN 번호가 아닙니다.");
}
 
int IsISBN(int *num) {
    int sum = 0;
    int judge_num;
 
    for (int i = 1; i <= 13; i++) {
        if (i % 2 != 0)
            sum += num[i];
        else
            sum += num[i] * 3;
    }
    
    judge_num = sum % 10;
 
    if (judge_num == 0)
        return 1;
 
    return 0;
}
cs



5번 문제

문제에는 밝기를 얼마나 줄이지의 횟수가 없어서 한번 횟수도 입력하여 그 수만큼 함수가 실행되어 값이 줄어들도록 만들어보았습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<stdio.h>
 
void dec_light(int *pixel_image);
 
int main(void) {
    int image[100];
    int row = 1, seps;
 
    for (int i = 0; i < sizeof(image) / sizeof(image[0]); i++) {
        if ((i / (row * 10)) != 0)
            row++;
        if ((i / (row * 10)) == 0) {
                printf("%d행 %d열의 픽셀 밝기 : ", row, (i % 10+ 1);
                scanf("%d"&image[i]);
        }
    }
 
    row = 1;
 
    printf("픽셀 밝기를 줄일 횟수를 입력하시오 : ");
    scanf("%d"&seps);
 
    for (int i = 0; i < seps; i++)
        dec_light(image);
 
    printf("밝기가 줄어든 픽셀입니다.\n");
    for (int i = 0; i < sizeof(image) / sizeof(image[0]); i++) {
        if ((i / (row * 10)) != 0)
            row++;
        if ((i / (row * 10)) == 0)
            printf("%d행 %d열의 픽셀 밝기 : %d\n", row, (i % 10+ 1, image[i]);
    }
 
    return 0;
}
 
void dec_light(int *pixel_image) {
    for (int i = 0; i < 400/sizeof(pixel_image[0]); i++)
        pixel_image[i]--;
}
cs



6번 문제

두 개의 정수를 입력받아 덧셈과 뺄셈, 곱셈, 나눗셈을 함수로 구현하고 이 함수를 가리키는 포인터 함수 배열을 만들어서 포인터 함수 배열의 인덱스와 각각의 함수를 짝지어 사용자가 입력한 메뉴에 따라 기능을 구현할 수 있습니다.   


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<stdio.h>
 
int add(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
int div(int x, int y);
 
int(*pf[4])(intint= { add, sub, mul, div };
 
int main(void) {
    int menu_choice, result, x, y;
 
    while (1) {
        printf("=====================\n");
        printf("0. 덧셈\n");
        printf("1. 뺄셈\n");
        printf("2. 곱셈\n");
        printf("3. 나눗셈\n");
        printf("4. 종료\n");
        printf("=====================\n");
 
        printf("메뉴를 선택하시오:");
        scanf("%d"&menu_choice);
 
        if (menu_choice == 4break;
 
        printf("2개의 정수를 입력하시오: ");
        scanf("%d %d"&x, &y);
 
        result = pf[menu_choice](x, y);
 
        printf("연산 결과 = %d\n", result);
    }
 
    return 0;
}
 
int add(int x, int y) {
    return x + y;
}
 
int sub(int x, int y) {
    return x - y;
}
 
int mul(int x, int y) {
    return x * y;
}
 
int div(int x, int y) {
    return x / y;
}
cs


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함