일지

Day 18 [함수]

joo_coding 2025. 3. 14. 09:17

-어려운 코드 여러번 따라쓰기

-한줄한줄 주석달기

 

scanf함수

scanf("%c", &c);

y를 입력하고 엔터를 치게되면

버퍼에는 y만 있는게 아니라 \n(엔터)가 남아있음

 

yy를 입력한다면?

버퍼에 yy\n이 들어가고

y랑\n이 남음

이걸 처리해주는 코드가 없으면 계속 돌게됨

 

#include <stdio.h>

int main()
{
    char answer;

    while ((answer=getchar()) != 'y')
    {
        if (answer == 'n')
        {
            printf("n을 올바르게 입력함\n");
        }

        else 
        {
            printf("n이 아님\n");
        }

        while (getchar() != '\n')
        {
            continue;
        }
        
    }
    return 0;
}

 

p.366 버퍼를 비우는 법

 

 

 

 

 

 

 

 

 

< 함수 > 

정의하는 방법:

반환형 함수명 ( 매개변수 )

    내용

    값의 반환

}

 

전달인자 유무 / 반환 값 유무

1. 전달인자 O / 반환 값 O

2. 전달인자 O / 반환 값 X

3. 전달인자 X / 반환 값 O

4. 전달인자 X / 반환 값 X

 

반환값이 있는 경우, return 값이 꼭 있어야한다.


1. 전달인자O / 반환 값 O

p.447 문제1

//작은 수 출력하는 함수
int int_min(int x, int y)
{
    int z;
    
    if (x>y)
    {
        z = y;
    }
    else
    {
        z = x;
    }

    return z;
}
    int result;
    result = int_min(5, 7); //함수 적용
    printf("%d", result);

 

 

반환값은 int

매개변수 int 2개

메인함수에 리턴값을 받아주는 변수가 있어야함


2.전달인자O / 반환 값 X

문제2

// 문제 2 함수
void chline(char ch, int i, int j) // 출력만 하라고 했으니
{
    int k;
    for (k = i ; k <= j; k++)
    {
        printf("%c\n",ch);
    }
}
    // 문제2
    char cha;

    printf("문자 입력: ");
    scanf("%c", &cha);

    int i = 0;
    int j = 10;

    chline(cha, i, j);

반환값 없음

매개변수 = (문자,정수1,정수2)

정수1이 시작하는 열

정수2가 끝나는 열

for문으로 범위를 정수1~정수2까지 잡아주고,

for문의 반복문장은 문자를 해당 범위까지 반복해서 출력하는 함수

 

main함수에서 정수1,2는 선언 및 초기화 해준 다음에 chline함수에 매개변수로 집어넣는다.

문자부분은 사용자에게 입력받아 초기화하도록 한다.

문자 'C'를 입력한다면 0~9까지 'C'를 1개씩 출력하게됨


문제3

// 문제3 함수
void square_char(char ch, int num1, int num2) // 반환값이 필요하냐
{
    for (int i=0; i<num1; i++) //열수(몇줄)
    {
        for (int j=0; j < num2; j++) //행수(몇칸)
        {
            printf("%c ",ch);
        }
        printf("\n");
    }
}
    // 문제3
    square_char('a', 10, 10);

num1은 몇줄을 만들건지

num2는 한줄에 몇개를 찍을건지

먼저 외부 for문으로 몇줄인지 만들고 (개행을 해준다)

내부 for문에 한줄에 문자가 몇개 들어있는지 만든다. 

 

main에 해당 함수를 쓸때, (출력할 문자, 줄 갯수, 문자 갯수) 넣으면 된다.


<자판기에 함수 사용하기>

int save_money(int input, int money) // 반환o, 매개변수o
{
    if ((input>9) && (input % 10 == 0)) // 10 단위
    {
        money += input; // 여기서 아무리 money에 저장한다고 한들
        return money;   // 이 함수에서만 저장이 된거기 때문에
    }                   // 이 값을 main함수에 받고싶으면 값을 반환해서 저장해줘야함
}

투입한 금액을 잔액에 저장하는 함수이다.

반환값과 매개변수 둘 다 있다.

조건문에 해당하면 money변수에 input값을 저장하고, money값을 반환한다.

 

여기서 주의할 점!!

save_money함수에 있는 money는 이 안에서만 존재하기 때문에

main함수에도 money가 있으면 서로 다른 녀석이다.

이것은 지역언어와 전역언어의 특성이다.

 

main지역의 money와

save_money지역의 money는 서로 다르다.

(부산의 김철수와 여수의 김철수가 이름은 같지만 서로 다른 사람이듯이)

 

그렇기 때문에 save_money함수에 있는 money를 

main에서 받아주려면 반환된 값을 main에 있는 money한테 저장해줘야된다.

 

그 코드는 다음과 같다.

/* 잔액저장 함수 */
money = save_money(input, money);

money에 save_money함수의 반환값을 저장해주면

그게 곧 잔액이 된다.

 

이를통해 조금이나마 지역과 전역의 차이를 느낄 수 있었다.