Upload
ashlyn-greene
View
218
Download
3
Embed Size (px)
Citation preview
Copyright 1998-2007 Curt Hill
Arrays in C/C++
More on usage
Copyright 1998-2007 Curt Hill
Tracing• Somewhat problematic• Since one name has many values
we have to be careful to keep track of them properly
• Thus our tracing chart widens
Copyright 1998-2007 Curt Hill
Voting Machine Again// Properties in the classint counts[20];...// these set to zerofor(int i=0;i<20;i++) counts[i] = 0;... void action () { int vote; cin >> vote; if(vote>=0 && vote<=20){ counts[vote]++; } else // invalid vote }
Copyright 1998-2007 Curt Hill
Technique• In the vote example we knew in
advance how many candidates before we got started– At compile time
• What if we do not know?– Two possibilities
• Make array large and do not fill it• C/C++ also has dynamic arrays
– Any pointer may refer to a simple item or an array of items
Copyright 1998-2007 Curt Hill
UnFull Array Technique• Consider this declaration:int used = 0, vals[1000];
• There are now two integers associated with vals:– used is the number that are used– 1000 is the maximum size
• Each time a value is added:if(used<1000) vals[used++]=a;
Copyright 1998-2007 Curt Hill
Technique Continued
• The only time 1000 is used is to see if a new item may be added
• All other references refer to used, such as a display:for(int i=0;i<used;i++) cout << i << “ “ << vals[i] <<“\n”;
Copyright 1998-2007 Curt Hill
Discussion• In other languages the used
variable could either refer to:– The last used value– The first unused value
• In the C family of languages it is almost always the latter– This makes it similar to array size
usage– Thus the for starts at zero and has an
end conditional of strictly less than
Copyright 1998-2007 Curt Hill
More Discussion• A function is completely unable to
determine the size of the array at run-time
• This kills array bounds checking– A compiler that can not check
something all the time will generally not do it ever
• It also does not matter whether we pass the function the size of the array or the number of items used
Copyright 1998-2007 Curt Hill
Example: Statistics• Consider that we wish to make a
simple statistics program• It should allow the entry of values
through a window• It should also allow display and
compute the average• As time permits compute median
or mode
Copyright 1998-2007 Curt Hill
Data Structure
• The central data structure is the array:double data [MAX];int count = 0;
• Adding an item to the array:if(count < MAX) data[count++] = val;
• Now some functions
Copyright 1998-2007 Curt Hill
Find the average
double avg(double d[], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0;
} // end of avg
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
size
012345678910…
4
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
0 4
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
0 4i0
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
0 4i0
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
01.2
4i0
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
01.2
4i01
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
01.2
4i01
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
01.24.3
4i01
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
01.24.3
4i012
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
01.24.38.3
4i012
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
01.24.38.3
4i0123
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
01.24.38.313.7
4i0123
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
01.24.38.313.7
4i01234
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
01.24.38.313.7
4i01234
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
01.24.38.313.7
4i01234
1.23.14.05.4
0.19.13.33.1-3.19.1…
Copyright 1998-2007 Curt Hill
Tracingdouble avg(double d [], int size){double sum = 0;for(int i = 0;i<size;i++) sum += d[i];if(size>0) // prevent zero division return sum/size;else return 0; } // end of avg
d
sizesum
012345678910…
01.24.38.313.7
4i01234
1.23.14.05.4
0.19.13.33.1-3.19.1…result
3.425
Copyright 1998-2007 Curt Hill
Parameter Passage• When a function receives a value
parameter as an actual parameter, it receives a copy
• No matter what the method does the formal parameter is not changed
• Since array names are pointers a function receives a pointer
• The pointer cannot be changed but the array to which it refers can be
Copyright 1998-2007 Curt Hill
Tracing Again• Consider the following worthless code:void m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
Copyright 1998-2007 Curt Hill
Tracingvoid m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
x z
12 1084
Copyright 1998-2007 Curt Hill
Tracingvoid m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
x z
12 1084
12
xar
Copyright 1998-2007 Curt Hill
Tracingvoid m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
x z
12 1084
12
xar
0
i
Copyright 1998-2007 Curt Hill
Tracingvoid m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
x z
12 6 84
12
xar
0
i
Copyright 1998-2007 Curt Hill
Tracingvoid m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
x z
12 6 84
12
xar
1
i
Copyright 1998-2007 Curt Hill
Tracingvoid m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
x z
12 6 54
12
xar
1
i
Copyright 1998-2007 Curt Hill
Tracingvoid m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
x z
12 6 54
12
xar
2
i
Copyright 1998-2007 Curt Hill
Tracingvoid m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
x z
12 6 53
12
xar
2
i
Copyright 1998-2007 Curt Hill
Tracingvoid m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
x z
12 6 53
12
xar
3
i
Copyright 1998-2007 Curt Hill
Tracingvoid m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
x z
12 6 53
12
xar
3
i
Copyright 1998-2007 Curt Hill
Tracingvoid m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
x z
12 6 53
-100
xar
Copyright 1998-2007 Curt Hill
Tracingvoid m1(int ar[], int s, int x){ for(int i = 0;i<s;i++) ar[i] = ar[i]/2 + 1; x = -100; }…int z[]={10,8,4}, x=12;m1(z,3,x);
x z
12 6 53
Copyright 1998-2007 Curt Hill
Discussion• A value parameter passed to a
function or method just passes a copy– The original cannot be changed
• An array just passes the pointer– The array may changed but not the
pointer
• Arrays may thus have their values changed
Copyright 1998-2007 Curt Hill
Partial Arrays• Beside using the unfull array
technique we may also process partial arrays
• A partial array is a subset of the full array
• This can be accomplished in two ways– Passing a smaller length, which we
have seen– Passing something other than the
beginning address
Copyright 1998-2007 Curt Hill
Lets Not Start at Beginning• Since
– an array name is just a pointer– the bracket is an address modification
operator– we may use both to pass a fragment
of an array to a function• Suppose:int fun(int d[], int size);int a[1000];...a[0] = fun(&a[10],100);
Copyright 1998-2007 Curt Hill
Discussion• The expression a[10] is just an int• The address of operator may then
obtain its address• This is then passed to the function• Of course the function believes
that the subscript range starts at zero
• So d[0] actually corresponds to a[10]
• Of course, &a[i] works in the same way
Copyright 1998-2007 Curt Hill
Conclusions• Arrays are a valuable means to
structure data• They require a subscript (or index)
to access individual elements• Only parameter passage uses an
array without an index• Methods may change array
elements• Multiple dimension arrays are also
possible but will be discussed later