만약 어떤 조건이 참일때와 거짓일 때를 구분해서 실행시키려면 if ~ then ~ else ~ end 구문을 사용한다.


if 조건식 then
   코드블럭1
else
   코드블럭2
end


조건식이 참이라면 then~else 사이의 코드블럭1이, 거짓이라면 else~end 사이의 코드블럭2가 수행된다. end는 맨 마지막에만 붙는다는 것에 유의해야 한다. 즉, if 와 짝을 이루는 end 하나만 마지막에 와야 한다. 예를 들면 다음과 같다.


a = 11
if a%2 == 0 then
   print('even number')
else
   print('odd number')
end

실행 결과

odd number


if ~ then 사이의 조건이 거짓이이므로 else~end 사이의 코드가 수행된다.


 여러 조건을 검사해야 할 때는 elseif 를 사용한다.


if 조건식1 then
   코드블럭1
elseif 조건식2 then
   코드블럭2
elseif 조건식3 then
   코드블럭3
...
else
   코드블럭n
end


elseif가 공백이 없는 한 단어이다. 이렇게 하면 여러가지 조건에 따라서 서로 다른 코드블럭을 수행할 수 있다. 예를 들면 다음과 같다. 여기에서도 end는 맨 마지막에 하나만 와야 한다. 마지막 코드블럭n은 모든 조건식들이 다 거짓일 경우 수행된다.


if a < 0 then
   print('negative')
elseif a==0 then
   print('zero')
else
   print('positive')
end


이 예에서 만약 a가 음수이면 ‘negative’가, 0이라면 ‘zero’가, 양수라면’positive’가 출력될 것이다.

 

 루아에서는 C계열 언어의 switch~case 구문이 없다. 하지만 elseif 구문을 사용하면 동일한 기능을 하는 코드를 작성할 수 있다.



Posted by 살레시오
,

 많은 경우에 있어서 명령어들은 어떤 관계의 참, 거짓 여부를 따져서 조건부로 실행시켜야 되는 경우들이 있다. 여기에서는 이런 경우에 사용되는 if문과 switch문에 대해서 살펴보겠다.

 if문의 가장 간단한 사용법은 다음과 같다.


if 조건문
   명령집합
end


여기서 조건문이 참(0이 아닌값)이면 if명령어와 end 사이의 명령집합을 실행시키고 거짓(0)이면 명령집합을 실행시키지 않는다. 간단한 예제를 작성해 보자. 사과를 구입하는데 사과 하나에 500원이고 만약 사과를 10개 이상 구입을 하면 가격의 20%를 깎아준다고 한다. 사과의 개수를 입력받아서 가격을 구하는 프로그램은 다음과 같이 작성할 수 있다.


clear all
n = input('사과의 개수는?');
cost = n*500;
if (n>=10)
   cost = 0.8*cost;
end
sprintf('사과의 개수는 %d개이고 가격은 %d입니다.',n,cost)


둘째 줄에서 input()함수를 이용하여 사과의 개수를 입력받아 변수 n에 저장하였고 네째 줄에서 입력받은 개수가 10보다 크거나 같은지를 조건검사한다. 그래서 10이상이면 계산된 가격에 0.8을 곱해서 가격을 다시 계산한 후 일곱 번째 줄에서 가격을 화면에 표시하게 된다.


 위의 프로그램에 대해서 한번만 더 생각하면 더 간단하게 작성할 수 있다. 조건문 (n>=10)을 생각해보면 이 조건은 변수 n이 10이상이면 1값을 가지고 10보다 작으면 0을 갖는다. 이 사실을 이용해서 다음과 같이 간단하게 줄일 수 있다.


clear all
n = input('사과의 개수는?');
cost = (1-0.2*(n>=10))*n*500;
sprintf('사과의 개수는 %d개이고 가격은 %d입니다.',n,cost)


여기서 세 번째 줄에서 사용된 조건식 (1-0.2*(n>=10))를 살펴보면 만약 변수n이 10이상이면 (n>=10)이 1값을 가지므로 (1-0.2*(n>=10))는 0.8의 값을 가지게 되고 변수n이 10보다 작으면 (n>=10)이 0값을 가지므로 (1-0.2*(n>=10))는 1.0의 값을 가지게 된다. 이 예제는 앞의 프로그램과 완전히 동일한 결과를 생성하며 if문을 사용한 예는 아니지만 조금만 생각해 보면 프로그램을 훨씬 간결하고 효율적으로 작성할 수 있음을 보여준다.

 여러 가지 조건을 한꺼번에 검사하기 위해서는 else명령어나 elseif명령어를 if문에 사용한다. if 뒤의 조건이 참(0 이외의 값)이면 뒤에 따라오는 명령문을 수행하고, 거짓(0)이면, 뒤에 나오는 나 elsief문 뒤의 조건을 판별하여 명령문을 수행한다. 문법은 다음과 같다.


if (조건1) %조건 1이 참이면 명령집합1을 수행하고 끝냄
   명령집합1
elseif (조건2) %조건2가 참이면 명령집합2를 수행
   명령집합2
else % 조건1,2 모두 거짓이면 명령집합 3을 수행
   명령집합3
end


예를 들면 다음과 같다.


if (a>1)
   k = 1;
elseif (a<-1)
   k = 100;
else
   k = 1000;
end


이 예제를 실행하고 나면 a>1 이면 k=1, a<-1 이면 k=100, -1≤a≤1 이면 k=1000 의 값을 갖게 된다. 이 예제의 경우도 다음과 같이 작성할 수 있다.


k = (a>1) + 100*(a<-1) + 1000*(a>=-1 & a<=1)


 이제 if-else-end문을 이용하여 2차 방정식의 해를 구하는 프로그램 예제를 작성해 보자. 2차 다항식 ax2+bx+c 의 세 계수를 입력받아서 판별식 D=b2-4ac를 계산한 후 이 판별식의 부호에 따라서 각각 다른 메시지를 출력하는 프로그램을 작성해보도록 하겠다. 다항식의 근을 구하기 위해 앞에서도 소개되었던 roots()함수를 이용하도록 한다. 판별식의 부호에 따라서 두 개의 실근을 가지는지, 중근을 가지는지 그리고 허근을 가지는지를 화면에 출력해보도록 하겠다.


clear all
a=input('x^2의 계수:')
b=input('x의 계수:')
c=input('상수 계수:')
D = b^2-4*a*c;
s = roots([a b c]);
if (D>0)
   sprintf('서로 다른 실근')
elseif (D==0)
   sprintf('중근')
else
   sprintf('허근')
end
s


여기에서 if-elseif-else문이 사용되었다. D가 양수냐, 음수냐, 0이냐에 따라서 다른 명령이 실행이 된다는 것을 알 수 있다.



Posted by 살레시오
,

 파이썬의 while 명령은 단순 반복을 수행한다.


while 조건식:
실행문
....


여기서 조건식이 참이면 실행문을 수행하고 다시 조건을 검사한다. 즉, 조건문이 거짓이 될 때까지 실행문을 반복 수행하는 것이다.


>>> m,p = 1,1
>>> while m<=10:
...     p *= m
...     m += 1
>>> p
3628800


이  예는 10! 을 구하는 프로그램이다. 10!=3628800 이라는 것을 알 수 있다.


 for문과 마찬가지로 while 문도 else 절이 붙을 수 있다.


while 조건식:
실행문들1
else:
실행문들2


조건식이 거짓으로 판정되어서 ‘실행문들1’이 수행되지 않을 때 else 절의 ‘실행문들2’가 수행된다. 만약 break 문에 의해서 반복이 끝난다면 (for반복문과 마찬가지로) else절은 수행되지 않고 그 바깥으로 빠져 나가게 된다.


n=3
while n>=0:
   m = input("Enter a interger :")
   if int(m)==0: break
   n -= 1
else:
   print('4 inputs.')


이 예제는 4개의 0이 아닌 정수를 입력 받으면 else 절이 수행된다.


.#실행 결과 1
Enter a interger :1
Enter a interger :2
Enter a interger :3
Enter a interger :4
4 inputs.


만약 그 전에 0이 입력된다면 else 절이 수행되지 않고 while 반복문을 완전히 종료하게 된다.


# 실행 결과 2
Enter a interger :0


for 반복문과 마찬가지로 break 문에 의한 반복 종료인지 아니면 조건문이 False 가 되어서 반복문을 종료하는 지를 구별하여 다른 실행문을 수행할 경우에 while ~ else 절을 사용하면 된다.


m=997
n=2
while n<m//2:
if m%n==0: break
n += 1
else:
print(m,'is a prime number!')


이 예는 997이 소수(prime number)인지 아닌지 판별하는 함수이다. 2부터 498까지 차례로 나누어서 나머지가 한번이라도 0이 된다면 break 문에 걸리게 된다. 만약 한 번도 0이 아니라서 반복문이 끝까지 돌았다면 else 절이 수행되어 소수임을 표시한다.(음영진 부분은 seq 형이다.)



Posted by 살레시오
,

 파이썬의 for 반복문 안에서 break 명령을 사용할 수 있는데 이 명령은 즉시 그것이 포함된 가장 안 쪽의 반복문을 빠져 나온다. 다음 반복문을 보자.


for n in lst:
   if n==0:
       break
   print(n)


이것은 lst 안의 요소들을 차례대로 프린트하다가 0이 발견되면 바로 반복을 멈추는 프로그램이다. 만약 lst=[1,2,3,0,4,5] 라면 1,2,3만 출력되고 반복문은 종료될 것이다. 만약 반복문의 중첩되어 있다면 가장 안쪽의 반복문만 빠져 나온다는 점에 유의해야 한다.


파이썬의 for 반복문은 else 명령과 짝을 이룰 수도 있다.


for 변수 in 반복가능자:
   수행문들1
else:
   수행문들2


else 블럭에 포함된 ‘수행문들2’는 for 반복문이 반복형의 마지막 요소까지 모두 반복했을 경우 그 다음에 수행된다. 즉, 모든 반복이 성공적으로 수행된 경우에 한 번 수행된다. 하지만 break문을 만나면 else 구문은 수행되지 않고 for 블럭을 완전히 빠져나간다.


for n in lst:
   if n==0: break
   print(n)
else:
   print(‘There is no 0.’) # break문을 만나지 않았다면 수행된다.


이 예제의 경우 lst 안에 0이 있다면 break를 만나게 되고 따라서  else 블럭은 수행되지 않고 for 반목문을 빠져 나오게 된다.


따라서 for 반복문이 종료된 시점에서 이 종료가 모든 반복을 다 수행한 후의 정상적인 종료인지, 아니면 break 명령에 의한 강제 종료인지에 따라서 수행해야 될 일을 구분할 필요가 있는 경우에 for~else 구문을 사용하면 된다.



Posted by 살레시오
,

 if 명령은 그 뒤에 오는 조건식의 참/거짓 여부에 따라 속한 블럭을 수행할지 말지를 결정하는 명령이다. 가장 기본 문법은 다음과 같다.


if 조건식:
   실행문1
   실행문2
   …


여기에서 조건식이 참(True)이면 실행문1, 실행문2 … 가 수행되고 그렇지 않으면 실행되지 않는다. 주의할 점은 if 문에 속한 모든 실행문은 들여쓰기가 같아야 한다는 것이다. 한 칸이라도 틀리면 문법 오류를 발생하게 된다. (보통 한 수준의 들여쓰기는 공백문자 4칸으로 한다.) 또한 조건식 뒤의 콜론(:)도 처음에는 빠뜨리기 쉬우니 조심하자.


 조건식에는 보통 관계연산자와 논리연산자가 사용된다.


[표 1] 조건식에서 사용되는 관계/논리 연산자들

분류

연산자들

관계연산자

==, !=, <, >, <=, >=, is, is not, in, not in

논리연산자

and, or, not


예를 들면 다음과 같다.


n = int(input("integer:"))
if n%2==0:
   print("even number!")

#실행:
integer:12
even number!


이 예는 입력 받은 정수가 짝수일 경우 화면에 ‘even number’라고 출력하고 홀수일 경우는 아무런 일도 하지 않는 것이다.


좀 더 일반적인 if 명령의 문법은 else 와 짝을 이루는 것이다.


if 조건식 :
   실행문1
   실행문2
   …
else :
   실행문3
   실행문4
   …


이 경우 조건식이 거짓이면 else 블럭(실행문 3, 실행문4…)을 수행하게 된다.


age = int(input("나이:"))
if age<30:
   print("청년")
else:
   print("중년")

#실행:
나이:44
중년


사용자의 나이 입력을 받아서 나이가 30 미만으면 ‘청년’, 30 이상이면 ‘중년’이라고 출력하는 간단한 예제이다.


 일반적인 if 명령의 구조는 다음과 같다.


if 조건식1 :
   실행문1
   ...
elif 조건식2
   실행문2
   …
elif 조건식3
   실행문3
   …
else :
   실행문n
   …


키워드 elif 는 else if 를 줄인 단어이다. 이 구조에서 조건식1이 참이라면 실행문1을 수행하고 if 블럭을 완전히 빠져나간다. 만약 조건문1이 거짓이라면 조건식2를 판별한다. 그래서 조건식2가 참이면 실행문2를 실행하고 if 블럭을 빠져나간다. 모든 조건이 거짓일 경우 else 문에 속한 실행문n이 실행된다.


s = 'hello'
if 'a' in s:
   print("'a' is contained")
elif 'b' in s:
   print("'b' is contained")
else:
   print("both 'a' and 'b' are not contained")

#실행결과:
both 'a' and 'b' are not contained


파이썬에는 C/C++/JAVA/C# 등에는 있는 switch - case 명령문이 없다. 따라서 비교적 많은 수의 다중 조건을 판단해야 할 경우에도 if - elif- else 문을 조합하여 구성해야 한다.


 가끔 조건문을 판단하고 참 거짓에 따라 행동을 정의 할 때 아무런 일도 하지 않도록 설정을 하고 싶을 때가 생기게 된다. 다음의 예를 보자.


"집에 돈이 있으면 가만히 있고 집에 돈이 없으면 노트북을 팔아라"


위의 예를 pass를 적용해서 구현해 보자.


>>> home = [‘money’, 'TV', 'radio', 'notebook']
>>> if 'money' in home:
...    pass
... else:
...    print("sell notebook.")


home이라는 리스트 안에 'money'라는 문자열이 있기 때문에 if 문 다음 문장인 pass가 수행되었고 아무 일도 수행하지 않는 것을 확인 할 수 있다.


위의 예를 보면 if문 다음의 수행할 문장이 한 줄이고 else문 다음에 수행할 문장도 한 줄이다. 이렇게 수행할 문장이 한 줄일 때 조금 더 간편한 방법이 있다. 위에서 알아본 pass를 사용한 예는 다음처럼 간략화할 수 있다.


>>> home = [‘money’, 'TV', 'radio', 'notebook']
>>> if 'money' in home: pass
... else:
...    print("sell notebook.")


if 문 다음의 수행할 문장을 ':'뒤에 바로 적어 주었다. else 문 역시 마찬가지이다. 이렇게 하는 이유는 때로는 이렇게 하는 것이 보기에 편하게 때문이다.



Posted by 살레시오
,

4.1 조건 분기문    [doc]    [smts]

프로그램에서 어떤 조건에 따라서 수행해야 하는 행동이 달라지는 경우는 매우 빈번하게 발생한다. 따라서 프로그램언어라면 보통 명령 수행의 흐름을 바꾸는 제어 명령어가 마련되어 있으며 C/C++언어도 이를 위해서 조건 검사 명령과 반복 명령어가 있다.


if 명령문은 조건을 제어하기 위해서 사용된다. 문법은 다음과 같다.


if (조건식) {
  실행문1;
  …
   실행문n;
}

보다시피 아주 간단한 문장으로 조건문이 참인지 거짓인지 판별하여 조건이 참이면 바로 뒤의 중괄호 {}로 묶인 실행문들을 수행하고, 참이 아니면 수행하지 않고 다음으로 넘어간다.


 만약 실행문이 하나라면 굳이 중괄호로 묶을 필요는 없으나 가독성을 높이기 위해서 중괄호를 항상 사용한다. 예를 들면 다음과 같다.


if (ca == cb)
  cx = 10;
if (cd > 10) {
  ce = 100;
}

 if 문을 사용할 때는 몇 가지 주의할 점이 있다. 먼저 조건은 반드시 괄호로 감싸야 한다는 점이고 괄호 안의 조건은 참과 거짓을 판별할 수 있어야 한다. C언어는 내부적으로 정수 0을 거짓으로 취급하고 그 이외의 수는(보통은 1값) 모두 참으로 취급한다는 점을 유의하자. 아래의 예에서 sa=10이라는 대입문은 무조건 수행되고 예2에서 sb=sc라는 대입문은 절대로 수행되지 않는다. (왜?)


if (1) {
  sa = 10; // sa=10과 동일
}

if (0) {
  sb = sc;
}

또한 조건문에서 가장 하기 쉬운 실수가 ‘==’를 ‘=’로 잘 못 사용하는 경우인데 이 경우 논리적인 버그가 발생하게 된다. 예를 들면


long la = 1, lb = 1, lc;
if (la = lb) {
  lc = 10;
}

위와 같은 경우에는 la=lb라는 표현식은 변수 la에 변수 lb값을 대입하고 그 자체로 변수 lb값인 1을 갖게 된다. 따라서 의도와 다르게 lc=10이라는 명령은 무조건 수행되게 된다. 만약 lb변수값이 0이라면 lc=10이라는 명령은 절대로 수행되지 않는다. 따라서 아래와 같이 프로그램을 수정해야 할 것이다.


long la=1, lb=1, lc;
if (la == lb) {
lc = 10;
}

또한 실수하기 쉬운 예가 다음과 같다.


if (la == 10);
  lb = lc;

이 예의 경우 if 조건 다음의 세미콜론 ‘;’에 의해 수행문이 종료되기 때문에 조건과 관계없이 lb=lc명령이 수행된다. 실제 프로그래밍을 하다보면 쉽게 하는 실수이니 눈여겨보기 바란다.


다음의 두 예는 서로 다른 프로그램이다. 첫 번째 예는 괄호가 없기 때문에 if 조건이 첫 번째 문장에만 적용되어서 ia의 값과는 상관없이 sc++이 수행되지만, 두 번째 예는 ia가 10값일 때에만 sc++이 수행된다.


if (ia == 10)
sb++;
sc++;
if (ia == 10) {
  sb++;
  sc++;
}

이번에는 if 문과 항상 같이 다니는 else문에 대해서 알아보자. 기본적인 문법은 아래와 같다.


if (조건문) {
  명령1;
  ...
} else {
  명령2;
  ...
}

else문에 포함된 명령어집합은 if 조건이 거짓일 경우 수행된다. 또한 if와 else를 조금 확장해 보면 if ~ else if 문이 된다.


if (조건문1) {
  명령문1;
  ...
} else if (조건문2) {
  명령문2;
  ...
} else {
  명령문3;
  ...
}

조건문1이 참이면 명령문1을 수행하고 조건문1이 거짓이고 조건문2가 참이면 명령문2가 수행되며, 두 조건 다 거짓일 경우 명령문 3이 수행된다.


 다음 예제는 하나의 정수를 입력받아서 3의 배수인지 아닌지를 판별하여 화면에 표시해주는 예제이다. 3의 배수라면 3으로 나눈 나머지가 0일 것이고 아니라면 3으로 나눈 나머지가 0이 아니라는 사실을 이용하면 쉽게 프로그램을 작성할 수 있다.


ex04-01.c
#include <stdio.h>
int main() {
  int ia;
  printf("Input an interger :");
  scanf("%d", &ia);
  if (ia%3 == 0)
      printf("%d is multiple of 3.\n", ia);
  else
      printf("%d is NOT multiple of 3.\n", ia);
}

Input an interger number :2
2 is NOT multiple of 3.

 사용자가 입력받은 수의 절대값을 출력하는 프로그램 예를 들면 다음과 같다. 입력된 수가 양수냐 아니냐에 따라서 수행되는 일이 달라진다.


ex04-02.c

#include<stdio.h>
int main() {
double da;
printf("input a number :");
scanf("%lf", &da);
printf("|%lf|=", da);
if (da>0) {
printf("%lf",da);
} else {
printf("%lf",-da);
}
}

실행 결과

input a number :-1.1
|-1.100000|=1.100000

이 프로그램에서 입력된 수가 양수이면 그대로 출력하고 음수라면 -1을 곱해서 출력하는 간단한 방법을 사용했다.


 다음 예는 입력된 정수가 음수인지, 0인지, 양수인지를 판별하는 예이다. if-else문이 중첩되어 사용되었음을 눈여겨보아야 한다.


ex04-03.c
#include <stdio.h>
int main() {
  int ia;
  printf("Input an interger number : ");
  scanf("%d",&ia);
  if (ia < 0)
      printf("%d is negative.\n", ia);
  else if (ia > 0)
      printf("%d is positive.\n", ia);
  else
      printf("%d is a zero.\n", ia);
}

Input an interger number : 0
2 is a zero.

다음은 사용자로부터 입력 받은 문자 하나가 알파벳 소문자라면 ‘lower case’ 라고 화면에 출력하는 예제이다.


ex04-04.c
#include <stdio.h>
int main() {
char ch;
scanf("%c", &ch);
if ('a'<=ch && ch<='z' ){
printf("lower case");
}
}

g
lower case

이 예제에서 비교문 (‘a’<=ch && ch<=’z’)는 (97<=ch && ch<=122) 와 동일하다. 문자는 내부적으로 아스키코드로 간주되기 때문이다.


 위 예제어서 대문자의 경우 “upper case’라고 출력하고 숫자의 경우 ‘digit’이라고 츌력하는  부분을 추가하면 다음과 같다.


ex04-05.c
#include <stdio.h>
int main() {
char ch;
scanf("%c", &ch);
if ('a'<=ch && ch<='z' ){
printf("lower case");
} else if ('A'<=ch && ch<='Z' ){
printf("upper case");
} else if (‘0’<=ch && ch<=’9’) {
printf("upper case");
} else {
printf("unknown");
}
}

이와 같이 if - else if 문은 얼마든지 중첩하여 사용할 수 있다.


Posted by 살레시오
,