본문 바로가기
코스웨어/16년 스마트컨트롤러

20160308_김도관_업무일지_제어문

by 알 수 없는 사용자 2016. 3. 9.
728x90
반응형

제어문


1.while


do while 문 : {}안을 선행처리후 조건을 실행

1
2
3
4
5
do
{
 
}while(조건문);
 
cs


일반 적인 while문 : 조건문에 만족할동안 반복

1
2
3
while(조건문){
 
}
cs


EX)

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
#include <stdio.h>
 
int main()
{
    int iCnt = 1;
    int iCnt2 = 1;
 
    int iSum1 = 0;
    int iSum2 = 0;
    
    printf("do while\n");
    do
    {
        iSum1 = iSum1+iCnt;
        iCnt++;
        
    }while(iCnt > 10);
    printf("%d\n",iCnt);
 
    printf("\nwhile\n");
    while(iCnt2 > 10)
    {
        iSum2 = iSum2+iCnt2;
        iCnt2++;
    }    
    printf("%d\n",iCnt2);
 
    return 0;
}
cs

12번째줄 : do~while의 경우 조건문이 맞지 않으므로 적어도 한번은 실행

21번째줄 : while문에 의해서 조건문이 먼저 체크되므로 {}안의 내용은 적용되지 않음


출력 : 


2. for

while문과 같은 반복문의 한형태


EX)구구단3단 

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
32
33
#include <stdio.h>
 
void multiTB(void)
{
    int iCnt;
    int iNum = 3;
    int iValue;
    
    printf("구구단 %d단 \n\n",iNum);
    
    /***********************
    while (iCnt <= 9)
    {     
        
        iValue = iNum * iCnt;
        printf("%d * %d = %d\n",iNum,iCnt,iValue);
        iCnt = iCnt + 1; //++iCnt; 왼쪽을 더 지향함
    }
    ***********************/
 
    for(iCnt = 19 >= iCnt; iCnt++)
    { 
        iValue = iNum * iCnt;
        printf("%d * %d = %d\n",iNum,iCnt,iValue);
 
    }
    return;
}
int main()
{
    multiTB();
    return 0;
}
cs

12번째줄 while문으로 작성

21번째줄 for문으로 작성



상단의 그림과 같이 while문을 for문으로 변경가능


출력




iCnt가 100의 값을 가질때 

++iCnt 과 iCnt++의 차이


++iCnt 처리 순서

1.iCnt = iCnt + 1;

2.A = iCnt;

A에 처음 출력되는 값 = 101;


iCnt++ 처리 순서

1.A = iCnt;

2.iCnt = iCnt + 1;

A에 처음 출력되는 값 = 100;

iCnt = iCnt + 1;
iCnt++;
++iCnt;
모두 동일하지만 계산 순서의 차이가 있음

지연용 반복
특정 상황을 유발하기 위해서 무한루프를 실행시켜야할때가 있음

1
2
3
4
5
6
7
8
while(1);
 
for(;;){}
 
for(;;);
 
for(;;){
}
cs

4가지 경우 모두 동일하게 무한루프 만들어냄

volatile

컴파일러는 불필요한 시간낭비를 막기위해서 자동 최적화를 해서 컴파일 하므로

이것을 막기위해 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    volatile int iCnt;
    /*************
    for(iCnt = 0; 1000000000 > iCnt; iCnt++)
    {} // volatile없을때는 내부가 비었으므로 자동 속도 최적화 시켜버림 iCnt = 10억 의 값을 바로 넣어버림
    *************/
 
    for(iCnt = 01000000000 > iCnt; iCnt++)
    {}
    printf("test\n");
 
    return 0;
}
 
cs


exe 파일 실행시 약간의 딜레이가 좀더 발생하는것을 볼수있고 cpu 사용율을 보면 조금더 높게 사용하는것을 볼수 있음





3. union (공용체)

구조체 선언시 struct를 union으로 변경한것. struct와의 차이는 변수의 메모리 할당

 struct

 변수들에게 각각 메모리 할당하여 저장

 union

 가장 메모리를 크게 할당이 되는 자료형을 기준으로 하나의 메모리만 가지며 이것을 공유함


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
union smart // 공용체
{
    int A;
    short B;
    int C;
    char D;
};
 
int main()
{    
    union smart obj;
    obj.A = 0x12345678;
 
    printf("%d \n",sizeof(union smart));
    printf("A = %X \n",obj.A);
    printf("B = %X \n",obj.B);
    printf("C = %X \n",obj.C);
    printf("D = %X \n",obj.D);
    return 0;
}
cs


14번째줄 obj.A에 16진수 12345678의 값을 넣음

메모리에 아래와 같이 영역을 가지게 됨


출력:







4. 함수포인터

함수를 가르키는 포인터

하는일 : 1. 정의된 함수의 호출

 2. 함수가 위치하고 있는 주소의 값 확인


선언 방법

1.void smart( ); -> 함수의 원형

2.void ( * ) ( ); -> 함수의 type

3.void ( * test ) ( ); -> test라는 함수의 포인터 변수 선언 


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
#include <stdio.h> //함수 타입 추출
 
//void smart1(); //함수의 원형
void smart1(void)
{
    printf("1번함수\n");
    return;
}
 
void smart2(void)
{
    printf("2번함수\n");
    return;
}
 
int main()
{
    void (*test)(); // 함수포인터선언
 
    test = smart1; //주소 지정
    test(); //호출
 
    test = smart2; // 2번째 주소지정
    test();
 
    return 0;
}
cs


18번째줄 : 함수포인터 명을 지정

20번째 및 23번째줄 : 포인터명은 같으나 서로 다른 함수 호출


728x90