type *.for FACULTY:[IJL.COMPUTER.CS323.FORTRAN]ARNOLD.FOR;4 C Stephanie Arnold C Project 1 C This is a program that will calculate possible molecular combinations C of Carbon, Oxygen, and Hydrogen, given the total weight. PROGRAM PROJ1A C WC = weight of carbon, WH = weight of hydrogen, WO = weight of oxygen, C CW = calculated total weight, OW = observed total weight, C ERROR = error tolerance, C NC = # carbon items, NH = # hydrogen atoms, NO = # oxygen items, C SOLN = the number of solutions that we have found DOUBLE PRECISION WC, WH, WO, CW, OW INTEGER NC, NH, NO, SOLN C Enter the known weights for C, H, and O DATA WC, WH, WO /12.001, 1.0079, 15.9994/ C Set initial values for the everything else DATA CW, OW, ERROR, NC, NH, NO, SOLN /0.,0.,0.,0,1,0,0/ C Read in the observed weight and error tolerance 10 FORMAT (' Observed weight: Error Tolerance:') WRITE (*,10) 15 FORMAT (2D20.6) READ (*,15) OW,ERROR C Increment the number of oxygen atoms to include C This, in effect, the outer loop. 30 NC = 0 NO = NO + 1 C If the molecule is too big already, then kick out of loop IF ((NO * WO + WC + WH - OW) .GT. OW) GOTO 115 C Increment the number of carbon atoms - inner loop 40 NC = NC + 1 C If the molecule is too big, then kick out of loop IF ((NO * WO + NC * WC + WH - OW) .GT. OW) GOTO 115 IF (NO .GT. (NC * 2)) GOTO 40 C Calculate the number of hydrogen atoms C Until I find out how to round, I will just truncate NH = (OW - NO * WO - NC * WC) / WH C If there isn't at least one atom of H then go to outer loop IF (NH .LT. 1) GOTO 30 C Find the calculated total weight CW = NH * WH + NO * WO + NC * WC IF (NH .GT. (NC * 4)) GOTO 40 IF (ABS(OW - CW) .LE. ABS(ERROR)) THEN GOTO 110 ELSE GOTO 40 ENDIF C We have a solution 110 SOLN = SOLN + 1 IF (SOLN .EQ. 1) CALL PRINT1(OW,ERROR) CALL PRINT2(CW,OW,NC,NH,NO) GOTO 40 C We have no more solutions 120 FORMAT (' No solutions') 115 IF (SOLN .EQ. 0) WRITE(*,120) C The End of the program END C The End of the program CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C Subroutine that prints the solution C C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE PRINT1(OBSW,TLRNC) 400 FORMAT (' Observed Molecular Weight: ',D20.6) WRITE (*,400) OBSW 500 FORMAT (' Experimental Error (+or-): ',D20.6) WRITE (*,500) TLRNC 600 FORMAT (' Possible Formula(s) Calculated Weight Error') WRITE (*,600) 700 FORMAT (' ------------------ ----------------- -----') WRITE (*,700) RETURN END C End of subroutine print1 SUBROUTINE PRINT2(CALCW,OBSW,C,H,O) INTEGER C, H, O DOUBLE PRECISION OE OE = OBSW - CALCW 420 FORMAT (' C H O ',2D20.6) WRITE (*,420), CALCW, OE N = C + H + O 430 FORMAT (I3,2I4) WRITE (*,430), C, H, O RETURN END C End of the subroutine print2 FACULTY:[IJL.COMPUTER.CS323.FORTRAN]CONVEY.FOR;1 PROGRAM CHEMISTRY C C -- CURRENT VALUE FOR NUMBER OF EACH ATOM BEING CONSIDERED INTEGER CCOUNT, HCOUNT, OCOUNT C C -- INDICATED WHETHER OR NOT ANY FORMULAE WERE FOUND LOGICAL EVENONE C C -- USER-ENTERED SAMPLE AND TOLLERANCE MASSES DOUBLE PRECISION SAMPLE, TOL C C -- MIN AND MAX POSSIBLE OCCURANCES OF EACH ATOM IN THE SAMPLE INTEGER OMAX, HMAX, CMAX C C -- INTERMEDIATE VALUES USED WHEN COMPUTING ATOMIC MASSES DOUBLE PRECISION DTEMP1, DTEMP2 C C ********************* PROGRAM CODE ********************** C C -- CONSTANT DATA FOR MASSES OF SINGLE ATOMS DOUBLE PRECISION CMASS, HMASS, OMASS DATA CMASS, HMASS, OMASS / 12.011, 1.0079, 15.9994 / C C -- GET PARAMETERS FROM USER, ECHO THEM BACK 10 CALL PARAMS(SAMPLE, TOL) C C -- FIND OUT WHETHER OR NOT USER CHOSE THE 'QUIT' OPTION IF ((SAMPLE.EQ.0.0).OR.(TOL.EQ.0.0)) GOTO 500 C -- PUT AN UPPER LIMIT ON THE LOOPING DONE CALL BOUNDS(CMAX, HMAX, OMAX, CMASS, HMASS, OMASS, SAMPLE) C -- SOLVE THE PROBLEM EVENONE = .FALSE. DO 200 CCOUNT = 1,CMAX,1 DO 100 OCOUNT = 1,OMAX,1 C -- TOTAL MASS USED BY CURRENT C, O GUESSES DTEMP1 = (CCOUNT * CMASS) + (OCOUNT * OMASS) C -- REMAINING MASS TO BE TAKEN UP BY HYDROGEN DTEMP2 = (SAMPLE - DTEMP1) C -- CLOSEST NUMBER OF H TO ACCOUNT FOR REMAINING MASS HCOUNT = IROUND(DTEMP2 / HMASS) C -- CHECK FOR ACCURACY OF GUESS DTEMP1 = (CCOUNT * CMASS) + (OCOUNT * OMASS) 2 + (HCOUNT * HMASS) C -- SKIP OUTPUT OF FORMULA IF IT ISN'T VALID IF ( (ABS(DTEMP1-SAMPLE).GT.TOL).OR.(HCOUNT.LT.0) 2 .OR.((4*HCOUNT).GT.CCOUNT).OR.((2*OCOUNT).GT.CCOUNT)) 3 GOTO 50 EVENONE = .TRUE. CALL WORKS(CCOUNT, HCOUNT, OCOUNT) 50 CONTINUE 100 CONTINUE 200 CONTINUE C C -- IF NOT VALID FORMULAE, SAY SO IF (.NOT.EVENONE) 2 WRITE(*,300) 300 FORMAT (/' SORRY, NO VALID COMBINATIONS WITHIN TOLERANCE'//) C -- LOOP BACK TO BEGINNING FOR MORE INPUT GOTO 10 500 CONTINUE END C C ********************* FUNCTIONS/SUBROUTINES ********************** C SUBROUTINE PARAMS(S, T) C -- GETS THE INPUT PARAMETERS FROM THE USER REAL S, T WRITE(*, 600) 600 FORMAT (//' PLEASE ENTER SAMPLE ATOMIC MASS AND TOLLERANCE'/ ) READ(*,*) S, T RETURN END C C -------------------------------------------------------------------- C SUBROUTINE BOUNDS(CMAX, HMAX, OMAX, CMASS, HMASS, OMASS, MOLMAS) C -- COMPUTES UPPER BOUNDS OF POSSIBLE PRESENCE OF EACH ELEMENT IN MOL. INTEGER CMAX, HMAX, OMAX REAL CMASS, HMASS, OMASS, MOLMAS CMAX = INT(MOLMAS / CMASS + 2.) HMAX = INT(MOLMAS / HMASS + 2.) OMAX = INT(MOLMAS / OMASS + 2.) RETURN END C C -------------------------------------------------------------------- C INTEGER FUNCTION IROUND(X) C -- GIVEN A REAL, RETURNS NEAREST INTEGER DOUBLE PRECISION X IROUND = INT(X + .5) RETURN END C C -------------------------------------------------------------------- C SUBROUTINE WORKS(C,H,O) INTEGER C, H, O WRITE (*,1000) C, H, O 1000 FORMAT (/' C = 'I4', H = 'I4', O = 'I4) RETURN END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]DEMO.FOR;5 1 WRITE(6,*) '1234567.8901' READ(5,10,END=1000,ERR=100) FLOATV 10 FORMAT(F12.4) WRITE(6,*) FLOATV WRITE(6,*) 'X1234567890' READ(5,20,END=1000,ERR=100) INTV 20 FORMAT(1X,I10) WRITE(6,*) INTV GO TO 1 100 WRITE(6,*) 'INPUT IS NOT VALID' GO TO 1 1000 STOP 'END-OF-FILE SIGNALED' END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]DEMO2.FOR;2 DO 100 I = 3.100 PRINT *, DO100I END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]EQUIV.FOR;16 REAL X INTEGER I LOGICAL L(4) CHARACTER * 1 C(4) EQUIVALENCE (X,I,L,C) X=42.0 WRITE(6,*) X WRITE(6,*) I WRITE(6,*) L WRITE(6,*) C I=42 WRITE(6,*) X WRITE(6,*) I WRITE(6,*) L WRITE(6,*) C L(1)=.TRUE. L(2)=.FALSE. L(3)=.FALSE. L(4)=.TRUE. WRITE(6,*) X WRITE(6,*) I WRITE(6,*) L WRITE(6,*) C C(1) = 'J' C(2) = 'O' C(3) = 'H' C(4) = 'N' WRITE(6,*) X WRITE(6,*) I WRITE(6,*) L WRITE(6,*) C END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]FORTRANQ.FOR;1 PROGRAM Quiz C DECLARATIONS OF VARIABLES (ALL VARIABLES USED BELOW MUST BE DECLARED) INTEGER C, H DOUBLE PRECISION CWeight, HWeight, maxWt C INITIALIZATION OF CWeight, HWeight = ATOMIC WEIGHTS OF C AND H DATA CWeight, HWeight / 12.011, 1.0079/ C READ THE SPECIFIED MAXIMUM WEIGHT, maxWt READ (*,101) maxWt 101 FORMAT(F10.4) C LOOP THROUGH ALL POSSIBLE NUMBERS OF C'S AND H'S DO 105, C = 1, INT((maxWt - HWeight) / CWeight) DO 104, H = 1, INT((maxWt - C*CWeight) / HWeight) WRITE (6, 102) C*CWeight + H*HWeight 102 FORMAT(1X, 'C H has molecular weight', F8.4) WRITE (6, 103) C, H 103 FORMAT(1X, 2I4) 104 CONTINUE 105 CONTINUE END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]OUT.FOR;1 C Just a couple of words about your evaluation of FORTRAN ... first, remember C that it really matters! The value of the written evaluation is equivalent to C 1/3 the value of the project, itself ... so this isn't something that you C should just do really quickly on the way to class because we'll be looking C for a thoughtful write-up, prepared with good style. C Also remember that the evaluation is to be done individually even though you C may have worked with a partner. C When writing the evaluation try not to think of it in terms of, "Was this C mini-project easy? In that case this language was a good one to use..." C because it's to be expected that your first program of substance in any new C language will be a bit difficult to produce. Instead, think of the various C LANGUAGE EVALUATION CRITERIA which were presented in class and in the C textbook. C You may find it to be useful to organize your paper in the following way... C PROS C - List the language criteria for which the language excels. Be specific C in explaining HOW the language excels C CONS C - List the language criteria for which the language seems to be lacking. C Again be specific in your criticism by giving actual examples C Personal evaluation C - Would you ever willfully use the language again for some other project? C If not why not (specifically) ... if so, what would the reason be C for choosing FORTRAN ... what kind of specific requirement would C prompt you to choose the language rather than, say, Pascal, C or C++? C -------------------------------------- C The project is due in class on Wednesday ... it will also be accompanied by C the project quiz ... In order to ENCOURAGE EXCELLENCE in the writing of the C evaluation, I will accept the evalaution any time on Wednesday ... just slip C it under the door if the door is closed, Don! ;) C By the way, go ahead and extract this and execute it! 10 FORMAT(1X18HHAPPY PROGRAMMING!) WRITE(6,10) STOP 'REMEMBER -- QUALITY COUNTS!' END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]PLOT.FOR;19 PROGRAM PLOT C C BASED ON 'PROGRAMMING WITH FORTRAN' SCHAUM'S OUTLINE SERIES C EXAMPLE ON PAGE 258 C INTEGER BLANK, DOT, CROSS, LINE(61), LINEY(61) DATA BLANK, DOT, CROSS, LINE, LINEY /' ', '.', 'X', 61*' ', 61*'.'/ WRITE(6,10) 10 FORMAT('1',10X,'GRAPH OF A FUNCTION'//3X,'X',6X,'Y'//) X = -4. 50 Y = F(X) C C THIS NEXT STEP IS VERY EMPIRICAL. NOT AT ALL GENERAL. C J = INT((Y + 39.5)/1.5) IF (J.GT.61.OR.J.LT.1) STOP 'RESULT OUT OF RANGE' C C TEST TO SEE IF WE'RE NEAR THE AXIS C IF (ABS(X).LT.0.001) GO TO 100 LINE(30) = DOT LINE(J) = CROSS WRITE(6,20) X, Y, LINE 20 FORMAT(1X,2(F6.2,1X),61A1) LINE(J) = BLANK GO TO 200 100 LINEY(J) = CROSS WRITE(6,20) X, Y, LINEY 200 X = X + 0.1 IF (X.LE.4.0) GO TO 50 STOP 'EXECUTION COMPLETE' END C REAL FUNCTION F(VAL) REAL VAL F = ((2.0*VAL-1.0)*VAL-22.0)*VAL+21. RETURN END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]PROJ1.FOR;1 C C CS323 FORTRAN PROJECT - PROFESSOR'S VERSION C C THIS PROGRAM READS AN OBSERVED MOLECULAR WEIGHT AND EXPERIMENTAL ERROR FOR C A CHEMICAL UNKNOWN COMPOSED OF C, H, AND O. IT THEN PRINTS ALL CHEMICALLY C FEASIBLE FORMULAS WHOSE CALCULATED MOLECULAR WEIGHT IS SUFFICIENTLY CLOSE. C ANY NUMBER OF DATA SETS MAY BE READ, ONE TO A LINE OF INPUT C DOUBLE PRECISION OBSERVED, EXPERROR, CWEIGHT, HWEIGHT, OWEIGHT, 1 CALCULATED DATA CWEIGHT, HWEIGHT, OWEIGHT /12.011, 1.0079, 15.9994/ INTEGER C, H, O LOGICAL FOUND C 1 READ (*,101,END=999), OBSERVED, EXPERROR 101 FORMAT(D19.0,1X,D19.0) C WRITE (*,102) OBSERVED, EXPERROR 102 FORMAT(1X, 'OBSERVED MOLECULAR WEIGHT: ', F13.6 / 1 1X, 'EXPERIMENTAL ERROR (+OR-): ',F13.6 // 2 1X, 'POSSIBLE FORMULA(S) CALCULATED WEIGHT', 3 ' ERROR' / 4 1X, '------------------- -----------------', 5 ' -----' /) C FOUND = .FALSE. C DO 2, O = 1, INT((OBSERVED+EXPERROR - CWEIGHT - HWEIGHT) 1 / OWEIGHT) DO 2, C = 1, INT((OBSERVED+EXPERROR - O*OWEIGHT - HWEIGHT) 1 / CWEIGHT) H = NINT((OBSERVED - O*OWEIGHT - C*CWEIGHT) / HWEIGHT) CALCULATED = O*OWEIGHT + C*CWEIGHT + H*HWEIGHT IF (ABS(OBSERVED - CALCULATED) .LE. EXPERROR .AND. 1 H .LE. 4*C .AND. O .LE. 2*C) 2 CALL PRINTIT(C, H, O, OBSERVED, CALCULATED, FOUND) 2 CONTINUE C IF (.NOT. FOUND) WRITE(*,103) 103 FORMAT(1X,'NO FORMULAS POSSIBLE') WRITE(*,104) 104 FORMAT(1H0) C GOTO 1 C 999 STOP END C C SUBROUTINE TO ACTUALLY PRINT A FORMULA C SUBROUTINE PRINTIT(C, H, O, OBSERVED, CALCULATED, FOUND) INTEGER C, H, O DOUBLE PRECISION OBSERVED, CALCULATED LOGICAL FOUND C WRITE (*,101), CALCULATED, CALCULATED - OBSERVED, C, H, O 101 FORMAT(1X, 'C H O ', F13.6, 4X, F9.6 / 1 2X, I4, 2X, I4, 2X, I4 / ) C FOUND = .TRUE. C RETURN END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]QUIZ.FOR;2 I = 0 J = 1 10 IF (J.GT.10) GO TO 100 K = 0 20 IF (K.GT.J) GO TO 30 I = I + J * K K = K + 1 GO TO 20 30 J = J + 1 GO TO 10 40 FORMAT(1X,I6) 100 WRITE(6,40) I END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]QUIZB.FOR;8 INTEGER VAL REAL PERCENT, TOLERANCE VAL=42 PERCENT=0.1 TOLERANCE=1.0E-07 10 FORMAT('VAL =',I2//F3.1/F5.3) WRITE (6,10) VAL,PERCENT,TOLERANCE 20 FORMAT(' VAL =',1X,I2//1X,F3.1/1X,F5.3) WRITE (6,20) VAL,PERCENT,TOLERANCE END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]QUIZC.FOR;18 DOUBLE PRECISION D D=12.34D+01 I=IROUND(D) 10 FORMAT(1X,D12.4,5X,I5,5X,I5) WRITE(6,10)D,I,IROUND(D) END C FUNCTION IROUND(VALUE) INTEGER RESULT DOUBLE PRECISION VALUE RESULT = IDINT(VALUE+0.5) RETURN RESULT END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]STYLE_ZERO.FOR;1 C PROGRAM TO CALCULATE THE ZERO OF A FUNCTION IN A GIVEN INTERVAL C WRITTEN BY IRVIN J. LEVY, GORDON COLLEGE C C P.S. YOUR COMMENTS HAD BETTER BE CONSIDERABLY BETTER THAN THIS! C PROGRAM ZERO C DOUBLE PRECISION MINI,MAXI,STEP,OLDVAL,PARM,XIN,COMP, 2 THRESH,VALUE,TEST1,TEST2,CALC 10 FORMAT (' PRECISION DESIRED IN RESULT: '$) WRITE(6,10) READ (5,*) THRESH IF (THRESH.LT.1E-6) WRITE(6,15) IF (THRESH.LT.1E-6) THRESH=1E-6 15 FORMAT('+>> THRESHOLD TOO SMALL. AUTO-SET TO 1 PPM <<') 20 FORMAT(/' FIND FIRST ZERO IN RANGE (0,0 = DONE): ',$) 23 WRITE(6,20) READ (5,*) MINI,MAXI 25 FORMAT(1X) WRITE(6,25) IF (MINI-MAXI) 31,220,31 31 STEP=(MAXI-MINI)/100. 50 OLDVAL=CALC(MINI+0.1*STEP) DO 100 PARM=MINI,MAXI,STEP XIN=PARM VALUE=CALC(XIN) TEST1=OLDVAL/ABS(OLDVAL) TEST2=VALUE/ABS(VALUE) IF (TEST1.NE.TEST2) GOTO 150 100 CONTINUE 150 MINI=PARM-STEP STEP=STEP/10. 175 FORMAT (' SIGN CHANGE. X = ',G,' VALUE = ',G) WRITE(6,175) PARM,VALUE COMP=VALUE/PARM IF (ABS(COMP).LE.THRESH) GOTO 200 GOTO 50 200 PREC=VALUE/PARM*1E6 WRITE(6,210) PARM,VALUE,PREC 210 FORMAT (////' RESULT!!! X = ',G,' VALUE = ',G, 2 /' PRECISION = ',G,' PPM') GOTO 23 220 STOP 'PROGRAM TERMINATED - RANGE OF ZERO' END C C * * * * * * * * * * * FUNCTION SECTION * * * * * * * * * * * C FUNCTION CALC(X) DOUBLE PRECISION X CALC=((2.7182818**(-2.*X))*(2.*X**2+2.*X+1.))-0.100 RETURN END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]TEST.FOR;1 i = 10 goto 10 write(6,5) 5 format(' hello') 10 stop 'did i just say hello?' end FACULTY:[IJL.COMPUTER.CS323.FORTRAN]VARIABLE.FOR;7 I = 10 J = 4 K = 12 L = 5 M = ((I-J) * ((K-L) / ((K-I) * ((K-I) * ((L-J) / ((J-K) * ((L-J)))))))) END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]YIKES.FOR;2 DO 50 I = 1. 10 50 CONTINUE WRITE(6,*)DO50I END FACULTY:[IJL.COMPUTER.CS323.FORTRAN]ZERO.FOR;1 C Program to calculate the zero of a function in a given interval C Written by Irvin J. Levy, Gordon College C C P.S. Your comments had better be considerably better than this! C PROGRAM ZERO C DOUBLE PRECISION MINI,MAXI,STEP,OLDVAL,PARM,XIN,COMP, 2 THRESH,VALUE,TEST1,TEST2,CALC 10 FORMAT (' Precision desired in result: '$) WRITE(6,10) READ (5,*) THRESH IF (THRESH.LT.1E-6) WRITE(6,15) IF (THRESH.LT.1E-6) THRESH=1E-6 15 FORMAT('+>> Threshold too small. Auto-set to 1 ppm <<') 20 FORMAT(/' Find first zero in range (0,0 = done): ',$) 23 WRITE(6,20) READ (5,*) MINI,MAXI 25 FORMAT(1X) WRITE(6,25) IF (MINI-MAXI) 31,220,31 31 STEP=(MAXI-MINI)/100. 50 OLDVAL=CALC(MINI+0.1*STEP) DO 100 PARM=MINI,MAXI,STEP XIN=PARM VALUE=CALC(XIN) TEST1=OLDVAL/ABS(OLDVAL) TEST2=VALUE/ABS(VALUE) IF (TEST1.NE.TEST2) GOTO 150 100 CONTINUE 150 MINI=PARM-STEP STEP=STEP/10. 175 FORMAT (' Sign change. X = ',G,' Value = ',G) WRITE(6,175) PARM,VALUE COMP=VALUE/PARM IF (ABS(COMP).LE.THRESH) GOTO 200 GOTO 50 200 PREC=VALUE/PARM*1E6 WRITE(6,210) PARM,VALUE,PREC 210 FORMAT (////' RESULT!!! X = ',G,' Value = ',G, 2 /' Precision = ',G,' ppm') GOTO 23 220 STOP 'PROGRAM TERMINATED - RANGE OF ZERO' END C C * * * * * * * * * * * FUNCTION SECTION * * * * * * * * * * * C FUNCTION CALC(X) DOUBLE PRECISION X CALC=((2.7182818**(-2.*X))*(2.*X**2+2.*X+1.))-0.100 RETURN END F::IJL.COMPUTER.CS323.FORTRAN>