해결해야 할 문제의 규모가 크거나 복잡할 때 main 이라는 하나의 함수에서 모두 해결하는 것보다 문제 해결에 필요한 기능들을 분석하고 분석 결과를 바탕으로 작은 함수들로 나누어서 해결하는것이 쉽고, 효율적이다.

 

자주 사용하는  printf() 같은 경우도 인자를 콘솔에 출력하는 일종의 함수이다.

 

함수는 전달인자의 유무와 반환 값의 유무에 따라 4개의 형태로 나눌 수 있다. 

전달인자와 반환값이 모두 있는 경우, 전달인자만 있고 반환값은 없는 경우, 전달인자가 없고 반환값만 있는 경우, 전달인자와 반환값이 모두 없는 경우로 총 4가지가 있다.

 

전달인자와 반환값이 모두 있는 경우

두 수의 덧셈 기능을 하는 함수로 예를 들면 전달인자는 int형 정수 두 개 이고, 덧셈 결과는 반환이 되고, 반환형도 int 형이다. 함수의 이름은 Add로 한다.

함수 호출 시 전달 되는 인자를 매개변수라 한다. 

함수를 정의하고 호출하는 코드는 다음과 같다.

#include <stdio.h>

int Add(int num1, int num2) // 반환형 함수이름(매개변수1, 매개변수2)
{
    return num1 + num2;     // 값 반환
}

int main(void)
{
    int result = Add(3,5);
    printf("Add Result : %d\n", result);
    return 0;
}
// output : Add Result : 8

int result = Add(3,5); 를 보면 함수의 호출문이 반환하는 값으로 대체된다는 것을 알 수 있다.

함수가 호출되면 호출된 함수의 영역으로 실행의 흐름이 이동한다.

 

전달인자나 반환값이 존재하지 않는 경우

void 라는 반환형은 반환하지 않는다 라는 뜻이 담겨 있다. void로 반환형이 지정된 함수의 몸체에는 return문이 없다.

매개변수의 선언 위치에 void가 들어가면 인자를 전달하지 않는다는 뜻이다.

반환형과 매개변수의 위치에 둘다 void를 사용하여 전달 인자와 반환값이 모두 존재하지 않는 함수도 정의할 수 있다.

#include <stdio.h>

int Add(int num1, int num2) // 인자 전달, 반환값
{
    return num1 + num2;
}

void ShowAddResult(int num) // 인자 전달
{
    printf("Add Result : %d", num);
}

int ReadNum(void)   // 반환값
{
    int num;
    scanf("%d", &num);
    return num;
}

void HowToUseThisProg(void)
{
    printf("If you input two number, print add result.\ninput two number.\n");
}

int main(void)
{
    int result, num1, num2;
    HowToUseThisProg();
    num1 = ReadNum();
    num2 = ReadNum();
    result = Add(num1,num2);
    ShowAddResult(result);
    return 0;
}

 

return

키워드 return은 두가지 의미가 있다. 값을 반환하며 함수를 빠져나간다는 의미지만, return문 뒤에 반환한 값이 없는 경우 값의 반환 없이 함수만 빠져나간다는 의미로 사용할 수 있다.

 

int Add(int num1, int num2);

int main(void)
{
	int result = Add(3,4);
    printf("%d",result);
    return 0;
}

int Add(int num1, int num2)
{
	return num1+num2;
}

위 코드와 같이 함수의 선언을 먼저 하고 호출 된 후에 정의를 할 수도 있다. 함수의 선언에는 매개변수의 갯수와 자료형의 정보만 포함하면 된다. 따라서 다음과 같이 매개변수의 이름을 생략하여 함수를 선언할 수 있다.

int Add(int, int);

 

'Language > C, C++' 카테고리의 다른 글

[C] 전역변수  (0) 2020.12.09
[C] 지역변수  (0) 2020.12.09
[C] goto  (0) 2020.12.08
[C] switch  (0) 2020.12.08
[C] continue  (0) 2020.12.05

goto는 프로그램의 흐름을 원하는 위치로 이동시킬 때 사용하는 키워드이다. goto는 프로그램의 자연스러운 흐름을 방해한다는 이유와, goto를 사용했을 때의 이점이 크지 않기 때문에 goto의 사용에 대한 인식은 부정적이다.

 

goto 키워드로 레이블을 지정하면 지정한 위치로 코드의 흐름을 이동시킨다.

#include <stdio.h>

int main(void)
{
    int num;
    printf("input number : ");
    scanf("%d", &num);

    if(num==1)
        goto ONE;
    else if(num==2)
        goto TWO;
    else
        goto OTHER;
    
ONE:
    printf("input 1\n");
    goto END;
TWO:
    printf("input 2\n");
    goto END;
OTHER:
    printf("input other num\n");
    goto END;

END:
    return 0;
}

위 코드와 같이 레이블은 실행하는 코드가 아닌 위치를 표시하는 역할로 사용되기 때문에 왼쪽 정렬시켜 구분하기 쉽게 한다.

'Language > C, C++' 카테고리의 다른 글

[C] 지역변수  (0) 2020.12.09
[C] 함수(function)  (0) 2020.12.08
[C] switch  (0) 2020.12.08
[C] continue  (0) 2020.12.05
[C] break  (0) 2020.12.05

switch문은 if~else 문과 비슷한 역활을 한다. switch 문은 다음과 같은 형태로 구성된다.

switch(n)
{
case 1:
	...
case 2:
	...
...
case n:
	...
default:
}

n은 switch문으로 전달되는 인자로 정수형 변수여야 한다. 전달되는 n 값에 따라 실행할 영역이 결정된다. n의 값이 2면 case 2의 영역을 실행하게 된다. n의 값에 일치하는 case 영역이 없을 경우 default 영역을 실행한다.

 

#include <stdio.h>

int main(void)
{
    int num;
    printf("Input 1~3 number : ");
    scanf("%d", &num);

    switch (num)
    {
    case 1:
        printf("input 1\n");
        break;
    case 2:
        printf("input 2\n");
        break;
    case 3:
        printf("imput 3\n");
        break;
    default:
        printf("I don't know! \n");
    }
    return 0;
}

switch문에서 위 코드와 같이 break문을 사용하면 조건을 만족할 경우 해당 영역을 실행 후 switch문을 탈출한다. break문을 사용하지 않는다면 조건에 맞는 영역과 그 아래 영역까지 모두 실행한다. 예를 들어 num 값이 2라면 case 2, 3, default 영역까지 모두 실행되는 것이다.

'Language > C, C++' 카테고리의 다른 글

[C] 함수(function)  (0) 2020.12.08
[C] goto  (0) 2020.12.08
[C] continue  (0) 2020.12.05
[C] break  (0) 2020.12.05
[C] 조건 연산자(삼항 연산자)  (0) 2020.12.05

continue 키워드는 반복문 안에 들어가며 cotinue 문장을 실행하게 되면 이 문장의 위치와 상관 없이 반복문의 조건 검사 위치로 이동한다. 

#include <stdio.h>

int main(void)
{
    for(int i = 0; i < 10; i++)
    {
        printf("%d\n",i);
        continue;
        printf("continue test\n");
    }
}

위 코드같은 경우 continue가 실행되면 반복 조건 검사 위치로 다시 돌아가기 때문에 continue test 라는 문자열은 한번도 출력되지 않는다. 

'Language > C, C++' 카테고리의 다른 글

[C] goto  (0) 2020.12.08
[C] switch  (0) 2020.12.08
[C] break  (0) 2020.12.05
[C] 조건 연산자(삼항 연산자)  (0) 2020.12.05
[C] 조건적 실행  (0) 2020.12.05

break는 반복문을 빠져 나올때 사용하는 키워드이다. 

다음 코드의 경우 무한 루프를 하는 반복문이지만 조건문에 break가 있기 때문에 조건을 만족시킨다면 반복문을 빠져 나올 수 있다. 1+2+3+...+n의 결과가 최초로 5000을 넘길때 n의 값을 구하는 코드이다. 

#include <stdio.h>

int main(void)
{
    int sum=0, num=0;
    
    while (1)
    {
        sum += num;
        if(sum > 5000)
            break;
        num++;
    }

    printf("sum = %d\nnum = %d\n", sum,num);
    return 0;
}

'Language > C, C++' 카테고리의 다른 글

[C] switch  (0) 2020.12.08
[C] continue  (0) 2020.12.05
[C] 조건 연산자(삼항 연산자)  (0) 2020.12.05
[C] 조건적 실행  (0) 2020.12.05
[C] for  (0) 2020.11.29

이 연산자는 if~else문을 일부 대체할 수 있고, 피 연산자가 3개이기 때문에 삼항 연산자 라고도 불린다. 조건 연산자는 다음과 같이 구성된다. 

(num1>num2) ? (num1) : (num2);

위 코드에서 조건이 참이면 num1 을 반환하고 거짓이면 num2를 반환한다. 대입연산자보다 조건연산자의 우선순위가 높기 때문에 다음과 같이 활용할 수 있다.

int num3 = (num1>num2) ? num1 : num2;

 

다음은 조건연산자를 활용하여 입력한 정수의 절댓값을 출력하는 예시이다.

#include <stdio.h>

int main(void)
{
    int num, abs;
    printf("input num : ");
    scanf("%d", &num);

    abs = num>0 ? num : num*(-1);
    printf("result : %d\n", abs);
    return 0;
}

'Language > C, C++' 카테고리의 다른 글

[C] continue  (0) 2020.12.05
[C] break  (0) 2020.12.05
[C] 조건적 실행  (0) 2020.12.05
[C] for  (0) 2020.11.29
[C] do~while  (0) 2020.11.28

C에서 if 라는 키워드는 조건적 실행(조건에 따라서 실행을 하느냐 마느냐)를 가능하게 한다. if문은 조건이 만족하면 if문 아래의 문장이 실행되고, 조건이 만족하지 않으면 실행하지 않는다. if문의 영향을 받는 문장은 중괄호로 감싸고 한 줄이라면 들여쓰기로 구분할 수 있다.

다음 코드는 입력받은 숫자에 따라 0보다 큰지, 작은지, 0인지 판단하는 코드이다.

#include <stdio.h>

int main(void){
    int num;
    printf("input number : ");
    scanf("%d", &num);

    if(num<0)
        printf("number is smaller than 0. \n");
    
    if(num>0)
        printf("number is bigger than 0. \n");

    if(num == 0)
        printf("number is 0. \n");

    return 0;
}

 

else 라는 키워드는 독립적으로는 사용할 수 없고, if와 함께 사용해야 한다. if절의 조건이 참이면 if 블록이 실행되고, 거짓이면 else 블록이 실행되는 구조이다. 다음 코드는 입력한 값이 0이면 0이라고 출력하고 다른 값이면 0이 아니라고 출력하는 코드이다.

#include <stdio.h>

int main(void)
{
    int num;
    printf("input number : ");
    scanf("%d", &num);

    if(num==0)
    {
        printf("number is 0\n");
    }
    else
    {
        printf("number is not 0\n");
    }

    return 0;
}

 

위 코드의 경우에는 두 개의 블록중 하나를 선택하여 실행하는 코드였다. else if 라는 키워드를 사용하면 3개이상의 블록중 하나의 블록을 선택하여 실행하도록 할 수 있다. 처음에는 if 절로 끝나고 마지막은 else 절로 끝난다. if절과 else절 사이에는 else if 절을 몇개든지 추가할 수 있다. 조건의 만족 여부 검사는 위에서 아래로 진행되고 조건이 만족되어 해당 블록을 실행하고 나면 마지막 else까지 아래의 블록들은 전부 건너 뛴다.

#include <stdio.h>

int main(void)
{
    int num = 3;
    
    if(num < 0)
    {
        printf("num is smaller than 0\n");
    }
    else if (num > 0)
    {
        printf("num is bigger than 0\n");
    }
    else if(num==3)
    {
        printf("num is 3\n");
    }
    else
    {
        printf("num is 0\n");
    }

    return 0;
}

위 코드의 경우 조건에 만족하는 첫번째 else if절을 실행하고, 다음 코드들은 전부 실행하지 않는다. 두번째 else if 절도 조건을 만족하지만 이미 위 조건을 만족했기 때문에 실행하지 않는다.

'Language > C, C++' 카테고리의 다른 글

[C] break  (0) 2020.12.05
[C] 조건 연산자(삼항 연산자)  (0) 2020.12.05
[C] for  (0) 2020.11.29
[C] do~while  (0) 2020.11.28
[C] while  (0) 2020.11.27

반복문의 반복횟수를 판단하려면 while문의 경우 반복을 위한 변수와 반복 조건, 반복 조건을 거짓으로 만들기 위한 연산 등 최소 3문장을 파악해야 한다. 이 세 가지 요소를 한 데 묶어 반복 횟수의 판단이 쉬운 반복문이 for 문이다. 

반복문의 필수 요소 3가지는 반복을 위한 변수의 선언 및 초기화에 사용되는 초기식, 반복의 조건을 검사하는 목적으로 사용되는 조건식, 반복의 조건을 거짓으로 반드는 증가 및 감소 연산인 증감식이 있다. 그리고 for문을 사용하면 다음과 같은 형식이 된다.

for(초기식; 조건식; 증감식)
{
	// 반복할 코드
}

 

#include <stdio.h>

int main(void)
{
    int total = 0;
    int num;

    printf("0 to num add, What is num? ");
    scanf("%d", &num);

    for(int i = 0; i <= num; i++)
        total += i;
    
    printf("0 to %d add : %d\n", num, total);
    return 0;
}
/* output : 
0 to num add, What is num? 10
0 to 10 add : 55
*/

위 예제 코드는 0부터 입력한 값까지의 총 합을 더한 결과를 출력하는 코드이다.  원래는 for(int i = 0; 과 같이 for문 안에 초기식 변수를 선언하면 컴파일이 안됐으나 요즘은 for문 안에 변수 선언을 지원하는 컴파일러들이 많다. 

 

아래 코드와 같이 for문 중간의 조건식이 비워지면 무조건 참으로 인식하여 무한 루프가 형성된다.

for( ; ; )
{
}

 

for문도 while문과 do~while문과 마찬가지로 중첩 사용이 가능하다.

'Language > C, C++' 카테고리의 다른 글

[C] 조건 연산자(삼항 연산자)  (0) 2020.12.05
[C] 조건적 실행  (0) 2020.12.05
[C] do~while  (0) 2020.11.28
[C] while  (0) 2020.11.27
[C] 자료형 변환  (0) 2020.11.27

do~while문은 while문과 달리 반복 조건을 뒷부분에서 검사한다. 이 때문에 do~while문은 반복 영역을 최소한 한 번은 실행한다.

 

#include <stdio.h>

int main(void)
{
    int total = 0, num = 0;

    do
    {
        printf("input int(0 to quit) : ");
        scanf("%d", &num);
        total += num;
    } while (num != 0);
    printf("Total : %d\n", total);
    return 0;
}

위 코드는 반복해서 사용자 숫자입력을 받고, 입력받은 숫자가 0 이면 입력받은 숫자들의 합을 출력하는 코드이다. 위  코드와 같이 반복 영역을 최소한 한 번은 무조건 실행해야 하는 경우에는 do~while문을 사용하는 것이 적절하다. 

'Language > C, C++' 카테고리의 다른 글

[C] 조건적 실행  (0) 2020.12.05
[C] for  (0) 2020.11.29
[C] while  (0) 2020.11.27
[C] 자료형 변환  (0) 2020.11.27
[C] const  (0) 2020.11.25

프로그래밍을 할 때 반복적인 행위를 하는 코드의 양을 줄이고, 효율적으로 명령하기 위해서 반복문을 이용한다.

C에서는 크게 다음과 같이 3개의 반목문을 제공하고 있다. while문, do~while문, for문

 

whule문은 특정 조건을 주고 그 조건을 만족하는 동안 특정 영역을 계속 반복하는 구조이다.

#include <stdio.h>

int main(void){
    int num = 0;

    while (num<5)
    {
        printf("hello world %d \n", num);
        num ++;
    }
    return 0;    
}

위 코드를 보면 변수 num의 크기가 5보다 작을 때 까지 while 밑의 중괄호 안의 코드를 계속 반복 수행하도록 하는 코드이다. 만약 위 코드에서 num ++; 라는 코드가 없다면 반복의 조건이 무너지지 않아서 반복이 멈추지 않는 무한 루프 현상이 발생한다. 반복문의 구성에 있어서 중요한 것 중 하나는 반복의 조건을 무너뜨리기 위한 최소한의 연산이다.

 

반복의 대상이 다음과 같이 하나의 문장이라면 중괄호는 생략하고 들여쓰기 만으로 표현할 수 있다.

while(num<5)
	printf("hello world %d\n", num++);

 

while문에 처음 진입하면 반복의 조건인 비교 연산을 진행하고 참일 경우 반복 영역을 실행후 다시 반복 조건 검사하는 곳으로 돌아온다. 조건이 성립하지 않을 경우(비교 연산 진행 결과 거짓일 경우) 반복문을 종료한다.

 

while문은 조건이 거짓이 되면 반복문을 종료한다. 다음과 같이 조건을 항상 참으로 만들어주면 의도적으로 무한루프 반복문을 만들 수있다.

while(1)
{
	int num = 0;
	printf("%d\n", num);
    num ++
}

1은 참을 의미하는 대표적인 숫자이므로 반복문의 조건은 항상 참이 된다.

 

while문은 while문 안에 여러번 중첩하여 사용할 수 있다.

'Language > C, C++' 카테고리의 다른 글

[C] for  (0) 2020.11.29
[C] do~while  (0) 2020.11.28
[C] 자료형 변환  (0) 2020.11.27
[C] const  (0) 2020.11.25
[C] 문자 표현  (0) 2020.11.25

+ Recent posts