Fortran 90 Description in program how to continue it)

  • Context: Comp Sci 
  • Thread starter Thread starter DoremiCSD
  • Start date Start date
  • Tags Tags
    Fortran Program
Click For Summary

Discussion Overview

The discussion revolves around writing a Fortran 90 program that reads four integers (a, b, c, d) from the user and checks specific inequalities (a ≤ b and c ≤ d). The program should repeatedly prompt the user until valid inputs are provided, and then it should compute and print the squares of integers between a and b, as well as the product of integers between c and d.

Discussion Character

  • Homework-related
  • Technical explanation
  • Debate/contested

Main Points Raised

  • Some participants suggest using loops to repeatedly prompt the user for input until the inequalities are satisfied.
  • One participant proposes a structure in pseudo code to illustrate the logic needed for input validation.
  • Several participants provide snippets of Fortran code, discussing the correct syntax for loops and variable declarations.
  • There are differing opinions on how to implement the squaring of integers and the calculation of the product, with some suggesting the use of `DO` loops and others providing corrections to earlier code attempts.
  • One participant notes the need to avoid using line numbers and the `CONTINUE` statement in Fortran 90, advocating for a more modern approach to coding.
  • Another participant expresses confusion about the requirements of the homework, asking for clarification on the expected outputs for given inputs.

Areas of Agreement / Disagreement

Participants generally agree on the need for input validation and the structure of the program, but there are multiple competing views on the best way to implement the loops and calculations. The discussion remains unresolved regarding the most effective coding practices in Fortran 90.

Contextual Notes

Some participants mention issues with variable declarations and the need for a clearer understanding of loop structures in Fortran. There are also references to the differences between Fortran 77 and Fortran 90 syntax.

Who May Find This Useful

This discussion may be useful for students learning Fortran 90, particularly those working on homework assignments involving user input and basic programming constructs.

DoremiCSD
Messages
10
Reaction score
0
Fortran 90:(Description in program how to continue it)

Homework Statement


Write a program in Fortran 90 (not fortran 77) that reads from the user 4 integers a, b, c, d. The program should first check if applicable inequality
a ≤ b, c ≤ d.
If not then it should asking again numbers from the user until they have given numbers satisfying these inequalities. Once your program reads these numbers should

1. to print the squares of integers k such that is
a ≤ k ≤ b.
2. To print the product of all integers r is such that
c ≤ r ≤ d.



Homework Equations


its says that the program should asking the user to give numbers until satisfying a<=b and c<=d. This will be done with loop?( i don't know how to do this and i stucked).Still how i can find the squares of integers k and the product of all integers r?( i want only an description of how to do it to finish the program)



The Attempt at a Solution


program sub

implicit none

integers :: a, b, c, d

print *, "Give me an integer a:"
read *, a

print *, "Give me an integer b:"
read *, b

print *, "Give me an integer c:"
read *, c

print *, "Give me an integer d:"
read *, d

if(a .ge. b) then
print *, "Invalid."
stop
endif

if(c .ge. d) then
print *, "Invalid."
stop
endif
 
Physics news on Phys.org


Here's a simple structure in pseudo code:

notOK=0

while(notOK<1) {
read a,b,c,d
if((a>b) or (c>d)) print "ERROR: either a>=b or c>=d: Please re-enter your four numbers"
else notOK=1
}

// step 2
for(k=a; k<=b; k++) {
print "k:"+k+" and k^2: " +(k*k)
}

// set 3 use a loop like the one above within another loop like the one above
 


program Arithmetical

implicit none

integers :: a, b, c, d

PRINT *, "Give me an integer a:"
READ *, a

PRINT *, "Give me an integer b:"
READ *, b

PRINT *, "Give me an integer c:"
READ *, c

PRINT *, "Give me an integer d:"
READ *, d

IF(a .ge. b) THEN
PRINT *, "Invalid."
STOP
ENDIF

IF(c .ge. d) then
PRINT *, "Invalid."
STOP
ENDIF

notOK = 0
DO
notOK = notOK + 1
IF( (a>b) or (c>d) ) EXIT
PRINT *, "ERROR: either a>=b or c>=d: Please re-enter your four numbers"
ELSE
notOK = 1
ENDIF
END DO

FOR(k=a, k<=b, k++)
PRINT "k:"+k+" and k^2: " +(k*k)

END PROGRAM



I used this in silverfrost but can't run it. I believe that i have something wrong .Can anyone correct me wrongs?
 


you don't want to stop you want to loop until the a,b,c,d fit the limits the problem defined.

as I read your program it does the following:

asks for a reads a
asks for b reads b
asks for c reads c
asks for d reads d

tests a>b if so STOPS
tests c>d if so STOPS

so use of the notOK does nothing

instead you need to place your reads in a while (...) do end loop:isOK=0

while(isOK<2) do

isOK=0 // reset the condition counter to ZERO
asks for a reads a
asks for b reads b
asks for c reads c
asks for d reads d

if(a.le.b) isOK=isOK+1 // we add ONE because the 1st condition was met
if(c.le.d) isOK=isOK+1 // we add ONE again because the 2nd condition was met

enddo // the loop ends when isOK==2

...when your program gets here then a<=b and c<=d and you can do steps 2 and 3...
 
Last edited:


for the squaring loop use:

DO 10 K=A,B,1
print K*K
10 CONTINUE
 


jedishrfu said:
for the squaring loop use:

DO 10 K=A,B,1
print K*K
10 CONTINUE

For fortran 90, you'd want to dispense with the line numbers and CONTINUE, and do something like this:
Code:
DO K = A, B
   PRINT K * K
END DO
 


Mark44 said:
For fortran 90, you'd want to dispense with the line numbers and CONTINUE, and do something like this:
Code:
DO K = A, B
   PRINT K * K
END DO

Thanks for the correction, I work mostly in java and haven't done fortran in roughly 40 years or so but I think F90 still accepts the old style otherwise they'd break a lot of programs.
 


DoremiCSD said:
:
[
Code:
]
:
I used this in silverfrost but can't run it. I believe that i have something wrong .Can anyone correct me wrongs?[/QUOTE]

Check your variable declarations, and significant parts of this are not in Fortran. Also, you really need to review how to form loops; googling "fortran 90 loops" will take you to informative material, including [URL="http://en.wikibooks.org/wiki/Fortran/Fortran_examples#Fortran_90.2F95_examples"]Wikibooks[/URL]

As a code snip, you might use:

[CODE]do 
    print *, "Give me an integer a:"
    read *, a
    print *, "Give me an integer b, not less than a:"   ! try to AVOID mistakes
    read *, b
    if (b >= a) exit          ! ===> input OK
    print *, "Found b less than a, please re-enter your numbers a & b"
end do

I suggest you just get this working for the inputs before you try the calculations. Then read up on iterated loops as per Mark44's post.
 


1. to print the squares of integers k such that is
a ≤ k ≤ b.
2. To print the product of all integers r is such that
c ≤ r ≤ d.
How i can to do the above 2 parts i stucked here.
 
  • #10


1. Read Mark44 above
2. Initialize the product calculation p at 1, then make a loop starting at c, ending at d, and multiply the loop counter into p each time.
 
  • #11
Fortran 90:Can not run

Homework Statement



Write a program in fortran 90 which reads from the user 4 integers a,b,c and d. The program first

needs to make sure that the following inequalities hold : a <=b <=c <=d.

If not,the program needs to ask again those numbers from the user until the user finally gives

numbers that satisfy the above inequalities.

Once your program reads these numbers , then it will have to :

1) type the squares of the integers k , such as a< = k <= b , and

2)type the product of all the integers r, such as c<= r <= d.

Homework Equations



Guys i am the guy with the fortran problem and my program doesn't run i don't know why.. Maybe its wrong written because i am new in programming.Plz if anyone cangive me the right code.Down is my try for the program...



The Attempt at a Solution



program Arithmetical

implicit none

integer :: a, b, c, d, x, y

print *, "Give me an integer a:"
read *, a

print *, "Give me an integer b:"
read *, b

print *, "Give me an integer c:"
read *, c

print *, "Give me an integer d:"
read *, d

if(a .ge. b) then
print *, "Invalid."
stop
endif

if(c .ge. d) then
print *, "Invalid."
stop
endif

do
print *, "Give me an integer a:"
read *, a
print *, "Give me an integer b, not less than a:"
read *, b
if(a .ge. b) exit
print *, "Found b less than a, please re-enter your numbers a & b"
endif
end do

do
print *, "Give me an integer c:"
read *, c
print *, "Give me an integer d, not less than c:"
read *, d
if(c .ge. d) then
print *, "Found d less than c, please re-enter your numbers a & b"
endif
end do

x = a
y = 0
do while (x <= b)
y = x^2
print y
x = x+1
end do

x = c
y = 0
do while (x <= d)
y = y+x*(x+1)
x = x+1
end do

end program
 
  • #12


Mod note: Merged the contents of a new thread started by the OP into the existing thread.[/color]
DoremiCSD said:

Homework Statement



Write a program in fortran 90 which reads from the user 4 integers a,b,c and d. The program first

needs to make sure that the following inequalities hold : a <=b <=c <=d.

If not,the program needs to ask again those numbers from the user until the user finally gives

numbers that satisfy the above inequalities.

Once your program reads these numbers , then it will have to :

1) type the squares of the integers k , such as a< = k <= b , and

2)type the product of all the integers r, such as c<= r <= d.
In 1 and 2 above, "such as" is incorrect, as it suggests an example. The problem statement undoubtedly means "such that."
Do you understand what parts 1 and 2 are asking you to do? If not, you will never be able to write the code to implement these parts.

To assess your understanding, if a = 5 and b = 15, what output would you expect from part 1.

Similarly, if c = 3 and d = 12, what output would you expect from part 2?
DoremiCSD said:

Homework Equations



Guys i am the guy with the fortran problem and my program doesn't run i don't know why.
Be more specific. When you say it doesn't run, we have no idea what that means. Does your code fail to compile? If so, you need to fix the syntax errors. One that I see is '^' used for raising a number to a power. The operator in Fortran is **, not ^.

Does your code compile but not run? If so, there are errors in your logic, so that the program halts before doing anything useful. In your input section, if the user enters invalid values, the program STOPs. It should not be doing that. Your whole input section needs to be in a DO loop of some kind, where the loop keeps running until all of the input values are in the right order.
DoremiCSD said:
Maybe its wrong written because i am new in programming.Plz if anyone cangive me the right code.
We DO NOT do your work for you. We'll help, but we aren't going to just give you the code.
DoremiCSD said:
Down is my try for the program...



The Attempt at a Solution

Use a [noparse]
Code:
 tag just above your code, and a
tag after the end of your code [/noparse]. This makes your code easier for us to read, by preserving your indentation. Please make an effort to do that on code that you show.
DoremiCSD said:
Code:
program Arithmetical

implicit none

integer :: a, b, c, d, x, y

print *, "Give me an integer a:"
read *, a

print *, "Give me an integer b:"
read *, b

print *, "Give me an integer c:"
read *, c

print *, "Give me an integer d:"
read *, d

if(a .ge. b) then
 print *, "Invalid."
 stop
endif

if(c .ge. d) then
 print *, "Invalid."
 stop
endif

do 
 print *, "Give me an integer a:"
 read *, a
 print *, "Give me an integer b, not less than a:"
 read *, b
 if(a .ge. b) exit
  print *, "Found b less than a, please re-enter your numbers a & b"
 endif
end do

do
 print *, "Give me an integer c:"
 read *, c
 print *, "Give me an integer d, not less than c:"
 read *, d
 if(c .ge. d) then
  print *, "Found d less than c, please re-enter your numbers a & b"
 endif
end do

x = a
y = 0
do while (x <= b)
 y = x^2
 print y
 x = x+1
end do

x = c
y = 0
do while (x <= d)
 y = y+x*(x+1)
 x = x+1
end do

end program
 
Last edited:
  • #13


It looks like you don't appreciate the difference between an inline if and a block if statement:

Inline ("logical") if:
Code:
if (<test>) <single-action>

(note, there is no end if for an inline if)

Block if:
Code:
if (<test>) then
    <action>
    <action>
    <action>
    <action>
end if

(note that there are further options in a block if using else and else if)

Selective execution

Also you won't really get closer to a solution by just piling every suggested piece of code - with unnecessary additions - into your program. You really have to understand what the code is doing.

And you'd do well to annotate your code with some comments, too.
 
Last edited:

Similar threads

Replies
4
Views
3K
Replies
7
Views
3K
  • · Replies 12 ·
Replies
12
Views
4K
  • · Replies 2 ·
Replies
2
Views
6K
  • · Replies 8 ·
Replies
8
Views
3K
  • · Replies 7 ·
Replies
7
Views
3K
  • · Replies 6 ·
Replies
6
Views
5K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K