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