2010. 7. 10. 02:03

제 13장 C언어의 핵심, 함수 - 3

 

 

 


변수의 범위 : 함수와 변수의 관계를 따 져보다.

 

 ▽  변수의 특성에 따른 분류
 
 - 지역변수
: 중괄호{ }  내에 선언된 변수(Local Varial)

 - 전역변수 : 함수내에 선언되지 않는 변수(Gloval Varial)

 - 정적변수 : 함수 내부, 외부 모두 선언가능(Static Varial)

 - 레지스터 변수 : 선언에 제한이 많이 따름(Register Varial)

 

 

 

 static변수


 - 함수내부 및 외부에 선언가능


 - 한번만 초기화 된다 : 전역변수의 특징을 가진다


 - 함수내부에서 선언될 경우 함수내에서만 접근 가능
   > 지역변수의 특징 static int a;

 

예제) ========================================================

 

#include <stdio.h>

 

void Fuc(void)
{                          // 한번만 초기화 되기때문에
 static int num = 0; // 2번째 호출부터 실행되지 않는다.
                          // num값은 0으로 한번만 초기화가 이루어진다.
 num++;   

 printf("%d \n", num);
}                       // 함수를 빠져나와도, num은
                        // 값을 유지하면서 소멸되지 않는다!
int main()
{
 int i;  

 for(i=0; i<5; i++)
  Fuc();

 return 0;
}

=============================================================

 

 

 

register : cpu내의 가장가까운 기억장치(상당히 빠른 메모리)

 

 - 여유가 있는 메모리 공간은 아니다.(잘 사용하지 않는다)

 

 - regiter int b; // regiter 메모리공간에 변수를 선언한다.

 

 - 사용시, 많은 제약이 따른다

 

 


재귀 함수

 

 - 자기자신을 다시 호출하는 형태의 함수

 

 - 프로그램을 이용하기위해선 프로세서를 이해해야 한다.
   -> 컴퓨터 구조(H/W -> 운영체제)

   -> 운영체제 


 - 자기자신을 계속 호출하기때문에, 이해하기보다는

 

 - 코딩시 조금만 신경써서, 분석하며 작성하는게 좋다!

 

 - 하지만 스택오버플로우(메모리과다사용으로 인한 경고)를 조심한다.
 


예제 ) ==========================================================

 

#include <stdio.h>

 

void Print()
{
 printf("재귀함수 호출 \n");
 Print();                         // 자기자신을 다시 호출한다.
}                                  // 무한루프에 빠지게 된다.

int main()
{
 Print();
 return 0;
}


예제 )==========================================================

 

#include <stdio.h>

 

void Repeat(int n) // 함수선언 및 정의
{
 printf("재귀함수 호출\n");
 if(n==1)            // if문은 재귀함수를 빠져나가기 위한 조건
  return ;            // return문 용도 : 함수 빠져나오거나, 값을 반환할때 쓰임
 Repeat(n-1);    // n값은 1씩 감소하면서 호출해 나간다.
}                     // 결국 n값이 1이 되면 빠져나가게 되는 함수

int main()
{
 int a = 4;
 Repeat(a);      // 함수호출

 return 0;
}

// -> 핵심 :  무한 재귀호출을 위해서 탈출조건을 잘 구현해야함


※ 재귀함수의 대표적인 사례는 팩토리알 (factoral)계산
  n! = (n-1) * (n-2)......* 2 * 1
  5! = 5 * 4 * 3 * 2 * 1


예제 )==========================================================

 

#include <stdio.h>

int Fat(int n);


int main()
{
 int input;  

 printf("정수 하나 입력 : ");
 scanf("%d", &input);

 printf("%d! = %d \n", input, Fat(input));
 return 0;
}

int Fat(int n)
{

 if(n==0)                  // n값이 1이면 빠져나가게 한다.
  return 1;

 else
  return n*Fat(n-1); // Fat함수를 호출시 매개변수 값이
                             // 1씩 감소하면서 호출한다
}

Posted by 토실토실천재
2010. 7. 10. 02:02

제 12장 C언어의 핵심, 함수 - 2

 

 


변수의 범위 : 함수와 변수의 관계를 따 져보다.

 

▽  변수의 특성에 따른 분류 


 - 지역변수 : 중괄호{ }  내에 선언된 변수(Local Varial)

 

 - 전역변수 : 함수내에 선언되지 않는 변수(Gloval Varial)

 

 - 정적변수 : 함수 내부, 외부 모두 선언가능(Static Varial)

 

 - 레지스터 변수 : 선언에 제한이 많이 따름(Register Varial)

 

 

 

지역변수 : 선언된 함수내에서만 접근가능
                     - {중괄호} 안에 선언된 변수는 모두 지역변수이다


ex) while(){}, for(;;){}, main(){}등과 같이 {}안에 있는 변수

 

int Fuc()
{
 int k;        // k값이 적용되는 범위는 { } 안에서만 가능
 ...           // 지역변수 k는 이 함수가 끝나면 메모리공간에서 사라진다.
 return 0;  // tip : C메모리구조는 stack 형태로 저장된다.
}

 

int Fuc_1()
{
 int k;  // 이 k값은 위의 Fuc함수의 k값과는 별개다.
 int k1;

 ...
 return 0;
}


예제 =========================================================


#include <stdio.h>

 

int main()
{
 int i;                       // main함수 내에서는 어디에든 접근가능

 for(i=0; i<3; i++)
 {
  int a = 0;               // main함수안의 for문안에 있는 지역변수 a
  a++;
  printf("%d번째 for 루프, 지역변수 a는 %d \n", i, a);
 }                            // 반복을 할때마다 a는 중괄호를 나갔다가 다시 올라간다.
                              // 즉, 지역을 벗어나기 때문에 a는 소멸된다.(생성/소멸반복)
 if(i==3)
 {
  int a = 10;           // main함수안의 if문안에 있는 지역변수 a
  a++;
  printf("if문에 내에 존재하는 지역변수 a는 %d \n", a);
 }
  
 return 0;
}

 

예제 =========================================================

 

#include <stdio.h>

 

int main()
{
 int val = 0;         // main함수를 지역으로 두는 변수

 {                     // main 함수내 줄괄호를 이용해서 또 다른지역을 연다
  int val = 0;        // 만약에 이 수식문이 사라지면
  val = val + 10;   // {} 밖에 있는 val값이 적용된다.
  printf("if의 지역변수 val : %d \n", val);
 }                     // { }의 val 소멸

 printf("main의 지역변수 val : %d \n", val);

 return 0;
}

==============================================================

 

 

지역변수와 매개변수

  - 매개변수도 지역변수의 일종이다.
 
int fuction(int k, int m) // 매개변수(k, m) < 지역변수
{
 k = k+10;
 m = 20;
 
 return k-m;
}

 

 


전역변수

 

 - 프로그램 어디에서도 접근이 가능한 변수

 

 - { } 에 속하지 않는다.

 

 - main함수종료(프로그램 종료)때까지 존재한다.


 - 전역변수는 어디서든 접근가능하다.


 - 그렇지만, 잦은 사용은 좋지 않다.


 - 나중에 프로그램이 커지면, 얽키고 설켜버릴 가능성이 있다.

 

바로 예제 갑니다.

 


예제 =========================================================

 

#include <stdio.h>

int val;  // 전역변수는 자동으로 0으로 초기화 된다.
            //
지역변수는 자동으로 초기화 되지 않음.


void Sum(int k); // 함수선언

 

int main()
{
 printf("val : %d \n", val);

 Sum(4);        
 printf("val : %d \n", val);

 val++;                           // 전역변수


printf("val : %d \n", val); // 전역변수

 return 0;
}

 

void Sum(int n)// 힘수정의
{
 val = val + n; // 프로그램 전체 내에서 val값은 유지된다.
}

 

Posted by 토실토실천재
2010. 7. 10. 02:01

제 11장 C언어의 핵심, 함수 - 1

 

 

 

C언어로 만들어진 프로그램은 ?

    : 함수로 시작해서 함수로 끝나는 프로그래밍 언어

 

 - 중요도는 함수가 포인터가 상대적으로 높다.

 

 - 포인터는 활용하는데 정말 중요

 

 - 함수를 적절히 이용하는건 더 어렵게 걸린다.

 

 - 포인터를 얼마냐 잘 사용되느냐가 아닌

 

 - 함수를 어떻게 정하는건지 실력판단.

 

 - 좋은함수를 만들수 있어야한다.

 

 

 

main()함수 다시보기

 

int main (void)
{

 // 함수몸체

}


1. 함수는 이름이 필요하다

 

(void)  : 입력의 형태

 

 (int)   : 출력의 형태(반환 혹은 리턴형)

 

{    }  : 함수의 몸체(함수의 기능)

 

 

2, 함수를 정의하는 이유

 

  - 모듈화(기능별로 분리)에 의한 프로그램의 질 향상

 

  - 유지 보수, 확장의 용이성
    ex) 프로그램을 바꿀때, 기능별로 순차적으로 수정이 가능

 

 - 문제를 분리하고,전체를 정복하라 (Divide and Conquer)

 

  - 체계적인 프로그래밍 가능

 

  - 코드 읽기의 효율성

 

 

3. 함수의 형태
 
int Sum(int a, int b) // int형을 return 할 Sum 이라는 이름의 함수
{                          // 변수 a, b로 받아준다.
 int sum = a+b;       // 연산값을 sum에 대입

 return sum;         // return : sum을 반환해라, 던져줘라
}

 

예제 ===============================================

 

#include <stdio.h>

 

int Sum(int a, int b) // 여기에 a = 10, b = 20
{
 int result = a+b;

 return result;            // result를 던진다.(뱉어낸다)
}

 

int main()
{
 int val;

 val = Sum(10, 20);// 뱉어낸 값을 받아서 val에 보관
 printf("val = %d \n", val);

 return 0;
}

 

// 함수가 리턴값은 어디로 넘어가는가?

// 리터형 함수는 어떤것들이 있는가?

 

 

4 다양한 형태의 함수

 

int Sum(int val)     // 전달인자, 리턴값 둘다 있다.
void Sum(int val)  // 전달인자는 있지만 리턴값이 없다.
int Sum()              // 전달인자는 없고, 리턴값은 있다.
void Sum(void)    // 전달인자, 리턴값 둘다 없다.

 

 

5. 함수 선언의 필요성

 

 - 컴파일러의 특성상, 함수는 호출되기전에 정의되야 한다.

 

 - 호출할 함수정의는 main함수 이전에 무조건 선언 되야 한다.

 

 - 호출할 함수원형을 선언후, main()함수 밑에 선언도 가능

 

 - 컴파일은 위에서 아래의 순서대로 읽기때문에, 컴파일이 호출할 함수를 읽어야 한다.


예제 ===============================================

 

#include <stdio.h>

 

int Add(int a, int b);        // 더하기 함수선언
int Minus(int a1, int b1); // 빼기 함수선언
int Input();                    // 입력하는 함수선언
void Print(int k, int k1);  // 출력하는 함수선언
void Title();                  // 프로그램제목 함수선언

//-------------------------------------- 까지 함수 선언부분

int main()
{
 int num1, num2;
 int sum1, sum2;

 

 Title();                                // 제목함수호출

 

 num1 = Input();                    // Input함수를 호출하여, 결과값을 num1에 반환
 num2 = Input();                    // Input함수를 호출하여, 결과값을 num2에 반환

 

 sum1 = Add(num1, num2);    // Add(더하기)함수 호출하여 결과값을  sum1에 반환
 sum2 = Minus(num1, num2); // Minus(빼기)함수 호출하여 결과값을 sum2에 반환

 

 Print(sum1, sum2);              // 출력함수 호출

 return 0;                            // 0을 리턴한다.
}

//-------------------------------------- 부터 함수 정의부분

void Title()                         // Title 함수정의부분
{
 printf("  ▲                               ▲\n");
 printf("■ 함수를 이용한 프로그램 예제입니다 ■\n");
 printf("  ●                               ●\n");
}

 

int Add(int a, int b)             // Add 함수정의부분
{
 int result = a + b;
 return result;
}

 

int Minus(int a1, int b1)      // Minus 함수정의부분
{
 int result1 = a1 - b1;
 return result1;
}

 

int Input()                        // Input 함수정의부분
{
 int val;
 printf("값을 입력하세요 : ");
 scanf("%d", &val);

 return val;
}

 

void Print(int k, int k1)     // Print 함수정의부분
{
 printf("더한 결과 : %d \n", k);
 printf("빼기 결과 : %d \n", k1);
}

 

// 위(main함수 위)에는 함수를 선언한부분

// 밑(mani함수 밑)에는 선언한 함수를 정의한 부분이다

 

예제 ===============================================


// 함수 선언의 의미

#include <stdio.h>

 

int Large_Num(int a, int b); // 함수 선언부분

 

int main()
{
 int a = 10;
 int b = 12;

 int c = 3;
 int d = 2;

 

 printf("%d 와 %d중 큰 수는 %d \n", a, b, Large_Num(a, b));
 printf("%d 와 %d중 큰 수는 %d \n", c, d, Large_Num(c, d));

 

// printf의 인자값을 반환값이 존재하는 함수가 올수 있다

 

 return 0;
}

 

int Large_Num(int a, int b)  // 함수정의 부분, main 함수내의  변수 a,b와는 별개인 변수다
{
 if(a > b)
  return a;

 else
  return b;
}

 

// Tip !

// 한 함수내의 { } 안에 선언된 변수의 이름은 그 안에서만 효력이 발생한다.

// 다른 함수에 똑같은 이름의 변수가 있더라도, 영향을 받지 않지만,

// 프로그램의 가독성 및 혼란성을 피하기 위해서, 다른 변수를 넣어주는것이 좋다.

ex)

in Add()

{

int a;

}

 

int Add_1()

{

int a;

}

 

이둘의 a값은 컴파일의 혼란을 야기 시키지 않는다. 이름만 같을뿐, 서로 다른변수다.

 

 

 

Posted by 토실토실천재