/* * ==================================================================== * DataArray.java: Compute simple operations on a one-dimensional array * of double precision floating point numbers. * * Version 2 (April 2009): Added the method * public void readDataFile( String fileName ) ... * so that data can now be read from a file. * * Written by: Mark Austin November 2006 * Last Modified April 2009 * ==================================================================== */ import java.lang.Math; import java.util.*; import java.io.*; import java.text.*; public class DataArray { private String sName; private int iNoElements; private double data[]; // Define NoColums to be a "constant" .... (see use below) public final static int NoColumns = 5; // Array constructors .... DataArray( int iNoElements ) { this.iNoElements = iNoElements; this.data = new double [ iNoElements ]; // Initialize array elements (strictly speaking, don't need to do this)... for(int i = 0; i < iNoElements; i++) setElement( i, (double) 0.0 ); } DataArray( String sName, int iNoElements ) { this.sName = sName; this.iNoElements = iNoElements; this.data = new double [ iNoElements ]; } DataArray( String sName ) { this.sName = sName; } // ====================================== // Set/get name for data array // ====================================== public void setName ( String sName ) { this.sName = sName; } public String getName() { return this.sName; } // ====================================== // Retrieve and set matrix element values // ====================================== public double getElement( int i ) { double returnValue; if( i < 0 || i >= iNoElements ) throw new RuntimeException("*** In getElement(): Array element index out of range"); returnValue = data[i]; return returnValue; } public void setElement( int i, double value ) { if( i < 0 || i >= iNoElements ) throw new RuntimeException("*** In setElement(): Array element index out of range"); this.data[i] = value; } // ============================================ // Convert array to string format .... // ============================================ public String toString() { String s = "Array: " + this.sName + "\n"; for (int i = 1; i <= iNoElements; i = i + 1) { s += s.format(" %10.3e", data[i-1]); if (i % NoColumns == 0 || i == iNoElements ) s += "\n"; } return s; } /* ================================================== */ /* Method to read an array of data from a file */ /* ================================================== */ public void readDataFile( String fileName ) throws IOException { String sLine; // [a] Open reader to the input file .... FileReader inputFile = new FileReader( fileName ); BufferedReader in = new BufferedReader( inputFile ); // [b] Read file contents ... try { // [b.1] Get no of lines in input file .... sLine = in.readLine(); StringTokenizer st = new StringTokenizer(sLine); if ( st.hasMoreTokens() == true ) this.iNoElements = Integer.parseInt( st.nextToken() ); else System.out.println("*** ERROR in input file "); // [b.2] Dynamically allocate memory for the array .... this.data = new double [ iNoElements ]; // [b.3] Read measurements from data file for ( int i = 1; i <= iNoElements; i = i + 1 ) { sLine = in.readLine(); StringTokenizer st1 = new StringTokenizer( sLine ); if ( st1.hasMoreTokens() == true ) { double dItem = Double.parseDouble ( st1.nextToken() ); this.setElement ( i-1, dItem ); } } } catch (FileNotFoundException e){} catch (EOFException e){} // [c] Close input file in.close(); } // ====================================================== // Compute sum and difference of two data arrays... // ====================================================== public DataArray Add( DataArray dA ) { // Check compatibility of array lengths if( this.iNoElements != dA.iNoElements ) throw new RuntimeException("*** In Add(): Incompatible array lengths"); // Compute sum of data arrays .... DataArray daSum = new DataArray( this.iNoElements ); for(int i = 0; i < iNoElements; i++) daSum.data[i] = data[i] + dA.data[i]; return (daSum); } public DataArray Sub( DataArray dA ) { // Check compatibility of array lengths if( this.iNoElements != dA.iNoElements ) throw new RuntimeException("*** In Sub(): Incompatible array lengths"); // Compute difference of data array values .... DataArray daDiff = new DataArray( this.iNoElements ); for(int i = 0; i < iNoElements; i++) daDiff.data[i] = data[i] - dA.data[i]; return (daDiff); } // ====================================================== // Compute basic statistics on array values .... // ====================================================== public double max() { double dMaxValue = data[0]; for(int i = 1; i < iNoElements; i++) dMaxValue = Math.max( data[i], dMaxValue ); return (dMaxValue); } public double min() { double dMinValue = data[0]; for(int i = 1; i < iNoElements; i++) dMinValue = Math.min( data[i], dMinValue ); return (dMinValue); } public double average () { double dSum = 0.0; for(int i = 0; i < iNoElements; i++) dSum = dSum + data[i]; return (dSum/iNoElements); } public double range () { return (max() - min()); } public double std() { double dMean = average(); double dSum = 0.0; for (int i = 0; i < iNoElements; i = i + 1) dSum = dSum + data[i]*data[i]; return Math.sqrt(dSum/iNoElements - dMean*dMean); } // ============================================ // Exercise methods in array class .... // ============================================ public static void main(String[] args) { // Create, initialize and print a small array ..... DataArray A = new DataArray("First", 4); A.setElement( 0, 1.0); A.setElement( 1, 2.0); A.setElement( 2, 3.0); A.setElement( 3, 4.0); System.out.println( A.toString() ); System.out.println( A.getName() + ".(Max element value) = " + A.max() ); System.out.println( A.getName() + ".(Min element value) = " + A.min() ); System.out.println( A.getName() + ".(Range) = " + A.range() ); System.out.println( A.getName() + ".(Average value) = " + A.average() ); System.out.println( A.getName() + ".(Standard Deviation) = " + A.std() ); System.out.println( "" ); // Initialize and print a second data array ... DataArray B = new DataArray("Second", 4); B.setElement( 0, 5.0); B.setElement( 1, 7.0); B.setElement( 2, 6.0); B.setElement( 3, 8.0); System.out.println( B ); // Compute/print A + B ... DataArray daSum = A.Add(B); daSum.setName("A+B"); System.out.println( daSum ); // Compute/print A - B ... DataArray daDiff = A.Sub(B); daDiff.setName("A-B"); System.out.println( daDiff ); // Read data from a file .... DataArray sensor1 = new DataArray( "Sensor 1" ); try { sensor1.readDataFile( "sensor1.txt" ); } catch (IOException e){} // Print measurements ... System.out.println( sensor1.toString() ); } }