CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC PROGRAM OBFUSCATE CONSTANT = 5. INVERSE = 1./CONSTANT photo1 = 5.*INVERSE + 5. pH = CONSTANT + 3. X = photo1 * pH C strange combination of pH and photolysis... GOTO 1 X = X + 17. 1 CONTINUE IF (X .LT. 60.) THEN X = X + 7. PRINT *,'RESULT=',X STOP END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
Hopefully the formatting comes out OK; consult the original if in doubt. The question, of course, is what does the code print, and more importantly exactly why? I'm off to the Lakes for a few days to get rained on, so unless you can work out the answer for yourselves, you'll have to wait till I come back.
Obviously, C would never do anything so odd.
And the answer, as EFS found, comes in three parts:
1. The easy one is that without IMPLICIT NONE, any variable starting with I (to N) is implicitly an integer, so INVERSE is 0, not 0.2.
2. The first amusing one is that any non-blank character in column 6 is a continuation marker. Comments are discarded, so we have:
X = photo1 * pH OTO 1and since spaces are also discarded, we actually have
X = photo1 * pHOTO1So (since case is also discarded) after that X is 25. To which we add 17, getting 42, of course.
3. Then, lastly, Fortran has a block IF, but also a single-line IF, and
IF (X .LT. 60.) THEN X = X + 7can't be a block IF (despite the formatting trying to make the end-of-code "END" look like it's closing), so it's actually
IF (X .LT. 60.) THENX = X + 7And so we end up with a variable called THENX with value 49, and X with value 42.
X = photo1 * pHOTO1 (basically the G in GOTO! is read as a continuation of the previous statement)
(G in GOTO! occupies the 6th character position which is the default position for a FORTRAN continuation statement)
X = photo1 * pH
X = 25.
X = 25. + 17. = 42.
The FORTRAN compiler ignores case/spaces everywhere (by default, if there are no 'normal' FORTRAN syntax errors), thus spaces or tabs upper/lower case are ignored and thus ...
X = photo1 * pH
... is actually ...
X = P h O t O 1
x = photo1
... should read ...
"GOTO1" (I held down the shift key when typing "1")
Still messed it up (via online formatting, x=photo1*photo1=25,x=x+17=42), but I know the answer.
INVERSE is an integer by default, thus inverse=1/5=0 (default F77 is 6 characters, but doesn't matter here due to revisions to the FORTRAN standard). I normally follow the F&& standard except when I don't, which is often, thus all my codes are wrong but always give me my preferred answers.
It's Greek to me.
EFS: nearly. You've missed the last trick though.
if you mean that ...
IF (X .LT. 60.) THEN X = X + 7.
... is ...
IF(X.LT.60.)THENX=X+7. (which isn't printed out)
Otherwise, I'm still missing the last trick?
I use the Intel FORTRAN compiler ,,,
No additional statement can be placed after the IF THEN statement in a block IF construct. For example, the following statement is invalid in the block IF construct:
IF (e) THEN I = J
This statement is translated as the following logical IF statement:
IF (e) THENI = J"
If I thought that that if then construct was even valid, I would have said so (and the answer would have been 49 instead of 42). But then I already knew that it wasn't, didn't think it was of any value, since it does nothing relative to the 'RESULT=',X statement. And no, I just looked it up like 10 seconds ago (but I already knew it was not a proper if/then construct and that it will still get through the compiler anyways).
I go back with that particular compiler to when DEC owned it (very early 1983 is when I 1st used it).
BTW, I 1st learned FORTRAN in the fall of 1975 (IBM 360 with little donuts for memory). I 1st learned BASIC in the fall of 1972 (self taught 18 years old Dartmouth timeshare while at VTC). There were no computer courses at the time I went to HS (I only did NC punched tape in technical drafting, that would take me back to circa 1970).
Post a Comment