Day 18 [함수]
-어려운 코드 여러번 따라쓰기
-한줄한줄 주석달기
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함수의 반환값을 저장해주면
그게 곧 잔액이 된다.
이를통해 조금이나마 지역과 전역의 차이를 느낄 수 있었다.