레이블이 if인 게시물을 표시합니다. 모든 게시물 표시
레이블이 if인 게시물을 표시합니다. 모든 게시물 표시

2015년 7월 29일 수요일

맥시마(maxima)의 if 조건문

 맥시마에서 조건 검사를 하는데 if 명령어가 사용된다. 문법은 다음과 같다.

if <조건식> then <expr1> else <expr2>

만약 조건식이 참이면 <expr1>이 실행되고 거짓이면 <expr2>가 실행된다. 조건식을 구성하는데 사용되는 조건 연산자는 다음과 같다.

[표 1] 조건식에 사용되는 연산자들
연산자
의미
비고
a = b, equal(a,b)
같다
관계 연산자
a # b, notequal(a,b)
다르다(≠)
a < b
크다
a > b
작다
a <= b
크거나 같다
a >= b
작거나 같다
and
and
논리 연산자
or
or
not
not

예를 들면 다음과 같다.
변수 a에 %pi 값이 들어있으니 조건은 거짓이 되므로 b:0 이 실행된다. 위의 예제는 다음과 같이 조금 더 간단하게 바꿀 수 있다.

위에서 (if a<%e else 0)가 단일 표현식이며 그 값은 조건에 따라서 1이거나 0이 된다. 따라서 조건에 따라 그 값을 변수 b에 저장시키는 것이다. and연산자를 이용한 예를 들어보면 다음과 같다.

또한 elseif 명령을 이용하여 if문을 중첩하여 쓸 수 있다.

if <조건식1> then <expr1>
elseif <조건식2> then <expr2>
elseif <조건식3> then <expr3>
...
else <exprN>

이 문법에서 만약 <조건식1> 이 참이라면 <expr1>을 수행하고 빠져나간다. <조건식1>이 거짓이고 <조건식2>가 참이라면 <expr2>를 수행한다. <exprN>은 모든 조건이 거짓일 때 수행된다. 다음 예를 보자.
이 예제에서 변수 b에는 2가 대입된다.


2015년 7월 18일 토요일

싸이랩(scialb)의 조건 검사 if ~ elseif ~ else ~ end

 scilab에서 어떤 조건이 참인지 거짓인지 판별한는데 if 명령이 사용되며 만약 if 문 바로 뒤의 조건문이 참이라면 명령문들을 수행한다. if 문은 반드시 end문과 쌍을 이루어야 한다. 간단한 예를 들면 다음과 같다.

>> if %t then
     disp(“True!”)
  end

이 예는 if 문 뒤의 진리값이 항상 참이므로 then과 end 사이의 명령이 항상 실행될 것이다. else 문을 이용하면 진리값이 거짓일 경우 수행될 코드를 처리할 수 있다.

>> n=%e;
>> if n==%pi then
       a=1
   else
       a=2
   end

위의 조건 검사문은 if문 뒤의 조건이 거짓이므로 변수 a는 2값을 가질 것이다. 또한 elseif 명령을 이용하여 여러 조건 검사를 한꺼번에 수행할 수도 있다.

>> n=2;
>> if n==%pi then
     a=1
  elseif n==%e then
     a=2
  else
     a=3
  end

위의 예에서 변수 a는 3값을 가지게 될 것이다.

 조건검사에 쓰이는 비교 연산자를 다음 표에 정리하였다.

[표 1] 조건 검사에 사용되는 비교/논리연산자
비교연산자
설명
a==b
(비교연산자) 같다
a~=b 혹은 a<>b
(비교연산자) 다르다
a<b
(비교연산자) 크다
a>b
(비교연산자) 작다
a<=b
(비교연산자) 크거나 같다
a>=b
(비교연산자) 작거나 같다
a & b
(논리연산자) and
a | b
(논리연산자) or
~a
(논리연산자) not

‘같다’를 검사하는 연산자는  == 이며 = 가 아님에 주의해야 한다. 조건식에 대입연산자 =를 사용하면 에러를 발생하게 된다.

 대소비교를 하는 <, >, <=. >= 네 개의 연산자는 피연산자로 오직 실수(행렬)만이 허용됨을 유의해야 한다. 복소수는 수학적으로도 대소 관계가 정의되어 있지 않으므로 Scilab에서도 그것이 허용되지 않는다.

>>1+2*%i < 3
        !--error 144
Undefined operation for the given operands.
check or define function %s_1_s for overloading.
단 ==, ~= (혹은 <>) 연산은 허용된다. 복소수의 경우 실수부와 허수부가 모두 같아야 참(%t)이 반환될 것이다.

 논리 연산자를 사용할 때 한가지 알아두어야 할 점은 피 연산자가 벡터(행렬)인 경우이다. 다음 예들을 보자.

>> [1 2 3] == 1
ans  =
 T F F  

>>[1 2 3] == [1 2]
ans  =
 F  

>>[1 2;3 4] == [1 2; 3 5]
ans  =
 T T  
 T F  

위의 예들에서 보듯이 다음과 같이 정리할 수 있다.

       ➊ 하나가 스칼라, 다른 하나가 행렬일 경우 스칼라와 행렬의 모든 요소를 비교한다.
       ➋ 둘 다 행렬이고 크기가 다를 경우 거짓 (%f)가 반환된다.
       ➌ 둘 다 행렬이고 크기가 같을 경우 같은 위치의 요소끼리 비교한다.

만약 행렬의 상동을 if 문으로 비교할 경우 크기와 모든 요소가 같아야 참으로 간주된다.

>>a=0
>>A=[1 2; 3 4]
>>B=[1 2;3 5]
>>C=[1 2;3 4]
>> if A==B then // [T T; T F]
     a=1;
  elseif A==C then // [T T;T T]
     a=2;
  else
     a=3;
  end

위의 예에서 변수 a는 2값을 가질 것이다.


2015년 7월 13일 월요일

MATLAB의 조건문 if ~ elseif ~ else ~ end

 많은 경우에 있어서 명령어들은 어떤 관계의 참, 거짓 여부를 따져서 조건부로 실행시켜야 되는 경우들이 있다. 여기에서는 이런 경우에 사용되는 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이냐에 따라서 다른 명령이 실행이 된다는 것을 알 수 있다.


2015년 6월 25일 목요일

C/C++ 의 if 문 예제 1

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

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

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

(a) f1과 f2 중 큰 것을 fMax에 저장한다.
(b) f3이 fMax보다 크다면 fMax 값을 f3 값으로 갱신한다.
(c) fMax를 화면에 출력한다.

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

#include  <stdio.h>
int main(void)
{
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.

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

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

이 문제는 앞의 문제보다는 한 번 더 생각해야 한다. 여기서도 세 float형 변수를  f1, f2, f3 라고 하고 결과값(중간 수)를 저장하는 변수를 fMid 라고 하고 임시값을 저장하는 변수명을 fTmp라고 하자. (Tmp는 temporary 를 줄인 단어임) 알고리듬은 다음과 같이 생각해 볼 수 있다.

(a) f1과 f2 중 작은 수를 fMid 에 저장하고 큰 수를 fTmp에 저장한다.
(b) f3가 fMid보다 크다면 현재 fMid 값이 최소값이라는 의미다. 따라서 f3와 fTmp중 작은 것이 중간값이므로 그것을 fMid에 저장한다.
(c) f3가 fMid 보다 작다면 (a)에서 구한 fMid 값이 중간값이므로 그것을 출력한다.
(d) fMid를 출력한다.


 이제 이 알고리듬을 프로그램으로 작성해 보면 다음과 같다.

#include  <stdio.h>
int main() {
float f1, f2, f3;
printf("Input three numbers : ");
scanf("%f,%f,%f", &f1, &f2, &f3);
float fMid, fTmp;
if (f1>f2) { // 알고리듬 (a)를 구현한 것임
fMid = f2;
fTmp = f1;
} else {
fMid = f1;
fTmp = f2;
}
if (f3 > fMid) // (b)를 구현한 것임
fMid = (f3>fTmp)? fTmp:f3;
printf("The middle value is %f.", fMid);
}

위에서 보면 알고리듬 (c)가 성립한다면 두 번째 if 문이 실행되지 않고 바로 printf()문이 실행이 되므로 올바르게 작동하는 것을 이해할 수 있을 것이다.

실행 예는 다음과 같다.

Input three numbers : -11,22.5,100.345
The middle value is 22.500000.