사이먼's 코딩노트

[C언어] 함수 문제풀이(2) / 서식지정자와 자료형 본문

C언어

[C언어] 함수 문제풀이(2) / 서식지정자와 자료형

simonpark817 2024. 1. 29. 12:12
  • 지난번에 이어 함수와 관련된 몇 가지 문제를 더 풀어보자.

 

[문제 1]

  • 입력받은 숫자가 10이라고 할때 1부터 10 사이에 존재하는 모든 소수의 개수와 합을 출력하는 함수를 구현해보자.
#include <stdio.h>

#pragma warning (disable: 4996)

int is_prime_number(int num) {
    if(num < 2) {
        return 0;
    }

    for(int i = 2; i < num; i++) {
        if(num % i == 0) {
            return 0;
        }
    }

    return 1;
}


int get_1_to_n_prime_numbers_count(int n) {
    int count;

    for(int i = 1; i <= n; i++) {
        if(is_prime_number(i)) {
            count++;
        }
    }

    return count;
}

int get_1_to_n_prime_numbers_sum(int n) {
    int sum;

    for(int i = 1; i <= n; i++) {
        if(is_prime_number(i)) {
            sum += i;
        }
    }
    
    return sum;
}

int main() {
    int count;
    int number;
    int sum;

    number = 1000;
    count = get_1_to_n_prime_numbers_count(number);
    sum = get_1_to_n_prime_numbers_sum(number);
    printf("1부터 %d사이에 존재하는 소수의 개수 : %d개\n", number, count);
    printf("1부터 %d사이에 존재하는 소수의 개수 : %d개\n", number, sum);
    // 출력 => 1부터 1000사이에 존재하는 소수의 개수 : 168개
    // 출력 => 1부터 1000사이에 존재하는 소수의 합 : 76127

    number = 2000;
    count = get_1_to_n_prime_numbers_count(number);
    sum = get_1_to_n_prime_numbers_sum(number);
    printf("1부터 %d사이에 존재하는 소수의 개수 : %d개\n", number, count);
    printf("1부터 %d사이에 존재하는 소수의 개수 : %d개\n", number, sum);
    // 출력 => 1부터 2000사이에 존재하는 소수의 개수 : 303개
    // 출력 => 1부터 2000사이에 존재하는 소수의 합 : 277050

    return 0;
}
  • 소수를 판별하는 함수인 is_prime_number() 함수를 만들어준다.
  • 범위 안에 소수의 개수를 세기 위해서는 get_1_to_n_prime_numbers_count() 함수를 만들어주고 count라는 변수를 생성하여 1부터 범위까지 반복문을 통해 만약 소수이면 count를 1씩 증가하게 하여 count를 return 해준다.
  • 범위 안에 소수의 합을 계산하기 위해서는 get_1_to_n_prime_numbers_sum() 함수를 만들어주고 sum이라는 변수를 생성하여 1부터 범위까지 반복문을 통해 만약 소수이면 sum에 해당 소수를 더하여 sum을 return 해준다.

 

 

[문제 2]

  • 정수 a, b 두개의 값을 입력받고, 두 수의 공약수를 모두 출력하는 함수를 구현해보자.
#include <stdio.h>

void print_num_common_divisor(int num1, int num2) {

    for(int i = 1; i <= num2; i++) {
        if(num1 % i == 0 && num2 % i == 0) {
            printf("%d와 %d의 공약수 : %d\n", num1, num2, i);
        }
    }

}

int main(void) {

    int a;
    int b;

    printf("두 수를 입력하세요 : ");
    scanf("%d %d", &a, &b);

    print_num_common_divisor(a, b);

    return 0;
}
  • 두 수의 정수의 값을 사용자 임의로 입력하기 위해서는 main 함수에서 scanf를 사용한다.
  • scanf는 해당 서식지정자에 주소를 가르키는 &를 사용하여 작성한다.
  • 두 수의 공약수는 각 숫자의 공약수 중 공통으로 속한 값이다.
  • 공약수를 구하는 함수는 print_num_common_divisor() 함수를 만들고 입력받은 두 값이 1부터 범위까지의 숫자까지 반복하여 나눴을 때 나머지가 0이면 공약수로 판별한다.

 

 

[문제 3]

  • 정수 a, b 두개의 값을 입력받고, 두 수의 최대공약수를 모두 출력하는 함수를 구현해보자.
#include <stdio.h>

int print_num_common_divisor(int num1, int num2) {

    int max_divisor = 0;

    for(int i = 1; i <= num2; i++) {
        if(num1 % i == 0 && num2 % i == 0) {
            if(max_divisor <= i) {
                max_divisor = i;
            }
        }
    }

    return max_divisor;

}

int main(void) {

    int a;
    int b;

    printf("두 수를 입력하세요 : ");
    scanf("%d %d", &a, &b);

    print_num_common_divisor(a, b);
    printf("%d와 %d의 최대공약수 : %d\n", a, b, print_num_common_divisor(a, ));

    return 0;
}
  • 두 수의 정수의 값을 사용자 임의로 입력하기 위해서는 main 함수에서 scanf를 사용한다.
  • 최대 공약수는 공약수 중에 가장 큰 값을 의미한다.
  • 최대 공약수를 구하는 print_num_common_divisor() 함수를 만들고 먼저 반복문을 통해 공약수를 구하고 max_divisor라는 변수를 생성하여 조건문을 통해 해당 공약수가 가장 큰 값인지 비교하여 가장 큰 값을 max_divisor에 넣고 retrun 한다.

 

 

[문제 4]

  • 정수 a의 값을 입력받고, 랜덤숫자를 맞추는 함수를 구현해보자.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int check_random(int x, int y) {

    if (x == y) {
        printf("random 숫자 %d를 맞추셨습니다!!.\n", x);
        return 1;
    } else if (x > y) {
        printf("입력하신 값이 random보다 작습니다. 다시 시도하세요.\n");
        // printf("랜덤 숫자는 %d 입니다\n", x);
    } else if (x < y) {
        printf("입력하신 값이 random보다 큽니다. 다시 시도하세요.\n");
    }

    return 0;
}

int main(void) {

    int random_num;
    int a;

    // 1부터 100까지의 랜덤숫자 추출
    srand(time(NULL));
    random_num = rand() % 100 + 1;

    while (1) {

        printf("숫자를 입력하세요 : ");
        scanf("%d", &a);

        if (check_random(random_num, a) == 1) {
            break;
        }
    }

    return 0;
}
  • 먼저 랜덤숫자를 얻기 위해서 <stdlib.h>와 <time.h> 헤더를 포함한다.
  • 랜덤함수를 추출하는 방법은 srand(time(NULL))와 1부터 100까지의 숫자 중 하나라면 random_num이라는 변수를 생성하고 random_num = rand()%100+1를 작성한다.
  • 사용자가 입력한 값이 랜덤함수에서 추출된 숫자와 일치할 때까지 무한으로 반복문을 실행해야되기 때문에 무한루프인 while(1) 반복문 안에 scanf와 숫자를 체크하는 함수인 check_random()를 만들어준다.
  • check_random() 함수가 참일 때, 즉 숫자를 맞췄을 때 break를 걸어 반복문이 종료되고 해당 프로그램이 종료된다.
  • check_random() 함수는 입력받은 값과 랜덤숫자를 조건문을 통해 두 수의 값이 같은지 작은지 큰지를 확인한다.

 

 

[서식지정자와 자료형]

  • 정수형 타입을 가지는 자료형은 char, int, short, long, float, double 등이 있다.
  • char는 문자를 나타내는 자료형으로 알고있지만 사실 C언어에서는 문자가 존재하지 않기 때문에 char도 정수 타입으로 취급당한다. char는 1바이트로 8비트의 크기를 가지고있다.
  • short는 2바이트로 16비트의 크기를 가지고있다.
  • int는 4바이트로 32비트의 크기를 가지고있어 대략 -21억에서 21억까지의 숫자 범위를 가진다.
  • int보다 더 큰 숫자를 정의할 때는 long 자료형을 사용한다.
#include <stdio.h>

int main(void) {

    int k = 500000000;
    printf("%d\n", k);

    char age = 'd';
    printf("%c\n", age);

    char a = 'a';
    printf("%c\n", a);
    printf("%c\n", a + 1);
    printf("%c\n", a + 2);

    return 0;
}
  • 예시와 같이 문자 'd'를 char로 age라는 변수를 선언하여 넣었을 때 출력문에서 문자를 출력하는 방법은 서식지정자를 %d가 아닌 %c로 작성해야한다.
  • 문자를 %d로 출력하게 되면 'd'의 아스키코드 값인 100이 출력이된다.
  • 문자 'a'의 아스키코드 값은 97이고 예시와 같이 a, a+1, a+2로 출력문에서 출력하게 되면 컴퓨터는 97이라는 숫자를 기준으로 계산을 하기 때문에 a = 97, a+1 = 98, a+2 = 99가 되고 이는 문자로 출력했을 때 'a', 'b', 'c' 로 출력된다.

 

  • char : %c
  • short : %hd
  • int : %d, %ld
  • unsigned int : %u
  • float : %f
  • double : %lf
  • long : %ld
반응형

'C언어' 카테고리의 다른 글

[C언어] 포인터 문제풀이  (0) 2024.02.02
[C언어] 포인터  (0) 2024.02.02
[C언어] 함수 문제풀이(1)  (0) 2024.01.24
[C언어] 함수  (1) 2024.01.23
[C언어] 반복문(for, while)  (0) 2024.01.19