2025년 11월 18일 화요일

C언어_9.1. 함수_코드예제

9장 보충 1 - 사용자 정의함수

사용자 정의 함수는 반환 값과 매개변수의 유무에 따라 4가지 유형으로 분류될 수 있다.

  • 반환값 : 없음 / 매개변수 : 없음  예) void buy(void)
  • 반환값 : 없음 / 매개변수 : 있음  예) void buy(int a)
  • 반환값 : 있음 / 매개변수 : 없음  예) int buy(void)
  • 반환값 : 있음 / 매개변수 : 있음  예) int buy(int)

9.1. 반환값이 없고 매개변수가 없는 경우

이 유형의 함수는 매개변수를 받지 않고, 어떤 값도 반환하지 않는다. 이러한 함수는 일반적으로 특정 작업을 수행하지만 그 결과를 직접 반환하지 않는다. 예를 들면, 출력을 담당하는 함수나 특정 상태를 변경하는 함수가 있다.

예제 9.1
#include <stdio.h>
void school(void) {
    printf("K대학교\n");
}
int main() {
    printf("A 학생이 다니는 학교는?\n");
    school();
    printf("B 학생이 다니는 학교는?\n");
    school();
    printf("C 학생이 다니는 학교는?\n");
    school();
    printf("D 학생이 다니는 학교는?\n");
    school();
    return 0;
}
실행 결과
A 학생이 다니는 학교는?
K대학교
B 학생이 다니는 학교는?
K대학교
C 학생이 다니는 학교는?
K대학교
D 학생이 다니는 학교는?
K대학교
예제 9.2
#include <stdio.h>
void print_line(void);
void main() {
    print_line();
    printf("학번     이름    전공    학점\n");
    print_line();
}
void print_line(void) {
    int i;
    for (i = 0; i < 50; i++)  {
        printf("-");
    }
    printf("\n");
}
실행 결과
--------------------------------------------------
학번     이름    전공    학점
--------------------------------------------------

9.2. 반환값이 없고 매개변수가 있는 경우

이 유형의 함수는 하나 이상의 매개변수를 받지만 반환값은 없다. 이러한 함수는 전달된 매개변수를 사용하여 작업을 수행하지만 결과를 반환하지는 않는다.

예제 9.3
#include <stdio.h>
void buy(int x) {
    printf("%d만원짜리 차를 구입했습니다. \n", x);
}
int main(void) {
    buy(20);
    buy(40);
    return 0;
}
실행 결과
20만원짜리 차를 구입했습니다.
40만원짜리 차를 구입했습니다.
예제 9.4
#include <stdio.h>
void buy(float x) {
    printf("%f만원짜리 차를 구입했습니다. \n", x);
}
void main() {
    buy(20.2);
    buy(40.5);
}
실행 결과
20.200001만원짜리 차를 구입했습니다.
40.500000만원짜리 차를 구입했습니다.

[참고] 실행 결과로 20.200001만원으로 나온 이유는?

컴퓨터에서는 모든 수를 이진수(2진수)로 표현하게 된다. 이 과정에서 일부 실수는 정확하게 이진수로 표현할 수 없는 문제가 발생한다. 10진법에서는 간단히 표현되는 수도 2진법에서는 무한히 반복되는 소수가 될 수 있다.

예를 들어, 10진법에서 0.1을 이진수로 표현하려고 하면 0.0001100110011001100110011...와 같이 무한히 반복되게 된다. 이런 수를 컴퓨터가 유한한 비트로 표현하려고 할 때는 반올림이나 잘림 등의 방법을 사용하여 근사치를 저장하게 된다.

따라서, 20.2가 float 형식으로 표현되었을 때 발생하는 오차 때문에 20.200001이라는 결과가 출력되었을 가능성이 높다. 이러한 문제를 해결하기 위해 많은 프로그래밍 언어에서는 고정 소수점 수를 사용하는 라이브러리를 제공하고 있다. C 언어에서는 math.h 라이브러리 등이 이에 해당한다.

이는 컴퓨터의 부동소수점 표현에 대한 근본적인 문제로, 컴퓨터에서 실수를 다룰 때는 이런 문제를 항상 염두에 두어야 한다.

예제 9.5
#include <stdio.h>
void draw_rect(int side) {
    int x, y;
    for (y = 0; y < side; y++)     {
        for (x = 0; x < side; x++)
            printf("*");
        printf("\n");
    }
}
int main(void) {
    draw_rect(5);
    return 0;
}
실행 결과
*****
*****
*****
*****
*****
예제 9.6
#include <stdio.h>
void print_char(char ch, int cnt);
int main(void) {
    print_char('0', 5);
    return 0;
}
void print_char(char ch, int cnt) {
    int i;
    for (i = 0; i < cnt; i++) {
        printf("%c", ch);
    }
}
실행 결과
00000
예제 9.7
#include <stdio.h>
void buy(int x) {
    printf("%d만원 짜리 차를 구입했습니다. \n", x);
}
int main(void) {
    int num;
    printf("1번째는 얼마짜리 차를 구입했습니까? : ");
    scanf("%d", &num);
    buy(num);
    printf("2번째는 얼마짜리 차를 구입했습니까? : ");
    scanf("%d", &num);
    buy(num);
    return 0;
}
실행 결과
1번째는 얼마짜리 차를 구입했습니까? : 50
50만원 짜리 차를 구입했습니다.
2번째는 얼마짜리 차를 구입했습니까? : 70
70만원 짜리 차를 구입했습니다.
예제 9.8
#include <stdio.h>
void draw_rect(int side) {
    int x, y;
    for (y = 0; y < side; y++)  {
        for (x = 0; x < side; x++)
            printf("*");
        printf("\n");
    }
}
int main(void) {
    int num;
    printf("숫자를 입력하시오: ");
    scanf("%d", &num);
    draw_rect(num);
    return 0;
}
실행 결과
숫자를 입력하시오: 4
****
****
****
****
예제 9.9
#include <stdio.h>
void buy(int x, int y) {
    printf("%d만원 짜리 차와 %d만원 짜리 차를 구입했습니다. \n", x, y);
}
int main(void) {
    int num1, num2;
    printf("얼마짜리 차를 구입했습니까? : ");
    scanf("%d", &num1);
    printf("얼마짜리 차를 구입했습니까? : ");
    scanf("%d", &num2);
    buy(num1, num2);
    return 0;
}
실행 결과
얼마짜리 차를 구입했습니까? : 200
얼마짜리 차를 구입했습니까? : 300
200만원 짜리 차와 300만원 짜리 차를 구입했습니다.

9.3. 반환값이 있고 매개변수가 없는 경우

이 유형의 함수는 매개변수를 받지 않지만, 어떤 값이나 결과를 반환한다. 이러한 함수는 특정 상태를 확인하거나 값을 생성하는데 사용될 수 있다.

예제 9.10
#include <stdio.h>
int get_pos(void) {
    int pos;
    printf("숫자 입력 :");
    scanf("%d", &pos);
    return pos;
}
int main(void) {
    int res;
    res = get_pos();
    printf("입력값: %d\n", res);
    return 0;
}
실행 결과
숫자 입력 : 10
입력값: 10
예제 9.11
#include <stdio.h>
int get_integer(void) {
    int n;
    printf("숫자 입력: ");
    scanf("%d", &n);
    return n;
}
int main(void) {
    int a, b;
    a = get_integer();
    b = get_integer();
    printf("첫 번째 입력: %d, 두 번째 입력: %d\n", a, b);
    return 0;
}
실행 결과
숫자 입력: 10
숫자 입력: 20
첫 번째 입력: 10, 두 번째 입력: 20

9.4. 반환값이 있고 매개변수가 있는 경우

이 유형의 함수는 하나 이상의 매개변수를 받고, 그에 따른 결과나 값을 반환한다. 대부분의 함수는 이 유형에 속하며, 가장 일반적인 형태이다.

예제 9.12
#include <stdio.h>
int square(int n) {
    return (n * n);
}
int main(void) {
    int result;
    result = square(5);
    printf("%d\n", result);
    return 0;
}
실행 결과
25
예제 9.13
#include <stdio.h>
int get_max(int x, int y) {
    if (x > y)
        return x;
    else
        return y;
}
int main(void) {
    int max;
    max = get_max(5, 10);
    printf("큰 수는: %d\n", max);
    return 0;
}
실행 결과
큰 수는: 10
예제 9.14
#include <stdio.h>
int power(int x, int y) {
    int i;
    long result = 1;
    for (i = 0; i < y; i++)
        result *= x;
    return result;
}
int main(void) {
    int ans;
    ans = power(2, 4);
    printf("%d\n", ans);
}
실행 결과
16
예제 9.15
#include <stdio.h>
int add(int x, int y);
int main(void) {
    int a = 10, b = 20;
    int res;
    res = add(a, b);
    printf("result: %d\n", res);
    return 0;
}
int add(int x, int y) {
    int temp;
    temp = x + y;
    return temp;
}
실행 결과
result: 30
예제 9.16
#include <stdio.h>
int buy(int x, int y) {
    int z;
    printf("%d만원과 %d만원 짜리 차를 구입했습니다.\n", x, y);
    z = x + y;
    return z;
}
int main(void) {
    int num1, num2, sum;
    printf("얼마짜리 차를 구입했습니까? : ");
    scanf("%d", &num1);
    printf("얼마짜리 차를 구입했습니까? : ");
    scanf("%d", &num2);
    sum = buy(num1, num2);
    printf("합계 %d만원입니다.\n", sum);
    return 0;
}
실행 결과
얼마짜리 차를 구입했습니까? : 30
얼마짜리 차를 구입했습니까? : 40
30만원과 40만원 짜리 차를 구입했습니다.
합계 70만원입니다.

댓글 없음:

댓글 쓰기