
'프로그래밍 > C' 카테고리의 다른 글
제 17장 포인터의 이해 - 예제 (0) | 2010.07.10 |
---|---|
제 16장 포인터의 이해 - 1 (0) | 2010.07.10 |
제 14장 1차원 배열 - 1 (0) | 2010.07.10 |
제 13장 C언어의 핵심 함수 - 3 (0) | 2010.07.10 |
제 12장 C언어의 핵심 함수 - 2 (0) | 2010.07.10 |
제 17장 포인터의 이해 - 예제 (0) | 2010.07.10 |
---|---|
제 16장 포인터의 이해 - 1 (0) | 2010.07.10 |
제 14장 1차원 배열 - 1 (0) | 2010.07.10 |
제 13장 C언어의 핵심 함수 - 3 (0) | 2010.07.10 |
제 12장 C언어의 핵심 함수 - 2 (0) | 2010.07.10 |
제 16장 포인터의 이해 - 1 (0) | 2010.07.10 |
---|---|
제 15장 1차원 배열 - 2 (0) | 2010.07.10 |
제 13장 C언어의 핵심 함수 - 3 (0) | 2010.07.10 |
제 12장 C언어의 핵심 함수 - 2 (0) | 2010.07.10 |
제 11장 C언어의 핵심 함수 - 1 (0) | 2010.07.10 |
제 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씩 감소하면서 호출한다
}
제 15장 1차원 배열 - 2 (0) | 2010.07.10 |
---|---|
제 14장 1차원 배열 - 1 (0) | 2010.07.10 |
제 12장 C언어의 핵심 함수 - 2 (0) | 2010.07.10 |
제 11장 C언어의 핵심 함수 - 1 (0) | 2010.07.10 |
제 10장 조건에 따른 흐름의 분기 - 2 (0) | 2010.07.08 |
제 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값은 유지된다.
}
제 14장 1차원 배열 - 1 (0) | 2010.07.10 |
---|---|
제 13장 C언어의 핵심 함수 - 3 (0) | 2010.07.10 |
제 11장 C언어의 핵심 함수 - 1 (0) | 2010.07.10 |
제 10장 조건에 따른 흐름의 분기 - 2 (0) | 2010.07.08 |
제 9장 조건에 따른 흐름의 분기 - 1 (0) | 2010.07.08 |
제 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값은 컴파일의 혼란을 야기 시키지 않는다. 이름만 같을뿐, 서로 다른변수다.
제 13장 C언어의 핵심 함수 - 3 (0) | 2010.07.10 |
---|---|
제 12장 C언어의 핵심 함수 - 2 (0) | 2010.07.10 |
제 10장 조건에 따른 흐름의 분기 - 2 (0) | 2010.07.08 |
제 9장 조건에 따른 흐름의 분기 - 1 (0) | 2010.07.08 |
제 8장 여러형태의 반복문 (0) | 2010.07.08 |
// num 값이 0보다 크면 ch = '+'가 되다.
// 즉, 0~9까지 2, 3으로 나눠 떨어지는 수를 제외한 수를 출력한다.
// 2와 3의 배수
// grade 값은 0~10까지의 값이 들어간다.
// break문이 없으면 다음 case문이 실행된다
제 12장 C언어의 핵심 함수 - 2 (0) | 2010.07.10 |
---|---|
제 11장 C언어의 핵심 함수 - 1 (0) | 2010.07.10 |
제 9장 조건에 따른 흐름의 분기 - 1 (0) | 2010.07.08 |
제 8장 여러형태의 반복문 (0) | 2010.07.08 |
제 7장 비트단위 연산과 상수, 기본자료형 (0) | 2010.07.08 |
// tip : 정수 입력시, space키나 enter키로 구분하여 입력한다
printf("3, 4로 동시에 나눠어 떨어지는 수 : %d \n", loop);
제 11장 C언어의 핵심 함수 - 1 (0) | 2010.07.10 |
---|---|
제 10장 조건에 따른 흐름의 분기 - 2 (0) | 2010.07.08 |
제 8장 여러형태의 반복문 (0) | 2010.07.08 |
제 7장 비트단위 연산과 상수, 기본자료형 (0) | 2010.07.08 |
제 6장 scanf함수와 데이타 표현방식의 이해 (0) | 2010.07.08 |
int i = 2; // i는 2부터 시작하니,
int j = 0;
while(i<10) // i가 10보다 작을때까지, 즉 9까지
{
j = 1;
while(j<10) // j는 10보다 작을때까지, 즉 9까지
{
printf("%d * %d = %d ", i, j , i*j);
j++;
}
i++;
int total = 0;
int val = 0;
do
{printf("숫자 입력 ( 0 : quit) :");}
scanf("%d", &val);
total+=val;
while(val!=0);
printf("Total : %d ", total);
system("PAUSE");
return 0;
int val ;
int i = 1;
printf("출력하고자 하는 구구단, 몇 단? :");
scanf("%d", &val);
do
{
printf("%d * %d = %d ", val, i, val*i);
i++;
}
while(i<10);
return 0;
int total = 0;
int i, n;
printf("0부터 n까지의 덧셈, n은? ");
scanf("%d", &n);
for(i=0; i<=n; i++) // i는 0부터시작해서 입력한 수 n보다 같거나 작을때까지
{ // i는 1씩 증가
total += i;
}
printf("0부터 %d까지의 덧셈결과는 : %d", n, total);
system("PAUSE");
return 0;
float total = 0.0;
float input = 0.0;
int count = 0;
for(;input >=0.0;) // 이건 초기문, 증감문이 없다.
// 단, input값이 0.0보다 클때 라는 조건만 있따.
{
total += input; // 아
printf("양의 실수 입력(minus to quit) :");
scanf("%f", &input);
count++;
}
printf("지금까지의 평균 : %f ", total/count-1); // count는 한번더 +1을 하므로 -1을 해줌
return 0;
int i, j;
for(i=0; i<3; i++)
{
printf("현재 i 는 %d *** ", i);
for(j=0; j<2;j++)
{
printf("현재 j는 %d ", j);
}
i++;
}
system("PAUSE");
return 0;
제 10장 조건에 따른 흐름의 분기 - 2 (0) | 2010.07.08 |
---|---|
제 9장 조건에 따른 흐름의 분기 - 1 (0) | 2010.07.08 |
제 7장 비트단위 연산과 상수, 기본자료형 (0) | 2010.07.08 |
제 6장 scanf함수와 데이타 표현방식의 이해 (0) | 2010.07.08 |
제 5장 변수와 연산자 - 2 (0) | 2010.07.08 |
제 9장 조건에 따른 흐름의 분기 - 1 (0) | 2010.07.08 |
---|---|
제 8장 여러형태의 반복문 (0) | 2010.07.08 |
제 6장 scanf함수와 데이타 표현방식의 이해 (0) | 2010.07.08 |
제 5장 변수와 연산자 - 2 (0) | 2010.07.08 |
제 4장 변수와 연산자 (0) | 2010.07.08 |
제 8장 여러형태의 반복문 (0) | 2010.07.08 |
---|---|
제 7장 비트단위 연산과 상수, 기본자료형 (0) | 2010.07.08 |
제 5장 변수와 연산자 - 2 (0) | 2010.07.08 |
제 4장 변수와 연산자 (0) | 2010.07.08 |
제 3장 C언어의 기초 - printf함수 (0) | 2010.07.08 |