Download PPT - CSE, IIT Bombay

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts

Partial differential equation wikipedia , lookup

Schwarzschild geodesics wikipedia , lookup

Transcript
Conditional Control Flow
Constructs
Sequential Control Flow
• Execution order follows the textual order
• straight line flow
• Many simple problems can not be solved only
with such sequential flow
• Here is an example
• Problem: Computation of a maximum of two numbers
Solution
Program max2
Implicit none
integer num1,num2, max
read *, num1,num2
if (num1 > num2) then
!control comes here if num1 > num2
max = num1
!control jumps to the end of the if statement (endif)
else !control comes here if num1 < = num2
max = num2
endif
print *, max
end program max2
Another Problem
• Input two numbers
• Compute the quotient and remainder of the
bigger number divided by the smaller number
• The numbers are input in unknown order
Solution
Program Quo_Rem1
Implicit none
integer num1,num2, quotient, remainder
read *, num1,num2
if (num1 > num2) then
quotient = num1/num2 ! / is integer division
remainder = num1 – (quotient * num2)
else
quotient = num2/num1
remainder = num2 – (quotient * num1)
endif
print *, quotient, remainder
end program Quo_Rem1
Problems with the solution
What happens if num1 or num2 is negative?
– Problem Specification needs to be clarified
What if one of the numbers is 0?
– Divide by zero leads to overflow
– Should be avoided
– need to test it before dividing
Program Quo_Rem2
integer:: num1,num2, temp, quotient, reminder
read *, num1,num2
if (abs(num1) < abs(num2)) then
! abs function returns the absolute value
temp = num2
num2 = num1 ! swapping the contents
num1 = temp ! of num1 and num2
end if
if (.not.(num2 == 0)) then
!num2 contains a nonzero value
quotient = num1/num2
remainder = num1 - quotient * num2
print *, quotient, remainder
else
print *,"cannot divide! one of the numbers is zero"
end if
The program Quo_Rem2
• The body of if-then-else is simpler
• The else clause is missing
• Complex conditions can appear in the if-condition
• Successive if-statements allowed
Another Problem
• %Nesting of ifs
Problem: Compute Maximum of three numbers
Solution: ?
A Strategy
Let num1,num2,num3 store the three numbers.
1. Compute the maximum of num1 and num2.
Name it max12
2. Compute the maximum of num2 and num3.
Name it max23
3. Compute the maximum of max12 and max23,
which is the maximum of num1.num2,num3
Another Strategy
1. Compute the maximum of num1 and num2,
say max12
2. Compute the maximum of max12 and num3,
which is the required maximum?
Which is the better strategy?
The latter - less number of steps
Now we are ready to write the program
Program max3
integer num1,num2,num3,max
read *, num1,num2,num3
if (num1 > num2) then
if (num1 > num3) then !num1 > num2,num1 > num3
max = num1
else ! num1 > num2 and num1 <= num3
max = num3
endif
elseif (num2 > num3) then !num1 <=num2 > num3
max = num2
else ! num1 <=num2<=num3
max = num3
endif
print *, max
end program max2
Nested If statements
• If statements in the then clause or else clause
• elseif construct
• Arbitrary series of nesting permitted
• elseif and else corresponds to the innermost if for
which the endif is yet to come
• if and endif are like left and right brackets.
Further Observations
• else clause can be missing
• endif can be dropped if there is only one
statement
• long series of ifs can be confusing (at most 20
levels allowed)
• indentation improves readability
• use indentation and comments
If conditions
• Control flow branches in conditional
statements
• Branching decided by evaluating the
conditions
• conditions are expressions of a new type
called LOGICAL
• Examples:
(x > 0), (z == 1), .NOT. (num == 2)
• All these involve relational operators: >,==
• Relational operators are defined over many
data types to compare values
Relations over Arithmetic
• Given e1,e2 expressions over integer (or
real),
–
–
–
–
–
–
e1 == e2 ( equality )
e1 < e2 ( less than )
e1 <= e2 ( less than or equal )
e1 > e2 ( greater than )
e1 >= e2 ( greater than or equal )
e1 /= e2 ( not equal )
LOGICAL VARIABLES
• Fortran 90 has a built in LOGICAL DATA TYPE
• Expressions involving relational operators are of type
LOGICAL
• Variables can be declared to have type LOGICAL
• Declarations:
LOGICAL :: found, goodness
• Logical variables assume just two values
– .TRUE., .FALSE.
• They can be used in if conditions, eg.
– if (found) then stop
– if (goodness) then x = 0
LOGICAL OPERATORS
• Operators over logical type values
• They are
.not., .and., .or., .eqv., .neqv.
• .not. p is .true.
•
iff p is .false.
p .and. q is .true. iff both p and q are .false.
• p .or. q is .true. iff one of (or both) p,q .true.
• p .eqv. q is .true. iff both p and q has the same
truth value
• p .neqv. q is .true. iff both p and q have different
truth values
Operator precedence
• A general logical expression may include arithmetic,
relational and logical operators
• operator precedence defined to specify order of
evaluation
• arithmetic operators are evaluated first followed by
relational operators
• logical operators are evaluated last
• precedence amongst logical operators
.not. , .and. , .or. , .eqv. and .neqv.
If condition
• The condition in an `if' statement is a logical
expressions, eg.
1. if ((a>=b) .eqv. x) then ...
- a,b arithmetic variables, x logical variable
2. if (((rate*prin)> 100) .AND. .NOT. (closed)) then ...
Quadratic Equation Solving
• Roots of quadratic equation:
ax2 + bx + c = 0
• Can have
– exactly one root
– two real roots
– two complex conjugate roots
• Type of roots depends upon the discriminant
(b2 - 4ac)
A Program to solve the equation
program quadratic
implicit none
real :: a, b, c, disc, x_r, x_r1, x_r2, x_im1, x_im2
real, parameter :: eps = 1.0e-6
read *, a, b, c
if (a == 0.0) then
! a is 0, not a quadratic equation
print *, "equation is not quadratic"
else
disc = b*b – 4.0*a*c
x_r = -b/(2.0*a)
if ( abs(disc) < eps ) then ! discriminant nearly zero
print *, "double real root", x_r
elseif ( disc > 0 ) then ! two distinct real roots
disc = sqrt(disc)/(2.0*a)
x_r1 = x_r + disc ! disc temporary variable
x_r2 = x_r - disc
print *, “two real roots”, x_r1, “ and”, x_r2
else ! disc is negative, complex conjugate roots
x_im1 = sqrt(-disc)/(2.0*a)
x_im2 = - x_im1
print *, "complex conjugate roots", x_r, "+", &
x_im1, "i and", x_r, "-", x_im2, "i"
endif
endif
end program quadratic
Comparison of Real Numbers
• instead of disc == 0.0 we have checked
abs(disc) < eps
as condition for double root
• misleading results occur otherwise,
eg.
0.1x2 - 0.3 x + 0.225 = 0
• has 1.5 as double root
• errors in representation give disc > 0.0
• roots obtained are 1.5004526 and 1.4995474
Comparing Real Numbers
• double roots undesirable in many applications
• two roots close to each other may be treated as
double
• if abs(disc) is small, roots are close
• a parameter eps (epsilon) is usually used for
comparing reals
• two reals are treated as equal if absolute value of
difference is < eps
Quadratic Equations
• numerical problems in solving quadratic equations by
this method
• if two roots differ by orders of magnitude, smaller root
cannot be found accurately
x2 – 1000.001x + 1.0 = 0
• two real roots 1.0000000e+03, 1.0070801e-03
• what happens if actual roots are 1.0e+4 and 1.0 e-4 ?
Strategies
• Strategies are high level descriptions of computations
• They are intuitive and understandable to humans
• Easier to write, analyze, explore and change
compared to programs
• Develop strategies first
• Only when a strategy is finalized, write the programs
• Precise statement of strategies is called Algorithm
Algorithm
• Is a sequence of steps
• Each step is precise and unambiguous to people
• Each step is a high level instruction, that can be
carried out by mechanically
•
Each step can be translated into `low level' programs
• Is at a much higher level than HLL itself
Analyzing algorithms
• Before writing the program, analyze and choose the
efficient algorithm
• Metrics for algorithm
– Number of steps
– Complexity of steps
• number of primitive operations
(like addition, multiplication, comparison)