Arrays and Vectors Sequential (One-Dimensional) Containers Chapter 12 1.

Slides:



Advertisements
Similar presentations
Chapter 6 Queues and Deques.
Advertisements

C++ Templates. What is a template? Templates are type-generic versions of functions and/or classes Template functions and template classes can be used.
Parameter Passing Mechanisms Reference Parameters.
Beginning C++ Through Game Programming, Second Edition
Chapter 10.
Computer programming1 Arrays. Computer programming2 ARRAYS Motivation Introduction to Arrays Static arrays Arrays and Functions Arrays, Classes, and typedef.
Main Index Contents 11 Main Index Contents Container Types Container Types Sequence Containers Sequence Containers Associative Containers Associative Containers.
Arrays Hanly - Chapter 7 Friedman-Koffman - Chapter 9.
1 Arrays In many cases we need a group of nearly identical variables. Example: make one variable for the grade of each student in the class This results.
Chapter 8. 2 Objectives You should be able to describe: One-Dimensional Arrays Array Initialization Arrays as Arguments Two-Dimensional Arrays Common.
 2006 Pearson Education, Inc. All rights reserved Arrays.
 2003 Prentice Hall, Inc. All rights reserved. 1 Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based.
Arrays Data Structures - structured data are data organized to show the relationship among the individual elements. It usually requires a collecting mechanism.
C++ for Engineers and Scientists Third Edition
Chapter 8 Arrays and Strings
 CS105 C++ Lecture 2 Arrays. Parameter passing  2 types  Pass-by-value  Pass-by-reference 2.
The switch Statement Selection Revisited. Problem Using OCD, design and implement a program that allows the user to perform an arbitrary temperature conversion.
Sorting and Vectors Mechanism for representing lists JPC and JWD © 2002 McGraw-Hill, Inc. Modified by S. Sudarshan.
Modular Programming Chapter Value and Reference Parameters t Function declaration: void computesumave(float num1, float num2, float& sum, float&
Chapter 7: Arrays. In this chapter, you will learn about: One-dimensional arrays Array initialization Declaring and processing two-dimensional arrays.
Data Structures Using C++ 2E
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Chapter 12: Recursion Problem Solving, Abstraction, and Design using C++
CSIS 123A Lecture 6 Strings & Dynamic Memory. Introduction To The string Class Must include –Part of the std library You can declare an instance like.
 2006 Pearson Education, Inc. All rights reserved Arrays.
Modular Programming Chapter Value and Reference Parameters computeSumAve (x, y, sum, mean) ACTUALFORMAL xnum1(input) ynum2(input) sumsum(output)
Chapter 8 Arrays and Strings
Introduction to STL and the vector container class CS342 Data Structures Based on Ford & Topp.
Recursion Textbook chapter Recursive Function Call a recursive call is a function call in which the called function is the same as the one making.
Comp 245 Data Structures Linked Lists. An Array Based List Usually is statically allocated; may not use memory efficiently Direct access to data; faster.
Arrays Module 6. Objectives Nature and purpose of an array Using arrays in Java programs Methods with array parameter Methods that return an array Array.
Vectors of Vectors Representing Objects with Two Dimensions.
Controlling Function Behavior Sequence, Selection and Repetition.
File I/O ifstreams and ofstreams Sections 11.1 &
Pointers OVERVIEW.
Parameter Passing Mechanisms Reference Parameters Read § §
CS Midterm Study Guide Fall General topics Definitions and rules Technical names of things Syntax of C++ constructs Meaning of C++ constructs.
C++ for Engineers and Scientists Second Edition Chapter 11 Arrays.
Parameter Passing Mechanisms Reference Parameters § §
CS102 Introduction to Computer Programming Chapter 9 Pointers.
File I/O 1 ifstreams and ofstreams Sections 11.1 & 11.2.
Nyhoff, ADTs, Data Structures and Problem Solving with C++, Second Edition, © 2005 Pearson Education, Inc. All rights reserved Stacks.
1 Arrays and Vectors Chapter 7 Arrays and Vectors Chapter 7.
CPSC 252 The Big Three Page 1 The “Big Three” Every class that has data members pointing to dynamically allocated memory must implement these three methods:
Standard Template Library The Standard Template Library was recently added to standard C++. –The STL contains generic template classes. –The STL permits.
Practice Building Classes Modeling Objects. Problem Write a program that computes the Dean’s List (full-time students whose GPA 3.0), using a student.
A First Book of C++: From Here To There, Third Edition2 Objectives You should be able to describe: One-Dimensional Arrays Array Initialization Arrays.
12/15/2015Engineering Problem Solving with C++, Second Edition, J. Ingber 1 Engineering Problem Solving with C++, Etter Chapter 6 One-Dimensional Arrays.
Vectors One-Dimensional Containers. Problem A file contains a sequence of names and scores: Ann92 Bob84 Chris89... Using OCD, design and implement a program.
 2008 Pearson Education, Inc. All rights reserved. 1 Arrays and Vectors.
Copyright 2003 Scott/Jones Publishing Standard Version of Starting Out with C++, 4th Edition Chapter 7 Arrays.
Review Pointer Pointer Variables Dynamic Memory Allocation Functions.
CS201 – Introduction to Computing – Sabancı University 1 Built-in Arrays l C++ native array type (not the class version) l Two versions ä fixed size arrays.
Starting Out with C++, 3 rd Edition Introduction to the STL vector The Standard Template Library (or STL) is a collection of data types and algorithms.
Chapter 7 Arrays Csc 125 Introduction to C++. Topics Arrays Hold Multiple Values Array Operations Arrays as function arguments Two-dimensional arrays.
CSE 332: C++ pointers, arrays, and references Overview of Pointers and References Often need to refer to another object –Without making a copy of the object.
C++ Programming Lecture 14 Arrays – Part I The Hashemite University Computer Engineering Department (Adapted from the textbook slides)
CPS120 Introduction to Computer Science Exam Review Lecture 18.
Array. Array is a group of data of the same type. Array elements have a common name –The array as a whole is referenced through the common name Individual.
14-1 Computing Fundamentals with C++ Object-Oriented Programming and Design, 2nd Edition Rick Mercer Franklin, Beedle & Associates, 1999 ISBN
ECE 264 Object-Oriented Software Development Instructor: Dr. Honggang Wang Fall 2012 Lecture 19: Container classes; strings.
Arrays Chap. 9 Storing Collections of Values 1. Introductory Example Problem: Teachers need to be able to compute a variety of grading statistics for.
Objectives You should be able to describe: One-Dimensional Arrays
A FIRST BOOK OF C++ CHAPTER 7 ARRAYS. OBJECTIVES In this chapter, you will learn about: One-Dimensional Arrays Array Initialization Arrays as Arguments.
ifstreams and ofstreams
7 Arrays.
7 Arrays.
Arrays Arrays A few types Structures of related data items
ifstreams and ofstreams
4.1 Introduction Arrays A few types Structures of related data items
Presentation transcript:

Arrays and Vectors Sequential (One-Dimensional) Containers Chapter 12 1

Problem A file contains a sequence of names and scores: Ann92 Bob84 Chris89... Write a program that computes the average score, and displays each name, its score, and its difference from the average. 2 Lab 10: average, standard deviation, grade on the curve Proj 10: median also Note the different types of data

Preliminary Analysis This problem requires us to process the scores twice: Once to compute their average; and Once to compute the difference of each score from the average. One way is to close the file, then reopen it with open() [or use seekg() to begin reading from the beginning of the file]. But that would force us to read each name twice, which is unnecessary; it is also inefficient because disk I/O is considerably slower than transferring data from internal memory. 3 Lab 10: 3 times Proj 10: Many times p. 478

A better way is to use containers in main memory and store the: sequence of names in one container sequence of scores in another container. 4 Ann Bob Chris namesscores Ann92 Bob84 Chris89... disk file memory By using two such containers, we can process the scores twice without processing the names twice and without having to read the values from disk more than once.

Valarrays Vectors 5 Sequential Containers C++ provides several in-memory containers for storing and processing sequences of values of the same type. The candidates here are: Arrays (from C) Other containers studied in data structures courses: stacks queues priority queues... and more... linked lists binary search trees directed graphs One of the containers in STL (Standard Template Library)

C (and C++) provide two types of arrays: Static: Memory allocation is specified at compile-time (This is the only kind we'll study — see §12.2) Dynamic: Memory is allocated during run-time An array declaration (static) has the form: element_type name[constant_capacity]; Example: double x[50]; This allocates a block of 50 consecutive memory locations for storing doubles and associates the name x with it. They are numbered 0, 1,..., C-Style Arrays Two-dimensional array (matrix)? double y[10][50]; # rows # columns x 2...

7 Because it may be necessary to change the capacity of the array to store more/fewer data items, it is better to not "hard-wire" the capacity into the declaration; instead, use a named constant: const int CAPACITY = 50;... double x[CAPACITY]; To change the capacity, we need only change the const declaration. Extra: An example of how to create a dynamic array double * x; // x is a pointer to (address of) a memory // location where a double can be stored int cap; cout << "Enter array's capacity: "; cin >> cap; x = new double[cap]; // allocate memory block for x

8 Example: Read and store up to 50 doubles in x. cout << "# of values (<= " << CAPACITY << ")?"; cin >> numVals; for (int i = 0; i < numVals; i++) cin >> x[i]; For either kind of array, data values can now be stored in the array elements. They are accessed by using the subscript operator. The names of the individual elements are: x[0], x[1], x[2],... In general, x[i] is the i -th location in the array x ; i is called an index or subscript x

C++ provides some other sequential containers that remove some of the weaknesses of C-style arrays: 9 Valarrays (for mathematical vectors) Have predefined operations, but still fixed capacity Only numeric type Vectors Have predefined operations Can grow when necessary (but not shrink) Elements can be of any type See §12.6 So, we'll use vectors... Fig. 12.2

Back to our Program 10 1.Get the name of the input file from the user. 2.From the input file, read names into one vector and scores into another vector. 3.Compute the average of the values in the scores vector. 4.Finally, output each name, its corresponding score, and the difference of that score and the average. Ann Bob Chris names scores memory

Implementation in C++ 1.We know how to use a string variable to store the name of a file and use.data() to extract the name from it. Or we could use: char inFileName[30]; cin >> inFileName; ifstream fin(inFileName); A declaration of a vector in C++ has the form: vector vec; where T is the type of the elements of the vector vec. vector is really a class template (like complex ). It becomes a class when we specify what type T is.

12 So we need two vectors: vector of strings to store the names: vector nameVec; vector of doubles to store the scores: vector scoreVec; Now we need to: fill these vectors from the file of names and scores compute the average of the scores in scoreVec output the names in nameVec, the scores in scoreVec, and the differences between the scores and the average. Since none of these operations are built into C++, we will write functions to perform them.

Function #1: fillVectors() This function should receive from its caller the name of the input file, an (empty) vector of strings, and an (empty) vector of doubles. It should open an ifstream to the file. Then, using an input loop, the function should read a name and score, append the name to the vector of strings, and append the score to the vector of doubles. On exiting the loop, the function should pass the name-vector and score-vector back to the caller. 13 as in Slide #4

It must pass back two vectors, so these must be reference parameters. It must repeatedly read a name and a score and then append the name to the vector of names, and the score to the vector of scores. The vector class template provides a built-in operation for this: vecName.push_back(value); 14 See "C++ vector Library Quick Reference" link on CS 104 Other Course Information page. Also, §12.6. Observations about fillVectors()

//-- Needs,, and libraries void fillVectors(string inFileName, vector & nameVec, vector & scoreVec) { // open input stream to inFileName ifstream fin(inFileName.data()); assert(fin.is_open()); string name; // input variables double score; for (;;) //Loop: { fin >> name >> score; // read name, score if (fin.eof()) break; // if none left, quit nameVec.push_back(name); // append name to nameVec scoreVec.push_back(score); // append score to scoreVec } fin.close(); } 15 Definition of fillVectors()

16 Function #2: average() This function should receive from its caller a vector of doubles. It must then compute the average of these doubles, and return this average.

To avoid having to copy this (potentially large) vector, we make it a constant reference parameter instead of a value parameter. To compute the average score, we need to know how many scores there are; vector has a built-in function member for this: vecName.size(); We need the sum of the scores in scoreVec. Like arrays, vectors have a subscript operator [ ], so we could just use a for-loop for this: double sum = 0; for (int i = 0; i < scoreVec.size(); i++) sum += scoreVec[i]; However, C++ has a function that does this. 17 Observations about average()

The accumulate() function can be used to sum the values in a C++ container — vector, in particular. It is found in the library (possibly in in older versions of C++). Pattern: 18 sum = accumulate(vec.begin(), // start vec.end(), // stop 0.0); // initial // value iterators: begin() points to first element, end() points just past last element, Initial value of sum; it also determines the type of the sum (int or double) See "C++ algorithm Library Quick Reference" link on CS 104 Other Course Information page. Also, §12.7.

// Needs and libraries double average( vector numberVec) { int numValues = numberVec.size(); if (numValues > 0) { double sum = return sum / numValues; } else { cerr << "\n*** Average: vector is empty!\n" << endl; return 0.0; } } 19 accumulate(numberVec.begin(), numberVec.end(), 0.0); Definition of average() Note: On the assignment, you will be building a useful library named DoubleVectorOps that contains this function average() along with functions for computing standard deviation and median. const &

20 Function #3: displayResults() This function should receive from its caller a vector of names, a vector of scores, and an average. It should then use a loop to output each name, its corresponding score, and the difference of the score from the average.

Because it returns no value, like function #1, this will be a void function that receives the two vectors — the names and the scores — and the average score. Again, to avoid having to copy potentially large vectors, we make them constant reference parameters instead of value parameters. We can use a for-loop to run through the two vectors and output each name, the corresponding score, and the difference between that score and the average, using the subscript operator [ ] to access the individual names and scores (see slide #17). 21 Observations about displayResults()

22 Definition of displayResults() // Needs library void displayResults(const vector & names, const vector & scores, double theAverage) { for (int i = 0; i < names.size(); i++) cout << names[i] << '\t' << scores[i] << '\t' << scores[i] - theAverage << endl; }

Discussion Now that all of the operations required by our main function's algorithm exist, we are ready to implement it. 23

Main Function Coding /* processScores.cpp */ #include // cin, cout,... #include // ifstream,... #include // string #include // assert() #include // vector #include // accumulate() using namespace std; // local prototypes void fillVectors(string inFileName, vector & nameVec, vector & scoreVec); double average(const vector & numberVec); void displayResults(const vector & names, const vector & scores, double theAverage); 24

int main() { cout << "\nTo process the names and scores in an input file," << "\n enter the name of the file: "; string inFileName; getline(cin, inFileName); vector nameVec; vector scoreVec; fillVectors(inFileName, nameVec, scoreVec); // input double theAverage = average(scoreVec); // process displayResults(nameVec, scoreVec, theAverage ); // output } // Definitions of fillVectors(), average(), displayResults() go here 25

Testing To test our program, we use a text editor and create easy-to-check input files: Ann 90 Bob 70 Chris 80 If we name this particular file test1.txt, then for it, our program should display: Ann Bob Chris

Some Other Useful & Powerful Functions You should explore the standard C++ libraries and to see some of the functions you can “plug into” your programs and save yourself hours of coding and testing if you had to write them yourself. Also, these powerful functions use the most efficient methods known for carrying out operations. And they have been thoroughly tested so they can be used with confidence. 27

One that you will learn about in the assignment is the sort() function in the library. It uses one of the fastest, if not the fastest, sorting methods. And like the other library functions, it is very easy to use because they use iterators in much the same way as the accumulate() function. For example, to sort the scores in our example, we need only write: sort(scoreVec, scoreVec ); 28.begin().end()

Figure 12.2 Out-of-Range Errors. /* Program to demonstrate aberrant behavior resulting from out-of-range errors */ #include // cout, // setw() using namespace std; const int CAPACITY = 4; typedef int IntArray[CAPACITY]; void printArray(char name, IntArray x, int numElements); int main() { IntArray a = {0, 1, 2, 3}, b = {4, 5, 6, 7}, c = {8, 9, 10, 11}; int below = -3, above = 6; printArray('a', a, 4); printArray('b', b, 4); printArray('c', c, 4); b[below] = -999; b[above] = 999; cout << endl; printArray('a', a, 4); printArray('b', b, 4); printArray('c', c, 4); } /* printArray() displays an int array. Receives: name, a character, and x, an int array Output: name of array, and 4 values stored in it */ void printArray(char name, IntArray x, int numElements) { cout << name << " = "; for (int i = 0; i < numElements; i++) cout << setw(5) << x[i]; cout << endl; } Sample run: a = b = c = a = b = c =

Algorithm for average() : 1.Receive numVec. 2.Compute sum, the sum of the values in numVec. 3.Compute numValues, the number of values in numVec. 4.If numValues > 0: Return sum / numValues. Otherwise 1.Display an error message via cerr. 2.Return 0.0 as a default value. 5.End if. Algorithm for fillVectors() : 1.Receive inFileName, nameVec and scoreVec. 2.Open inStream, a stream to inFileName, and check that it opened successfully. 3.Loop 1.Read name and score from inStream. 2.If end-of-file was reached, terminate repetition. 3.Append name to nameVec. 4.Append score to scoreVec. 4.End loop. 5.Close inStream.

Main Function Coding /* processScores.cpp */ #include // cin, cout,... #include // ifstream,... #include // string #include // assert() #include // vector #include // accumulate() using namespace std; // local prototypes void fillVectors(string inFileName, vector & nameVec, vector & scoreVec); double average(const vector & numberVec); void displayResults(const vector & names, const vector & scores, double theAverage); 31

int main() { cout << "\nTo process the names and scores in an input file," << "\n enter the name of the file: "; string inFileName; getline(cin, inFileName); vector nameVec; vector scoreVec; fillVectors(inFileName, nameVec, scoreVec); // input double theAverage = average(scoreVec); // process displayResults(nameVec, scoreVec, theAverage ); // output } // Definitions of fillVectors(), average(), displayResults() go here 32

//-- Needs,, and libraries void fillVectors(string inFileName, vector & nameVec, vector & scoreVec) { // open input stream to inFileName ifstream fin(inFileName.data()); assert(fin.is_open()); string name; // input variables double score; for (;;) //Loop: { fin >> name >> score; // read name, score if (fin.eof()) break; // if none left, quit nameVec.push_back(name); // append name to nameVec scoreVec.push_back(score); // append score to scoreVec } fin.close(); } 33 Definition of fillVectors()

// Needs and libraries double average( vector numberVec) { int numValues = numberVec.size(); if (numValues > 0) { double sum = return sum / numValues; } else { cerr << "\n*** Average: vector is empty!\n" << endl; return 0.0; } } 34 accumulate(numberVec.begin(), numberVec.end(), 0.0); Definition of average() const &

35 Definition of displayResults() // Needs library void displayResults(const vector & names, const vector & scores, double theAverage) { for (int i = 0; i < names.size(); i++) cout << names[i] << '\t' << scores[i] << '\t' << scores[i] - theAverage << endl; }