FORTRAN Help: Using Functions and Arrays

Click For Summary

Discussion Overview

The discussion revolves around a FORTRAN program designed to perform basic arithmetic operations based on user input. Participants are addressing issues related to function implementation, variable management, and syntax errors within the program.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant seeks to convert the functions x_data, y_data, and choi_1 into a single function that captures all necessary inputs for the main program.
  • Another participant points out the need for a READDATA function that prompts the user for two numbers and a choice, suggesting a more streamlined approach to input handling.
  • A later reply indicates that there is a syntax error related to how the choi_1 function is called, suggesting it should be assigned to a variable instead of being used directly in a READ statement.
  • Concerns are raised about the number of character and numeric variables in the program, with suggestions to simplify by removing unused variables.
  • Participants discuss the correct syntax for calling functions in FORTRAN, emphasizing the need for clarity in variable assignments.
  • One participant expresses appreciation for the help received and shares a success in debugging the program, noting that the function can be referenced in case statements for computations.
  • A trivial question is raised about cursor behavior in WRITE statements following READ executions, indicating a desire for control over output formatting.

Areas of Agreement / Disagreement

Participants generally agree on the need for function corrections and simplifications, but there are differing opinions on the best approach to implement these changes. The discussion remains unresolved regarding the optimal structure of the program.

Contextual Notes

Limitations include unresolved syntax issues and the potential for confusion due to the number of variables and function names. The discussion reflects ongoing refinements and corrections without reaching a consensus on the final implementation.

mattmac.nuke
Messages
22
Reaction score
0
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_1WRITE (*,*) ' '
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_dataREAL 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
 

Attachments

Last edited:
Physics news on Phys.org
mattmac.nuke said:
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

You're missing the READDATA function, so there should be a function with this name. From your PDF, the specification is:
Create a FUNCTION READDATA that will ask the user to enter real numbers A and B and a character CHOICE and stores that data in variables A and B and returns CHOICE.

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.
 
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
 
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:
choice = choi_1(x, y, choice)

BTW, you have way too many character variables.
Code:
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.
 
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.
 
SteamKing said:
When calling a FUNCTION, the syntax is VARIABLE = FUNCTION (Arg1. Arg2, ...)
Another possibility is to use the returned value from the function, such as in a call to WRITE; e.g.,
WRITE *,* ADDITION(x, y)
SteamKing said:
In the main program section, your FUNCTION calls need correction.
The one in the READ statement definitely needs to be fixed. The others are OK.
SteamKing said:
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.
 
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?
 

Similar threads

  • · Replies 7 ·
Replies
7
Views
2K
Replies
7
Views
3K
  • · Replies 17 ·
Replies
17
Views
3K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 2 ·
Replies
2
Views
6K
  • · Replies 3 ·
Replies
3
Views
7K
  • · Replies 20 ·
Replies
20
Views
3K
Replies
4
Views
3K
  • · Replies 1 ·
Replies
1
Views
3K