copyright 1998-2007 curt hill arrays in c/c++ more on usage

Post on 18-Jan-2016

218 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related