Introduces a block-if control structure.
No options
Parameter
expression | Logical expression, indicating whether or not to execute the first set of statements. |
---|
Description
A block-if structure consists of one or more alternative sets of statements. The first of these is introduced by an IF
statement. There may then be further sets introduced by ELSIF
statements. Then you can have a final set introduced by an ELSE
statement, and the whole structure is terminated by an ENDIF
statement. Thus the general form is:
first
IF
expression
statements
then either none, one, or several blocks of statements of the form
ELSIF
expression
statements
then, if required, a block of the form
ELSE
statements
and finally the statement
ENDIF
Each expression must evaluate to a single number, which is treated as a logical value: a zero value is treated as false and non-zero as true. Genstat executes the block of statements following the first true expression. If none of the expressions is true, the block of statements following ELSE
(if present) is executed.
You can thus use these directives to built constructs of increasing complexity. The simplest form would be to have just an IF
statement, then some statements to execute, and then an ENDIF
. For example:
IF MINIMUM(Sales) < 0
PRINT 'Incorrect value recorded for Sales.'
ENDIF
If the variate Sales
contains a negative value, the PRINT
statement will be executed. Otherwise Genstat goes straight to the statement after ENDIF
.
To specify two alternative sets of statements, you can include an ELSE
block. For example
IF Age < 20
CALCULATE Pay = Hours*1.75
ELSE
CALCULATE Pay = Hours*2.5
ENDIF
calculates Pay
using two different rates: 1.75 for Age
less than 20, and 2.5 otherwise.
Finally, to have several alternative sets, you can include further sets introduced by ELSIF
statements. Suppose that we want to assign values to X
according to the rules:
X
=1 if Y
=1
X
=2 if Y
≠ 1 and Z
=1
X
=3 if Y
≠ 1 and Z
=2
X
=4 if Y
≠ 1 and Z
≠ 1 or 2
This can be written in Genstat as follows:
IF Y == 1
CALCULATE X = 1
ELSIF Z == 1
CALCULATE X = 2
ELSIF Z == 2
CALCULATE X = 3
ELSE
CALCULATE X = 4
ENDIF
If Y
is equal to 1, the first CALCULATE
statement is executed to set X
to 1. If Y
is not equal to 1, Genstat does the tests in the ELSIF
statements, in turn, until it finds a true condition; if none of the conditions is true, the CALCULATE
statement after ELSE
is executed to set X
to 4. Thus, for Y
=99 and Z
=1, Genstat will find that the condition in the IF
statement is false. It will then test the condition in the first ELSIF
statement; this produces a true result, so X
is set to 2. Genstat then continues with whatever statement follows the ENDIF
statement. Block-if structures can be nested to any depth, to give conditional constructs of even greater flexibility.
Options: none.
Parameter: unnamed.
See also
Directives: ELSIF
, ELSE
, ENDIF
, EXIT
, CASE
, CALCULATE
.
Commands for: Program control.
Example
" Example 1:5.3.2. 1:5.4.4 " PROCEDURE '%TRANSFORM' " Define the arguments of the procedure." OPTION NAME='METHOD'; MODE=t;\ VALUES=!t(Logit,Comploglog,Angular);\ DEFAULT='LOGIT' PARAMETER NAME='PERCENT','RESULT';\ MODE=p; SET=yes; DECLARED=yes,no;\ TYPE=!t(scalar,variate,matrix,symmetric,diagonal,table);\ COMPATIBLE=*,!t(type,nvalues);\ PRESENT=yes,no IF METHOD .EQS. 'Logit' CALCULATE RESULT = LOG( PERCENT / (100-PERCENT) ) ELSIF METHOD .EQS. 'Comploglog' CALCULATE RESULT = LOG( -LOG((100-PERCENT)/100) ) ELSIF METHOD .EQS. 'Angular' CALCULATE RESULT = ANGULAR(PERCENT) ENDIF ENDPROCEDURE VARIATE [VALUES=10,20...90] Every10% " default setting 'logit' for METHOD " %TRANSFORM Every10%; RESULT=Logit10% PRINT Every10%,Logit10%; DECIMALS=0,3 %TRANSFORM [METHOD=A] 25,50,75; RESULT=Ang25,Ang50,Ang75 PRINT Ang25,Ang50,Ang75 COMMANDINFORMATION '%TRANSFORM','CAPTION','DOTPLOT','NOTONE';\ IMPLEMENTATION=tranimp,capimp,dotimp,notimp;\ CHANNEL=tranchan,capchan,dotchan,notchan;\ PRESENT=trancheck,capcheck,dotcheck,notcheck PRINT tranimp,tranchan,trancheck & capimp,capchan,capcheck & dotimp,dotchan,dotcheck & notimp,notchan,notchec