안녕하세요!
저번 3강에서는 랩뷰의 함수들에 대해 몇 가지 실습해보았습니다.
오늘은 좀 더 심화 과정으로 실습해보려고 해요.
저번 시간에 사용한 vi를 그대로 사용하시면 좋을 것 같아요.
첫 번째로는 난수 배열에서 5보다 크거나 같은 값과 5보다 작은 값을 구분해서 각각 다른 배열로 위치시키는 프로그램을 만들어 보겠습니다.
프로그램을 만들기 전에 플로우 차트를 그려보았어요.
배열의 원소를 하나씩 가져와서 원소가 5보다 크거나 같은지를 비교하고 5보다 크다면 5보다 큰 배열에, 5보다 작다면 5보다 작은 배열에 넣고 모든 원소의 배치가 다 끝나면 프로그램을 종료하도록 하겠습니다.
우선 가장 먼저 해야 할 것은 5보다 크거나 같은 원소의 집합인 배열과 5보다 작은 원소의 집합인 배열이 필요해요.
간단히 블록 다이어그램이나 프런트 패널에 있는 난수 배열을 복사해서 붙여 넣기를 두 번 해주시면 됩니다.
생성된 배열의 이름을 저는 '5보다 큰 배열', '5보다 작은 배열'로 이름을 바꾸어 주었습니다.
그런 다음 블록 다이어그램에 For 구조를 적당한 크기로 배치해주세요.
저번 2강 랩뷰의 반복문을 공부했을 때 For 구조의 서브 다이어그램에 배열을 입력하면 자동으로 인덱싱 처리가 된다고 배웠습니다.
서브 다이어그램에 난수 배열을 입력해 For 문이 회전할 때 배열의 원소가 하나씩 들어가도록 해주세요.
그리고 For문은 반복할 횟수를 카운트 터미널에 입력해주어야 한다고 배웠습니다.
배열의 크기는 곧 배열의 인덱스 개수입니다.
배열 크기 함수를 가져와 난수 배열을 입력하고 출력되는 배열의 크기를 For문의 카운트 터미널로 연결시켜 주세요.
그럼 For문은 난수 배열의 개수만큼 회전하게 됩니다.
그리고 서브 다이어그램 안에 입력되는 원소가 5보다 크거나 같은지를 비교하는 함수를 넣어줍니다.
x가 y보다 크거나 같은지 비교하여 x가 y보다 크거나 같은 값이면 참을 출력하는 함수입니다.
참, 거짓 값이 출력되기 때문에 그 이후에는 참, 거짓에 따라 별도의 코딩을 해주어야 해요.
서브 다이어그램 안에 '케이스 구조'를 넣어줍니다.
케이스 구조는 입력값이 참이면 참 코드를, 거짓이면 거짓 코드를 수행하는 구조입니다.
만약 입력값이 참이면 거짓 코드는 실행되지 않고 마찬가지로 입력값이 거짓이면 참 코드는 실행되지 않습니다.
비교 함수의 출력 불리언(참, 거짓) 값을 케이스 구조에 입력해주세요.
그리고 아래와 같이 각 케이스 안에 비교된 원소가 들어갈 배열을 넣어주세요.
이제 비교 완료된 원소를 각각 케이스 안에 넣어주기만 하면 됩니다.
원소를 배열에 추가하는 방법은 여러 가지가 있어요. 지금은 '배열에 삽입' 함수를 이용해 각각의 배열에 원소를 추가하도록 하겠습니다.
먼저 Ctrl + H를 누르고 마우스 커서를 '배열에 삽입' 함수 위로 올려 도움말을 확인해볼게요.
'배열에 삽입' 함수는 원소를 추가할 배열을 'n차원 배열' 입력 칸에 입력하고 삽입할 원소를 'n 또는 n-1차원 배열' 입력 칸에 입력해주면 됩니다.
인덱스 칸에 삽입을 원하는 인덱스 번호를 넣으면 해당 인덱스에 원소가 입력됩니다.
도움말에는 입력 배열과 출력 배열이 별도의 배열인데 우리는 같은 배열을 사용할 거예요.
그러기 위해 로컬 변수(지역 변수)를 만들어야 합니다.
'5보다 큰 배열'과 '5보다 작은 배열'을 선택하고 오른쪽 마우스를 누른 뒤 생성 → 로컬 변수를 선택해주세요.
그리고 이번 실습에서는 이 로컬 변수를 읽기 용으로 사용할 예정이니 마우스 오른쪽 버튼을 누른 뒤 읽기로 변경을 눌러줍니다.
이제 생성한 로컬 변수를 '배열에 삽입' 함수로 입력하고 인덱싱 된 원소도 '배열에 삽입' 함수로 입력합니다.
인덱스는 입력하지 않습니다.
인덱스를 입력하지 않으면 배열의 맨 뒤에 삽입돼요.
좌측은 참 케이스, 우측은 거짓 케이스입니다.
프런트 패널로 온 다음 코드를 실행(Ctrl + R)하고 값을 확인해 보세요.
일단 얼추 봤을 때 원소들이 알맞게 잘 배치된 것 같기는 해요.
5보다 작은 값은 5보다 작은 배열로, 5보다 큰 값은 5보다 큰 배열로.
좀 더 확실하게 하려면 배열 최대&최소 함수를 사용하면 됩니다.
저는 이렇게 for 루프 전체를 '다층 시퀀스 구조'로 묶고 다음 시퀀스를 추가해서 각 배열의 최대와 최소값을 확인하게 했습니다.
다층 시퀀스 구조는 프로그램을 순차적으로 실행할 수 있게끔 해주는 구조예요.
랩뷰에서는 서브 다이어그램 내에 있는 소스 중 어떤 것이 먼저 실행될지 모릅니다.
반드시 먼저 실행되어야 하는 함수들이 있으니 그럴 경우에는 이렇게 다층 시퀀스 구조를 만들어 순차적으로 소스가 실행되게 해주어야 해요.
다층 시퀀스 구조를 선택하고 오른쪽 마우스를 누른 뒤 다음에 프레임 추가를 누르면 다음 시퀀스를 만들 수 있습니다.
다층 시퀀스 구조에서 프레임 복제를 누르면 해당 다이어 그램에 있는 모든 코드를 그대로 복사해서 다음 시퀀스에 추가합니다. 반복 작업 (일명 노가다,,)을 할 때 아주 유용한 기능이에요.
똑같이 코딩하고 프런트 패널로 와 프로그램을 실행해보세요.
큰 배열의 최대, 최소값은 각각 9.91665와 5.01244
작은 배열의 최대, 최소값은 각각 4.99167과 0.0164782 가 나왔네요.
값이 각각의 배열에 옳바르게 들어간 것을 확인할 수 있습니다.
두 번째로 가장 큰 값은 난수 배열의 몇 번째 인덱스에 있는지를 찾아보겠습니다.
방금 전에 난수 배열에서 가장 큰 값을 찾아 값은 알고 있지만 이 값이 어디에 위치해 있는지는 아직 모릅니다.
배열에서 원소를 검색하려면 '1D 배열 검색 함수'를 사용하면 됩니다.
마찬가지로 '1D 배열 검색 함수'의 도움말을 보고 시작할게요.
1D라는 것은 Dimension 즉, 차원을 말합니다.
'1D 배열 검색 함수'는 1차원 배열에서의 원소 값을 찾을 수 있습니다.
1D 배열에는 검색할 대상이 되는 배열을 입력하고 원소에는 검색하려는 값을 입력합니다.
시작 인덱스는 검색할 위치를 지정합니다. 입력된 위치의 인덱스에서부터 검색을 시작해요.
'1D 배열 검색 함수'는 원소를 찾게 되면 결과를 출력하며 정지합니다. 이 말은 즉 원소를 찾기 전에는 모든 배열을 다 검색하며 원소를 찾는다는 것입니다.
지금은 배열의 크기가 작고 배열의 개수도 적으니 괜찮지만, 프로그램이 커져서 배열의 크기와 개수가 많아지면 그만큼 루프 타임에 시간을 잡아먹습니다.
어느 한 부분에서 과도하게 리소스를 잡아먹으면 다른 부분에서 문제가 생길 수밖에 없어요.
중요한 통신 시그널 또는 프로그램 내부의 트리거 같은 것들을 못 받고 지나쳐 버릴 수도 있으니 코드 작성을 할 때는 시간 관리에 주의해야 해요.
그렇기 때문에 찾으려는 원소의 대략적인 위치를 안다면 인덱스를 입력해 주는 것이 프로그램 속도 면에서 안정적입니다.
지금은 인덱스를 입력하지 않고 넘어가도록 할게요.
아까 만들어둔 다층 시퀀스에 다음 시퀀스를 추가한 다음 작업을 진행했습니다.
먼저 '1D 배열 검색 함수'를 블록 다이어그램에 올리고 난수 배열의 로컬 변수를 만들어 읽기 모드로 변경한 뒤 '1D 배열 검색 함수'의 1D 배열 칸에 입력합니다.
원소 칸에는 이전 시퀀스에서 찾은 가장 큰 값을 입력해줍니다.
이전 시퀀스의 큰 배열의 최댓값 변수를 로컬 변수로 만들고 읽기 모드로 설정 한 뒤 '1D 배열 검색 함수'의 원소 칸에 입력했습니다.
'1D 배열 검색 함수'가 찾은 인덱스를 배열 인덱스 함수에 입력해서 해당 인덱스 값이 정말로 가장 큰 값인지 확인해볼게요.
프런트 패널로 와서 코드를 실행하고 결과값을 확인해보면 난수 배열의 가장 큰 수와 5보다 크거나 같은 배열의 최대값이 9.91665로 동일하네요. ㅎㅎ
이렇게 몇 가지 함수를 더 사용해서 랩뷰의 배열 함수를 더 심도 있게 실습해보았습니다.
배열이 2D, 3D 등 다차원으로 커져도 배열을 잘라내야 하는 부분이 어딘지만 명확하게 정리하면 쉽게 작업할 수 있어요.
다음 강의로 또 뵐게요.
이 글을 포스팅하는 도중에 마우스 조작을 잘못해서 쓴 글이 모두 날아갔어요ㅜㅠ
아,,,, 임시저장도 안 해둬서 ,,, 원래는 다른 곳에 적고 복사해서 붙여 넣기 했는데 하필 바로 작성하는 날 이런 사고가,,
다시 적으려니 진이 쭉 빠지는데 뭐 어쩌나요 다시 써야지,,,