Arrays and Strings
Chapter 9
1
"All students to receive 2
arrays!" reports Dr. Austin.
Declaring arrays
Passing arrays
as parameters
Inspecting arrays
scores
scores:: 85
85 79
79 92
92 57
57 68
68 80
80 ......
0 1 2 3 4 5 98 99
3
Design Problem
Consider a program to calculate class
average
Why??
Why??
?
4
Add to Design Problem
Now your client says, I need to ALSO
calculate and display “deviations” from
the average
Describe
Describewhy
whythis
thiswill
willor
orwill
willNOT
NOTwork
work
5
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!!
Simple vs Structured Data 6
Types
Simple data type => data element
contains a single value
xx::15
15 avg
avg::84.35
84.35 ch
ch::‘A’
‘A’
Structured data type => a data element
contains a collection of data values
scores
scores:: 85
85 79
79 92
92 57
57 68
68 80
80
name
name:: ‘C’
‘C’ ‘L’
‘L’ ‘Y’
‘Y’ ‘D’
‘D’ ‘E’
‘E’
7
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
scores:: 85
85 79
79 92
92 57
57 68
68 80
80
0 1 2 3 4 5
cout
cout <<
<< scores[2];
scores[2];
scores[0]
scores[0] == 100;
100;
8
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
9
Use of Array for Our Problem
Store elements in array as read in
Go back and access for deviations
Note
Notedeclaration
declaration
10
Declaring Arrays
Syntax:
Data_type Array_name [constant];
Note declaration from our example
Tells
Tellshow
howmany
manyelements
elementsset
setaside
aside
11
Declaring Arrays
Example specifies an array…
» each element is an integer
» there is space for 100 elements
» the are numbered 0 through 99
scores
scores:: 85
85 79
79 92
92 57
57 68
68 80
80 ......
0 1 2 3 4 5 98 99
Accessing Individual 12
Components
Use the name of the array
Followed by an integer expression
inside the square brackets [ ]
scores
scores:: 85
85 79
79 92
92 57
57 68
68 80
80 ......
0 1 2 3 4 5 98 99
Index
Indexcan
canbe:
be: max
max == scores[0];
scores[0];
--constant
constant for
for (x
(x == 0;
0; xx << 100;
100; x++)
x++)
--variable
variable if
if (scores[x]
(scores[x] >> max)
max)
--expression
expression max
max == scores[x];
scores[x];
MUST
MUSTbe bean
aninteger
integer
13
Out of Bounds Index
What happens if … float f_list
float f_list [50];
[50];
f_list
f_list [100]
[100] == 123.456;
123.456;
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 14
Declarations
Possible to declare the size & initialize
int
int results
results [5]
[5] == {14,
{14, 6,
6, 23,
23, 8,
8, 12
12 }}
Possible to omit size at declaration
» Compiler figures out size of array
float
float prices
prices [[ ]] == {{ 2.41,
2.41, 85.06,
85.06, 19.95,
19.95, 3.91
3.91 }}
15
Aggregate Operations
Defn => an operation on the data
structure as a whole
» as opposed to operation on a SINGLE
element within the structure
Example
» would be nice to read in a WHOLE
array
16
Lack of Aggregate Operations
Would be nice but . . .
C++ does NOT have . . .
Assignment operator for whole array
Arithmetic operations for whole array
(think matrix)
Comparisons for arrays (not even = =)
Return of an array type by a function
How to Accomplish 17
Aggregate Operations?
Most such tasks (assignment, read, write)
can be performed some other way
» CS II course will write “classes” to
provide these functions
Otherwise
» these operations must be performed by
the programmer
» element by element in a loop
18
Arrays as Parameters
This is one task that CAN be done to the
WHOLE array
C++ always passes arrays by reference
19
Arrays as Parameters
The name of the array is a pointer
constant
The address of the array is passed to
the function
Size of the
array also
passed to
control loop
20
Arrays as Parameters
Note the empty brackets in parameter
list
» A number can be placed here but it
will be
ignored
21
Sub-array Processing
Note we specified an array size of 100
» but we don’t anticipate that many scores
Array always declared larger than needed
Must keep track of how many have been
used
» this is our limit when doing other things to
the array
22
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
» Treated differently for I/O than other
types of arrays
23
Declaration of C-Strings
Similar to declaration of any array
char name[30];
// no initialization
char title [20] = "Le Grande Fromage";
// initialized at declaration
// with a string
char chList [10] = {'a', 'b', 'c', 'd'};
// initialized with list of char
// values
Working with Character 24
Strings
String => a collection of characters interpreted as a
single item
» a structured data item
» in C++ a null-terminated sequence of characters
stored in a char array
All strings in C++ are terminated by the null character
» character 0,
‘\0’
25
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
greeting = “don’t do it;
26
String Output
Strings (character arrays) are handled
differently than other types of arrays
This would NOT be allowed
int
int num_list
num_list [100];
[100];
.. .. ..
cout
cout << << num_list;
num_list;
This is legal:
char
char name
name [30]
[30] == “Snidly
“Snidly Q.
Q. Fizbane”;
Fizbane”;
.. .. ..
cout
cout <<
<< name;
name;
27
String Input
Declare strings 1
element bigger than
planned size to
allow for ‘\0’
When input takes place, C++ automatically
places the ‘\0’ in memory at the end of the
characters typed in
Problems with >> for String
28
Input
Cannot be used to input a string with
imbedded blanks
>> stops reading as
soon as it
encounters first
whitespace
character
Problems with >> for String
29
Input
Solve problem by using getline ( … )
Quits
Quitsreading
readingafter
after1515characters
characters
or
orwhen
whenitithits
hitsaanewline,
newline,
whichever
whichevercomes
comesfirst.
first.
Includes
Includesall
allcharacters
characters
including
includingspaces,
spaces,tabs,
tabs,etc
etc
(whitespace
(whitespacecharacters)
characters)
Problems with >> for String
30
Input
If declared string is too small >> keeps
putting characters in memory PAST that
area in memory
s2
s2contents
contentsextend
extend
into
intothe
thememory
memory
area
areaof
ofs3
s3
31
Using Strings
Instead of “hard coding” file name for the
open ( … ) command,
» use a string variable,
» use keyboard entry with cin.getline(…)
» program more flexible, good for
ifstream
ifstream inFile;
inFile;
different
char
char files
fname[31];
fname[31];
cout
cout <<
<< “Enter
“Enter file
file name
name ->
-> “;
“;
cin.getline
cin.getline (fname,
(fname, 30,
30, ‘\n’);
‘\n’);
inFile.open
inFile.open (fname);
(fname);
32
String Library Routines
Recall that we could not use the aggregate
assignment of one string to another
C++ provides some string handling functions to
do this (and other similar tasks)
Found in
<string.h>
or
<cstring>
33
Contrast/Compare Strings and C-Strings
Assignment is OK Assignment is illegal
string s; char cs[30];
s = "hi mom"; cs = "don't do it";
Comparison OK Comparisons not allowed
if (s < "geek") …
I/O allowed much the
I/O allowed
cin >> s; same way
cin.getline(s,'\n');
cout << s;
34
Working with C-Strings
Functions provided in #include <cstring>
Used instead of assignment
Used for comparisons
35
Another Problem
Some functions require C-strings as
parameters
» The .open()
command for files
C-strings are terminated by the null
character (character 0)
» Such functions are looking for that
String objects are built differently
36
Solving the File Open Problem
One of the functions available for a string
object will convert it to a C-String
The function is c_str()
Remember that string functions are called by
using
» The variable
» The member operator var.c_str()
» The name of the function
View example
37
Design Problem
Consider the task of
keeping track of data
about parts for
manufacture
» part number,
description, qty
needed, unit price
38
Design Problem
Use “Parallel” arrays part # descrip qty price
One array each for
part num, descrip, A100 xxx 5 1.23 0
qty, price
B25 yyy 23 8.95 1
nth item in any one of
the arrays 2
associated with
same nth item of all
the arrays
39
Testing and Debugging Hints
Range of legal index values is 0 to array_size - 1
Individual elements of the array are of the
component type
No aggregate operations in arrays
» you must write the code to do this
If array parameter is incoming, specify formal
parameter as const
» prevents function from modifying
40
Testing and Debugging Hints
Omitting array size in declaration
» when array declared formal parameter
» when array initialized at declaration
Don’t pass component when function expects entire
array
Declare array size as max ever needed
» process only part of array which is used
Pass array name and length to functions which
process array or sub array
41
Testing and Debugging
Be sure to account for null character when
you manipulate characters individually in a
string
Remember proper use of the =
» correct for initialization at declarationtime
» INCORRECT for aggregate assignment
Aggregate input/output allowed for strings but
NOT for other array types
42
Testing and Debugging
If you use the >> for string input, make sure
» string is declared large enough
» string will have no white spaces
The >> operator stops at, but does not consume
the first trailing white space
» such as ‘\n’ or a space
The cin.getline (whatever, 30, ‘\n’ ) function
» stops when reading the ‘\n’
» consumes the ‘\n’
» has problems when ‘\n’ is still in the input stream
43
Testing and Debugging
When using the strcpy ( ), make
sure that the destination array is
declared long enough
Choose test data carefully for string
handling programs
» include strings that are too large
» include strings with whitespace