FORTRAN Help: Using Functions and Arrays

  • Comp Sci
  • Thread starter mattmac.nuke
  • Start date
  • #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
 

Attachments

Last edited:

Answers and Replies

  • #2
34,017
5,672
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.
 
  • #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
 
  • #4
34,017
5,672
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.
 
  • #5
SteamKing
Staff Emeritus
Science Advisor
Homework Helper
12,796
1,668
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.
 
  • #6
34,017
5,672
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)
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.
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
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?
 

Related Threads on FORTRAN Help: Using Functions and Arrays

  • Last Post
Replies
18
Views
935
Replies
1
Views
2K
Replies
2
Views
1K
Replies
13
Views
1K
Replies
11
Views
5K
Replies
7
Views
3K
  • Last Post
2
Replies
26
Views
3K
Replies
12
Views
9K
Replies
4
Views
24K
Replies
0
Views
3K
Top