370 likes | 463 Views
Engineering Problem Solving With C++ An Object Based Approach. Chapter 6 One-Dimensional Arrays. Arrays. An array is a collection of data which shares a common identifier and data type. Individual elements of the array are specified using offsets referred to as subscripts .
E N D
Engineering Problem Solving With C++An Object Based Approach Chapter 6 One-Dimensional Arrays
Arrays • An array is a collection of data which shares a common identifier and data type. • Individual elements of the array are specified using offsets referred to as subscripts. • In C++ the offsets or subscripts always start with 0.
Defining Arrays • General form data_type array_identifier[size]; The size of the array may be specified by a defined constant or constant literal. • Example: double m[8]; m[0] m[1] m[2] m[3] m[4] m[5] m[6] m[7]
'a' 'e' 'i' 'o' 'u' Initializing Arrays • Initializing the array when declared char vowels[5] = {'a', 'e', 'i', 'o', 'u'}; bool ansKey[] ={true, true, false, true, false, false}; char word[] = "Hello"; vowels ansKey true true false true false false word 'H' 'e' 'l' 'l' 'o' '\0'
Accessing Array Elements • Subscripts are used to access individual elements of an array. • General format: array_identifier[offset] • Example for (int I=0; I<8; I++) m[I] = double(I) + 0.5; • Subscripts may be any integer expression.
Functions and arrays • An array identifier references the first element of the array. When arrays are passed as arguments to functions, the address of the array is passed, thus by default, arrays are always passed by reference. • Generally we specify additional parameters with the array to provided information regarding the number of elements in the array.
Example #include <iostream> using namespace std; const int maxSize=20; //function prototypes void ReadArr(double a[], int &howMany); int FindMin(const double a[], int howMany); int main( ) { double darr[maxSize]; int cnt, where; ReadArr(darr, cnt); where = FindMin(darr, cnt); cout << "The smallest value in the array is " << darr[where] << endl; }
// This function inputs values into an array until –99 or array // limit reached void ReadArray(double a[], int & howMany) { double temp; howMany = 0; cin >> temp; while ((howMany < maxSize) && (temp != -99)) { a[howMany] = temp; howMany++; cin >> temp; } }
//This function returns the subscript of the minimum value // in an array int FindMin(const double a[], int howMany) { minElem = 0; for (int I=1; I<howMany; I++) if (a[I] < a[minElem] minElem = I; return minElem; }
Function overloading • In C++ we can have many functions with the same name provided the function signature is different. • The function signature includes the name of the function and the parameter list.
#include <iostream> using namespace std; int Area (int Side);// Area of Square int Area (int Length, int Width);// Area of Rectangle double Area (double Radius);// Area of Circle const double PI= 3.14159; int main() { cout << "Area of Square:" << Area(10) << endl; cout << "Area of Rect:" << Area(8,12) << endl; cout << "Area of Circle: " << Area(2.5) << endl; return 0; } Example
Overloaded Function Implementations int Area (int Side)// Area of Square { return (Side * Side); } int Area (int Length, int Width)// Area of Rectangle { return (Length * Width); } double Area (double Radius)// Area of Circle { return (PI* Radius * Radius); }
Function Templates • Function templates allow a programmer to provide a generic function which is not tied to a specific data type. • The compiler uses the template to write an instance of the function for each data type needed by a specific program.
Function template prototypes • General format: template < classtemplate_parameter > function_prototype; • Example: template < class elemType> int findMin(elemType a[], int howMany);
Function Templates template < class elemType> int findMin(elemType a[], int howMany) { int minElem = 0; for (int I=1; I<howMany; I++) if (a[I] < a[minElem]) minElem = I; return minElem; }
Using Template Functions //Function prototypes. template < class elemType> void ReadArr(elemType a[], int &howMany); template < class elemType> int findMin(elemType a[], int howMany); const int MaxSize = 100; int main() { double a[MaxSize]; int count, where; ReadArr(a, count); where = findMin(a, count); …
Practice! • Write a function template which will swap two data values specified in the parameter list. template <class elemType> void swap(elemType elem1, elemType elem2) { elemType temp; temp = elem1; elem1 = elem2; elem2 = temp; return; }
Sorting Algorithms • Sorting algorithms arrange the data into either ascending or descending order, based on the values in the array. • Sorting algorithms to be discussed • Selection sort • Quick sort
Basic Premise of Selection Sort • Find minimum value, place it in the first position. • Find next minimum value, place it in the second position. • Continue doing this until you have placed the second to the largest value in the second to the last position.
Practice! • Fill in the following table to show how the array is sorted into ascending order using the selection sort. arr[0] arr[1] arr[2] arr[3] arr[4] swap min and arr[0] 18 2945 51 36 18 29 36 51 45 18 29 36 4551
Quick Sort • Select a pivot value - generally the first value in the list. • If list is greater than 2 values, divide list into two groups; values less than pivot, and values greater than the pivot. • Place pivot between these groups. • Recursively, repeat process with each group greater than 2. • If group size is two, compare and swap if necessary.
Searching Unordered Arrays • Simple Sequential Search • Examine each element starting with the first one, until either a match is found or the end of the list is reached • Can be implemented with a function which returns true if in the list and false if not found • Can be implemented with a function which returns the location of the element if found, or –1 if not found
Searching Ordered Lists • Modified Sequential Search • Stops either when item is found, or when the element examined is past where the item should be in the list. • Binary Search • Examine middle element, if not found determine if item should be in top part or bottom part of list. • Repeat with appropriate sublist, until sublist is empty.
37 43 Example of Binary Search for 48 5 11 14 22 28 37 43 56 59 70 arr[0] arr[mid] arr[9] 37 43 56 59 70 mid is 7 arr[5] arr[mid] arr[9] mid is 5 arr[5] arr[6] mid is 6 43 arr[6]
Character Strings • C style strings • array of characters terminated by \0 character • remember when declaring the character array to add an extra space to the array for '\0' • literal string constants are enclosed in double quote marks, "a string" • file names when using file I/O must be C style strings.
Input and strings • >> uses whitespace (' ', '\t', '\n') to determine the beginning and end of data • whitespace characters can not be read using >>, to read strings with embedded whitespace use getline() char phrase[30]; getline(phrase, 30); • peek() returns the next character in a stream without removing it from the stream
C++ functions for C style strings #include <iostream> #include <cstring> uses namespace std; int main() { char str1[30]="John", str2[30]="Johnson"; char phrase[20]="'s shirt was green", sentence[30]; if (strcmp(str1,str2) < -1) strcpy (sentence, str1); // puts "John" into sentence else strcpy (sentence,str2); // puts "Johnson into sentence strcat(sentence, phrase); cout << "Sentence is: " << sentence << endl; return 0; }
The string class • include <string> • declaring string objects string word="Engineering"; string word2; • string member functions • size( ) • empty( ) • substr (int start, int len) • c_str()
Overloaded operators for string class • relational operators < > == <= >= • concatenation + += • assignment =
Example Using string Class #include <iostream> #include <string> uses namespace std; int main() { string str1="John", str2="Johnson"; string phrase = "'s shirt was green", sentence; if (str1 < str2) sentence = str1; // puts "John" into sentence else sentence = str2; // puts "Johnson into sentence sentence += phrase; cout << "Sentence is: " << sentence << endl; return 0; }
Vector class • Array problems avoided by use of vector class • boundary checking • array size specified when array is declared and can not be changed • inefficient use of space • default is pass by reference for functions
Vector class • #include <vector> //in standard template library • Member functions empty() // returns true if vector contains no values erase() // deletes specified element from vector pop_back() // deletes last element in vector push_back() // add element to end of vector resize() // changes the size of the vector size() // returns the size of the vector
Defining vectors • Define a vector of type double with no specified size. Values can be added to numList using push_back() method. vector <double> numList; • Define a vector of strings, with space to hold n strings vector<string> myText(n); • Define a vector of integers with space for 8 elements, and initial each element to 0 vector<int> intList(8,0);
More about the vector class • Use [ ] with a subscript to access the individual elements. • Vectors are pass by value, by default. • Vectors of the same type can use the assignment operator to copy one to the other.
Example using vectors #include<vector> #include<iostream> #include<fstream> using namespace std; int main() { vector<int> numList; ifstream fin("data"); int temp; while(fin>>temp) { numList.push_back(temp); } for(int i=0; i<numList.size(); i++) { cout << numList[i] << endl; } return 0; } // define a vector of type int // input a value from data file // add value to end of numList // print all size values