씻다 , 헹구기 , 반복하다 "다시 해"를 의미하거나 무한 루프를 유머러스하게 암시할 수 있는 영어 관용구입니다. 스크립팅 컨텍스트에서 함수 또는 일련의 단계를 반복하는 것을 반복 또는 루핑이라고 합니다.반복은 매우 중요한 스크립팅 기술입니다. 다음은 간단한 논리 다이어그램과 해당 JSL 코드입니다. 을 위한 고리.

초보 스크립터가 기본 스크립트의 구문을 배우면 을 위한 루프, 자주 그들은 "어떻게 해야 하나요?"라고 묻습니다.
- 반복 횟수를 알 수 없는 경우 반복
- 한 번 일찍 루프를 중지 N 이벤트가 집계되었습니다
- 특정 조건에 대해 단계 블록 실행을 건너뛰지만 계속 반복하는 등의 작업을 수행합니다.
다음은 4장 "섹션"에서 발췌한 것입니다. 조건부 함수 ", " 반복 " 의 JSL Companion, JMP 스크립팅 언어의 응용 프로그램, 제2판 기본 사항을 제시하고 이러한 질문을 해결합니다. 해당 섹션의 예제 스크립트가 첨부되어 있습니다. 이 책의 서문에서 언급한 바와 같이 "예제 스크립트에는 이 책에 담을 수 있는 것보다 훨씬 많은 정보가 포함되어 있습니다."
반복
JSL에는 루프 또는 반복되는 여러 기능이 있습니다. 반복 루프의 기본 구조는 다음을 포함합니다.
- 시작 또는 초기 조건
- 테스트 또는 while 조건
- 증분, 단계 크기 또는 반복 시퀀스
- 실행할 JSL 코드의 본문 또는 블록
테스트 조건이 true인 동안 JSL의 본문이 실행됩니다. 이 블로그와 스크립트의 나머지 부분 4_Iterating.jsl JMP 반복 함수의 예와 설명을 제공합니다.
각 행에 대해 및 각 값 설정
각 행에 대해 그리고 각 값 설정 데이터 테이블에 대한 특수 반복 메시지이며, 초기 조건은 소스 데이터 테이블의 첫 번째 행인 Row( ) = 1입니다. 종료 조건은 마지막 행입니다. 증분은 1입니다. 행( ) = 행( ) + 1입니다. 테스트 조건은 while 조건으로 간주될 수 있습니다: Row( ) <= N Row(dt). 처음 세 가지 구조적 구성 요소(초기, 동안 및 증분)가 내장되어 있습니다.
구문은 각 행에 대해( , 본문 ) .
합계 및 곱 함수
그만큼 요약 그리고 제품 기능은 특별합니다. 이러한 기능에서 기본 작업은 해당 이름에 내장되어 있습니다. 세 개의 인수는 일반적으로 변수에 할당되는 초기 값, 최종 값(i <= 6)이며 여기서 1 증가가 암시되고 세 번째 인수 또는 본문에는 합산되거나 곱해지는 것이 포함됩니다.
six_evens = Summation(i=1,6,2*i); // 42 Sum of 1st 6 even integers
six_odds = Summation(i=1,6,2*i-1); // 36 Sum of 1st 6 odd integers
power3to5 = Product(i=1,5,3); // 3*3*3*3*3 = 3^5 = 243
a = 2; b = 4; d = (b - a)/10; //d is step size for 10 intervals
integration_approx = Summation( i=1, 10, d*( a + ( i-.5 )*d)^2);
// 18.66 Integral(x^2) = (x^3)/3 = 64/3 – 8/3 = 56/3
show(six_evens, six_odds, power3to5, integration_approx);
For 및 While 함수
을 위한 그리고 하는 동안 전통적인 프로그래밍 반복 함수입니다. 일반적으로, 을 위한 계산할 때, 단계 크기가 일정하거나 반복 횟수를 계산할 수 있을 때 사용됩니다. 하는 동안 테스트 또는 while 조건에 더 복잡한 논리가 필요하거나 증분이 조건부일 때 가장 일반적으로 사용됩니다. 모든 을 위한 ( ) 코드 블록은 다음과 같이 작성할 수 있습니다. 하는 동안 ( ) 코드 블록이지만 그 반대는 사실이 아닐 수 있습니다.
예
이전 사용 통합_대략 예를 들어, 연속적으로 더 나은 근사값을 얻기 위해 반복 루프를 만듭니다. 10개의 간격으로 시작하여 연속 반복할 때마다 간격 수가 두 배가 됩니다. 이 첫 번째 예제는 5회 반복 후에 중지됩니다.
a = 2; b = 4; lastVal = 1000;
integration_approx = 0;
For( k = 1, k <= 5, k++,
If( k == 1,
n = 10,
n = 2 * n
);
lastVal = integration_approx; //needed to check convergence
d = (b - 2) / n;
integration_approx = Summation( i = 1, n, d * (a + (i - .5) * d) ^ 2 );
//-- show convergence
Show (k, n, d, integration_approx, integration_approx - lastVal);
); //end For
특정 수렴 기준이 필요하다고 가정합니다. 그만큼 4_Iterating.jsl 스크립트에는 이를 수행하기 위한 몇 가지 옵션이 있습니다. 이전 코드 조각에는 이미 필요한 논리가 있습니다. lastVal 그리고 통합_대략 시작 값이 있습니다. 절대 연속 차이가 수렴 기준보다 작을 때 스크립트가 중지됩니다.
이 스크립트의 한 변형은 수렴 기준을 테스트 인수의 표현식으로 사용합니다. 을 위한 고리. 다음 스크립트는 부서지다( ) 그만하다. 이 예는 각 을 위한 루프 인수는 여러 변수를 시작하거나 여러 변수를 증가시키거나 다른 작업을 수행하는 코드 블록일 수 있습니다. 실행할 코드 블록을 정의하기 위해 세미콜론이 JSL 문을 함께 바인딩한다는 점을 상기하십시오.
//Uses Break() to stop looping, an early stop when convergence is met
//Note n *= 2 is equivalent to n = 2*n
a = 2; b = 4;
For( k = 1; lastVal = 1000; integration_approx = 0; n = 10 , //multiple initial values
k < 100, //test
k++; n *= 2 , //increment
lastVal = integration_approx; //body...
d = (b - a) / n;
integration_approx = Summation( i = 1, n, d * (a + (i - .5) * d) ^ 2 );
If (Abs( integration_approx - lastVal ) < 1e-5, Break() );
);
Show (k, n, d, integration_approx, integration_approx - lastVal);
당신이 처음이라면 을 위한 루프에서 이 스크립트의 각 변형에 대한 로그 창의 k 및 n 값을 검토합니다. 초기 루프 후 JMP는 테스트 코드 블록을 실행하기 전에 증분 코드 블록을 실행합니다. 프로그래머는 루프 맨 아래에서 증가 . 이전 코드 스니펫의 경우 k=7 및 n=640일 때 수렴 기준이 충족되고 부서지다( ) 중지 을 위한 증분 코드 블록이 실행되기 전에 루프. 전체 스크립트(여기에 표시되지 않음)에서 하나의 변형에는 테스트 코드 블록의 표현식으로 수렴 기준이 있습니다. 따라서 증가 블록이 먼저 실행되고 k=8 및 n=1280인 다음 테스트 블록이 중지됩니다. 을 위한 고리.
제대로 된 확인 없이, 을 위한 그리고 하는 동안 루프는 무한정 반복될 수 있으며 이를 무한 루프 . 이것은 일반적으로 문제입니다. 이전 코드에서 추가된 조건 k < 100은 k가 매번 1씩 증가하는 한 루프가 99회 반복 후에 종료되도록 합니다. 대부분의 무한 루프는 경계 검사 부족과 경계 변수 파괴로 인해 발생합니다. 예를 들어 JSL 문 k++가 삭제되고 근사치가 분기된 경우 을 위한 루프는 무기한 반복되거나 JMP 예외가 발생할 때까지 반복됩니다. 의도적인 무한 루프가 유용한 드문 경우가 있습니다. 일반적으로 서비스 또는 개체 상태를 확인하는 데 사용되며 중단 또는 종료 문을 포함합니다. 그것들은 이 블로그[책]의 범위를 벗어납니다.
코드 본문을 실행할 수 없거나 실행해서는 안 되는 경우가 있을 수 있습니다. JMP 샘플 데이터 세트 고려 반도체 능력.jmp . 열 P1 및 M1에는 하나의 고유한 값만 있습니다. 관리도 또는 분포도는 그래픽 공간 낭비입니다. 값이 모두 누락되었거나 사용자 정의 열 목록에 숫자가 아닌 열이 포함된 시나리오를 찾아서 무시해야 합니다. 이 시나리오는 계속하다 기능. 이 경우 이용자에게 알리고, 표제 , 로그 창에 메모를 작성하거나 저널 파일에 텍스트 상자를 추가하고 목록의 나머지 열 분석을 계속합니다. 루프에서 벗어나고 싶지만 프로그램을 계속하고 싶은 경우가 있을 수 있습니다. 그리고 더 심각한 경우에는 전체 프로그램을 중지해야 할 수도 있습니다. 표 4.1은 반복을 중지하는 함수의 동작을 설명합니다.
표 4.1 반복을 중지하는 데 사용되는 함수
기능
|
결과
|
계속하다( )
|
루프의 현재 반복을 다음 위치에서 중지합니다. 계속하다 다음 반복이 시작될 때 루프를 시작합니다.
|
부서지다( )
|
다음 위치에서 루프 실행을 중지합니다. 부서지다 루프 외부의 첫 번째 명령문에서 다시 실행을 시작합니다.
|
던지다( )
|
던지다( 메시지 ) 로그 창에 메시지를 쓰고 스크립트 실행을 중단합니다. 이 기능은 종종 다음과 함께 사용됩니다. 노력하다( ) 또는 만약에( ) 문제를 파악하려면 좋은 오류 메시지를 만들고 안전하게 종료하는 단계를 수행한 다음 메시지를 던집니다.
|
계속하다 그리고 부서지다 의 본체에 사용할 수 있습니다. 을 위한 , 하는 동안 , 그리고 각 행에 대해 기능. 던지다 거의 모든 곳에서 사용할 수 있습니다. 메모 멈추다( ) 실행 중인 스크립트를 즉시 중지합니다.
추가 예시
그만큼 4_Iterating.jsl 스크립트에는 이전 장의 기술을 사용하여 많은 추가 기능이 있는 코드 블록이 포함되어 있습니다. ( ~와 같은 열려 있는 , 종류 , 요약 , 목록 및 기능 ) 그리고 앞으로의 챕터. 이 코드 스니펫은 계속하다 기능:
//Create a custom chart for each response with a non-constant value
For( i=1, i <= nitems(cList), i++,
if( Col Std Dev( column( cList[i] ) ) == 0,
tmpStr = cList[i] || " has no variation, no charts created";
Caption( tmpStr ); //caption
VListBox( Outline Box(tmpStr) ) << journal; //journal
show( tmpStr ); //Log window
Wait( 5 ); Caption( Remove );
Continue()
//go to the bottom of the loop, skip remaining "body" of code
); // end if
cc = lot_sumry_dt << Control Chart(
Sample Label( :lot_id ),
KSigma( 3 ),
Chart Col( eval(cList[i]), Levey Jennings )
); //end control chart
report(cc)[OutlineBox(2)]<<JOURNAL></JOURNAL>
이 블로그 게시물의 내용은 우리 책에서 발췌한 것입니다. JSL Companion: JMP 스크립팅 언어의 응용, 제2판 에서 JMP 스크립팅 언어 작업에 대한 더 많은 기술과 예를 찾을 수 있습니다.