1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

FORTRAN Help: Using Functions and Arrays

  1. Sep 29, 2011 #1
    Alright, so I've updated it once more... The only thing I need to do is figure out how to convert the functions x_data, y_data and choi_1 that store all 3 of the inputs I need for the main program and other functions.

    program calculator
    IMPLICIT NONE
    REAL :: addition, subtraction, multiplication, division, x, y, j, k, x_data, y_data !x = A, y = B
    CHARACTER :: choice, a, b, c, d, l, choi_1


    WRITE (*,*) ' '
    WRITE (*,*) 'LAB 6- Baby Calculator'
    WRITE (*,*) '----------------------'


    j = x_data(x)
    k = y_data(y)
    l = choi_1(choice)

    SELECT CASE (l)
    CASE ('A','a')
    WRITE (*,*) 'A+B = ', addition (x, y)
    CASE ('B','b')
    WRITE (*,*) 'A-B = ', subtraction (x, y)
    CASE ('C','c')
    WRITE (*,*) 'A*B = ', multiplication (x, y)
    CASE ('D','d')
    WRITE (*,*) 'A/B = ', division(x, y)
    END SELECT

    end program calculator

    CHARACTER FUNCTION choi_1 (choice)
    IMPLICIT NONE
    CHARACTER :: choice
    WRITE (*,*) ' A) A+B'
    WRITE (*,*) ' B) A-B'
    WRITE (*,*) ' C) A*B'
    WRITE (*,*) ' D) A/B'
    WRITE (*,*) 'Enter choice:'
    READ (*,*) choice
    choi_1 = choice
    END FUNCTION choi_1

    REAL FUNCTION x_data (x)
    IMPLICIT NONE
    REAL :: x
    WRITE (*,*) 'Enter a value A:'
    READ (*,*) x
    x_data = x
    END FUNCTION x_data

    REAL FUNCTION y_data (y)
    IMPLICIT NONE
    REAL :: y
    WRITE (*,*) 'Enter a value B:'
    READ (*,*) y
    y_data = y
    END FUNCTION y_data


    REAL FUNCTION addition (x, y)
    IMPLICIT NONE
    REAL, INTENT(IN) :: x, y
    addition = x + y
    END FUNCTION addition

    REAL FUNCTION subtraction (x, y)
    IMPLICIT NONE
    REAL, INTENT(IN) :: x, y
    subtraction = x - y
    END FUNCTION subtraction

    REAL FUNCTION multiplication (x, y)
    IMPLICIT NONE
    REAL, INTENT(IN) :: x, y
    multiplication = x*y
    END FUNCTION multiplication

    REAL FUNCTION division (x, y)
    IMPLICIT NONE
    REAL, INTENT(IN) :: x, y
    IF ( y == 0) THEN
    division = 0
    ELSE
    division = x/y
    END IF
    END FUNCTION division
     

    Attached Files:

    Last edited: Sep 29, 2011
  2. jcsd
  3. Sep 29, 2011 #2

    Mark44

    Staff: Mentor

    You're missing the READDATA function, so there should be a function with this name. From your PDF, the specification is:
    Instead of having two functions - x_data and y_data - that each read a number from input, write a single function with two parameters that returns a character. This function should prompt the user to enter two numbers and a character that represents the choice of operation.
     
  4. Sep 29, 2011 #3
    I've written it as one function now, but after making a choice selection it tells me I'm missing a left parenthesis in format.

    program calculator
    IMPLICIT NONE
    REAL :: addition, subtraction, multiplication, division, x, y, j, k, x_data, y_data !x = A, y = B
    CHARACTER :: choice, a, b, c, d, l, choi_1


    WRITE (*,*) ' '
    WRITE (*,*) 'LAB 6- Baby Calculator'
    WRITE (*,*) '----------------------'


    READ choi_1(x, y, choice)

    SELECT CASE (l)
    CASE ('A','a')
    WRITE (*,*) 'A+B = ', addition (x, y)
    CASE ('B','b')
    WRITE (*,*) 'A-B = ', subtraction (x, y)
    CASE ('C','c')
    WRITE (*,*) 'A*B = ', multiplication (x, y)
    CASE ('D','d')
    WRITE (*,*) 'A/B = ', division(x, y)
    END SELECT

    end program calculator



    CHARACTER FUNCTION choi_1 (x, y, choice)
    IMPLICIT NONE
    CHARACTER :: choice
    REAL :: x, y
    WRITE (*,*) 'Enter a value A:'
    READ (*,*) x
    WRITE (*,*) 'Enter a value B:'
    READ (*,*) y
    WRITE (*,*) ' A) A+B'
    WRITE (*,*) ' B) A-B'
    WRITE (*,*) ' C) A*B'
    WRITE (*,*) ' D) A/B'
    WRITE (*,*) 'Enter choice:'
    READ (*,*) choice
    choi_1 = choice
    END FUNCTION choi_1

    REAL FUNCTION addition (x, y)
    IMPLICIT NONE
    REAL, INTENT(IN) :: x, y
    addition = x + y
    END FUNCTION addition

    REAL FUNCTION subtraction (x, y)
    IMPLICIT NONE
    REAL, INTENT(IN) :: x, y
    subtraction = x - y
    END FUNCTION subtraction

    REAL FUNCTION multiplication (x, y)
    IMPLICIT NONE
    REAL, INTENT(IN) :: x, y
    multiplication = x*y
    END FUNCTION multiplication

    REAL FUNCTION division (x, y)
    IMPLICIT NONE
    REAL, INTENT(IN) :: x, y
    IF ( y == 0) THEN
    division = 0
    ELSE
    division = x/y
    END IF
    END FUNCTION division
     
  5. Sep 29, 2011 #4

    Mark44

    Staff: Mentor

    It's this line:
    READ choi_1(x, y, choice)

    This is not how to call this function. What you want is something like
    Code (Text):

    choice = choi_1(x, y, choice)
     
    BTW, you have way too many character variables.
    Code (Text):
    CHARACTER :: choice, a, b, c, d, l, choi_1
    Get rid of a, b, c, d, and l. You aren't using a, b, c, or d, so they should not be in your program.

    You also have way too many numeric variables; namely, x, y, j, k, x_data, y_data. Get rid of all but two of these. Having extra variables makes your program needlessly confusing, especially to you.

    Also, you should pick a better name for your function than choi_1, which is silly. A better name would be GetInput.
     
  6. Sep 29, 2011 #5

    SteamKing

    User Avatar
    Staff Emeritus
    Science Advisor
    Homework Helper

    When calling a FUNCTION, the syntax is VARIABLE = FUNCTION (Arg1. Arg2, ...)

    In the main program section, your FUNCTION calls need correction.

    Also, you have READ CHOI_1 () and CHARACTER FUNCTION CHOI1 (). You cannot have the same name assigned to a variable and a FUNCTION at the same time.
     
  7. Sep 29, 2011 #6

    Mark44

    Staff: Mentor

    Another possibility is to use the returned value from the function, such as in a call to WRITE; e.g.,
    WRITE *,* ADDITION(x, y)
    The one in the READ statement definitely needs to be fixed. The others are OK.
     
  8. Oct 1, 2011 #7
    I really appreciate all the help guys! I actually wound up debugging it during class. I discovered that I can reference the function in my case statements, where all 3 of the data inputs can be used in the arguments and computations. The TA's were amazed that it worked...

    Now I have a slightly trivial question, you know how the cursor moves to the next line following a WRITE statement where there is a READ execution, well I need for the cursor to remain on the same line in which the WRITE statement was made. I believe the slash descriptor is used to do this, but I can't seem to apply it correctly, could you perhaps show me a simple example of it's use, where the user is prompted to enter a simple real number?
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: FORTRAN Help: Using Functions and Arrays
  1. Fortran : Using arrays (Replies: 18)

Loading...