이번에는 저번 글 http://widevery.tistory.com/7 에 이어서 while문의 루프와 중첩에 대하여 알아 보겠습니다.





1. 무한루프


while문에서 while(조건식) 과 같이 조건식이 '참'인 경우 while문의 내용을 실행하고, 조건식이 '거짓'일 경우 while문을 종료하게 됩니다.


그렇다면 조건식이 '항상 참'인 경우에는 어떻게 될까? 라는 생각을 가져 볼 수 있습니다. 이와 같은 생각으로 다음과 같이 해볼 수 있습니다.



0을 제외한 나머지 값은 참으로 인식하니까 참으로 인식하는 값 중 대표적으로 많이 쓰이는 1을 조건식에 넣어서 실행 해볼까? 라는 생각을 가지고 실행하게 되면 위의 예제에서처럼 따로 멈춰주지 않는 이상 계속 실행을 하게 됩니다. ( Ctrl + C를 누르면 멈추게 됩니다.)


이렇듯 반복문의 탈출조건이 성립하지 않는 경우 무한루프를 형성한다고 합니다.


이러한 무한루프는 실수로 만들어지는 경우도 있지만, 의도적으로 만들어서 break문과 함께 사용하기도 합니다.

(break문은 추후 조건에 따른 흐름의 분기와 관련하여 내용을 다루면서 그 때 다시 다루도록 하겠습니다.)





2. while문의 중첩


while문의 중첩은 말 그대로 반복을 위해 사용한 while문 안에 while문이 존재하는 경우를 의미합니다.


다음 예제는 while문을 중첩시켜서 구구단 2~9단 까지 출력을 하는 예제인데, 해당 예제를 통해서 중첩된 while문의 코드 흐름을 이해하도록 하겠습니다.



위의 예제를 보시면 코드를 실행한 결과로 오른쪽에 구구단이 출력이 된 것과 해당 코드가 구구단을 출력하기 위한 코드라는 것을 확인 할 수 있습니다.


짧고 간단한 코드이지만 while문의 중첩을 모르는 상태에서 보게 될 경우 복잡해 보일 수가 있습니다.


우선 위 예제의 코드에서 다음과 같은 내용을 알 수 있습니다.


1) while문의 중첩

2) 원하는 결과의 출력을 위한 변수 초기화

3) while문의 조건 설정


이와 같은 내용들을 확인 할 수 있습니다.


먼저 while문에서 while(조건식) 의 '조건식'이 만족할 때까지 while문 내부에 있는 문장을 실행하는 것을 저번 글에서 알아 보았습니다.


그렇다면 while문의 내부에 while문이 있다면 while문 안쪽의 while문이 끝날 때까지 처음 작성한 while문은 계속 실행이 된다는 것을 알 수 있습니다.


이와 같은 내용을 바탕으로 위의 코드를 해석하면 첫 번째 while문의 조건이 i = 2 일 때 내부의 while문을 9번 실행하고, i가 하나씩 증가 되는 것을 알 수 있습니다.


i 값이 하나씩 증가하여 i 의 값이 9일 때까지 실행이 되고, i 가 10이 되면 while문을 실행하지 않고, while문을 종료 후 그 다음 문장을 실행하게 됩니다.


또한 위의 코드에서 첫 번 째 while문이 끝날 때까지 내부의 while문을 실행해야 되는데 9번째 줄에서 j = 1; 로 초기화를 시켜주는 이유는 초기화를 하지 않고 진행하게 될 경우 구구단을 정상적으로 출력하지 않게 됩니다.


초기화를 진행 해 주지 않으면 j의 값이 계속 10으로 지정 되어 있기 때문에 다음과 같이 실행 결과가 나오게 됩니다.



[구구단 출력 예제에서 곱해지는 값인 j 값의 초기화를 하지 않았을 경우]




또한 while문을 사용하지 않고 예제에 사용된 구구단 출력을 할 수도 있습니다.



[while문의 중첩을 활용하지 않고 출력을 한 경우]



위와 같이 효율이 떨어지게 됩니다.


따라서 반복문의 중첩을 자주 사용하게 됩니다.










이것으로 반복문 중 하나인 while문에 대하여 모두 알아 보았습니다.


다음 글에서는 반복문 중 하나인 'do~while문에 의한 문장의 반복'에 대하여 공부하고 글을 올리도록 하겠습니다.












'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - for문 (1)  (0) 2017.01.12
C언어 반복문 - do~while문  (0) 2017.01.09
C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 printf 함수 와 scanf 함수  (0) 2017.01.01
C언어 상수와 기본 자료형  (0) 2016.12.27

이번에는 C언어에서 반복 실행을 위해 사용이 되는 반복문 중 하나인 while문에 대하여 알아보도록 하겠습니다.




1. 반복문


반복문 : 하나 이상의 문장을 두 번 이상 반복 실행하기 위해서 구성하는 문장입니다.


반복문의 종류는 'while', 'do~while', 'for' 문이 있습니다.


우선 반복이 필요한 이유에 대해서 다음의 예제를 보도록 하겠습니다.



위 예제에서 확인 할 수 있듯이 반복해서 할 수 있는 작업을 하나씩 전부 작업 해 준다면 효율이 떨어지게 됩니다.

(예제에서는 10개의 문장으로 예를 들었지만 100개, 1000개 등 그 이상을 하게 될 경우 효율이 굉장히 나빠지게 됩니다.)


이렇듯 반복을 해야 할 경우 쉽게 해주는 것이 반복문입니다.





2. while문의 사용


이번 글에서는 반복문 중 하나인 'while문'에 대하여 알아 보도록 하겠습니다.


while이라는 단어를 검색해 보면 '~하는 동안' 이라고 되어 있습니다.


프로그래밍에서도 마찬가지로 while문은 '~하는 동안 반복해라' 라는 것을 의미합니다.


while문을 사용해 보도록 하겠습니다.


while문 사용은 다음의 예제를 통해 먼저 알아보고 진행하도록 하겠습니다.



위 예제와 위쪽 글의 주제에 사용 되었던 예제 사진과 비교를 해 본 결과 반복문을 사용할 경우 훨씬 효율적인 것을 알 수 있습니다.


반복문 중 하나인 while문을 사용하기 위해서 다음과 같은 사실들을 알 수 있습니다.


1) 반복을 하기 위한 조건 설정 ( 5번째 줄의 int num = 1;  /  7번째 줄의 while 다음에 있는 (num < 11)  /  10번 째 줄의 num++; )


2) 반복을 하기 원하는 문장 ( 9번째 줄의 printf 문장 )


실행 순서는 다음과 같습니다.


(1) 10번 반복 하고 싶으니까 10번 반복을 위해 count 해 줄 값인 1을 num 이라는 변수에 저장

(2) while문을 선언하고 10번 반복을 위해 num이라는 변수에 저장 되어 있는 값이 11 보다 작을 때까지 라는 조건 설정

(3) 반복을 실행할 문장 작성

(4) num이라는 변수에 저장 되어 있는 값을 1 증가 (이 때 num++ 문장으로 인하여 num 값은 2가 됩니다.)

    (또한 아직 num에 있는 값이 while문의 조건 (num < 11) 을 만족하기 때문에 return 0; 문장을 실행하지 않고 다시 while문을 실행하게 됩니다.

(5) (3) ~ (4) 를 계속 반복 하면서 num 값이 11이 되어서 다시 while문의 조건(num < 11)으로 가서 해당 조건이 만족하지 않을 경우 while문을 빠져나오게 됩니다.

(6) return 0; 실행 (프로그램 종료)


이렇듯 반복을 원하는 문장과 반복 하기 위한 조건을 설정을 하게 되면 해당 반복조건이 만족하지 않을 때까지 while문이 실행이 되고, 반복조건이 만족하지 않으면 while문을 종료하고 다음 문장을 실행하게 됩니다.





3. while문의 들여쓰기


들여쓰기와 관련하여 다음의 예제를 보고 진행하도록 하겠습니다.



[들여쓰기 하지 않았을 경우]




[들여쓰기를 한 경우]



위의 두 사진에서 알 수 있듯이 들여쓰기를 해도 되고, 하지 않아도 상관은 없습니다.


단지 들여쓰기를 하게 되면 가독성이 훨씬 좋아지기 때문에 보편적으로 들여쓰기를 해서 프로그램을 작성합니다.


들여쓰기의 기준은 보통 띄어쓰기(Space) 4회 또는 Tab을 사용합니다.


들여쓰기를 하실 때 띄어쓰기(Space)와 Tab을 혼용해서 사용하시는 것보다 하나로 통일해서 일관성 있게 하는 것이 좋습니다.

(실제로 저는 처음에 프로그래밍을 할 때 띄어쓰기(Space)와 Tab을 혼용해서 사용 했었는데 작성한 소스를 수정할 때 굉장히 불편함을 겪은 적이 있습니다.)





4. 반복문의 중괄호 { } 생략


int main(void) 함수에서도 중괄호 { } 를 사용하였는데 while문에서도 사용하니까 불편하다 라고 하실 수도 있습니다.


이와 관련하여 생략을 할 수 있는 경우가 있습니다.


실행할 문장이 한 줄이거나, 한줄로 표현이 가능한 경우 입니다.



위의 예제처럼 한 줄로 표현이 가능한 경우 중괄호 { } 를 생략할 수 있습니다.

(중괄호를 사용하지 않기 위해 일부러 한줄로 다 표현하는 경우 가독성이 굉장히 떨어지게 됩니다. 그러한 방법은 사용하지 않는 것을 권장합니다.)


또한 하나의 문장이어도 중괄호 { } 를 포함 할 수 있습니다.



위의 예제처럼 하나의 문장이지만 중괄호 { } 를 생략하지 않아도 아무런 이상이 없이 정상적으로 작동하는 것을 알 수 있습니다.







이것으로 반복문 중 하나인 while문의 첫 번째 Part에 관한 내용이 끝났습니다.


다음 글에서는 while문의 무한루프와 while문의 중첩에 대하여 공부하고 글을 올리도록 하겠습니다.











'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - do~while문  (0) 2017.01.09
C언어 반복문 - while문(2)  (0) 2017.01.02
C언어 printf 함수 와 scanf 함수  (0) 2017.01.01
C언어 상수와 기본 자료형  (0) 2016.12.27
C언어 데이터 표현방식  (0) 2016.12.25

이번에는 printf 함수와 scanf 함수에서 사용하는 서식문자에 대해서 알아 보도록 하겠습니다.





1.  특수문자 출력


printf 함수는 문자열을 출력하는 함수입니다.


문자열을 출력할 때 큰 따옴표(" ")로 묶인 문자열을 전달하고, printf 함수를 실행(호출)하면 전달된 문자열이 모니터상에 출력이 됩니다.



위 사진과 같이 큰 따옴표(" ")로 묶인 문자열이 출력 되는 것을 확인 할 수 있습니다.


이 때 이러한 생각이 들 수 있습니다.


철수가 말했습니다. "안녕 나는 철수라고 해." 라는 문장을 출력하고 싶은데 어떻게 어떻게 해야 되지? 라고 생각을 가질 수가 있습니다.


그래서 다음과 같이 문장을 작성 하시는 경우가 생길 수 있습니다.



일반적으로 사람이 볼 때는 "철수가 말했습니다. "안녕 나는 철수라고 해."" 라고 문장을 작성하게 되면 "안녕 나는 철수라고 해." 부분이 철수가 말하는 내용으로 출력이 되서 결과가 나와야 된다고 쉽게 생각을 할 수 있습니다.


하지만 컴퓨터는 처음 시작하는 큰 따옴표(" ")와 해당 큰 따옴표(" ")와 짝이 맞는 큰 따옴표(" ")를 찾아서 하나의 문장으로 인식 하기 때문에 에러가 위와 같은 경우가 발생하게 됩니다.


이러한 경우 다음과 같은 방법으로 해결할 수 있습니다.



이와 같이 큰 따옴표(" ")와 같은 문자를 직접 출력하고 싶을 경우 해당 따옴표 앞에 역슬래시(\)를 입력해주면 해당 문자가 직접 출력이 됩니다.


이렇듯 위의 예제에서 사용된 역슬래시(\)와 같은 문자를 특수문자라 합니다.



다음은 특수문자의 종류와 각 특수문자가 의미하는 내용을 나타낸 표입니다.


 특수문자

의미하는 바 

  \a 

  경고음 

  \b 

  백스페이스(backspace) 

  \f 

  폼 피드(form feed) 

  \n 

  개 행(new line) 

  \r 

  캐리지 리턴(carriage return) 

  \t 

  수평 탭 

  \v 

  수직 탭 

  \' 

  작은 따옴표 출력 

  \" 

  큰 따옴표 출력 

  \? 

  물음표 출력 

  \\ 

  역슬래시 출력 



이 때 \f와 \v는 모니터 출력이 아닌 '프린터 출력'을 위해 정의된 특수문자이기 때문에 모니터의 출력에 사용하게되면, 이상한 문자가 출력 됩니다.





2. printf 함수의 서식지정과 서식문자들


%d %X와 같은 서식문자를 이용해서 출력할 문자열의 형태를 직접 지정할 수 있습니다.



위의 예제에서 보시는 것과 같이 myAge라는 변수에 저장 되더 있는 정수 12를 서식문자인 %d(10진수 형태로 출력), %X(16진수 형태로 출력)를 사용해 출력 형태를 직접 지정하여 출력한 결과 지정한 형태대로 출력이 되는 것을 확인 할 수 있습니다.


다음은 서식문자의 종류와 그 의미를 나타내는 표입니다.


서식문자 

출력 대상(자료형) 

출력 형태 

  %d 

  char, short, int 

  부호 있는 10진수 정수 

  %ld 

  long 

  부호 있는 10진수 정수 

  %lld 

  long long 

  부호 있는 10진수 정수 

  %u 

  unsigned int 

  부호 없는 10진수 정수 

  %o 

  unsigned int 

  부호 없는 8진수 정수 

  %x, %X 

  unsigned int 

  부호 없는 16진수 정수 

  %f 

  float, double 

  10진수 방식의 부동소수점 실수 

  %Lf 

  long double 

  10진수 방식의 부동소수점 실수 

  %e, %E 

  float, double 

  e 또는 E 방식의 부동소수점 실수 

  %g, %G 

  float, double 

  값에 따라 %f와 %e 사이에서 선택 

  %c 

  char, short, int 

  값에 대응하는 문자 

  %s 

  char * 

  문자열 

  %p 

  void * 

  포인터의 주소 값 


* 위의 표에서 %s와 %p에 대해서는 추후 포인터와 배열을 다루면서 추가적으로 설명하도록 하겠습니다.



* 정수의 출력을 위한 서식문자들 중 %x, %o의 경우 출력한 결과 문자인지 숫자인지 헷갈리는 경우가 발생합니다. 이 때 사용해주느 것이 #을 사용하는 것인데 이와 관련해서 다음의 예제를 보고 추가 설명을 하도록 하겠습니다.



위의 예제에서 서식문자를 활용하여 num1과 num2에 저장되어 있는 정수인 7, 13을 각각 8진수와 16진수로 출력을 한 결과입니다.


이 때 8진수와 16진수로 출력을 했어도 단순하게 생각하고 보면 '7은 10진수 7이구나, d는 문자 d 이구나' 라고 생각을 할 수도 있게 됩니다.


그래서 사용해주는 것이 %와 출력형태인 o, x 사이에 #을 넣어주는 것입니다.


#을 넣어주게 될 경우 위와 같이 7 앞에 8진수를 나타내는 0이 붙어서 출력이 되고, d 앞에 16진수를 나타내는 0x가 붙어서 출력이 되는 것을 확인 할 수 있습니다.




3. 실수의 출력을 위한 서식문자들 : %f, %e


실수의 출력은 %f를 주로 사용하지만 '지수'를 사용한 실수를 출력할 때에 어떻게 출력해야 되는지 생각을 하게 됩니다.


이와 관련하여 컴퓨터는 지수를 표현할 수 없으므로 e 표기법으로 지수를 대신 표현하게 됩니다.


10의 n승을 기준으로 나타내게 되는데, 이 때 10을 e로 표현하고 지수인 n을 e뒤에 붙여서 출력하게 됩니다.


다음의 예제를 통해 알아보도록 하겠습니다.



위의 예제와 같이 %f의 사용 결과와 %e의 사용 결과를 알 수가 있었습니다. %e의 사용에 관한 내용은 다음 주제에서 추가적으로 다루도록 하겠습니다.




4. %g의 실수출력


서식문자 %g의 실수출력과 관련해서 다음의 예제를 먼저 보고 진행하도록 하겠습니다.



%g의 실수출력과 관련해서 위의 예제의 결과를 통해 알 수 있는 것은 서식문자 %g는 %f와 %e 표기 중 적절한 것을 사용해서 출력한다는 것입니다.


%g를 사용한 결과 d1과 d2의 경우 소수점 이하 자릿수가 너무 많지 않고 충분히 알 수 있을 정도의 자릿수여서 0.00123, 0.000123 그대로 출력이 되는 반면, d3와 d4의 경우 소숫점 이하 자릿수가 많아져서 읽을 때 불편함이 발생하게 됩니다. 


따라서 컴퓨터는 %g를 사용한 결과 d3와 d4는 %e를 사용해서 e 표기법으로 출력을 한 것을 확인 할 수 있습니다.




5. scanf 함수


1) scaf 함수에서 정수 기반의 입력형태를 정의하기


데이터를 입력 할 때 scanf 함수에세 전달해야 하는 두 가지 정보는 다음과 같습니다.


- 입력의 형식

- 입력 장소


이 두 가지 정보를 바탕으로 scanf 함수에게 데이터를 전달해야 합니다.


다음의 예제를 보도록 하겠습니다.



위의 예제에서 scanf 전달되어지는 데이터에 대해서 알 수 있습니다.


%d(10진수 정수) 형태, %o(8진수 정수) 형태, %x(16진수 정수) 형태로 데이터를 입력 받습니다.


* printf와 달리 저장 되어 지는 곳을 정해 줄 때 printf 함수 처럼 그냥 변수로 사용하면 될텐데 왜 변수 앞에 &를 붙이지? 라는 생각을 가지실 수 있는데 이와 관련해서는 포인터와 배열을 다루면서 추가적으로 설명하도록 하겠습니다.




6. 실수 기반의 입력형태 정의


printf 함수에서는 서식문자 %f, %e 그리고 %g의 의미가 각각 달랐습니다.


하지만 scanf 함수에서는 'float형 데이터를 입력 받겠다' 라는 말은 동일한 의미를 담고 있습니다.


scanf 에서의 %f %e %g는 float형 데이터의 삽입을 위한 서식문자 일 뿐입니다.


다음의 예제를 보고 진행하도록 하겠습니다.



printf 함수에서는 double형과 float형 모두 %f를 사용했습니다.


하지만 scanf 함수에서는 입력되는 자료형을 정확히 구분 해 줄 필요가 있습니다.(printf 함수의 경우 이미 저장되어 있거나 지정한 값들을 출력하는 것이기 때문에 상관이 없지만 scanf 함수의 경우 입력을 하는 것이기 때문에 정확하게 구분 해 줄 필요가 있습니다.)


다음은 scanf 함수에서 사용되어지는 서식문자를 나타낸 표입니다.


서식 문자

입력 받는 자료형

  %f 

  float 형  

  %lf 

  double 형

  %Lf 

  long double 형 


위의 표와 같이 정확하게 구분을 해줘야 합니다.


또한 double 형과 long double 형의 입력에 있어서 사용되는 서식 문자인 %lf 와 %Lf의 L의 대,소문자 또한 확실히 구분을 해주셔야 합니다.





printf 함수와 scanf 함수에 대해서 간단히 알아 보았습니다.


다음에는 반복실행을 명령하는 반복문에 대하여 공부하고 글을 올리도록 하겠습니다.








'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - while문(2)  (0) 2017.01.02
C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 상수와 기본 자료형  (0) 2016.12.27
C언어 데이터 표현방식  (0) 2016.12.25
C언어 변수와 연산자  (0) 2016.12.24

+ Recent posts