360 likes | 499 Views
Introduction to Computer Science. COMP 51 – Fall 2012 – Section 2. Arrays. Arrays. Motivation for Arrays. Projects and labs to-date have worked with small amounts of data Ex: Write a function to find the smaller (or larger) of two integers
E N D
Introduction to Computer Science COMP 51 – Fall 2012 – Section 2 Arrays
Motivation for Arrays • Projects and labs to-date have worked with small amounts of data • Ex: Write a function to find the smaller (or larger) of two integers • Suppose we need to work with a large amount of data? • Ex: Write a function to find the smallest (or largest) value of a set of 1000 integers
Motivation for Arrays • Do you need to declare individual variables? • int num1, num2, num3, num4, … • Do you need to save data to each variable individually? • cin >> num1 >> num2 >> num3 >> num4 … • Do you need to pass a huge list of arguments to your function? • result = min(num1, num2, num3, …); • Does your function need to have a huge number of if-statements to compare all these variables?
Arrays • Fortunately, no! • High-level languages (include C++) utilize a concept called arrays • An array is a single variable that can hold multiple items of the same type • So, in the previous example, you can use a single variable that holds 1000 integers
Array Items • Refer to each item in the array variable by a number • Subscript or index number • The items are numbered starting with 0 Array (variable name): numbersToProcess 4 3 1 0 2
Array Syntax • How do I declare arrays? • int myArray[100]; • Declares an new array • Name: myArray • Type: Integers • Maximum number of elements in array: 100 • Numbered 0-99 • Must declare an array before using it • Just like other variables and functions
Array Syntax • How do I access individual items in an array? • Example using element 16 of array “myArray” • myArray[15] • Print it out: • cout << myArray[15]; • Use it in a calculation: • sum = myArray[15] + 32; • Use it in a function call: • myFunction(myArray[15]); • Why did we use [15] when we wanted the 16th element?
Array Syntax • The index number can be an expression • These produce identical resultsBoth access element number 15 in the array • cout << myArray[15]; • int n = 8;cout << myArray[n+7]; • This makes it easy to access all the items in an array using a for or while statement
Example • Read in 1000 integers, and print them out in reverse order int values[1000]; for(inti=0; i<1000; i++) { cin >> values[i]; } for(inti=999; i>=0; i--) { cout << values[i] << endl; }
Pitfall – Arrays start at Zero, not One! • Take an array of 100 items • int myArray[100]; • The first array index is ZERO • myArray[0] • The last array index is 99 • myArray[99] • Array indexes run from 0 to <ArraySize> - 1 • Attempting to access myArray[100] will cause problems!
Arrays in Memory Address Value • Think of memory as a very large table where we can store data • Each element in the table is numbered consecutively • This number is called the address • If you’ve used a spreadsheet application, it’s similar to the rows or columns
Arrays in Memory Address Value • Let’s declare some integer variables • int var1 = 15;int var2 = 8421; var1 var2
Arrays in Memory Address Value • Now let’s declare an array and another variable • int myArray[5];int var3 = 19; var1 var2 myArray[0] myArray[1] myArray[2] myArray[3] myArray[4] var3
Arrays in Memory Address Value • Now let’s set some valuesmyArray[3] = 1745;myArray[1] = 1527;myArray[2] = 1621;myArray[4] = 1893;myArray[0] = 1441; • Once the array is defined, we can access the items in any order var1 var2 myArray[0] myArray[1] myArray[2] myArray[3] myArray[4]
Pitfall – Array Out-of-Bounds Address Value • What happens if I attempt to write a value outside of the array range? • myArray[5] = 1921; • I overwrite the contents of var3! (which happened to come next in memory) var1 var2 myArray[0] myArray[1] myArray[2] myArray[3] myArray[4] Bad!!
Pitfall – Array Out-of-Bounds Address Value • What happens if I attempt to read a value outside of the array range? • value=myArray[5]; • I don’t get an error • Instead, I get the contents of var3! (which happened to come next in memory) var1 var2 myArray[0] myArray[1] myArray[2] myArray[3] myArray[4] Bad!!
Array Initialization • We can declare and initialize variables at the same time • intmyVar = 15; • We can also declare and initialize arrays at the same time • int myArray[5] = {1,2,3,4,5}; equivalent to • int myArray[5];myArray[0] = 1;myArray[1] = 2;myArray[2] = 3;myArray[3] = 4;myArray[4] = 5;
Array Initialization Tips • You don’t have to specify the max size of the array when initializing it • intmyArray[] = {10, 15, 20, 25, 30, 35, 40}; • Empty brackets tells the compiler to automatically create an array big enough to hold the initialized values • In this case, 7 elements • But you can’t later try to change the size of the array; if it’s supposed to be bigger, you must either declare it as such, or add “dummy” initializers
Setting Array Size • You could just use a literal number • int myArray[20]; • But, a better way to do it is to declare a constant variable first • const int ARRAY_SIZE=20;intmyArray[ARRAY_SIZE]; • Now we can use the identifier to make the code easier to understand (and avoid bugs)! • for(inti=0; i<ARRAY_SIZE; i++) • All-caps name is programmer convention for constants
Pitfall – Array Size • Array size must be known to the compiler at compile-time • You cannot do this: • int size;cin >> size;intmyArray[size]; • There is a way to accomplish this concept that you’ll learn later (dynamic allocation), but it requires a different way to create the array
Pitfall – Copying Array • It’s reasonable to need to copy an array • const int ARRAY_SIZE = 10;int array1[ARRAY_SIZE] = {…};int array2[ARRAY_SIZE];array2 = array1; • This does not work! • Compiler should produce an error here
Copying Array • The correct way to copy an array • const int ARRAY_SIZE = 10;int array1[ARRAY_SIZE] = {…};int array2[ARRAY_SIZE];for(inti=0; i<ARRAY_SIZE; i++){ array2[i] = array1[i];} • Must copy array element-by-element
Pitfall – Outputting Array • Likewise, you may want to output an array • const int ARRAY_SIZE = 10;int array1[ARRAY_SIZE] = {…};cout << array1; • This does not work! • Program will instead print out the memory address of the first item in array1
Outputting Array • The correct way to output an array • const int ARRAY_SIZE = 10;int array1[ARRAY_SIZE] = {…};for(inti=0; i<ARRAY_SIZE; i++){cout << array1[i] << endl;} • Must also output array element-by-element
Arrays Elements in Function Calls • You can use individual array elements in functions calls • Pass-by-value and pass-by-reference both work • Example function: • calculateSomething(double var1); • Takes a double as an argument • Example array: • double myArray[10]; • Example function calls: • calculateSomething(myArray[3]); • calculateSomething(myArray[i]); • As long as i evaluates to an int between 0 and 9
Whole Arrays in Function Calls • You can also use an entire array in your function call • This works using pass-by-reference • If you modify the array inside the function, the original array (outside of the function) is actually modified • There is only one copy of the data storage element (the array), with two labels… • Don’t need to use the & symbol • Arrays are always pass-by-reference • You cannot do pass-by-value for an entire array, only for one element of the array
Whole Arrays in Function Calls // This function will read in <size> integers // and save them in <array> void populateArray(int array[], int size) { cout << “Enter ” << size << “ integers:” << endl; for(inti=0; i<size; i++) { cin >> array[i]; } } int main() { const int NUMBER_OF_GRADES = 25; intgrades[NUMBER_OF_GRADES]; populateArray(grades, NUMBER_OF_GRADES); } Empty brackets so we can accept arrays of any size No square bracket or index – we want the entire array
Arrays as Function Return Values • Functions cannot return an array • They can only return single values • One int, one double, one char, … • We’ll learn a different way to accomplish this idea later (by using pointers…)
Summary of Arrays and Functions • Individual array elements (indexed variables) can be passed as arguments to a function • Pass-by reference or pass-by-value • An entire array may be passed as arguments • Essentially pass-by-reference only • Do not need the & symbol • Array size is not known by the function • Usually need to pass it as an argument to • Nice benefit: the same function can be used for different sized arrays!
Special Preview! Strings
Declaring Strings • String library • Add a new type of data: Many characters in a row • Works similar to built-in data types like int, char, and double • Include the library: • #include <string>using namespace std; • Declare a new string variable and initialize • string mystring1 = “AMD”;
Strings – Basic Operators • Some of the basic operators work with strings too! • At least, the ones that make sense… • Use + to concatenate strings • Use = to assign strings • string str1=“Computer “;string str2=“Science“;string str3;str3 = str1+ str2; // Value is “Computer Science”
String – Basic Operators • Use == or != to compare strings • Use coutto output values • string str1=“Orange”;string str2=“Apple“;if(str1 != str2)cout << str1 << “ is not equal to “ << str2; • Use cinto input values • string str1, str2;cin >> str1 >> str2; • Input finishes on whitespace! • “University of the Pacific” • str1 = “University” • str2 = “of”
String – Member Functions • at(i) – Character at position n (count starts at 0) • Example: string str1=“Computer”;cout << str1.at(3); // Should print ‘p’ • And many more functions!
Questions? ? ? ?