티스토리 뷰

[37강] 함수

* 함수란? 반복적인 수행을 정의해 놓은 작은 프로그램 단위(하나의 프로그램 단위)

                모듈의 독립성을 높이기 위해 응집도를 높이고 결합도를 낮춘다.

반환함수 함수 선언과 사용
반환타입 함수명(인자들...){
   수행할 작업1
   수행할 작업2
}
int sum(int a, int b) 
{
int c = a+b;
return c; 
}

int data = sum(10,20); // 30을 return 시킴
printf("%d", data); // 30 출력

*반환하지 않는거는 void 타입이라고 함.

문제 풀이
#include<stdio.h>

void swap(int a, int b){
  int temp;
  temp = a;
  a = b;
  b = temp;
}

int main(void) {
  int k,j;
  k=3;
  j=2;
 swap(k,j);
 printf("k = %d, j=%d",k ,j);
 return 0;
}
*void는 return하지 않는 함수

k = 3;
j = 2;
swap(3,2) {
  tem = 3 
  a = 2
  b = 3
}
return하지 않았기 때문에 tem,a,b의 값은 다 사라짐.
따라서 k=3,  j=2





 

[38강] 함수와 반복문

문제 풀이
#include<stdio.h>

int func(int n);
int main(void) {
  int num;
  printf("%d\n", func(5));
  return 0;
}

int func(int n) {
  if(n<2)
     return n;
  else {
     int i,temp, curent =1, last = 0;
     for(i=2; i<=n; i++){
        tmp = curent;
        curent += last;
        last = tem;
     }
     return curent;
   }
}
func(5) {
  5<2 거짓이므로 else로 감
  for {
i=2<=5 참,
    tmp = 1;
    curent = 1 + 0 = 1;
    last = 1;  i++
i=3<=5참,
    tmp = 1;
    curent = 1+1=2;
    last = 1; i++
i=4<=5참;
    tem = 2;
    curent = 2+1=3;
    last = 2; i++
i=5<=5참;
    tem = 3;
    curent = 3+2=5;
    last = 3; i++
i=6<= 거짓, for문 빠져나옴
    return curent = 5;
}

printf("%d\n", func(5))는 5를 출력

 

[39,41,42,44,45,46,47,48강] 함수에 주소 전달

* call by value 값을 전달해서 함수를 호출

* call by reference 주소값 전달 (포인터, 객체, 오브젝트, 배열 전달)

문제1 풀이
#include<studio.h>
int main(void) {
   int x = 10, y = 20;
   printf("%d", f(&x, y)); &는 주소값임
   printf("%d %d\n", x, y);
}
* main 앞의 int는 출력값의 자료형, main뒤의 void 자리는 입력받는 자료의 자료형, void는 기본값.

int f(int *i, int j){
  *i += 5;
   return (2 * *i+ ++j);
}

실행결과는?
x = 10 15 (100번지)
y = 20 (200번지)
f(100번지의 값, 20) {
  ++j가 우선순위 가장 높으므로 j = 20+1 = 21
 100번지의 값 = 100번지의 값10+5=15;
  return 2 * (100번지의 값 15) + (j=20+1=21)
  즉, 2*15+21=51
}
return 후 함수 안에 내용은 초기화됨

printf("%d", f(&x, y));는 51을 출력
printf("%d %d\n", x, y);는 15, 20 출력

개행없으므로 51 15 20
문제2 풀이
int value = 3, list[4] = {1,3,5,7};
int i;
swap(value, &list[0]);
swap(list[2] , &list[3]);
swap(value, &list[value]);
for (i=0l i<4, i++)
  print("%d", list[i]);

void swap(int a, int *b){
  int temp;
  temp = a;
  a = *b;
  *b = temp;
}
value = 3, list = {1 3,3,5,7 5 3}, i
swap (3,100번지(1이 있는 주소)){
  temp = 3;
  a= 100번지의 값 1
  *b = 100번지(list[0])의 값은 temp 3
} return 값은 없음. 변수 초기화
swap (5, 103번지(7의 주소)) {
  temp = 5
  a = 7
  *b = 5
}
swap (3, list[3]의 주소값){
 temp = 3
 a = 5
 *b = 3
}
for i=0, 0<4참 list[0] i<4까지 list출력 3353

 

[40강] 함수와 변수의 유효범위

* 함수에서 변수를 참조할 때 나랑 가장 가까이있는 변수를 참조한다.

문제 풀이
#include<stdio.h>
int a=1, b=2, c=3; → *전역변수
(모든 프로그램에 영향을 미칠 수 있는변수)

int f(void); // 니 밑에 f라는 함수가 있어
int main(void){
  printf("%3d\n", f());
  printf("%3d%3d%3d\n", a,b,c);
  return 0;
}

int f(void){
  int b,c;
  a=b=c=4;
  return (a+b+c);
}
a=1 4, b=2, c=3
printf("%3d\n", f()); %3d는 3개의 공간 ___ 뒤에서부터 채움
f() {
  지역변수 b,c 존재
   a=b=c=4;
   전역변수 a=4할당
   지역변수 b와 c에 4 할당
   return a+b+c=4+4+4=12 반환
} f()안에있던 변수들 초기화

printf("%3d\n", f()); " 12" 공백포함 출력 후 개행
printf("%3d%3d%3d\n", a,b,c);전역변수 a,b,c 출력"  4  2  3 "

 

[43강] 함수가 주소를 리턴

문제 풀이
#include<stdio.h>
int main() {
  int i;
  int x = 10;
  int *p;
  int a[100];
  for(i=0; i<100; i++)
     a[i] = i*10;
  p = func(x,a);
  printf("sum=%d",x + a[0] + a[1] + p[0] + p[1]); 
}

int *func (int a, int *x){
  a = a+10;
  x = x+1;
 *x = *x * 2;
  return x;
}
i
x=10
p포인터함수 = func(x,a)의 주소값 101번지
a={0,10 20,20,30,40,50,60,,,,,990}

func(10,a의주소값) {
  지역변수 a=10+10=20;
  x = x+1 = 101번지 10
 *x = *x * 2 101번지에 10*2 = 20
  x를 리턴하므로 101번지 주소값리턴
}

printf("sum=%d", x + a[0] + a[1] + p[0] + p[1]); 
10 + 0 + 20 + 20(101번지) + 20 = 70
sum = 70

 

※ 출처 : 흥달쌤 C언어 37강~48강 https://youtu.be/1-VH1ZGgVG0?si=L-sHN-mTwfpNI4gb

※ 컴파일 사이트 : http://ideone.com

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함