C언어_기타 제어문에 대해 알아보자 (break,continue,goto,return)

 

기타제어문 ?

프로그램의 흐름과 처리 순서 등을 조절하는 제어문들을 말한다.

기타 제어문의 종류로는 break,continue,goto,return이 있으며

break와 continue는 반복문에서 주로 사용하고, goto와 return은 프로그램의 실행 순서에 관여할때 주로 사용된다.

 

먼저, 반복문에서 주로 사용되는 break와 continue에 대해 알아보도록 하자.

 

1) break

break는 반복문에서 주로 사용되는데 '실행중인 코드를 빠져나가는 역할'을 한다.

do~while문을 보며 반복문을 빠져나가는 상황으로는 조건식의 결과가 거짓이 되거나 ctrl+c를 누를때였다.

이때 논리적으로 빠져나가는 것이 있는데, 바로 break문을 사용하여 빠져나가는 것이다.

반복문 안에서 break문을 만나게되면 무조건 반복문을 빠져나온다.

그 과정을 예제로 확인해보자.

 

 

위 코드는 1부터 100까지의 합 중 최초로 1000이 넘는 위치를 구하는 for문을 이용한 반복문이다.

여기서, if(hap>=1000) break;를 사용하여 hap의 값이 1000보다 크거나 같을 시 break문을 만나 루프를 빠져나오게 된다.

 

 

실행결과

 

2) continue

반복문 실행 도중 continue를 만나면 다시 처음으로 돌아가서 처음부터 반복문을 수행하게 된다.

3의 배수를 제외한 숫자를 더하는 프로그램을 작성하며 설명하도록 하겠다.

 

위 소스코드를 보면, 변수 hap엔 0, i는 1을 선언해주었다.

for문은 1부터 100까지 증가하며 실행될것이다.

안에 있는 if(i%3==0)은 i의 값을 3으로 나눌 시 나머지가 0, 즉 3의 배수를 뜻한다.

이 if문의 조건에 충족하는 값을 만날시 continue로 넘어가 다시 for문을 실행하게 된다.

거짓일 시엔 if continue를 실행하지 않고 그 밑에 있는 hap=hap+i;를 실행하며 프로그램이 계속 돌아가게 될 것이다.

 

실행결과

if(i%3==0) continue;를 이용해 3의 배수를 제외한 hap의 값을 구할 수 있었다.

 

 

3) goto

goto함수를 이용할 때 레이블을 지정해야합니다.

goto 레이블; 을 지정하면 지정한 레이블로 바로 넘어가게 됩니다.

goto는

 

goto 레이블;

레이블 이름:

 

이러한 방식으로 사용하게 됩니다.

예를 들어

goto mygoto;

mygoto: printf("hello!")

이런 식으로 goto함수를 사용할 수 있습니다.

 

원하는 값을 구하고 멈추고 출력할 때 주로 사용됩니다만 프로그램의 흐름을 복잡하게 만들기 때문에 코드가 길어질 경우 버그를 초래할 수 있기 때문에 사용을 권장하지는 않고 있습니다..

goto 함수를 이용해 1~100까지의 합계를 구하는 도중 누적된 계산값이 2000이 넘으면 오류 메세지를 출력하고 프로그램을 종료시키는 프로그램을 작성해보겠습니다.

 

 

 

소스코드에 대해 설명해드리겠습니다.

hap의 초기화값을 0으로 설정했고, 변수 i는 1으로 설정하였습니다.

for과 if에 대한 설명은 앞에 나온 포스팅에 해드렸으니 참고해서 봐주시면 감사하겠습니다.

만약 hap의 값이 2000을 넘으면, 바로 다음에 작성한 goto함수로 넘어가게 됩니다.

만약 hap의 값이 2000을 넘게 되면 for문을 빠져나와 설정해둔 mygoto라는 레이블으로 바로 넘어가게 됩니다.

따라서 mygoto에 설정한 printf를 실행하게 됩니다.

 

실행 결과

 

 

 

4) return

return에 대해서는 간단하게 알아보겠습니다.

return함수는 현재 함수를 호출한 곳으로 돌아가게 하는 함수입니다.

 

 

보통 main함수에서의 return은 프로그램을 종료한다는 의미로 사용됩니다.

return EXIT_SUCCESS; = return 0;

return EXIT_FAUSE; = return 1;

같은말입니다.

보통 성공적으로 프로그램이 종료되면 return 0을 사용하고,

비정상적으로 프로그램이 종료될때 return 1이 사용된다고 생각하면 쉽습니다.

 

일단 여기서 저희가 알아볼것은, 중간에 return값이 있으면 어떻게되는지를 알아볼겁니다.

 

 

 

 

 

보통은 return함수를 맨 밑에 써주지만, return함수의 활용도를 알아보기 위해 중간에 놓아보았습니다.

만약 return 0이 이 소스코드의 맨 밑에 위치한다면 실행결과창에는 1부터 1000까지 합은 5050입니다. 프로그램의 끝입니다. 가 출력될것입니다.

하지만 위 소스코드에서 return 0은 printf("1부터 1000까지의 합은 %d입니다. \n",hap);에 위치하고 있습니다.

이 프로그램을 실행하게 되면 printf("프로그램의 끝입니다.");를 실행하지 않고, return 0값이 있는 곳에서 함수를 호출한 곳으로 돌아가게 되고 소스코드는 종료됩니다.

그러므로 "프로그램의 끝입니다."는 출력되지 않습니다.

 

 

실행결과

 

 

 

 

 

break : 결과가 참일 시 프로그램을 멈추는 역할을 함.

continue : 결과가 참일 시 프로그램을 멈추는 역할을 함.

goto : 레이블을 설정하여 goto함수를 사용하면 지정한 레이블으로 바로 넘어가며 지정된 레이블에 있는 값을 실행시킴

return : 현재 함수를 호출한 곳으로 돌아감.

for?

C언어에서 흔히 쓰이는 반복문의 한 종류입니다.

do~while문도 있지만 전 for을 더 많이 사용하는거같아요 아직까지는

그럼 for이 어떤 방식으로 돌아가는지 알아볼게요

 

단순for문

 

 

반복할 문장이 하나뿐이라면 중괄호를 생략해도 됩니다.

써놨듯 초깃값이 제일 먼저 실행되고 그 다음에 조건식이 실행되며 반복할 문장을 출력한 후 증감이 이루어집니다

예를들어드릴게요

 

Q. for문을 사용하여 1부터 5까지의 숫자를 출력

 

제일 기본이 되는 for문의 사용법인데용

위 소스코드에 대해 설명해드릴게요

 

보시면 변수 i를 먼저 선언해주었고요

i의 초깃값을 for문 안에서 지정해줬습니다

그래서 i=1이라고 했으니까 처음 시작하는 i값은 1이 되겠네요

그 다음에 i<=5를 실행하는데 i는 5보다 작거나 같다니까 조건에 만족하므로 다음 실행 순서로 넘어갑니다

다음 실행 순서인 printf함수를 통해 1이 출력되고, 그 다음에 증감식인 i++로 넘어가서 i=2가 됩니다.

이런식으로 반복하는게 for문입니다.

그럼 조금 더 복잡한 중첩for문으로 넘어가볼게요

 

 

제가제일헷갈려한부분이 이부분입니다

일단 말로 설명을 드리자면

 

겉에 있는 for문을 먼저 돌릴겁니다

i=0을 첫번째로 실행합니다. 그럼 i는 0부터 시작하져?

그 다음에 조건식을 실행합니다.

위에서는 i<반복횟수라고 적혀져있는데 그 조건에 충족되면 밑에있는 for문으로 넘어가게 됩니다.

그리고 밑에있는 for문을 이제부터 실행할건데요

단순 for문 돌리듯 실행하면 됩니다.

먼저 k=0을 실행한 후 k<반복횟수가 충족되면 반복할 문장을 실행하고 k++를 실행하면 됩니다.

그렇게 밑에있는 for문을 계속 돌립니다.

그리고 밑에있는 조건이 모두 충족되면 겉에 있는 for문의 증감식으로 넘어가게됩니다.

그리고 또 똑같이 돌려주면 됩니다..

 

 

중첩 for문의 대표적인 예시는 별찍기입니다.

이 부분을 지금부터 살펴보도록 하겠습니다

 

Q. 별찍기를 이용하여 삼각형 출력 (왼쪽정렬)

*

**

***

****

*****

이 모양이 나오도록 별을 찍으려면 어떤 소스코드를 이용해야할까요?

 

 

먼저 변수 i와 j를 선언해줍니다.

그리고 중첩 for문을 사용하여 별을 표현할건데요

겉에 있는 for은 줄을 건너뛰는 용도로 사용할거고

속에 있는 for은 별을 표현하는 용도로 사용될것입니다.

 

 

먼저 겉에있는 for문을 통해 5줄을 출력할것입니다.

또한 안에 있는 for문을 이용해 *을 출력할것입니다.

이 소스코드대로 한다면,

j=0;j<=i;j++

j가 0부터 시작되고, 0<=0이 충족되기때문에 첫번째 *을 출력한 뒤 j++를 받아 j=1이 됨.

그럼 j=1;1<=0의 조건에 충족되지 않기 때문에 겉에 있는 for문으로 넘어가게 됨.

그럼 \n를 출력한 뒤 i++로 넘어가서 i=1이 됨.

1<5의 조건이 충족되기때문에 다음 for문 실행

위와 같은 방법으로 계속 실행됩니다.

 

실행결과

그럼 이런 실행결과가 나옵니다

 

 

 

Q. 삼각형 출력 (가운데정렬)

tip. for문 3개를 사용.

공백문자 9개, 별 1개로 시작한다.

 

 

아시겠나요?

잘 풀었다면 이런 형태의 삼각형이 나올겁니다

 

저는 이 방법을 조금 더 응용하여 높이를 입력받아보겠습니당

 

 

Q. 높이를 입력받아 삼각형 출력 (가운데정렬)

 

 

소스코드

 

값을 입력받을 변수 line을 선언하여 scanf를 이용해 line에 값을 입력받았습니다.

높이를 입력받지 않는 경우, 만약 열=10의 별을 출력한다고 가정했을때, line의 값에 10만 넣어주면 됩니다.

겉에 있는 for문을 이용해 몇 줄을 출력할 것인지 정했습니다.

안에 있는 for문을 이용해 무슨 내용을 어떻게 출력할 것인지 정했습니다.

line을 5라고 가정했을 때, 제일 첫번째 줄의 띄어쓰기는 5개가 됩니다.

그리고 밑에 있는 k의 값을 가지고있는 for문에서는 k=0부터 시작해 하나하나 별을 늘려갑니다

두번째 for문에서 k<=j*2를 안해주면 삼각형이 반쪽만 나옵니다.

 

실행결과

 

 

 

do~while

for문과 마찬가지로 사용 빈도가 높은 반복문입니다.

for문과 비슷하지만 사용 방법이 약간 다릅니다

 

for문은 (초깃값;조건식;증감식) 이었다면

 

while문은

조건이 참인 동안 그냥 계속 반복한다고 생각하면 된다.

그렇다면, for문에서는 초깃값과 증감식을 설정해줬는데 while에서는 어떻게 설정해주어야할까요?

정답은 "다른 위치에 넣어서 사용해줘야한다" 입니다.

그럼 어디에 넣어서 사용해줘야할까요?

 

for문이 (초깃값;조건식;증감식) 이었다면

 

while은

 

초깃값

while(조건식)

{

반복할 문장;

증감식;

}

 

이렇게 사용해줍니다.

while(1)은 무한루프를 만들어줍니다.

코드를 작성하기 전, while(1)을 이용해 모든 코드를 감싸주면 그 코드가 무한반복되어 돌아가게됩니다.

예시로, 무한루프를 활용한 계산기가 있습니다.

 

 

이렇게 while(1)으로 겉을 감싸주고 그 안에 소스코드를 짜준 뒤 실행하게되면

 

 

이렇게 스스로 멈추지 않는 이상 프로그램이 꺼지지 않고 계속 돌아가게 됩니다.

 

이제 do~while에 대해 알아보겠습니다.

do~while문은 while문과 거의 동일하지만, 조건식이 아랫쪽에 달린다는 점이 다릅니다.

while문의 경우에는 처음의 조건식이 거짓일 때 '반복할 문장들'을 한 번도 수행하지 않지만 do~while문에서는 조건식을 확인하기 전에 일단 '반복할 문장들'을 수행하므로 조건식이 참이든 거짓이든 무조건 한 번은 수행됩니다.

그렇다면 do~while을 어떤 방식으로 사용할 수 있을까요?

 

 

위 소스코드는 카페에서 주문하는 과정을 do~while문으로 나타낸것입니다.

일단 손님이 들어오면 적어도 한 번 이상의 주문 여부를 확인해야하기 때문에 do while을 사용하였습니다.

여기서 1,2,3번을 선택하면 주문을 반복하게됩니다.

4번을 선택하면 주문이 끝나게됩니다.

이런 방식의 프로그램을 만들 때 do while문이 사용됩니다.

 

실행결과

 

 

 

for문과 while문은 C언어에서 자주 사용하는 반복문이니 자주 사용해보고, 코딩하며 익혀가는것을 추천드립니다.

우리는 C언어를 통해 무언가를 만들어내고자 할것이다.

어떤 값을 출력하고, 입력받아 프로그램을 만들어낼것이다.

그렇다면 출력하고 입력받는 방법에 대해 먼저 알아보도록 하자.

 

 

* printf("출력할내용");

 

먼저 dos창에 내가 표현하고자 하는 글을 직접 출력해내려면 printf를 사용하여야 한다.

예를들어 dos창에 "Hello!"를 출력하고 싶다면 어떤 식으로 작성해야할까?

 

 

 

그냥 단순하게 printf("Hello!\n"); 만 적어주면 출력할 값이 완성된다.

이제 ctrl+f5버튼을 눌러 빌드를 실행시켜보자.

 

<실행시>

이렇게 Hello!라는 글자가 적혀 출력된다.

 

하지만 printf함수만을 이용해 출력하게되면 직접 값을 입력받아 작성하는데에는 무리가 있다.

그러나 scanf_s함수를 이용하면 값을 입력받아 출력시키는 프로그램을 만들 수 있다.

 

scanf_s와 printf함수를 이용해 값을 입력받아 자신의 나이를 나타내보자.

 

 

먼저, scanf_s함수를 쓰는 방법은 scanf_s("%d",&a); 이다.

기본적으로 %d를 많이 사용하지만 %o %x %c %s %f(=%lf) 를 상황에따라 바꿔가며 사용해준다.

이는 입력받는 값을 어떤 형태로 만들어 출력할것인지 결정해주는 것이다.

또한 두번째에 들어가는 &a를 꼭 써줘야한다. 이는 어떤 변수의 값을 입력받을지 설정하는 단계이다.

&를 써주지 않으면, a라는게 int a를 말하는건지 그냥 문자 a를 말하는건지 인식을 못해준다.

따라서 scanf_s함수를 사용할땐 무조건 &를 써주도록 하자.

//는 주석을 말한다. 주석을 통해 설명하도록 하겠다.

 

 

이렇게 소스코드르 짠 뒤 실행시켜보자.

 

<실행시>

먼저 나이를 입력하라는 문자열이 먼저 나오고, 프로그램 실행자가 나이를 입력하고 엔터를 누르면 내 나이가 몇살인지 알 수 있도록 출력된다.

위 소스코드와 딱 맞게 출력된게 보일것이다.

printf함수를 이용해 "나이를 입력하세요 : "라는 글자를 출력하였고

scanf_s함수를 이용해 20살이라는것을 입력받을 수 있었다.

입력받은 후엔 printf함수를 이용해 입력받은 값을 출력할 수 있었다.

사용은 항상 이런식으로 해주면 된다.

 

 

다음으로 볼 함수는 if~else문이다.

 

if문은 보통 이렇게 사용된다

 

if(조건식)

{

printf("조건이 참일시 출력할내용");

}

else

printf("조건이 거짓일시 출력할 내용");

 

 

if문이 흘러가는 방식은 이렇습니다

조건식1이 참일시 조건식2로 넘어가요

만약 맨 처음에 있는 조건식이 거짓이라면 바로 맨 끝에있는 else로 넘어가게됩니다.

참이면 다음 조건으로 넘어가구요.

 

 

 

예시를 들어 설명해보겠습니다

Q. 성적이 90점 이상일시 A, 80점 이상일시 B, 70점 이상 C, 60점 이상 D, 그 외 F (if~else 사용)

 

#include <stdio.h>

int main()
{
 int a;

 printf("점수를 입력하세요. : ");
 scanf_s("%d", &a);

 if (a >= 90)
  printf("A");
 else
  if (a >= 80)
   printf("B");
  else
   if (a >= 70)
    printf("C");
   else
    if (a >= 60)
     printf("D");
    else
     printf("F");

 printf("학점 입니다.\n");

 system("PAUSE");
 return 0;
}

 

90점 이상이면 A를 출력합니다.

만약 아닐 경우, 80점 이상인지 검토한 후 80점 이상이면 B를 출력합니다.

만약 아닐 경우, 70점 이상인지 검토한 후 70점 이상이면 C를 출력합니다.

만약 아닐 경우, 60점 이상인지 검토한 후 60점 이상이면 D를 출력합니다.

만약 아닐 경우 F를 출력합니다.

 

<실행결과>

 

그럼이걸 if말고 swich를 사용하면 어떻게 될까요?

실제로 python에서는 switch문이 아예 없는 대신 switch문으로 만들 수 있는 소스코드를 if로 대체해서 사용합니다.

switch함수를 이용해서도 if문에서 나온 결과값과 같은 값을 낼 수 있습니다

먼저 switch~case의 형식과 순서도부터 보겠습니다.

보통 이렇게 형성되어 있는데

형식에서 break;는 참일시 거기서 멈추는 역할을 하는 함수입니다.

 

방금 들었던 똑같은 예시를 들어 설명해보겠습니다

Q. 성적이 90점 이상일시 A, 80점 이상일시 B, 70점 이상 C, 60점 이상 D, 그 외 F (switch~case 사용)

 

switch의 정숫값에 a/10을 넣음으로서

100을 입력받으면 100/10=10

99를 입력받으면 99/10=9 (9.9이지만 소숫점은 버려준다. int a을 사용하였기 때문에.)

85를 입력받으면 85/10=8 (8.5=8)

의 값이 된다.

따라서 입력받은 값에 대한 case값을 찾아가면 자신의 학점을 구할 수 있다.

 

실행결과

이렇게 나온다고 보면 된다.

 

 

printf는 출력할때 쓰는 함수.

scanf_s는 값을 직접 입력받을때 쓰는 함수.

if는 조건에 대한 값을 구할때 쓰며

switch는 자주 사용하지 않지만 가끔 쓰인다~ 정도만 알아두면 될 것 같다.

 
* Visual stdio 2017 또는 2015를 사용

* 참고도서 :

C언어 for Beginner (우재남/한빛아카데미)

그림으로 배우는 Easy C언어 (Mana Takahashi/영진닷컴)

 

 

프로그래밍 언어란?

컴퓨터에서 작동하는 소프트웨어를 만들기 위한 도구이다.

이 프로그래밍 언어 중에서 가장 대표적인 언어가 바로 지금 우리가 배우고자 하는 C언어이다.

 

 

C언어의 특징

1) 이식성이 좋다

2) 하드웨어와 관련된 부분까지 접근할 수 있다.

3) 구문이 간결하고 명확하다

4) C를 익히면 다른 프로그래밍 언어도 쉽게 익힐 수 있다.

 

 

 

C프로그램 작성 방법

C언어는 프로그램을 코딩한 후 컴파일과 링크 과정을 거쳐 생성된 실행 파일을 구동한다.

 

프로그램 코딩 ▶ 빌드(컴파일/링크) ▶ 파일 실행

 

프로그램 코딩 : 소스 프로그램을 코딩하고 확장자를 *.c로 한다.

컴파일 : 작성된 *.c를 기계어로 변환한다.

링크 : 관련 파일을 하나로 결합한다. 그 결과로 실행 파일을 생성한다.

파일 실행 : 생성된 *.exe 파일을 실행한다.

 

여기서 빌드컴파일 링크를 한꺼번에 처리는 과정을 말한다.

 

 

 

C언어에 쓰이는 함수

printf : 괄호 안의 내용을 모니터에 출력

scanf_s : 키보드로 값을 입력받음. 변수에 값을 입력받으려면 반드시 &기호를 사용해야 한다.

strcpy : 문자열을 대입할때(복사할때) 쓰임

sizeof : 피연산자의 크기를 바이트의 단위로 계산해서 반환하는 연산자

if : 조건식이 참이면 실행할 문장을 실행, 조건식이 거짓이면 실행하지 않음. (또는 else실행)

swich~case : swich의 조건 값에 따라 case문을 실행한다.

for : 조건이 참일때까지 문장을 반복한다.

while : 조건이 참일때까지 문장을 반복한다.

break : 반복문을 종료할때 사용

countinue : 블록의 남은 부분을 건너뛰고 반복문의 처음으로 돌아간다.

goto : 지정된 레이블으로 건너뛴다.

return : 현재 실행하고 있는 함수를 끝내고, 함수를 호출한 곳으로 돌아가게 하는 제어문

strlen : 문자열의 길이를 알려주는 함수

strcpy_s : 문자열을 복사하는 함수

strcat_s : 두 문자열을 이어주는 함수

strcmp : 두 문자열을 비교하는 함수

gets_s : 문자열을 입력받는 함수

puts : 문자열을 출력하는 함수

getch : 키보드를 통해 문자 하나를 입력받음. 입력한 내용은 화면에 보여지지 않음.

getche : 키보드를 통해 문자 하나를 입력받음. 입력한 내용은 화면에 보여짐.

getchar : 사용자가 키보드로 enter를 누를 때까지 입력한 것을 메모리(버퍼)에 모두 저장해놓고 그 중에서 한문자만 꺼낸다. (enter도 저장됨)

putchar : 표준출력장치에 문자 하나를 출력한다.

putch : =putchar

fopen_s : 파일 열기

fclose : 파일 닫기

fgets : 파일의 문자열 읽기

fscanf_s : 서식을 지정하여 파일 읽기

fputs : 파일의 문자열 출력

fprintf : 서식을 지정하여 파일 출력

malloc : 동적 메모리 확보

realloc : 이미 할당한 메모리 크기 변경

calloc : 메모리를 할당하면서 초기화할때 사용

free : 동적으로 할당한 메모리의 사용이 모두 끝나면 사용한 공간을 해제해야하는데 이때 사용하는 함수가 free이다.

 

 

 

 

자료형

int : 정수형 변수 선언 (4byte)

float : 실수형 변수 선언 (4byte)

double : 큰 실수형 변수 선언 (8byte)
char : 문자형 또는 정수형 (1byte)

 

 

서식

%d : 정수(10진수)

%x : 정수(16진수)

%o : 정수(8진수)

%f 또는 lf : 실수(소숫점이 붙은 수)

%c : 문자(꼭 한글자여야 하고, ' '로 둘러싸야 한다)

%s : 문자열(한 글자 이상이며, " "로 둘러싸야 한다)

%e : 공학계산용 형식

%p : 포인터 주소

 

 

서식 문자

\n : 새로운 줄로 이동한다

\t : 다음 탭으로 이동한다.

\b : 뒤로 한 칸 이동한다.

\r : 줄의 맨 앞으로 이동한다.

\a : 삑 소리를 낸다.

\\ : \를 출력한다.

\' : '를 출력한다.

\" : "를 출력한다.

 

 

산술 연산자

=

대입 연산자 

더하기 

빼기 

곱하기 

나누기 

나머지값 

 

 

 

관계 연산자

== 

같다 

!= 

같지 않다 

>  

크다 

<  

작다 

>= 

크거나 같다 

<= 

작거나 같다 

 

 

논리 연산자

&& 

AND (그리고) 

둘 다 참이어야 참이다. 

|| 

OR (또는) 

둘 중 하나만 참이어도 참이다. 

NOT (부정) 

참이면 거짓, 거짓이면 참이다. 

 

 

비트 연산자

비트 논리곱 (AND) 

비트 논리합 (OR) 

비트 배타적 논리합 (XOR) 

비트 부정 

<< 

비트 왼쪽 시프트(이동) 

>> 

비트 오른쪽 시프트(이동) 

 

+ Recent posts