Lavare , risciacquo , ripetere è un idioma in lingua inglese che potrebbe implicare "fallo di nuovo" o implicare umoristicamente un ciclo infinito. La ripetizione di una funzione o di una serie di passaggi nel contesto dello scripting è chiamata iterazione o looping.L'iterazione è una tecnica di scripting molto importante. Di seguito è riportato il diagramma logico e il corrispondente codice JSL di un semplice Per ciclo continuo.

Una volta che uno scripter alle prime armi impara la sintassi di un basic Per loop, spesso, chiedono "Come faccio":
- Iterare quando il numero di iterazioni è sconosciuto
- Ferma un ciclo in anticipo una volta N gli eventi sono stati contati
- Salta l'esecuzione del blocco di passaggi per determinate condizioni, ma continua a eseguire il ciclo, ecc.
Di seguito è riportato un estratto dal capitolo 4, sezione " Funzioni condizionali "," Iterare " Di JSL Companion, Applicazioni del linguaggio di scripting JMP, seconda edizione che presenta le basi e affronta queste domande. In allegato c'è lo script di esempio di quella sezione. Come affermato nella prefazione del libro "Gli script di esempio contengono ... molte più informazioni di quelle che potremmo inserire in questo libro".
Iterare
JSL ha diverse funzioni che eseguono cicli o iterazioni. La struttura di base di un ciclo di iterazione include quanto segue:
- Inizio o condizione iniziale
- Test o condizione while
- Incremento, dimensione del passo o sequenza di iterazione
- Corpo o blocco di codice JSL da eseguire
Il corpo di JSL viene eseguito finché la condizione di test è vera. Il resto di questo blog e script 4_Iterating.jsl fornire esempi e descrizioni delle funzioni di iterazione di JMP.
Per ogni riga e Imposta ogni valore
Per ogni riga E Imposta ogni valore sono messaggi di iterazione speciali per le tabelle di dati, dove la condizione iniziale è Row( ) = 1, la prima riga della tabella di dati di origine. La condizione finale è l'ultima riga. L'incremento è 1: Riga( ) = Riga( ) + 1. La condizione di test può essere considerata una condizione while: Row( ) <= N Row(dt). I primi tre componenti strutturali (initial, while e increment) sono incorporati.
La sintassi è Per ogni riga ( , corpo ) .
Funzioni di sommatoria e prodotto
IL Somma E Prodotto le funzioni sono speciali In queste funzioni, l'attività principale è incorporata nel suo nome. I tre argomenti sono il valore iniziale tipicamente assegnato a una variabile, il valore finale (i <= 6), dove è implicito un incremento di 1 e il terzo argomento o corpo include ciò che viene sommato o moltiplicato.
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);
Funzioni For e While
Per E Mentre sono funzioni di iterazione di programmazione tradizionali. Tipicamente, Per viene utilizzato durante il conteggio e quando la dimensione del passo è coerente o è possibile calcolare il numero di iterazioni. Mentre è più comunemente usato quando la condizione test o while richiede una logica più complessa o l'incremento è condizionale. Ogni Per ( ) blocco di codice può essere scritto come a Mentre ( ) blocco di codice, ma potrebbe non essere vero il contrario.
Esempio
Usando il precedente integrazione_ca esempio, creare un ciclo di iterazione per ottenere approssimazioni successivamente migliori. Inizia con 10 intervalli e ogni iterazione successiva raddoppierà il numero di intervalli. Questo primo esempio si interrompe dopo cinque iterazioni.
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
Supponiamo di volere uno specifico criterio di convergenza. IL 4_Iterating.jsl script contiene diverse opzioni per farlo. Il frammento di codice precedente ha già la logica necessaria: lastVal E integrazione_ca hanno valori di partenza. Lo script si interrompe quando la differenza successiva assoluta è inferiore al criterio di convergenza.
Una variazione di questo script utilizza il criterio di convergenza come espressione nell'argomento di test di Per ciclo continuo. Lo script seguente utilizza a Rottura( ) fermare. Questo esempio dimostra che ciascuno dei Per gli argomenti del ciclo possono essere un blocco di codice, l'avvio di più variabili, l'incremento di più variabili o l'esecuzione di altre attività. Ricordiamo che i punti e virgola legano insieme le istruzioni JSL per definire il blocco di codice da eseguire.
//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);
Se sei nuovo a Per loop, rivedere i valori di k e n nella finestra Log per ogni variazione di questo script. Dopo il ciclo iniziale, JMP esegue il blocco di codice incrementale prima di eseguire il blocco di codice test. I programmatori lo chiamano incrementando alla fine del ciclo . Per il frammento di codice precedente, quando k=7 e n=640, il criterio di convergenza è soddisfatto e Rottura( ) ferma il Per loop prima che venga eseguito il blocco di incremento del codice. Nello script completo (che non è mostrato qui), una variazione ha il criterio di convergenza come espressione nel blocco di codice di test. Quindi, il blocco di incremento viene eseguito per primo, k=8 e n=1280, quindi il blocco di test interrompe il Per ciclo continuo.
Senza controlli adeguati, Per E Mentre i cicli possono iterare all'infinito, che è chiamato an ciclo infinito . Questo di solito è un problema. Nel codice precedente, la condizione aggiunta k < 100 garantisce che il ciclo termini dopo 99 iterazioni, purché k venga incrementato di 1 ogni volta. La maggior parte dei loop infiniti è causata dalla mancanza di controlli sui limiti e dalla distruzione delle variabili di confine. Ad esempio, se l'istruzione JSL k++ è stata eliminata e l'approssimazione è divergente, the Per loop si ripeteva all'infinito o fino a quando non creava un'eccezione JMP. Ci sono rari casi in cui un ciclo infinito intenzionale è utile. In genere, vengono utilizzati per verificare lo stato di un servizio o di un oggetto e includono un'istruzione di interruzione o di terminazione. Vanno oltre lo scopo di questo blog [libro].
Potrebbero esserci casi in cui il corpo del codice non può o non deve essere eseguito. Considera il set di dati di esempio di JMP Capacità dei semiconduttori.jmp . Le colonne P1 e M1 hanno un solo valore univoco: un grafico di controllo o un grafico di distribuzione è uno spreco di spazio grafico. Gli scenari in cui mancano tutti i valori o in cui un elenco di colonne definito dall'utente include una colonna non numerica devono essere trovati e ignorati. Questo scenario è un buon caso per a Continua funzione. In questo caso, informare l'utente, inviare un messaggio con a Didascalia , scrivere una nota nella finestra Log o aggiungere una casella di testo ai file journal e continuare ad analizzare le restanti colonne nell'elenco. Potrebbero esserci casi in cui vuoi uscire dal giro, ma vuoi anche continuare il programma. E, nei casi più gravi, potresti voler interrompere l'intero programma. La Tabella 4.1 descrive il comportamento delle funzioni per interrompere l'iterazione.
Tabella 4.1 Funzioni utilizzate per interrompere l'iterazione
Funzione
|
Risultato
|
Continua( )
|
Interrompe l'iterazione corrente di un ciclo in corrispondenza di Continua e inizia il ciclo all'inizio dell'iterazione successiva.
|
Rottura( )
|
Interrompe l'esecuzione del ciclo in corrispondenza di Rottura istruzione e ricomincia l'esecuzione dalla prima istruzione fuori dal ciclo.
|
Gettare( )
|
Gettare( msg ) scrive un messaggio nella finestra Log e interrompe l'esecuzione dello script. Questa funzione è spesso utilizzata con Tentativo( ) O Se( ) per rilevare il problema, creare un buon messaggio di errore, eseguire i passaggi per uscire in modo sicuro e quindi lanciare un messaggio.
|
Continua E Rottura può essere utilizzato nel corpo del Per , Mentre , E Per ogni riga funzioni. Gettare può essere utilizzato quasi ovunque. Nota Fermare( ) arresta immediatamente lo script in esecuzione.
Esempio supplementare
IL 4_Iterating.jsl script include un blocco di codice che ha molte funzionalità extra, utilizzando le tecniche dei capitoli precedenti ( ad esempio Aprire , Ordinare , Riepilogo , liste e funzioni ) e futuri capitoli. Questo frammento di codice è un esempio di Continua funzione:
//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>
Il contenuto di questo post sul blog è stato condensato da un estratto del nostro libro, Compagno JSL: applicazioni del linguaggio di scripting JMP, seconda edizione , dove troverai ulteriori tecniche ed esempi di utilizzo del linguaggio di scripting di JMP.