'예제'에 해당되는 글 12건

  1. 2015.05.17 C++ 클래스 예제 : Led 클래스
  2. 2015.04.22 간단한 예제들로 심파이 맛보기

 여기에서는 Led 라는 클래스를 작성하는 예를 들어보도록 하겠다. 아두이노의 예제이지만 아두이노가 C++로 개발하므로 일반적인 클래스의 예제도 된다.


 아두이노의 디지털핀에는 LED를 연결할 수 있으므로 Led 클래스는 연결된 핀 번호를 갖는 멤버가 있어야 한다. 따라서 다음과 같이 작성할 수 있다.

class Led {
   public: byte pin;
};

그리고 인스턴스를 생성할 때 이 핀번호를 받도록 하려면 다음과 같이 생성자를 작성하면 될 것이다.

class Led {
   public:
       byte pin;
       Led(int);
};
Led::Led(int dp) {
       pin = dp;
       pinMode(pin, OUTPUT);
}

이렇게 작성하면 멤버 변수 pin을 외부에서 접근할 수 있다. 예를 들면

Led ledRed(12);
ledRed.pin = 11;

와 같이 인스턴스를 생성한 이후에 핀번호를 바꾸는 것이 가능하다.


 그렇지만 핀번호는 한 번 초기화되면 바꿀 필요가 없으므로 궂이 외부에 노출시킬 필요가 없다. 따라서 다음과 같이 private 멤버로 지정하는 것이 바람직하다. 또한 내부 멤버임을 표시하기 위하여 첫 문자를 underscore(_)로 했다.



class Led {
   public:
       Led(int);
   private:
       byte _pin;
};
Led::Led(int pin) {
   _pin = pin;
   pinMode(_pin, OUTPUT);
}

또는 기본 지정자가 private 이므로 아래와 같이 작성해도 된다.



class Led {
   byte _pin;

   public:
       Led(int);
};

Led::Led(int pin) {
   _pin = pin;
   pinMode(_pin, OUTPUT);
}

 

하지만 명시적으로 private 키워드를 이용하여 지정해 주는 것이 가독성 측면에서 더 바람직하다. 그리고 클래스 선언에서는 public 멤버들이 먼저 오는 것이 좋다. 왜냐면 작성자가 아닌 다른 사람이  (보통 라이브러리에 포함되어 배포되는) 이 클래스를 사용하고자 한다면 public 멤버들만 알면 되지 private 멤버들은 궂이 볼 필요가 없기 때문이다.

 이렇게 핀 번호를 private로 지정해 놓으면 외부에서 접근할 수 없으므로 LED를 켜고 끄는 것도 외부에서 수행할 수 없다. 하지만 멤버 함수는 내부 변수를 접근할 수 있으므로 LED를 켜고 끄는 public 멤버 함수를 다음과 같이 지정할 수 있다. 전체적인 클래스의 모양은 다음과 같을 것이다.

class Led {
   public:
       Led(int);
       void turnOn();
       void turnOff();
   private:
       byte _pin;
};
Led::Led(int pin) {
   _pin = pin;
   pinMode(_pin, OUTPUT);
}
Led::void turnOn() {
   digitalWrite(_pin, HIGH); // 멤버 함수는 _pin을 사용할 수 있다.
}
Led::void turnOff() {
   digitalWrite(_pin, LOW); // 멤버 함수는 _pin을 사용할 수 있다.
}

 멤버 변수나 함수는 관례적으로 그 이름이 소문자로 시작하며 클래스는 대문자로 시작한다는 점을 알아두자. 이것은 식별자(이름)만 보고 타잎을 유추하기 쉽게 하기 위한 C++ 프로그램의 관례이다.

 만약 12번 핀에 빨간색 LED가 연결되어 있다면 다음과 같이 Led 객체를 사용할 수 있다.

Led ledRed(12);
....
ledRed.turnOn();
delay(500);
ledRed.turnOff();
delay(500);
....


이와 같이 인스턴스의 이름도 그것으로 실제 의미를 유추할 수 있도록 작성하는 것이 프로그램의 가독성 측면에서 유리하다.


 만약 11번핀에 노란색, 10번핀에 파란색 LED가 추가로 달려있다면 아래와 같이 작성할 수 있을 것이다.


Led ledRed(12), ledYellow(11), ledBlue(10);

이후에 만약 파란색 LED를 켜고 싶다면 다음과 같이 멤버함수를 호출한다.


ledBlue.turnOn();

 이런 식으로 클래스를 이용하여 LED를 객체화 시키면 직관적으로 프로그램을 작성할 수 있다는 장점이 있다.

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


c{c++},n{c0023}

Posted by 살레시오
,

 심파이에서는 변수를 대수 기호로 사용하려면 반드시 symbols()함수를 써서 지정해 주어야 한다. 만약 x, y, z를 대수 기호로 사용하겠다면 다음과 같이 하면 된다.


>>> x = symbols(‘x’)
>>> y,z=symbols(‘y z’)


아래부터는 live.sympy.org 에서 직접 확인해 볼 수 있다.


[그림 1] live.sympy.org 접속화면

대수 방정식

 이것을 이용하여 수식 x+2y 를 입력해 보자.


>>> expr = x+2*y
x+2*y


여기서 x, y는 마치 파이썬의 변수처럼 사용되었지만 내부적으로는 대수기호로 지정되어 있는 상태이다.


>>> expr+1
x + 2*y + 1

>>> x*expr
x*(x + 2*y)

>>> expr2 = expand(x*expr)
x**2 + 2*x*y

>>> factor(expr2)
x*(x + 2*y)


이와 같이 expand() 함수를 이용하여 수식을 전개할 수 있고 factor()함수로 인수분해를 할 수 있다.


 분수식을 통분하거나 분리할때는 together() 함수와 apart()함수를 이용한다.


>>> a, b, c, d = symbols('a b c d')

>>> together(a/b + c/d)
(a*d + b*c)/(b*d)

>>> apart( (a**2+a+4)/(a+2) )
a - 1 + 6/(a + 2)


 대수 방정식을 풀기 위해서는 solve()함수를 이용하면 된다.


>>> solve(x**2-2,x)
[-sqrt(2), sqrt(2)]


미분

 이제 함수 sin(x)ex 를 미분해 보자. 미분은 diff() 함수를 이용하면 된다.


>>> diff(exp(x)*sin(x),x)
exp(x)*sin(x) + exp(x)*cos(x)


적분

 함수 exsin(x) + excos(x)의 부정적분을 계산해 보자. integrate()함수를 이용하면 된다.


>>> integrate(exp(x)*sin(x)+exp(x)*cos(x),x)
exp(x)*sin(x)


정적분을 구하려면 integrate()함수의 두 번째 인수에 범위를 지정해 주면 된다. sympy에서 무한대는 oo (소문자 o 두 개) 기호를 사용한다.


>>> integrate(sin(x**2),(x,-oo, oo))
sqrt(2)*sqrt(pi)/2


극한

 극한값을 구하려면 limit()함수를 이용하면 된다.


>>> limit(sin(x)/x,x,0)
1


미분방정식

 심파이를 이용하면 미분 방정식도 풀 수 있다.


>>> t=symbols('t')
>>> y=Function('y')
>>> dsolve( Eq(y(t).diff(t,t)-y(t), exp(t)), y(t))
y(t) == C2*exp(-t) + (C1 + t/2)*exp(t)


선형대수

 선형대수도 가능하다. 예를 들어 행렬


[ 1 2 ]

[ 3 4 ]


의 고유값을 구하려면 다음과 같이 하면 된다.


>>> A = Matrix([[1,2],[2,2]])
>>> A.eigenvals()
{-sqrt(17)/2 + 3/2: 1, 3/2 + sqrt(17)/2: 1}


 이와 같이 sympy를 이용하면 다양한 대수식을 표현하거나 방정식을 풀 수 있다.




Posted by 살레시오
,