Arrays ELEC 206 Computer Applications for Electrical Engineers Dr. Ron Hayne Outline Arrays Statistical Measurements Functions Revisited 206_C6 2 Arrays One-dimensional array List of values Arranged in either a row or a column Offsets (Subscripts) distinguish between elements in the array Identifier holds address of first element Offsets always start at 0 206_C6 3 Definition and Initialization Declaration double x[4]; Initialization double x[4] = {1.2, -2.4, 0.8, 6.1}; int t[100] = {0}; char v[] = {'a', 'e', 'i', 'o', 'u'}; Loops double g[21]; for (int k=0; k<=20; k++) { g[k] = k*0.5; } 206_C6 4 Data Files double time[10], motion[10]; ifstream sensor3("sensor3.dat"); ... if(!sensor3.fail()) { for (int k=0; k<=9; k++) { sensor3 >> time[k] >> motion[k]; } } 206_C6 5 Function Arguments Passing array information to a function Two parameters usually used Specific array Number of elements in the array Always call by reference Address of the array 206_C6 6 /* /* /* This program reads values from a data file and calls a function to determine the maximum value with a function. #include <iostream> #include <fstream> #include <string> using namespace std; // Define constants and declare function prototypes. const int N=100; double maxval(double x[], int n); int main() { // Declare objects. int npts=0; double y[N]; string filename; ifstream lab; */ */ */ ... // Read a data value from the file. while (npts <= (N-1) && lab >> y[npts] ) { npts++; // Increment npts. } // Find and print the maximum value. cout << "Maximum value: " << maxval(y,npts) << endl; // Close file and exit program. lab.close(); } return 0; } /* /* This function returns the maximum value in the array x with n elements. double maxval(double x[], int n) { // Declare local objects. double max_x; // Determine maximum value in the array. max_x = x[0]; for (int k=1; k<=n-1; k++) { if (x[k] > max_x) max_x = x[k]; } // Return maximum value. / return max_x; } */ */ Statistical Measurements Maximum Minimum Mean (average) Median (middle) Variance Average squared deviation from the mean Standard Deviation Square root of the variance 206_C6 10 Mean double mean(double x[], int n) { double sum(0); for (int k=0; k<=n-1; k++) { sum += x[k]; } return sum/n; } 206_C6 11 Variance double variance(double x[], int n) { double sum(0), mu; mu = mean(x,n); for (int k=0; k<=n-1; k++) { sum += (x[k] - mu)*(x[k] - mu); } return sum/(n-1); } 206_C6 12 Function Overloading Function name can have more than one definition Each function definition has a unique function signature Each function call looks for a function prototype with a matching function signature double maxval(double x[], int n); int maxval(int x[], int n); char maxval(char x[], int n); 206_C6 13 Function Templates Generic algorithm for a function that is not tied to a specific data type template <class Data_type> Data_type minval(Data_type x[], int n) { Data_type minx; ... 206_C6 14 Summary Arrays Statistical Measurements Functions Revisited 206_C6 15 Problem Solving Applied Speech Signal Analysis Problem Statement Compute the following stastical measurements for a speech utterance: average power, average magnitude, and number of zero crossings. Input/Output Description Average power Average magnitude Zero crossings Zero.dat 206_C6 16 Problem Solving Applied Hand Example test.dat 2.5 8.2 -1.1 -0.2 1.5 Average power = 15.398 Average magnitude = 2.7 Number of zero crossings = 2 206_C6 17 Problem Solving Applied Algorithm Development main read speech signal from data file and determine number of points, n compute statistical measurements using functions ave_power(x, n) set sum to zero for k: add x[k]2 to sum return sum/n 206_C6 18 Problem Solving Applied Algorithm Development ave_mag(x, n) set sum to zero for k: add |x[k]| to sum return sum/n crossings(x, n) set count to zero for k: if x[k] * x[k+1] < 0, increment count return count 206_C6 19 /*---------------------------------------------------*/ /* This program computes a set of statistical */ /* measurements from a speech signal. */ #include <cstdlib> #include <iostream> #include <fstream> #include <string> #include <cmath> using namespace std; // Declare function prototypes and define constants. double ave_power(double x[], int n); double ave_magn(double x[], int n); int crossings(double x[], int n); const int MAXIMUM = 2500; int main() { // Declare objects. int npts=0; double speech[MAXIMUM]; string filename; ifstream file_1; // Prompt user for file name and open file. cout << "Enter filename "; cin >> filename; file_1.open(filename.c_str()); if( file_1.fail() ) { cout << "error opening file " << filename << endl; return 1; } // Read information from a data file. while (npts <= MAXIMUM-1 && file_1 >> speech[npts]) { npts++; } // Compute and print statistics. cout << "Statistics \n"; cout << "\taverage power: " << ave_power(speech,npts) << endl; cout << "\taverage magnitude: " << ave_magn(speech,npts) << endl; cout << "\tzero crossings: " << crossings(speech,npts) << endl; // Close file and exit program. file_1.close(); system("PAUSE"); return 0; } /*---------------------------------------------------*/ /* This function returns the average power */ /* of an array x with n elements. */ double ave_power(double x[], int n) { // Declare and initialize objects. double sum=0; // Determine average power. for (int k=0; k<=n-1; k++) { sum += x[k]*x[k]; } // Return average power. return sum/n; } /*---------------------------------------------------*/ /* This function returns the average magnitude */ /* of an array x with n values. */ double ave_magn(double x[], int n) { // Declare and initialize objects. double sum=0; // Determine average magnitude. for (int k=0; k<=n-1; k++) { sum += abs(x[k]); } // Return average magnitude. return sum/n; } /*---------------------------------------------------*/ /* This function returns a count of the number */ /* of zero crossings in an array x with n values. */ int crossings(double x[], int n) { // Declare and initialize objects. int count=0; // Determine number of zero crossings. for (int k=0; k<=n-2; k++) { if (x[k]*x[k+1] < 0) count++; } // Return number of zero crossings. return count; } /*---------------------------------------------------*/ Testing 206_C6 26 Testing 206_C6 27 Sorting Algorithms Sorting Arranging in ascending (descending) order Not one "best" algorithm Depends on characteristics of data Selection Sort Find smallest value from current position to end Swap smallest with current position Move to next position 206_C6 28 #include <iostream> #include <cstdlib> using namespace std; void sort(double x[], int n); void display(double x[], int n); const int N = 6; int main() { double data[N] = {5.0, 3.0, 12.0, 8.0, 1.0, 9.0}; cout << "Initial data" << endl; display(data, N); sort(data, N); cout << "Sorted data" << endl; display(data, N); ... void sort(double x[], int n) // Selection sort { int m; // marker double hold; for (int k=0; k<=n-2; k++) { m = k; // Find smallest value for (int j=k+1; j<=n-1; j++) { if (x[j] < x[m]) m = j; } hold = x[m]; // Swap smallest with current x[m] = x[k]; x[k] = hold; cout << "After k=" << k << endl; display(x, n); } } Testing 206_C6 31 Summary Arrays Statistical Measurements Functions Revisited Problem Solving Applied Selection Sort End of Chapter Summary C++ Statements Style Notes Debugging Notes 206_C6 32
© Copyright 2024 Paperzz