440 likes | 579 Vues
Arrays and Strings. Lecture: 25. 19.09.2012. Why??. Design Problem. Consider a program to calculate class average. ?. Add to Design Problem. Now your client says, I need to ALSO calculate and display “deviations” from the average. Describe why this will or will NOT work.
E N D
Arrays and Strings Lecture: 25 19.09.2012
Why?? Design Problem • Consider a program to calculate class average ?
Add to Design Problem • Now your client says, I need to ALSO calculate and display “deviations” from the average Describe why this will or will NOT work
Possible Solutions • Enter in the scores again • Use 100 separate variables • and cout and cin commands • Read (then re-read) from a file • The real answer … Use arrays!!
avg : 84.35 ch : ‘A’ x : 15 scores : 85 79 92 57 68 80 name : ‘C’ ‘L’ ‘Y’ ‘D’ ‘E’ Simple vs Structured Data Types • Simple data type => data element contains a single value • Structured data type => a data element contains a collection of data values
cout << scores[2];scores[0] = 100; Arrays • Arrays are Structured Data Types • They have a means of accessing individual components • Values can be retrieved from and stored in the structure scores : 85 79 92 57 68 80 0 1 2 3 4 5
One Dimensional Array • Structured collection of components • All of the same type • Structure given a single name • Individual elements accessed by index indicating relative position in collection • Type of elements stored in an array can be “just about” anything • Index of an array must be an integer
Note declaration Use of Array for Our Problem • Store elements in array as read in • Go back and access for deviations
Tells how many elements set aside Declaring Arrays • Syntax: Data_type Array_name [constant]; • Note declaration from our example
Declaring Arrays • Example specifies an array… • each element is an integer • there is space for 100 elements • the are numbered 0 through 99 scores : 85 79 92 57 68 80 . . . 0 1 2 3 4 5 98 99
Accessing Individual Components • Use the name of the array • Followed by an integer expression inside the square brackets [ ] scores : 85 79 92 57 68 80 . . . 0 1 2 3 4 5 98 99 Index can be:- constant- variable- expressionMUST be an integer max = scores[0];for (x = 0; x < 100; x++) if (scores[x] > max) max = scores[x];
Out of Bounds Index float f_list [50]; f_list [100] = 123.456; • What happens if … • C++ does NOT check for index out of range • Possible to walk off into “far reaches” of memory -- clobbers ... • other variable locations • .exe code • the operating system (??)
Initializing Arrays in Declarations • Possible to declare the size & initialize • Possible to omit size at declaration • Compiler figures out size of array int results [5] = {14, 6, 23, 8, 12 } float prices [ ] = { 2.41, 85.06, 19.95, 3.91 }
Arrays as Parameters • This is one task that CAN be done to the WHOLE array • C++ always passes arrays by reference
Arrays as Parameters • The name of the array is a pointer constant • The address of the array is passed to the function • Size of thearray alsopassed tocontrol loop
Arrays as Parameters • Note the empty brackets in parameter list • A number can be placed here but it will beignored
Multidimensional Arrays • A collection of a fixed number of components arranged in two dimensions • All components are of the same type • The syntax for declaring a two-dimensional array is: dataType arrayName[intexp1][intexp2]; where intexp1 and intexp2 are expressions yielding positive integer values.
Multidimensional Arrays • The two expressions intexp1 and intexp2 specify the number of rows and the number of columns, respectively, in the array • Two-dimensional arrays are sometimes called matrices or tables
Multidimensional Arrays double sales[10][5];
Accessing Array Elements • The syntax to access a component of a two-dimensional array is: arrayName[indexexp1][indexexp2] where indexexp1 and indexexp2 are expressions yielding nonnegative integer values • indexexp1 specifies the row position and indexexp2 specifies the column position
Accessing Array Elements sales[2][3] = 35.60; 35.60
2-DIM. Array Initialization • Like one-dimensional arrays • Two-dimensional arrays can be initialized when they are declared • To initialize a two-dimensional array when it is declared • Elements of each row are enclosed within braces and separated by commas • All rows are enclosed within braces • For number arrays, if all components of a row are not specified, the unspecified components are initialized to zero
2-DIM. Array Initialization • Example: intanArray[3][5] = { { 1, 2, 3, 4, 5, }, // row 0 { 6, 7, 8, 9, 10, }, // row 1 { 11, 12, 13, 14, 15 } // row 2 };
2-DIM. Array Initialization • Accessing all of the elements of a two-dimensional array requires two loops: one for the row, and one for the column. • Since two-dimensional arrays are typically accessed row by row, generally the row index is used as the outer loop. for (intnRow = 0; nRow < nNumRows; nRow++) for (intnCol = 0; nCol < nNumCols; nCol++) cout << anArray[nRow][nCol];
Multidimensional Arrays • A collection of a fixed number of elements (called components) arranged in n dimensions (n >= 1) • Also called an n-dimensional array • General syntax of declaring an n-dimensional array is: dataTypearrayName[intExp1][intExp2]...[intExpn]; where intExp1, intExp2, …are constant expressions yielding positive integer values Example: 3-Dimensional array: intanArray[5][4][3];
C-Strings or Character Arrays • We have learned that the elements of an array can be just about anything • Consider an array whose elements are all characters • Called a C-String • Has a collection of special routines
C-Strings or Character Arrays • Character array: An array whose components are of type char • String: A sequence of zero or more characters enclosed in double quote marks • C-stings are null terminated (‘\0’) • The last character in a string is the null character
C-Strings or Character Arrays char str[80] = “Amanuensis”
C-Strings or Character Arrays • There is a difference between 'A' and "A" • 'A' is the character A • "A" is the string A • Because strings are null terminated, "A" represents two characters, 'A' and '\0‘ • Similarly, "Hello" contains six characters, 'H', 'e', 'l', 'l', 'o', and '\0'
C-Strings or Character Arrays • Consider the statement char name[16]; • Because C-strings are null terminated and name has sixteen components • the largest string that can be stored in name is 15 • If you store a string of length, say 10 in name • the first 11 components of name are used and the last 5 are left unused
Declaration of C-Strings • Similar to declaration of any arraychar name[30]; // no initializationchar title [20] = "Le Grande Fromage"; // initialized at declaration // with a stringchar chList [10] = {'a', 'b', 'c', 'd'}; // initialized with list of char // values
greeting = “don’t do it; Initializing Strings • When a character array is declared, it is legal to use the assignment operator to initialize • Note : use of the = operator only legal for char array initialization • But : aggregate array assignment is NOT
C-Strings: Example-1 #include<iostream> #include<conio.h> using namespace std; int main() { const int MAX = 80; //maximum characters in a string char str[MAX]; //string variable str cout<< “Enter a string \n”; cin>>str; //put string in str cout<< “You entered: ” << str << endl; //display string from str getch(); return 0; }
Reading Embedded Blanks #include<iostream> #include<conio.h> using namespace std; int main() { const int MAX = 80; char str[MAX]; cout<< “Enter a string \n”; cin.get(str,MAX); //member function get() of the stream class of // which cin is an object cout<< “You entered: ” << str << endl; getch(); return 0; }
Reading Multiple Lines #include<iostream> #include<conio.h> using namespace std; const int MAX = 2000; char str[MAX]; int main() { cout<< “Enter a string \n”; cin.get(str, MAX, ‘$’); //terminate with $ cout<< “You entered: ” << str << endl; getch(); return 0; }
Copying a string: Hard-way #include<iostream> #include<cstring> // for copying a string #include<conio.h> using namespace std; int main() { char str1[] = “C++ is the best programming” “language that I have ever used.”; const int MAX = 80; char str2[MAX]; for(int j=0; j < strlen(str1); j++) str2[j] = str1[j]; cout<< str2 << endl; getch(); return 0; }
Copying a string: Easy-way #include<iostream> #include<cstring> // for copying a string #include<conio.h> using namespace std; int main() { char str1[] = “C++ is the best programming” “language that I have ever used.”; const int MAX = 80; char str2[MAX]; strcpy(str2, str1); cout<< str2 << endl; getch(); return 0; }
Standard C++ string Class #include<iostream> #include<string> //string class #include<conio.h> using namespace std; int main() { string s1(“Man”); string s2 = “Beast”; string s3; s3 = s1; //assign cout << “s3 = “ << s3 << endl; s3 = “Neither “ + s1 + “ nor ”; //concatenate s3 += s2; //concatenate cout << “s3 = ” << s3 << endl; s1.swap(s2); //swap s1 and s2 cout << s1 << ” nor “ << s2 << endl; getch(); return 0; }
Assignment is OKstring s;s = "hi mom"; Comparison OKif (s < "geek") … I/O allowedcin >> s;cin.getline(s,'\n');cout << s; Assignment is illegalchar cs[30];cs = "don't do it"; Comparisons not allowed I/O allowed much the same way Contrast/Compare Strings and C-Strings
Used instead of assignment Used for comparisons Working with Strings • Functions provided in #include <cstring>
Working with Strings • C-strings are compared character by character using the collating sequence of the system • If we are using the ASCII character set • The string "Air" is smaller than the string "Boat" • The string "Air" is smaller than the string "An" • The string "Bill" is smaller than the string "Billy" • The string "Hello" is smaller than "hello"
Passing Arrays to Functions Arrays can be used as arguments to functions.
Passing Arguments to Arrays #include<iostream> #include<conio.h> using namespace std; int sum(int list[], int listSize) { int index, sum = 0; for(index=0; index<listSize; index++) sum = sum + list[index]; return sum; } int main() { int myArray[] = {2, 3, 5}; cout<< "The is: " << sum(myArray, 3); getch(); return 0; }