c/자습

함수(쉽게 풀어쓴 C언어 EXPRESS)

지트리아 2022. 12. 30. 17:21

용어정리

 

 

 

 

본문정리

함수란?

함수는 3가지 특징을 가지고 있다.

서로 구별되는 이름, 특정한 작업을 수행, 입력을 받을 수 있고 결과를 반환 가능

함수의 종류에는 라이브러리 함수, 사용자 정의 함수가 있다. 라이브러리 함수란 컴파일러에서 지원되는 함수이다. 사용자 정의 함수란 개발자가 직접 만들어서 사용하는 함수이다.

 

함수 정의

구성 요소에는 반환형, 함수이름, 매개변수, 함수몸체로 구성되어 있다. 여기서 함수 몸체를 제외하고 나머지를 함수 헤더라 한다.

함수 호출이란 함수의 이름을 써주는 것이다.

 

매개 변수와 반환값

인수란 호출 프로그램에 의하여 함수에서 실제로 전달되는 값이고 매개 변수란 이 값을 전달받는 변수이다.

이때 인수와 매개변수 타입은 일치해야하고 개수가 일치해야한다.

반환되는 값이 없다면 return;을 쓰면 된다.

 

함수 원형

함수  원형은 함수 헤더에 세미콜론만을 추가한 것이다. 다만 매개변수 이름은 안적어도 된다.

 

라이브러리 함수(난수)

rand()란 함수는 stdlib.h에 정의되어 있다.

 

라이브러리 함수(수학 함수)

floor(), ceil(), fabs(), pow(), sqrt() 등은 Math.h에 정의되어 있다. 

 

함수를 사용하는 이유

중복성을 없앰, 재사용성, 복잡한 문제를 단순한 부분으로 분해

 

본문제

Q1. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Math.h>

double square(double);

int main(void) {
    double k;

    printf("정수를 입력하시오: ");
    scanf("%lf", &k);

    printf("주어진 정수: %lf의 제곱은 %lf입니다.", k, square(k));

    return 0;
}

double square(double k) {
    return pow(k, 2);
}

 

Q2. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

bool check_alpha(char);

int main(void) {
    char c;

    printf("문자를 입력하시오: ");
    scanf("%c", &c);

    if (check_alpha(c)) {
        printf("%c는 알파벳문자입니다.", c);
    }
    else {
        printf("%c는 알파벳문자가 아닙니다.", c);
    }

    return 0;
}

bool check_alpha(char c) {
    if (c >= 'a' && c <= 'z') {
        return true;
    }
    else {
        return false;
    }
}

 

Q3. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

double cal_area(double);

int main(void) {
    double r;

    printf("원의 반지름을 입력하시오: ");
    scanf("%lf", &r);

    printf("원의 면적은 %lf입니다.", cal_area(r));

    return 0;
}

double cal_area(double radius) {
    return radius * radius * 3.141592;
}

 

Q4. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int is_leap(int year) {
    if (year % 400 == 0) {
        return 366;
    }
    else if (year % 4 == 0) {
        if (year % 100 == 0) {
            return 365;
        }
        return 366;
    }
    return 365;
}

int main(void) {
    long year;

    printf("연도를 입력하시오: ");
    scanf("%ld", &year);

    printf("%ld년은 %d일입니다.", year, is_leap(year));

    return 0;
}

 

Q5. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int round(double k) {
    int a = 0;
    return a = (int)(k + 0.5);
}

int main(void) {
    double k;

    printf("실수를 입력하시오: ");
    scanf("%lf", &k);
    printf("반올림한 값은 %d입니다.", round(k));

    return 0;
}

 

Q6.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Math.h>

int even(int n) {
    if (n % 2 == 0) {
        return 1;
    }
    else {
        return 0;
    }
}

int absolute(int n) {
    if (n <= 0) {
        return (-1) * n;
    }
    else {
        return n;
    }
}

int sign(int n) {
    if (n < 0) {
        return -1;
    }
    else if (n == 0) {
        return 0;
    }
    else if (n > 0) {
        return 1;
    }
}

int main(void) {
    int k;

    printf("정수를 입력하시오:");
    scanf("%d", &k);

    printf("even()의 결과: ");
    even(k) ? printf("짝수\n") : printf("홀수\n");

    printf("absolute()의 결과: %d\n", absolute(k));
    
    printf("sign()의 결과: ");
    switch (sign(k)) {
        case -1:
            printf("음수");
            break;
        case 0:
            printf("0");
            break;
        case 1:
            printf("양수");
            break;
    }

    return 0;
}

 

Q7.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int get_tax(int income) {
    if (income <= 1000) {
        return income * 0.08;
    }
    else {
        return 1000 * 0.08 + (income - 1000) * 0.1;
    }
}

int main(void) {
    int k;

    printf("소득을 입력하시오(만원):");
    scanf("%d", &k);
    printf("소득세는 %d입니다.", get_tax(k));

    return 0;
}

 

Q8.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Math.h>

double sin_degree(double degree) {
    return sin(3.141592 * degree / 180.0);
}

int main(void) {

    for (double i = 0; i <= 180; i += 10) {
        printf("sin(%lf)의 값은 %lf\n", i, sin_degree(i));
    }

    return 0;
}

 

Q9.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void b_rand() {   
    return printf("%d ", rand() % 2);
}

int main(void) {
    srand(time(NULL));

    for (int i = 0; i < 5; i++) {
        b_rand();
    }

    return 0;
}

 

Q10.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>

int b_rand() {   
    return rand() % 2;
}

int main(void) {
    srand(time(NULL));
    int n = 0;
    char c = NULL;

    while (true) {
        printf("앞면 또는 뒷면(1 또는 0):");
        scanf(" %d", &n);
        if (n == b_rand()) {
            printf("맞았습니다.\n");
        }
        else {
            printf("틀렸습니다.\n");
        }
        printf("계속하시겠습니까?(y 또는 n):");
        scanf(" %c", &c);
        if (c == 'y') {
            continue;
        }
        else if (c == 'n') {
            break;
        }
    }

    return 0;
}

 

Q11.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void f_rand() {   
    return printf("%lf ", rand() / (double)RAND_MAX);
}

int main(void) {
    srand(time(NULL));
    for (int i = 0; i < 5; i++) {
        f_rand();
    }

    return 0;
}

 

Q12.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void print_value(int n) {
    for (int i = 0; i < n; i++) {
        printf("*");
    }
}

int main(void) {
    int n = 0;

    while (1) {
        printf("값을 입력하시오(종료는 음수): ");
        scanf("%d", &n);
        if (n < 0) {
            break;
        }
        else {
            print_value(n);
        }
        printf("\n");
    }

    return 0;
}

 

Q13.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int is_multiple(int a, int b) {
    if (a % b == 0) {
        return 1;
    }
    else {
        return 0;
    }
}

int main(void) {
    int a, b, result;
    printf("첫번째 정수를 입력하시오:");
    scanf("%d", &a);
    printf("두번째 정수를 입력하시오:");
    scanf("%d", &b);


    if (a >= b) {
        result = is_multiple(a, b);
        if (result) {
            printf("%d는 %d의 배수입니다.", a, b);
        }
        else {
            printf("배수가 아닙니다.");
        }
    }
    else {
        result = is_multiple(b, a);
        if (result) {
            printf("%d는 %d의 배수입니다.", b, a);
        }
        else {
            printf("배수가 아닙니다.");
        }
    }
    
    return 0;
}

 

Q14.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Math.h>

double get_distance(double x1, double y1, double x2, double y2) {
    return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
}

int main(void) {
    double x1, y1, x2, y2;

    printf("첫번째 점의 좌표를 입력하시오:(x, y) ");
    scanf("%lf %lf", &x1, &y1);
    printf("두번째 점의 좌표를 입력하시오:(x, y) ");
    scanf("%lf %lf", &x2, &y2);
    printf("두점 사이의 거리는 %lf입니다.", get_distance(x1, y1, x2, y2));
    
    return 0;
}

 

Q15.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void is_prime(int i) {
    int n = 0;
    for (int j = 2; j < i; j++) {
        if (i % j == 0) {
            n = 1;
            break;
        }
    }
    if (n == 0) {
        printf("%d ", i);
    }
}

int main(void) {
    for (int i = 2; i < 100; i++) {
        is_prime(i);
    }
    
    return 0;
}

 

Q16.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

double factorial(int n) {
    double result = 0, e = 1;
    if (n == 1) {
        return 1;
    }
    else {
        n -= 1;
        for (int i = 1; i <= n; i++) {
            result = 1;
            for (int j = 1; j <= i; j++) {
                result *= j;
            }
            e += 1.0 / result;
        }
        return e;
    }
}

int main(void) {
    int n = 0;

    printf("어디까지 계산할까요: ");
    scanf("%d", &n);
    printf("오일러의 수는 %lf입니다.", factorial(n));
    
    return 0;
}