[LV] 랜덤 아이콘 하나로 6개의 로또 번호 추출하기

심플디 2013.08.05 20:57 조회 수 : 201

HW. 로또 프로그램.zip


Q. 랜덤 아이콘을 1개만 쓰고서 로또 번호 6개를 추출하는 vi를 만드시오.

001.png

<Fig. 1 Project Frame>

 

아마 딱 보는 순간 Structure programming 방식과 매우 흡사하다는 것을 알 수 있을 것이다.

그도 그럴 것이 필자는 이미 C로만 3년 동안 인셉션 당해왔기 때문에, 좀 더 자유로운 Lab view 로직을 생각치 못한다.

잡소리는 이쯤 일단락 하고 Fig. 1을 보자.


일단, 이 프로그램은 크게 2가지로 나눌 수 있는데, Fig. 1과 같이,

좌측 프레임처럼 전역 변수에 로또 번호를 6개 초기화 하는 로직과,

우측 프레임처럼 전역 변수 값을 Indicator에 초기화 시켜주는 로직으로 구분된다.


# 01. 전역변수 설정


가장 주목해야 할 점은 Global variable!!

즉, 전역변수나 광역변수로 칭하는 변수가 사용되었다는 것이다.

꼭 좋은 점만 있는 것은 아닌데, 

아무튼 필자는 C만 주구장창 사용하다보니 

광역 변수를 편애의 수준을 넘어서 사랑의 수준으로 사용한다.


002.png 

<Fig. 2 광역변수 아이콘의 위치>



003.png 

<Fig. 3 Global Variable의 내부 모습>


Fig. 2와 같은 아이콘 생성 후, 더블클릭하여 내부에 값을 초기화 할 수 있는 컨트롤을 만든다.

Fig. 3을 보면, 좌측부터, 숫자만 있는 것은 랜덤의 숫자를 받아들이는 컨트롤이고,

중간은 로또의 정수값이 초기화 되는 컨트롤이며,

마지막은 6개의 로또 값이 전부 다름을 검사하는 값이 초기화 되는 컨트롤이다.


이렇게 만들어진 전역변수는 하나의 아이콘당 Input / Ouput의 형태를 자유롭게 취할 수 있으므로 

단순 로직에 매우 적합한 형태를 취할 수 있도록 도와준다.



# 02. 전역변수 초기화


004.png 

 <Fig. 4 전역변수 0으로 초기화>


Fig. 1의 좌측 프레임을 관찰하면 내부에도 프레임이 있다.

이중에서 8번 vi를 들여다 보면 Fig. 4와 같다.


Fig. 4는 전체 로직이 한번 돌기 시작하자마자 

모든 전역변수를 0으로 초기화 시켜주는 단순 로직만 담당한다.



# 03. 랜덤 아이콘 1개 사용, 전역변수 6개 초기화


005.png 

 <Fig. 5 랜덤값 6번 초기화>

 

Fig. 1의 8번 vi의 작업이 끝나면 바로 그 옆의 5번 vi가 실행된다.

5번 vi의 내부 로직은 Fig. 5와 같다. 


일단 랜덤 아이콘 1개로 6번을 초기화 해야 하는데, 

어떤 식으로든 다른 값을 넣어야 하므로 시간차를 둘 수 밖에 없다.


while문 안에 주사위를 두고 case로 값을 계속 받게 하였다.

while문은 6번째에서 if문에 의해 종료된다.


만약, 전역변수를 사용하지 않았다면 저 로직이 어떻게 변했을까?


필자는 랜덤의 값을 밖으로 빼내기 위해 부단히 노력했지만, 

로직 간의 알고리즘이 드럽게 복잡해지고, 

구현하기도 마땅치 않아서  전역변수를 사용했다.

이것이 전역변수를 사용할 수 밖에 없는 가장 큰 이유라 할 수 있겠다.


# 04. 전역변수 6개 Integer로 초기화


006.png 

 <Fig. 6 전역변수 값을 Integer형으로 변환 >


007.png 

<Fig. 7 전역변수 값을 Integer형으로 변환 (3번의 예) >

 

Fig. 5의 로직을 돌려서 Indicator로 보게 되면 소수점의 값임을 알 수 있다.

Fig. 6은, Fig. 1의 6번 vi의 내부 로직을 보여준다.

Fig. 6의 로직은 Fig. 5에서 초기화된 랜덤값을 6번의 루프를 통하여 또 다른 전역변수 값에 초기화 시켜준다. 


일단 랜덤값에 10000을 곱해준다.

이것을 45로 나누고 나머지값을 취한다.

이때 모든 랜덤값의 나머지는

0~44가 된다.


하지만 로또의 번호가 0부터 시작되는 경우가 없으므로 1을 더해준다.

따라서 모든 랜덤값의 나머지는 

1~45가 된다.


아직까지도 소수점인데

이것을 [] 아이콘을 통하여 

소수점을 쳐내버리고 

절대값으로 만들어서 

다른 전역변수로 집어넣게 된다.


Fig. 3의 관계를 여기서 볼 수 있다.



# 05. 서로 같은 값이 있는지 검사


008.png 

<Fig. 8 각 로또값이 다른 로또 값과 같은지 확인>


009.png 

<Fig. 9 각 로또값이 다른 로또 값과 같은지 확인 (3번의 예)>

 
상당히 무식하게 로직을 짰는데, 내부 로직 설계론에 대한 논점은 잠시 집어치우자.
우리는 이것을 '실행'되는 로직으로 만드는 것에 집중할 필요가 있다.

Fig. 8이나 Fig. 9를 통해, 만약 각 로또 값 중에서 서로 같은 숫자가 하나라도 나온다면 Inspect의 변수는 0 이상의 숫자를 취하게 된다.

(Fig. 8과 Fig. 9는 케이스의 내부 숫자가 조금 바뀌었을 뿐, 기본적인 로직은 바뀌지 않았 음을 볼 수 있다.)

참고로 내부의 if문에서 false의 경우는 빈 공간만 존재한다.



# 06. 실행 결과

010.png 

<Fig. 11, Fig. 1 Project Frame>


부득이하게 Fig. 1을 다시 끌어왔다. 이게 무슨 논문도 아니고, 너무 형식 따지지 말자.

우리는 8번, 5번, 6번, 7번 vi가 무슨 기능을 하는지 보고 왔다.

좌측의 프레임의 while은 7번 vi에서 Inspect 변수가 0인 경우에만 종료되게 설정되어 있다.


좌측 프레임의 while이 끝나면 우측 프레임으로 넘어가게 되고,

모든 검사가 완료된 각 전역변수는 로또 번호를 출력하는 Indicator에 전달되게 된다.



011.png

<Fig. 10 실행 결과>