Download 10 9 8 7 6 5 4 3 2 1

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

Elementary mathematics wikipedia , lookup

Factorial wikipedia , lookup

Transcript
BIT 2206/CSC 1209
INTRODUCTION TO
PROGRAMMING IN JAVA:
REPETITION (MORE ON FOR
LOOPS)
LESSON 2
CONTENTS
1. Processing a loop "in reverse"
2. Example problem - Factorial
2.1. Requirements
2.2. Analysis
2.3. Design
2.4. Implementation
2.5. Testing (including loop testing)
3. Example problem - Extended factorial
application
3.1. Requirements
3.2. Analysis
3.3. Design
3.4. Implementation
3.5. Testing
The first (Factorial) example problem gives another illustration of a variable count pre-test loop using a "for"
construct. The example also: (1) includes an error recovery mechanism using an "if-else" construct as
illustrated previously, and (2) uses data items of type long (first time such data items are used in this sequence
of WWW pages).
1. PROCESSING A LOOP "IN REVERSE"
It is sometimes desirable to process a fixed count loop backwards, i.e. in reverse. In some
programming languages (such as Ada and Pascal) this requires the inclusion of a reserved
word such as reverse in the loop definition. In Java (and languages such as C and C++) this
is not necessary because of the greater versatility of the for loop construct. All we need to do
is decrement the loop parameter instead of the more usual incrementation. For example the
code in Table 1 would produce the output:
10 9 8 7 6 5 4 3 2 1
//
//
//
//
SEQUENCE NUMBERS CLASS
Pius Nyaanga
Tuesday 13 April 2013
St. Paul’s University
class SequenceNumbers {
// ------------------ METHODS ----------------------/* Main method
*/
public static void main(String[] args) {
final int START_CONDITION = 10;
final int END_CONDITION
= 0;
// For loop
for (int loopParameter = START_CONDITION;loopParameter >
END_CONDITION;
loopParameter--)
System.out.print(loopParameter + " ");
// End
System.out.println("\n");
}
}
Table 1: Sequence of numbers output in "reverse"
2. EXAMPLE PROBLEM - FACTORIAL
2.1 Requirements
Design and implement a Java program that returns the value of N! (N Factorial) given a
specific value for N. Note:
n! = n x (n-1) x (n-2) ... 3 x 2 x 1
For example:
10! = 10 x 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 3628800
Assume that the minimum permissible value for N is 1, and the maximum permissible value
is 20.
2.2 Analysis
To produce a solution to
factorial N! we loop over N
iterations adding
multiplying the loop counter
by the product obtained so
far starting with a product
value of 1.
A class diagram for the
proposed solution is given
in Figure 1. Two classes are
proposed. A general class
Factorial, and an
application class
FactorialApp.
Note that we define the
product field to be of type
long because !20 =
2432902008176640000,
which is greater than the
maximum value permitted
for a data item of type int
(Integer.MAXIMUM =
2147483647).
Figure 1: Factorial class diagram
2.3 Design
2.3.1 Factorial Class
Class comprises: two private instance fields numberOfTerms and product, a constructor and
two instance methods as follows.
1. Factorial: Constructor to create an instance of the class Factorial given a number of
terms.
Field Summary
private long numberOfTerms
An instance field to store the number of required terms in the
factorial sequence.
private long product
An instance field to store the total derived from multiplying the
terms in the sequence.
Constructor Summary
Factorial(long numTerms)
Constructor to create an instance of the class Factorial given a number of terms.
Method Summary
public long getProduct()
Trivial "get" method to return the value of a given factorial.
public void factorialN()
Method to carry out the actual calculation.
A Nassi-Shneiderman chart for the above methods is given in Figure 2.
Figure 2: Nassi-Shneiderman charts for Factorial class
2.3.2 FactorialApp Class
Field Summary
private static Scanner input
A class instance to facilitate input from the input stream.
Method Summary
public static void main(String[] args)
Main method. Calls inputNumTerms to input number of
terms, and then creates an instance of the class Factorial. The
actual calculation is achieved through a call to the FactorialN
instance method defined in the Factorial class, after which the
result is output.
private static long inputNumTerms()
Method to allow user to input the required number of terms.
This must be an integer between 1 and 20 inclusive. Note that the
value of 20! is such that we must use a long integer type to store it.
The method includes an error recovery mechanism in the event of
an erroneous input.
A Nassi-Shneiderman chart for the above is
presented in Figure 3, and a control flow
chart to assist in path testing in Figure 4.
Figure 3: Nassi-Shneiderman charts for
FactorialApp class methods
Figure 4: Control flow diagram for factorial application
2.4. Implementation
The encoding of the above is given in Tables 2 and 3:
2.4.1 Factorial Class
//
//
//
//
FACTORIAL CLASS
Pius Nyaanga
Tuesday 13 April 2013
St. Paul’s University
/*********************************************/
/*
*/
/*
PROGRESSION
*/
/*
*/
/*********************************************/
class Factorial {
// ------------------ FIELDS ---------------------private long numberOfTerms;
private long product;
// ----------------- CONSTRUCTORS -----------------
/** Factorial constructor */
public Factorial(long numTerms) {
numberOfTerms = numTerms;
}
// ------------------ METHODS --------------------/** Get product */
public long getProduct() {
return(product);
}
/** Calculate factorial N */
public void factorialN() {
final long startCondition = 1;
// Initial value for product
product = 1;
// Loop
for(long loopParameter = startCondition; loopParameter <=
numberOfTerms;loopParameter++)
product = product*loopParameter;
}
}
Table 2: Implementation for factorial class
Notes:

The above is somewhat contrived for the benefit of giving an illustration of a for loop
where the loop parameter is decremented. The same result could be achieved using
"normal" incrementation thus:


for(loopParameter = 1; loopParameter <= numberTerms;loopParameter++)
product = product*loopParameter;
2.4.2 FactorialApp Class
// Pius Nyaanga
// Revised: Thursday 18 July 2013
// St. Paul’s University
import java.util.*;
class FactorialApp {
// ------------------- FIELDS -----------------------// Create Scanner class instance
private static Scanner input = new Scanner(System.in);
// ------------------ METHODDS ----------------------/* Main method
*/
public static void main(String[] args) {
// Input
long numTerms = inputNumTerms();
// Create instance of class Factorial
Factorial newFactorial = new Factorial(numTerms);
// Calculate
newFactorial.factorialN();
// Output
System.out.println(numTerms + "! = " + newFactorial.getProduct());
}
/* Input number of terms */
private static long inputNumTerms() {
final long maxTerms = 23;
final long minTerms = 1;
// Input
System.out.println("Input Number of terms (long " + minTerms +
".." +
maxTerms + "): ");
long numTerms = input.nextLong();
// Check input
if (numTerms > maxTerms || numTerms < minTerms) {
System.out.println("ERROR 1: Number of terms must be between
the limits " +
minTerms + " and " + maxTerms);
return(inputNumTerms());
}
else return(numTerms);
}
}
Table 3: Implementation for factorial application
2.4. Testing
2.4.1 Black box testing
BVA, Limit and Arithmetic Testing. A
suitable set of test cases is given in Table 4.
TEST CASE
EXPECTED RESULT
numTerms
OUTPUT
0
ERROR
1
1
2
2
10
3628800
19
121645100408832000
20
2432902008176640000
21
ERROR
Table 4: BVA, limit and arithmetic test cases
EXPECTED
RESULT
TEST CASE
numTerms
0 (start value -1: no
passes)
2.4.2 White box testing
Loop testing. Test repetitions in variable
count loop using set of test cases of the
form given in Table 5. Note that all these
have already been proposed as either BVA,
limit or arithmetic test cases (see above).
Path testing. Also path testing comprised
of both BVA and limit test cases.
OUTPUT
Error
1 (start value: one
pass)
1
2 (start value +1:
two passes)
2
10 (somewhere in
the middle)
3628800
19 (end value -1
passes)
121645100408832000
20 (end value
passes)
2432902008176640000
21 (end value +1
passes)
Error
Table 5: Loop test cases
3. EXAMPLE PROBLEM --- EXTENDED FACTORIAL
APPLICATION
3.1 Requirements
Produce a Java program that outputs the values of 1! to 20! inclusive.
3.2 Analysis
We can make use of the Factorial class defined in the foregoing section, we therefore only
need an appropriate application class, (say) FactiorialExtApp, which would only need one
method (main).
3.3 Design
3.3.1 FactorialExtApp Class
Method Summary
public static void main(String[] args)
Top level method. Contains a (fixed count) for loop which
loops through from 1 to 20. On each iteration a new instance of the
Factorial class is created, and then the actual calculation is
achieved through a call to the FactorialN instance method defined
in the Factorial class, after which the result is output.
A Nassi-Shneiderman chart for
the above is presented in Figure
5.
3.4. Implementation
The encoding of the above is
given in Tables 6.
//
//
//
//
Figure 5: Nassi-Shneiderman charts for
FactorialExtApp class method
FACTORIAL EXTENDED APPLICATION CLASS
Pius Nyaanga
Revised: Thursday 16 July 2013
St. Paul’s University
class FactorialExtApp {
// ------------------ METHODDS ----------------------/** Main method
public static
final int
final int
Factorial
*/
void main(String[] args) {
startValue = 1;
endCondition = 20;
newFactorial;
// Lopp to output series of factorials
for(long loopParameter = startValue;loopParameter <= endCondition;
loopParameter++) {
System.out.print(loopParameter + "! = ");
newFactorial = new Factorial(loopParameter);
newFactorial.factorialN();
System.out.println(newFactorial.getProduct());
}
// End
System.out.println("\n");
}
}
Table 6: Implementation for factorial application
3.4. Testing
Given that there is no input there is no
testing that can be undertaken other than a
simple "test run". The results of such a run
are presented in Table 7.
Note that, from the sample output given in
Table 7, we can see that using an int to
store our product would mean that we could
not calculate factorials beyond !13
(Integer.MAXIMUM = 2147483647).
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
Table 7: Output from extended factorial
application program
Created and maintained by Pius Nyaanga. Last updated 24 June 2013