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

Labview: 반복문 (4)

4. 쉬프트 레지스터


랩뷰의 반복문에서 이전 연산의 결과를 참조할 수 있는 방법이 없을까??
쉬프트 레지스터가 이런 의문을 해결해 줄 수 있다.


쉬프트 레지스터는 반복 구조를 나타내는 사각형의 왼쪽이나 오른쪽에 마우스 우클릭을 해서 추가할 수 있다.

쉬프트 레지스터를 이용하여 다음과 같은 프로그램을 작성해보자.


그리고 '입력'으로 크기가 5이고 원소로 {1, 2, 3, 4, 5}를 갖는 배열을 두었을 때,


이 프로그램의 결과인 '출력'은 1부터 5까지의 합인 15가 출력이 될 것이다.


< 이렇게 말이다. ㅎㅎㅎ >

몇 가지 눈에 거슬리는 부분에 대해서는 좀 있다가 이야기하는 것으로 하고,
쉬프트 레지스터에 의한 연산 과정만을 살펴보자면,
프로그램이 실행되면 먼저 입력 배열의 첫번째 원소인 1이 반복문으로 들어와서
쉬프트 레지스터를 통해 이전 연산의 결과 값 (첫 번째 반복이므로 0)과 더하기 연산을 진행한다.
그 다음 반복에서 오토 인덱싱 기능에 따라 입력의 두번째 원소인 2가 입력되어
쉬프트 레지스터를 통해 이전 연산의 결과 값인 1과 마찬가지로 더하기 연산을 진행한다.
반복된 연산 결과는 결국 입력 배열의 모든 원소들의 합을 구하는 결과로 나타난다.

여기서 눈에 거슬리는 것 중 하나는 'For 반복인데, 반복 터미널에 값이 없다.' 라는 점이다.
랩뷰에서는 For 반복문에 배열을 오토 인덱싱으로 입력할 때, 반복의 횟수를 지정하지 않더라도,
입력 배열의 크기만큼 반복문이 연산된다.
따라서, 이 프로그램에서도 반복의 횟수를 지정하지 않았지만 입력 배열의 크기 만큼 반복이 진행되었다.

두번째로, C나 Java의 프로그래밍 경험을 가진 사람들은 거의 무의식적으로 거슬릴 것이라 생각하는데,
Temporary하게 사용되는 쉬프트 레지스터에 초기값을 주지 않아도 되는가? 라는 점이다.

위의 결과를 통해 추측할 수 있듯이, 쉬프트 레지스터는 초기 값으로 '0'을 가진다는 것을 예상할 수 있다.
그런데, 동일한 프로그램을 연속적으로 실행했을 경우에도 항상 '초기화'를 해줄 것인지는 의심이 간다.
가장 좋은 방법은 테스트 해보는 것!!



.
.
.
.
계속 실행할수록 정확히 '15'만큼 결과가 늘어나는 것을 확인할 수 있다.
이것을 통해 쉬프트 레지스터는 프로그램의 실행과 초기화와는 관계가 없다는 것을 확인할 수 있다.
다시 말해, 내가 몇 번을 실행하든 같은 결과를 얻기 위해서는 초기화가 필요하다.


이번에는 쉬프트 레지스터 앞에 '0'이라는 상수 값을 연결해주었다.



쉬프트 레지스터에 초기화가 정상적으로 되고 있는 것을 확인할 수 있다.


다음에는 반복문 만큼이나 프로그래밍에 중요한 조건문을 공부해보자... ㅎㅎㅎ



요약
- 반복문에서 이전 연산의 결과는 쉬프트 레지스터를 통해 참조할 수 있다.
- 쉬프트 레지스터는 프로그램을 실행할 때 초기화 해주지 않는다.



spacer

Labview: 반복문 (3)

3. While 반복문


While문은 앞에서 살펴본 For문과 다르게 반복에 대한 횟수를 정해 놓지 않고,
프로그래머가 정한 조건에 따라 반복을 계속 할 것인지 아닌지 결정되는 반복문이다.
예전에 C 계열의 텍스트 기반 프로그래밍에서 아직 프로그래밍이 익숙하지 않았을 때,
반복의 조건까지 함께 생각해야하는 While문에 비해 처음부터 반복의 횟수 등을 결정하고 시작하는
For문을 좀 더 선호했었던 기억이 난다.

While문은 For문과는 다른 형태의 사각형으로 반복의 범위를 나타낸다.
While문에서도 반복과 관련된 두 가지 터미널이 보이는데, 하나는 For문과 같은 의미의 '카운터 터미널'이고,
다른 하나는 반복 종료의 조건을 의미하는 '조건 터미널'이다.


While문에서 오른쪽 아래의 조건 터미널을 마우스로 클릭하면 위의 그림처럼 터미널의 생긴 모양이 바뀌는데,
반복을 끝내는 조건이 '' ()일때 정지하느냐 '거짓' ()일때 정지하느냐를 의미한다.

랩뷰에서의 While문은 흔히 사용하는 C 계열 프로그래밍 언어에서의 While문과는 약간 다른 점이 있는데,
C 계열 프로그래밍 언어에서 While문은 조건을 먼저 검사하고 명령문을 실행하는 구조라면,
랩뷰에서는 명령을 먼저 실행하고 조건을 검사한다는 부분이다.
만약, C 계열 프로그래밍 언어에서의 While문은 조건값에 따라 반복구문이 한번도 실행되지 않을 수도 있지만,
랩뷰에서는 최소 한번은 반복구문이 실행된다는 점에서 'Do-While'문과 닮았다고 볼 수도 있다.


While문도 For문과 마찬가지로 반복 과정에서의 연산 값을 '인덱싱' 처리해 줄 수 있다.
(위 프로그램에서 오토 인덱싱 결과 크기가 4인 배열이 나온 이유는 카운터 터미널이 0부터 시작하기 때문이다.)

랩뷰의 반복문에서 중요한 타이밍 함수와 시프트 레지스터는 다음 시간에... ㅎㅎㅎ

spacer

Labview: 반복문 (2)

2. For 반복문

For 문은 지정된 범위 안의 명령들을 '정해진 횟수만큼' 반복하는 명령문이다.
블록 다이어그램 창에 For 반복문을 추가할 수 있다.

사각형으로 표현되는 For 반복문에서 눈에 띄는 두 부분이 있는데, 하나는 '반복 터미널'이고 다른 하나는 '카운터 터미널'이다.

반복 터미널은 For 반복문의 왼쪽 위에 위치한 N 모양의 터미널이고, 여기에 값을 연결하여 반복의 횟수를 전달할 수 있다.
카운터 터미널은 For 반복문의 왼쪽 아래에 위치한 i 모양의 터미널이고, 현재의 반복 횟수를 나타낸다.
간단하게 아래와 같이 프로그램을 작성해보자.

최대 반복 횟수를 10회로 하고 위의 프로그램을 실행시켰다.
크기가 10인 정수형 배열의 형태로 결과가 나온다.
이런 결과는 반복문의 실행 결과를 '인덱싱' 처리하여 배열화 시켜주는 랩뷰의 고마운 기능 덕분인데,
만약 이게 싫다면 인덱싱을 취소할 수 있고, 그럼 가장 마지막의 실행 결과만 전달된다.

반복문의 인덱싱과 관련하여 아래의 프로그램을 보자.

이 프로그램은 10개의 원소를 가진 'Input' 배열을 For 반복문에 연결하여 현재의 반복 횟수와 더하는 프로그램이다.
입력 배열도 마찬가지로 인덱싱을 통해 원소가 하나씩 전달되는 것을 확인할 수 있다.

랩뷰의 또 다른 반복문인 While문은 다음 시간에... ㅎㅎㅎ


spacer

Labview Basic: 반복문 (1)

1. 반복문이란??

Java나 C#과 같은 프로그래밍 언어를 조금.. 아~주 조금 접해본 사람이라 하더라도,
반복문에 대해서는 들어도 봤고 써보기도 했을 것이다.
어찌보면 프로그래밍의 기본 중에 기본이 조건문과 반복문이다보니 프로그램을 공부하는 사람으로써
내용을 살펴보지 않을 수 없잖아?? ㅎㅎ

반복문따윈 없는 아주 간단한 프로그램을 하나 만들어보자.

프론트패널에 입력과 출력을 하나씩 두고, 그냥 와이어로 연결한 아주 간단한 프로그램인데,

VI를 실행시키고 슬라이드를 조정했을 때, 슬라이드는 변화가 있지만 값에는 전혀 변화가 없다.
이 상태에서 다시 한번 VI를 실행시키면...

이제야 값이 변화되었다.
이런 결과의 첫번째 원인은 바로!!
'나는 VI를 실행시키고 슬라이드를 조정했지만, 프로그램은 동작하지 않았다.'
라는 말이 정답이다.
이 프로그램의 동작은 '슬라이드'의 입력 값을 '밸류'에 '전달'하는 것인데,
나는 VI를 실행시켰으나, 슬라이드를 조정할 때는 이러한 '전달'이라는 행동이 없었다는 뜻이다.
다시 말해, 내가 VI를 실행시켰을 때는 '분명히' 실행 되었으나 프로그램의 시퀀스가 너무 짧아
순식간에 끝이 났고, 슬라이드를 조정할 때는 이미 프로그램이 종료되고 난 이후였다는 의미이다.  
그래서, 다시 한번 VI를 실행했을 때는 이전 단계에서 변경된 '6'이라는 값이 '정상적'으로 전달되었기
때문에 밸류에 6이 표시되었다.
그렇다면 프로그램의 동일한 시퀀스를 엄청 길게, 그리고 많이 만들면 내가 원하는 결과를 얻을 수 있을까?
라고 한다면, 물론 무한정 길게는 아니겠지만 어느 정도는 가능할 것이다.
단, 동일한 시퀀스를 원하는 길이만큼 길게 만들어줘야 하는 무의미한 일들 해야할 뿐이지만...
당연히 무한대의 시퀀스를 만드는 것 또한 불가능이고...
 
이렇게 시퀀스를 '통제'가 가능한 범위 안에서 반복적으로 실행될 수 있도록 조정해주는 명령문을 반복문이라고 한다.
랩뷰에서 지원하는 반복문인 For와 While에 대해서 구체적으로.....
뒤져보는 것은 다음 시간에.... ㅎㅎㅎ 

spacer