4.1.1 조건문을 사용한 예제 1     [doc]    [smts]

여기에서는 if 문을 사용한 예제를 풀어보도록 하겠다.


1. 세 개의 float 형 숫자를 사용자에게 입력 받아서 가장 큰 수를 출력하는 프로그램을 작성하라.


세 float형 변수를  f1, f2, f3 라고 하고 가장 큰 수를 저장하는 변수를 fMax 라고 하 하자. 간단한 알고리듬을 다음과 같이 생각해 볼 수 있다.


(a) f1과 f2 중 큰 것을 fMax에 저장한다.

(b) f3이 fMax보다 크다면 fMax 값을 f3 값으로 갱신한다.

(c) fMax를 화면에 출력한다.


이것을 그대로 프로그램으로 구현하면 다음과 같다.


ex04-06.c
#include  <stdio.h>
int main() {
float f1, f2, f3;
printf("Input three numbers : ");
scanf("%f,%f,%f",&f1, &f2, &f3);
float fMax = (f1>f2)? f1:f2; //(a)를 구현
if (f3 > fMax) //(b)를 구현
fMax = f3;
printf("The maximum value is %f.", fMax);//(c)를 구현
}

실행 예는 다음과 같다.


Input three numbers : 11,22.5,-10
The maximum value is 22.500000.

이 프로그램을 조금만 바꾸면 최소값을 구하는 프로그램으로 변경할 수 있다.


Posted by 살레시오
,

 여기에서는 입력 장치로 많이 사용되는 푸시 버튼을 객체화 시키는 예제를 작성해 보도록 하겠다. 푸시버튼도 디지털 핀에 연결할 수 있으며 외부에서 풀업(pull-up)을 시켜주느냐 아니면 내부 풀업을 연결하느냐를 지정할 수 있도록 하겠다. Led 클래스와 마찬가지로 연결된 핀 번호는 private 변수에 저장한다. 그리고 내부에 풀업이 되었는지의 여부를 저장하는 변수도 private변수에 저장한다.


 클래스의 선언을 다음과 같다.

class Button {
public:
   Button(byte, boolean); // 생성자
   boolean isPushed(); // 버튼이 눌렸다면 true를 반환하는 멤버 함수
private:
   byte _pin; // 연결된 핀
   boolean _internalPullup; //내부에 풀업이 되었는가
};

생성자를 보면 입력 인수의 타입만 지정해 주었음을 알 수 있다. 생성자와 멤버 함수의 구현부는 다음과 같다.

// 생성자의 구현
Button::Button(byte pin, boolean internalPullUp = true) {
   _pin = pin;
   _internalPullup = internalPullUp;
   if (_internalPullup)
       pinMode(_pin, INPUT_PULLUP);
   else
       pinMode(_pin, INPUT);
}
// 멤버 함수의 구현
boolean Button::isPushed() {
   return (digitalRead(_pin) == LOW)? true:false;
}

생성자의 구현을 보면 다음과 같이 기본값 인자가 사용되었다.


Button::Button(byte pin, boolean internalPullUp = true) {...}

이렇게 구현해 놓으면 생성자는 인자를 하나를 받을 수도 있고 두 개를 받을 수도 있는데 하나만 있다면 두 번째는 자동으로 true로 지정된다. 즉, 다음과 같이 두 가지로 생성하는 것이 가능하다.

Button btn1(12); // 내부 풀업 저항을 연결하는 경우
Button btn2(11, false); // 외부에서 풀업 된 경우

두 번째 인자의 값에 따라서 pinMode()함수를 적절하게 호출하였음을 알 수 있다.


 풀업 저항이 연결되었을 경우 푸시버튼을 누른 상태에서 digitalRead()함수의 반환값은 LOW가 된다. 따라서 이에 맞게 멤버 함수 isPushed() 가 작성되었음을 알 수 있다.

 만약 클래스 선언이 Button.h에, 구현부가 Button.cpp 에 저장되어 라이브러리를 구성했다면, 이것을 이용하여 버튼이 눌리면 내장 LED가 켜지고 그렇지 않으면 꺼지는 프로그램을 다음과 같이 작성할 수 있다.

#include <Button.h> // 라이브러리 인클루드
Button btn1(12); //12번 핀에 내부 풀업 연결
void setup() {
   pinMode(13, OUTPUT);
}
void loop() {
   if (btn1.isPushed()) // 만약 버튼이 눌렸다면
       digitalWrite(13, HIGH);
   else // 그렇지 않다면 (눌리지 않았다면)
       digitalWrite(13, LOW);
}

 

이와 같이 class를 이용하여 객체화를 시도하면 프로그램을 좀 더 직관적으로 작성할 수 있다.




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

C++ 의 구조체(struct)  (0) 2015.06.12
C++ 인라인(inline) 멤버 함수  (0) 2015.06.12
C/C++ 함수 예제  (0) 2015.06.09
C/C++ 배열의 예제 및 풀이 #2  (0) 2015.06.08
C/C++ 배열 예제 및 풀이 #1  (0) 2015.06.08
Posted by 살레시오
,

7장 연습문제

pb07-01 자신의 영문 이름과 나이를 출력하는 함수 showMe() 함수를 작성하라. 그리고 이 함수를 100번 연속으로 호출하는 코드를 작성하라.



pb07-02 정수를 받아서 그 정수가 짝수이면 “even number”, 홀수이면 “odd number” 라고 화면에 출력하는 함수를 작성하라. 이 함수의 선언은 다음과 같다.

void isEven(int ia);


pb07-03 구의 반지름을 입력받아서 구체의 부피를 반환하는 함수를 작성하라. 함수의 선언을 다음과 같다.(V = 4πr3/3)

double calcVolumn(double dr);


pb07-04 unsigned char형 정수를 받아서 1부터 그 수까지의 합을 반환하는 함수를 작성하라. 함수의 선언은 다음과 같다.

long sumup(unsigned char uc);


pb07-05 세 개의 int형 정수를 받아서 그중 가장 큰 수를 반환하는 함수를 작성하라. 함수의 선언은 다음과 같다.

int getMax(int ia, int ib, int ic);


pb07-06 (a) char형 문자를 하나 받아서 그 문자가 소문자이면 1, 그 외의 문자이면 0을 반환하는 함수를 작성하라. 함수의 선언은 다음과 같다.

int isLower(char ca);


(b) 작성된 함수를 이용하여 주어진 문자열이 모두 소문자일 경우 “bingo” 라고 화면에 표시하는 프로그램을 작성하라.


pb07-07 (a) unsigned long형 인자를 두 개 받아서 그 두 수의 최대 공약수를 반환하는 함수를 작성하라. 반환값은 long형이다. 함수의 선언부는 다음과 같다.


long getGCD(unsigned long la, unsigned long lb);

(b) 최소 공배수를 구하는 함수 getLCM() 함수를 작성하라.


Posted by 살레시오
,

5.3 배열의 예제 및 풀이 #2     [doc]     [smts]

다음과 같은 배열 예제를 작성해 보자.


  1. int형 배열에 0부터 255까지의 정수를 순서대로 저장한다.

  2. 모든 배열의 요소와 각각의 16진수 값을 출력한다.


먼저 크기가 256인 정수형 배열을 선언한다.


int ia[256];


이 경우 선언과 동시에 초기화를 할 수도 있겠지만 초기화할 요소의 숫자가 많으므로 반복문을 이용하여 수행한다.


for (int k=0; k<256; k++) {
ia[k] = k;
}

이것에 의해서 0번 요소는 0, 1번 요소는 1, …, 255번 요소는 255로 초기화된다. 이제 각각의 요소를 출력하기 위해서 다시 for 반복문을 사용한다.


for(int k=0; k<256; k++) {
printf("ia[%d] = %d : %x\n", k, ia[k], ia[k]);
}

printf()함수의 %x 서식문자는 정수형 숫자 데이터를 16진수로 출력하는 것이다.


전체 프로그램은 다음과 같다.


#include  <stdio.h>
int main(void)
{
int ia[256];
for(int k=0; k<256; k++) {
ia[k] = k;
}
for(int k=0; k<256; k++) {
printf("ia[%d] = %d : %x\n", k, ia[k], ia[k]);
}
}

실행 예:

ia[0] = 0 : 0
ia[1] = 1 : 1
ia[2] = 2 : 2

… 중간 생략…

ia[252] = 252 : fc
ia[253] = 253 : fd
ia[254] = 254 : fe
ia[255] = 255 : ff

이 예제와 같이 많은 수의 배열 요소를 초기화할 때에는 반복문이 사용되기도 한다.


Posted by 살레시오
,

5.2 배열의 예제및 풀이 #1     [doc]     [smts]

다음과 같은 예제를 배열을 이용하여 풀어 보자.


  1. 배열에 사용자가 입력한 다섯 개의 float 형 데이터를 저장한 후 그것을 화면에 출력하라.

  2. 입력 받은 숫자들 중 가장 큰 최대값을 화면에 출력하라.


먼저 다섯 걔의 float형 값을 갖는 배열을 선언해야 한다.


float fa[5];

그 다음 사용자로부터 입력 받은 수를 저장하는 반복문을 작성해야 한다.


float fi;
for(int k=0; k<5; k++) {
scanf("%f", &fi);
fa[k]=fi;
}

이 반복문에서 정수형 변수 k는 0,1,2,3,4 값에 대해서 반복을 수행하며 입력된 실수를 배열 fa에 저장하게 된다.


이제 다 입력 받은 데이터를 화면에 출력하는 것도 반복문을 사용하면 된다.


for(int k=0; k<5; k++) {
printf("fa[%d] : %f\n", k, fa[k]);
}

여기서 printf() 함수의 첫 번째 %d에는 인덱스가, %f 자리에는 배열의 k번째 요소가 출력이 된다.


전체 프로그램은 다음과 같다.


#include  <stdio.h>
int main(void)
{
float fa[5];
float fi;
for(int k=0; k<5; k++) {
scanf("%f", &fi);
fa[k]=fi;
}

for(int k=0; k<5; k++) {
printf("fa[%d] : %f\n", k, fa[k]);
}
}

실행 예:

11
-22
1.5
4.7
-123.456
fa[0] : 11.000000
fa[1] : -22.000000
fa[2] : 1.500000
fa[3] : 4.700000
fa[4] : -123.456001

이제 사용자가 입력한 숫자들 중 최대값을 찾는 알고리듬을 다음과 같이 고안해 보자. 최대값을 저장할 변수를 fmax로 선언한다.


float fmax;


그리고 사용자가 처음 입력한 숫자를 fmax의 값으로 대입한 후 그 이후에는 새로 입력된 숫자가 이전에 저장된 fmax 값보다 클 경우 fmax 값을 갱신한다. 다섯 개의 숫자에 대해서 이 작업을 수행하면 마지막에 fmax 변수에는 가장 큰 값이 남아 있게 된다.


for(int k=0; k<5; k++) {
scanf("%f", &fi);
fa[k]=fi;
if (k==0) { // 첫 번째 데이터가 입력된 경우
fmax = fi;
} else {  // 두 번째 데이터 이후
if (fi > fmax)
fmax = fi;
}
}
}

위에서 보면 if ~ else 제어문으로 첫 번째 데이터와 그 이후의 데이터를 구분했으며 k변수가 0이면 첫 데이터라고 판단한다. 반복문이 종료되면 fmax 변수에는 최대값이 저장되어 있으므로 그것을 출력하면 된다.


printf("The maximum value is %f.", fmax);

전체 프로그램은 다음과 같다.


#include  <stdio.h>
int main(void)
{
float fa[5];
float fi;
float fmax;
for(int k=0; k<5; k++) {
scanf("%f", &fi);
fa[k]=fi;
if (k==0) {
fmax = fi;
} else {
if (fi > fmax)
fmax = fi;
}
}
printf("The maximum value is %f.", fmax);
}

실행 예:

11
-22
1.5
4.7
-123.456
The maximum value is 11.000000.

이 프로그램을 조금만 고치면 최소값을 출력하도록 할 수 있다. 직접 수정해서 결과를 확인해 보기 바란다.


Posted by 살레시오
,

시리얼 통신 두 번째 예제

 두 번째 예제로 이번에는 PC에서 문자 하나를 받아서 그것이 ‘0’이면 LED를 끄고 ‘1’이면 LED를 켜는 프로그램을 작성해 보자. 이 경우 아두이노는 데이터가 사용자로부터 들어올 때 까지 대기 상태로 있다가 데이터가 읽히면 거기에 맞는 동작을 수행해야 한다.


#define LED 13
void setup() {
 pinMode(LED, OUTPUT);
 Serial.begin(9600);
}
void loop() {
 if ( Serial.available() ) {
   char command = Serial.read();
   if (command == '0') {
     digitalWrite(LED, LOW);
     Serial.println("LED off.");
   }
   else if (command == '1') {
     digitalWrite(LED, HIGH);
     Serial.println("LED on.");
   }
     else {
     Serial.print("Wrong command :");
     Serial.println(command);
     }
 }
}


이 예제에서는 다음과 같은 함수들이 사용되었다.


   int Serial.available() 함수

  • 전송되어 내부버퍼(64바이트)에 저장된 데이터의 개수를 반환한다.

  • 입력인수는 없다.


   int Serial.read() 함수

  • 전송되어 내부 버퍼(64바이트)에 저장된 데이터 중 가장 첫 번째 데이터(ASCII코드)를 읽어서 반환한다.

  • 이 함수가 수행되면 내부 버퍼의 크기는 하나가 줄어든다.

  • 내부 버퍼가 비었다면 -1을 반환하다.


   int Serial.println() 함수

  • 출력 문자열의 끝에 줄바꿈 기호 ‘\r\n’ 가 자동으로 붙는다는 점 외에는 Serial.print()함수와 동일한 동작을 수행한다.


이 예제에서는 USRT 통신기의 내부 버퍼의 개념을 이해할 필요가 있다. 내부 버퍼란 전송된 데이터가 일시적으로 저장되는 내부 메모리를 말하며 데이터가 전송된 순서대로 저장된다. 아두이노의 내부 버퍼의 크기는 64바이트이다. 전송되어 저장된 데이터를 사용하려면 내부 버퍼에서 이 데이터를 읽어내야 하는데 이때 사용되는 함수가 Serial.read()함수이다. 가장 먼저 전송된 데이터 하나를 읽어낸 후 그 데이터는 버퍼에서 삭제되며, 만약 버퍼가 비었다면 -1을 반환한다. 따라서 버퍼에 읽어낼 데이터가 있는지 없는지를 먼저 검사하는 것이 일반적이고 이때 사용되는 함수가 Serial.available()이다. 이 함수는 버퍼에 저장된 데이터의 개수를 반환하며 따라서 버퍼가 비어있다면 0을 반환한다.


 이런 사항들을 이해하였다면 두 번째 예제를 이해하는데 어려움이 없을 것이다. 데이터가 전송되어 오면 그것을 읽어들여서 ‘1’이면 LED를 켜고, ‘0’이면 끈다. 그 이외의 데이터에 대해서는 잘못된 명령이라는 문자열을 출력한다.


시리얼 통신 세 번째 예제

 세 번째로 11번 핀에 부저가 연결되었다고 가정하고 명령어를 하나 받아서 다음과 같은 동작을 수행하는 예제를 작성해 보도록 하겠다.


       - ‘0’ : LED를 끈다.

       - ‘1’ : LED를 켠다.

       - ‘2’ : 부저를 짧게 한 번 울린다. (삑)

       - ‘3’ : 부저를 짧게 두 번 울린다.(삐삑)

       - 그 외의 명령어들은 잘못된 것이라는 메세지를 출력한다.


이 예제의 경우는 처리해야 될 경우의 수가 많기 때문에 if-else 명령보다는 switch-case 명령이 더 효율적이다.


#define LED 13
#define BUZ 11

void setup() {
 pinMode(LED, OUTPUT);
 pinMode(BUZ, OUTPUT);
 Serial.begin(9600);
}

void loop() {
 if ( Serial.available() ) {
   char command = Serial.read();
   switch(command) {
     case '0':
       digitalWrite(LED, LOW);
       Serial.println("LED off.");
       break;
   case '1' :
     digitalWrite(LED, HIGH);
     Serial.println("LED on.");
     break;
   case '2' :
     digitalWrite(BUZ, HIGH);
     delay(50);
     digitalWrite(BUZ, LOW);
     break;
   case '3' :
     digitalWrite(BUZ, HIGH);
     delay(50);
     digitalWrite(BUZ, LOW);
     delay(50);
     digitalWrite(BUZ, HIGH);
     delay(50);
     digitalWrite(BUZ, LOW);
     break;
   default:
     Serial.print("Wrong command :");
     Serial.println(command);
   }
 }
}


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad013}

Posted by 살레시오
,

 비트 xor 연산자(^)는 두 피연산자의 같은 위치의 비트끼리 xor 연산을 수행한다. 두 비트의 xor 연산은 두 비트가 서로 다른 경우에는 1, 같은 경우는 0이다. 그 진리표는 다음 표와 같다.


[표 1] 비트 xor 연산

x

y

x⊗y

0

0

0

0

1

1

1

0

1

1

1

0


두 비트의 연산은 이해하기 쉬우나 세 개 이상의 비트들에 대해서 xor 연산을 수행하면 결과가 어떻게 될지 예측하기는 쉽지 않다. 다음 표에 세 비트의 xor 결과를 기록하였다.


[표 2] 세 비트의  xor 연산

x

y

z

x⊗y⊗z

0

0

0

0

0

0

1

1

0

1

0

1

0

1

1

0

1

0

0

1

1

0

1

0

1

1

0

0

1

1

1

1


일반적으로 n개 비트들의 xor 결과는 1의 개수가 홀수 개이면 1, 짝수 개이면 0이다. 위의 두 표에서도 이 규칙이 적용되므로 확인해 보기 바란다.


 다음 예제로 xor 연산 결과를 살펴보자.


unsigned char ucX = 0x3a, ucY = 0xb2, uCZ ;
ucZ = ucX ^ ucY;


이제 변수 ucZ에 저장되는 값은 다음과 같이 계산된다.





b7

b6

b5

b4

b3

b2

b1

b0



ucX

=

0

0

1

1

1

0

1

0

(0x3a)

^

ucY

=

1

0

1

1

0

0

1

0

(0xb2)


ucZ

=

1

0

0

0

1

0

0

0

(0x88)


 이 bit-xor 연산을 이용하면 원하는 비트를 반전시키는데(toggle) 응용할 수 있다. 만약 어떤 데이터에서 상위 4비트는 그대로 유지하고 하위 4비트만을 반전시키고자 하면 다음과 같이 한다.


unsigned char uca = 0xba;
uca ^= 0x0f;





b7

b6

b5

b4

b3

b2

b1

b0



uca

=

1

0

1

1

1

0

1

0

(0xba)

^

0x0f

=

0

0

0

0

1

1

1

1

(0x0f)


uca

=

1

0

1

1

0

1

0

1

(0xb5)


위의 예에서 보면 0x0f(=0b00001111)과 xor연산을 취하면 하위 4비트만 반전됨을 알 수 있다. 상위 4비트는 원래 값을 유지한다. 그 결과로 uca변수에는 0xb5가 남는다.


C++ 강좌 전체 목록 >>>


c{c++},n{c0052}

Posted by 살레시오
,

3.5 논리 연산자    [doc]    [smts]

 논리 연산자는 다수의 조건식을 논리식으로 연결하는 연산자이이다. C 언어의 논리 연산자는 다음과 같은 것들이 있다.


[표 3.5.1] 논리 연산자.

논리연산자

의미

사용 예

&&

AND

i>80 && i<90

||

OR

i>10 || i<20

!

NOT

!(i<10)


논리 연산자에서 NOT의 의미인 ‘!’ 연산자는 관계 연산자의 ‘같지 않다’인 ‘!=’와 비슷하다. 그래서 초보자들은 가끔 혼동하는 경우가 있으니 주의해야 한다.


 예를 들어 정수형 변수 ‘ia가 0보다 크고 10보다 작다’ 라는 논리식은 다음과 같이 ‘0보다 크다’와 ‘10보다 작다’ 라는 논리식을 and로 묶어야 한다.


0 < ia  && ia < 10

세 개 이상의 조건문도 논리 연산자로 묶을 수 있다. ‘문자형 변수 ca가 ‘a’ 이거나 ‘b’ 혹은 ‘c’이다’라는 논리식을 다음과 같이 or로 묶어야 한다.


ca == ‘a’ || ca == ‘b’ || ca == ’c’

다음 논리식은 ! 연산자를 이용한 예이다.


!(ia>0) // ia<=0과 같다.
!(ca == ‘a’ || ca == ‘b’) // (ca != ‘a’ && ca != ‘b’) 과 같다.

 논리 연산자는 관계 연산자와 마찬가지로 내부적으로 참(true), 거짓(false)의 값을 가진다. &&는 양쪽 조건식이 모두 참일 때 전체 조건식이 참이 되며 ||는 양쪽 조건식 중 하나 이상이 참일 때 전체 조건식이 참이 된다. !은 참은 거짓으로, 거짓은 참으로 논리값을 바꿔준다.


 실습으로 어떤 short형 변수 값이 양의 짝수인지를 판별하고 어떤 실수형 변수가 1보다 크거나 –1보다 작은지를 검사하는 프로그램을 작성해보자.


ex03-07.c
#include <stdio.h>
int main(void) {
   short sA = 10;
   float fX = 2.0f;
   if ( sA>0 && sA%2 == 0 )
       printf("sA is a positive even number.\n");
   if ( fX<-1 || fX>1 )
       printf("|fA|<1.\n");
}

이것을 실행하면 첫 번째 printf()문만 수행될 것이다.



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

C/C++의 증감연산자(++, --)  (0) 2015.05.19
C/C++의 조건 연산자(?:)  (0) 2015.05.19
3.4 관계 연산자  (0) 2015.05.19
3.2 산술 연산자와 부호 연산자  (0) 2015.05.19
3.3 형변환  (0) 2015.05.19
Posted by 살레시오
,

4.5 do~while 반복문     [doc]     [smts]

반복문에 사용되는 do~while 의 문법은 다음과 같다.


do {
  실행문;
  ...
} while(조건문);

while문과 차이점은 do{...} 안의 실행문이 처음에 한 번은 무조건 실행된다는 것이다. 그 이후 while 뒤의 조건문을 체크하여 참이면 do{...} 블럭을 다시 수행하고 거짓이면 그대로 반복을 종료한다.  초보자가 주의할 점은 while()문 뒤의 세미콜론을 빠뜨리기 쉽다는 것이다.


 다음이 do-while문의 예인데 1부터 100까지의 합을 구하는 것으로서 결과는 앞의 예제들과 같다.


0405-01.c
int ia=1, isum=0;
do {
  isum += ia;
} while(ia++ < 100);

while 뒤의 조건문을 잘 파악하면 ia가 1부터 정확히 100까지 do 블럭을 반복한다는 것을 알 수 있다.


다른 예를 들어보자.


0405-02.c
#include <stdio.h>
int main() {
  int ia;
  printf(“Input a positive integer : “);
  do {
      scanf(“%d”, &ia)
  } while(ia<=0);
}

이 예는 사용자가 양의 정수를 입력할 때 까지 do 블럭 안의 scanf()함수를 실행한다.  왜냐면 0이나 음수를 입력하면 while 문 뒤의 조건문이 참이 되어 do 블럭을 다시 수행하기 때문이다. 양수가 입력되면 반복문이 종료된다.



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

C/C++의 continue 명령  (0) 2015.05.19
C/C++의 break 명령  (0) 2015.05.19
C/C++ 의 while 반복문  (0) 2015.05.18
C/C++의 for 반복문  (0) 2015.05.18
C/C++ 의 switch ~ case 제어문  (0) 2015.05.18
Posted by 살레시오
,

4.3 for 반복문    [doc]    [smts]

프로그램에서 같은 코드를 변수값만 바꿔가며 반복해서 해야 하는 경우는 빈번하게 발생한다. 이런 경우를 위해서 반복문이 사용된다. C 언어에서 사용하는 반복문은 for 와 while 그리고 do~while 세 가지가 있으며 가장 많이 쓰이는 것은 for 반복문이다.


for (초기실행문; 반복조건; 변환문) {
  명령문1;
  …
  명령문n;
}

for문 이후의 블럭이 정해진 수만큼 반복해서 수행이 된다. 초기실행문은 반복을 시작할 때의 초기값을 설정하는 부분이다. 만약 10번 반복해야 하고 초기값이 0이라면 이 부분에 0을 설정하는 실행문이 들어가야 한다. 만약 반복조건이 거짓이 되면 그 순간 반복문을 빠져 나가게 된다. 변환문은 매 반복이 끝나고(즉 명령문n이 끝난 다음) 반복조건이 참일 때 수행되는 명령문이다. 여기서 변수의 값을 증가 혹은 감소시킨다든가 하는 실행문이 위치하게 된다.


 다음 예제를 보자


0403-01.c
#include <stdio.h>
int main() {
   int ia;
  for (ia=0; ia<10; ia++) {
      printf("count : %d\n", ia);
  }
}
실행 결과
count : 0
count : 1
count : 2
count : 3
count : 4
count : 5
count : 6
count : 7
count : 8
count : 9

이 예제는 단순히 화면에 0부터 9까지 출력하는 프로그램이다. for구문이 수행되는 단계를 기술하면 다음과 같다.


      ① 반복문에 진입하기 전에 초기 실행문은 한 번 수행된다.

      ② 조건식을 검사한다.

      ③ 조건식이 참이라면 반복명령문(들)을 실행한다.

      ④ 변환문을 수행한 후 ②로 돌아간다.


위의 예제에서는 변환문은 ia++ 이다. ia는 0부터 시작해서 10보다 작을 경우 루프를 돌며 반복문을 수행한다. 즉 10번 반복문을 수행한다.


초기 실행문에 아예 변수의 선언을 해도 된다.


0403-02.c

#include <stdio.h>
int main() {
  for (int ia=9; ia>=0; ia--) {
      printf("count : %d\n", ia);
  }
}

실행 결과

count : 9
count : 8
count : 7
count : 6
count : 5
count : 4
count : 3
count : 2
count : 1
count : 0

이 예는 앞의 경우와 반대로 10부터 1까지 카운트다운을 하는 프로그램이다. 이 경우 변수 ia는 반복문이 시작될 때 생성되고 반복문이 종료되면 소멸된다. 즉, 반복문이 종료되면 변수 ia는 사용할 수 없다. 단, 이 기능은 C99 이후부터 지원하므로 gcc 를 실행할 때 ‘-std=c99’ 옵션을 반드시 추가해야 한다. 만약 C++컴파일러를 사용한다면 (g++) 별다른 옵션 조절없이 이 기능을 사용할 수 있다.


 이제 for 반복문을 사용하여 1부터 100까지의 총합을 구하는 프로그램을 작성해 보자.


0403-03.c
#include <stdio.h>
int main(void)
{
  int isum = 0;
  for (int ia=1; ia<=100; ia++) {
      isum += ia;    
  }
  printf(“result: %d.\n”,isum);
}

for 문 뒤에 실수로 세미콜론을 붙이지 않도록 주의한다. 즉


for ( ia=1; ia<=100; ia++);

  isum += ia;


이와 같이 되면 문법적으로는 오류가 없으나 의도하지 않게 반복문이 수행되지 않을 것이다. 또한 for문 뒤에 오는 명령어가 하나뿐이라면 중괄호{}를 생략할 수 있어 좀더 간결하게 프로그램을 작성할 수 있다.


for ( ia=1; ia<=100; ia++)

  isum += ia;


하지만 반복문에 속한 명령문이 하나 뿐일지라도 중괄호로 포함해 주면 가독성 측면에서 좀 더 낫다.


 다른 예로 구구단을 출력하는 프로그램을 for 반복문을 이용하여 작성해 보자.


0403-04.c
#include <stdio.h>
int main() {
   int ia = 3;
   for (int ib=2; ib<10; ib++) {
       printf("%d x %d = %d\n",ia, ib, ia*ib);
   }
}

이 예제에서 변수 ia는 단수를 지정하며 다음과 같이 3단을 출력한다.



3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27

for문을 중첩해서 사용할 수 도 있다. 다음 예제는 2단부터 9단가지 출력하는 프로그램이다.


0403-05.c
#include <stdio.h>
int main() {
   for (int ia=2; ia<10; ia++) {
       for (int ib=2; ib<10; ib++) {
           printf("%d x %d = %d\n",ia, ib, ia*ib);
       }
       printf("------------\n");
   }
}

초기 실행문은 콤마(,)로 연결하여 여러 변수를 동시에 초기화시킬 수도 있다.


for (int ia=1, isum=0; ia<=100; ia++) {
  isum += iA;
}

초기실행문에서 선언된 변수는 반복문이 종료된 이후에는 사용할 수 없다. 즉, 이 경우 변수 ia와 isum은 반복문이 종료된 후 소멸되므로 사용할 수 없다. 변환문도 콤마로 구분하여 여러 변수를 동시에 변화시켜줄 수 있다. 또한 조건은 ||연산자나 &&연산자를 이용하여 다중 조건을 체크할 수도 있다. 혹은 리턴값을 가진 함수를 이용하여 그 값을 비교할 수도 있다.


 만약 isum 변수를 반복문 종료 후에도 사용하고 싶다면 반드시 for문 밖에서 선언해야 한다. 다음 예는 1부터 100까지의 합을 구하는 예이다.


0403-06.c
#include <stdio.h>
int main() {
   int isum = 0;
   for (int ia=1; ia<=100; ia++) {
       isum += ia;
   }
   printf("isum = %d", isum); // isum변수를 사용할 수 있다.
}
실행 결과
isum = 5050

   for 반복문 바깥에서 선언된 변수는 반복문이 종료된 이후에도 사용할 수 있다.



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

C/C++ 의 do ~ while 반복문  (0) 2015.05.18
C/C++ 의 while 반복문  (0) 2015.05.18
C/C++ 의 switch ~ case 제어문  (0) 2015.05.18
C/C++ 의 if ~ else 조건 제어문  (0) 2015.05.18
C/C++ 포인터 사용시 주의할 점  (0) 2015.05.18
Posted by 살레시오
,