You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 8 Next »


This example is meant as a helpfull guide to see how Fortran looks in practice. And will show how to use subroutines, precision and simple arithmetic functions in fortran.


Main
program main
	implicit none
	call menu()  
end program main

The line 'implicit none' is needed in Fortran to avoid obscure errors when defining variables. In earlier Fortran versions all variables were implicitly given as floats (real) unless the first letter in the name between i and n. 'implicit none' makes sure all variables have to be given-type explicit



Menu
recursive subroutine menu() !'recursive' is needed if the subroutine or function will call itself either directly or implicit
	integer :: choice
	logical :: valid !A boolean to indicate if the input is valid (.TRUE. or .FALSE.)
	print *, '--------------------'
	print *, '-----Calculator-----'
	print *, '--------------------'
	print *, 'Addition 1'
	print *, 'Subtraction 2'
	print *, 'Multiplication 3'
	print *, 'Division 4'
	print *, 'High precision division 5'
	print *, 'Power 6'
	print *, 'Terminate 0'
	valid = .FALSE.	!Make shure the while loop runs atleast once
	do while (.NOT.valid)
		read *, choice
		valid = .TRUE.
		if (choice == 1) then
			call addition()
		else if (choice == 4) then
			call division()
		else if (choice == 5) then
			call hp_division()
		else if (choice == 6) then
			call power()
		else if (choice == 0) then
			print *, 'Program finished'
		else
			print *, 'False input, please enter valid input: '
			valid = .FALSE.
		end if
	end do
end subroutine menu

The subroutine for addition:

Addition
recursive subroutine addition() 
	implicit none
	real :: a,b
	print *, 'Enter two numbers to add'
	read *, a,b
	print *, 'Result: ', a+b
	call menu()
end subroutine addition
Division
recursive subroutine division()
	implicit none
	real :: a,b,res
	print *, 'Enter two numbers to divide'
	read *, a,b
	res = a/b
	print *, 'Result: ', res
	call menu()
end subroutine division
High precision addition
recursive subroutine hp_division()
	implicit none
	integer, parameter :: ikind=selected_real_kind(p=12)
	real(kind=ikind) :: a,b,res
	print *, 'Enter two numbers to divide'
	read *, a,b
	res = a/b
	print *, 'Result: ', res
	call menu()
end subroutine hp_division

Power
recursive subroutine power()
	implicit none
	real :: base, pow
	print *, 'Enter base then power'
	read *, base, pow
	print *, 'Result: ', base**pow
	call menu()
end subroutine power


Page content



  • No labels