<정처기> C언어 3. 함수와 재귀함수(v2)

빡찌's avatar
Sep 24, 2024
<정처기> C언어 3. 함수와 재귀함수(v2)

무조건 나온다 중요!

 
함수란 중복을 줄이는 것.
함수는 특정 작업을 수행하는 코드 블록이다.
함수는 코드의 재사용성을 높이고 프로그램을 더 구조적으로 만든다.
 
함수는 정의(선언)하는 부분이 있고,
그 함수를 호출(사용)하는 곳이 있다.
//함수 정의(선언부분) int add(int a, int b) { return a+b; //리턴값은 int다 } int main() { int result = add(3,4); //함수 호출 printf("3+4 = %d\n", result); return 0; }
*Python은 메인함수가 없음,, 그냥 순서대로 읽으면 됨
 
 
C 언어의 조건문에서는 0을 거짓으로, 그 이외는 모두 참
다른 언어와 달리 C언어는 참일때 1을 뱉고, 0은 거짓으로 판단
0외의 값이 조건으로 오면 참으로 판단.
참고) 비교 연산자의 경우도 1 아니면 0으로 리턴함
1==1의 출력값은 1이고 1==2의 출력값은 0
 
배열에서 size는 갯수.
length는 길이.
 
int length = 0; while(str[length] != '\0') { length++; }
: str[length]의 값이 null('\0')과 같지 않으면 참이여서 반복문 실행
반대로 값이 null('\0')이 되는 순간 거짓이 되어 반복문 탈출
 
void processValues(int *num, char *ch) { printf("입력된 숫자: %d\n", *num); printf("입력된 문자: %c\n", *ch); } int main() { int number = 42; char character = 'A'; processValues(&number, &character); return 0; }
이런 코드에서 넘겨주는 값이 배열이나 문자열이 아니기때문에
주소값을 넘겨주기 위해선 파라미터로 &를 붙여서 주소를 표현해줘야함
  • 파라미터로 포인터 변수가 들어온다는 것은? 메모리 주소가 들어온다는 것
메모리 주소를 묻는 것은 애초에 나오지 않음
 
//*a = 203을 가지고 있는 주소, *b = 1004를 가지고 있는 주소 void swap(int *a, int *b) { int temp = *a; //*a가 가지고 있는 값 = 203 = temp *a = *b; //a의 '값'에 b의 '값'을 넣어라 //>> a라는 값이 1004가 됨 *b = temp; //b의 값에 temp에 저장되어 있던 203을 넣음 } int main() { int x = 203; int y = 1004; printf("교환 전: x=%d, y=%d\n", x,y); swap(&x, &y); //메모리 주소를 줌 printf("교환 후: x=%d, y=%d\n", x,y); //교환된 값이 나옴 return 0; }
 

재귀함수(recursive function)란 무엇인가?

: 함수가 자기 자신을 호출하는 함수
>> 트리형태로 더해 나가는 문제가 많이 나옴
int factorial(int n) { if(n==0) { return 1; } else { return n*factorial(n-1); } } int main() { int number = 5; printf("%d! = %d\n", number, factorial(number)); }
factorial(5) = 5 * factorial(4)
factorial(4) = 4 * factorial(3)
factorial(3) = 3 * factorial(2)
factorial(2) = 2 * factorial(1)
factorial(1) = 1 * factorial(0)
factorial(0) = return 1
 
이런식으로 타고타고 가서 리턴값을 받고 역순으로 또 타고 올라가는 형식
 
*함수는 return 되는 순간 그 함수는 끝나벌인다~!~!
 
int charFreq(char *str, char ch) { if(*str == '\0') { return 0; } else { //여기서 ch는 l이기 때문에 str이 가르키는 값이 l이 아니라면 // 0을 return 하고 str이 가르키는 값이 l이라면 1을 리턴함 //str+1은 결국 다음 메모리 주소가 갈키는 값을 말함 return (*str == ch) + charFreq(str+1, ch); } } int main() { char myString[] = "hello world"; char targetChar = 'l'; printf("문자 '%c'의 빈도는 %d입니다.\n", targetChar, charFreq(myString, targetChar)); return 0; }
출력값 : 문자 ‘l’의 빈도는 3입니다.
특정 문자가 몇번 나오는지 확인 할 수 있는 것…
 

외울 것 요약

  1. 함수의 리턴값을 힌트로 어떤 값이 나가는지 파악하자
  1. 함수는 3개를 중요시 보면 된다. 호출부분, 입력값, 리턴값
  1. 메모리를 가리키는 포인터 변수(*)가 입력값으로 되어있을 때는 주의해서 보자
  1. 재귀함수는 차근차근 그 다음 스텝을 적어가면서 풀어보자
Share article

prettytree