Arrays
Multi-dimensional
initialize & display Sorting
Part II
Multidimensional Arrays
a everything about one dimensional arrays applies
a all elements of the same data type
a just need additional sets of [ ][ ]
a a 3-D array has rows, columns, and rank
Multidimensional Arrays
int scores [4] [3] [2];// assume loaded with 1-24
for(row=0; row<4; row++) { for(col=0; col<3; col++)
{for(rank=0; rank<2; rank++)
cout<<setw(6)<<scores[row][col][rank];
cout<<endl; // new line for each row }
Multidimensional Arrays
{
cout <<endl; // start a new line
{
cout<<setw(6)<<nums[row][col][rank];nums[row][col][rank]
cout<<endl; // start a new line }
}
for(rank=0; rank < 2; rank++) for(col=0; col < 3; col++)
for(row=0; row < 4; row++)
A B C D E
28 40 29 9 14
parallel arrays = two or more arrays in which elements with corresponding indexes are related
Parallel Arrays
Used when related data is of different data types.
grade % of class
*
Parallel Arrays
for(row…
for(col…
{ cout >> “Enter id#”;
cin >> id[row][col];
cout >> “Enter grade”;
cin >> grade[row][col];
}
Sum a Row
void main(void)
{ double nums [3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
double sumRow(double [3] [4]); // prototype cout << “The sum of row 3 is “
<< sumRow(nums)<<endl; //function call }
Sum a Row
double sumRow(double ary[3][4]) { int col;
double total=0;
for(col = 0; col < 4; col++) total += ary[ ][col];
return total;
}
* * total += ary[2][col]; //enter row #-1
output The sum of row 3 is 42The sum of row 3 is 42
Sum a Column
void main(void)
{ double nums [3][4] = {1, 2, 3, 4, 5, 6, 3 7, 8, 7 9, 10, 11, 12};11
double sumCol(double [3] [4]); // prototype cout << “The sum of column 3 is “
<< sumCol(nums) << endl; //function call }
Sum a Column
double sumCol(double ary[3][4]) { int row;
double total=0;
for(row = 0; row<3; row++) total += ary[row][ ];
return total;
}
* total += ary[row][2]; //enter col #-1
output The sum of column 3 is 21The sum of column 3 is 21
Sum All Rows
void sumRow(double ary[3][4]) { int row, col;
double total=0;
for(row = 0; row < 3; row++)
{ total = 0; // each row total begins at 0 for(col = 0; col<4; col++)
total += ary[row][col]; // enter row # cout << "The sum of row "<<row+1 << " is "<<total<<endl;
}
cout<<endl;
}}
*
1 X
Sum All Columns
void sumCol(double ary[3][4]) { int row, col;
double total=0;
for(col = 0; col < 4; col++)
{total = 0; // each col. total begins at 0 for(row = 0; row < 3; row++)
total += ary[row][col]; //enter col # cout << "The sum of col " << col+1 << " is " << total << endl;
}}
cout<<endl;
}}
* 1 3
X X
Just for fun!
A 2-D array has the same number of rows as col.
1. How to sum the diagonals - upper left to lower right?
2. How to sum the diagonals - upper right to lower left?
Sum Each Diagonal
Sorting
Internal Sorts [for small data sets]
selection
bubble (exchange)
External Sorts [for large data sets]
Selection Sort
index (k) sm_index
0 2
swap 21, 9
1 1
swap 13, 13
2 3
swap 21, 15
3 4
swap 21, 17 21 15
9 13 17
15 17
9 13 21
99 15
2121 13 17
15 2121
9 13 1717 2121 1515
9 13 17
Selection Sort
void sort(double [5]);
void swap(double [5], int, int); // prototypes void main(void)
{ int index;
double my_list[ ] = {21, 13, 9, 15, 17};
sort(my_list); // function call cout<<"\nThe sorted array is: \n";
for(index=0; index<5; index++) cout<<'\t'<<my_list[index]<<endl;
}
Selection Sort
void sort(double testArray[5])
{ int n, k, sm_index, moves=0; double smallest;
for(k=0; k<4; k++) // size-1 = number of passes { smallest=testArray[k];
sm_index=k;
for(n=k+1; n<5; n++) // size = # elem. to look at if(testArray[n]<smallest)
{ smallest=testArray[n];
sm_index=n;
}swap(testArray, sm_index, k); // call to swap() } }
Selection Sort
void swap(double testArray[5], int smaller, int pass)
{ // pass = current position: k
int moves;
double temp;
temp=testArray[pass];
testArray[pass]=testArray[smaller];
testArray[smaller]=temp;
moves++; // not needed for swap }
Bubble Sort
Put smaller first
Put smaller first
No change
Put smaller first
21 2525
13 9 1717
2121 2525
13 9 17
9 259
21 1321 17
9 25
13 21 17
Bubble Sort
Begin again and put smaller first
No change
Put smaller first
21 17
9 13 25
17 2121
9 13 2525 21 1721
13 913 25
2121 1717
9 13 25
A Bubble Sort Function
void bubble_sort(int array[ ], int length) { int j, k, flag=1, temp;
for(j=1; j<=length && flag; j++) {
flag=0; // false
for(k=0; k < (length-j); k++)
{if (array[k+1] > array[k]) // > low to high {temp=array[k+1]; // swap
array[k+1]= array[k];
array[k]=temp;
flag=1; // indicates a swap }} }} }} } // has occurred}
Array Review
a is an ordered sequence of data of the same type
a can be of any valid data type
a can be 1-, 2-, or multi- dimensional
a must be declared before used
a can be assigned and initialized
a element numbering starts at zero
Array Review
a use for loops to access
(nested for multidimentional)
a can be passed back and forth between functions
a when sent to functions the actual values are manipulated - not a copy
(passed by reference)
Array Review -1
Write a C++ program that adds equivalent
elements of the two-dimensional arrays named first and second. Both arrays should have two rows and three columns. For example, element [1][2] of the resulting array should be the sum of first[1][2] and second[1][2].
first second
16 18 23 24 52 77
54 91 11 16 19 59
sum
40 70 100 70 110 70
*
Write a C++ program that finds and displays the maximum value in a two-dimensional array of integers. It should also show the maximum
value’s subscripts. The array should be
declared as a four-by-five array of integers and initialized.
data: 16, 22, 99, 4, 18, -258, 4, 101, 5, 98, 105, 6, 15, 2, 45, 33, 88, 72, 46, 3
Array Review - 2
Array Review - 3
Write a program which picks the elements in ascending order from a two dimensional matrix (4 by 5) and puts them in a single dimensional array. Display the single
dimensional array.
There is a 3 by 5 array of grades. Write a program which reads the 15 grades and displays the number of grades below 60, number of grades in the 60's, number or grades in the 70's, number of grades in the 80's, and number of grades 90 or better.
Array Review - 4
Write a program that finds and displays the maximum value and its indicies in a two- dimensional array of integers. The array should be declared as a 10-row by 20- column array of integers in main().
Array Review - 5
Array Review - 6a
There is an array of three students each with four exam scores. Assume the scores are known and are: {77, 68, 86, 73}, {96, 87, 89, 78}, {70, 90, 86, 81}. Create a program which will display the lowest grade, the
highest grade and the average of the grades to two decimal places.
Array Review - 6b
#include <iostream.h>
#include <iomanip.h>
const int STUDENTS = 3;
const int EXAMS = 4;
int mini (int [][EXAMS], int, int);
int maxi (int [][EXAMS], int, int);
float average(int [], int);
void printArray(int [][EXAMS], int, int);
Array Review - 6c
void main(void)
{ int studentGrades[STUDENTS][EXAMS] =
{{77, 68, 86, 73}, {96, 87, 89, 78}, {70, 90, 86, 81}};
cout << "The array is:" << endl;
printArray(studentGrades, STUDENTS, EXAMS);
cout<<endl<<endl<<"Lowest grade: "
<< mini (studentGrades, STUDENTS, EXAMS) << endl << "Highest grade: "
<< maxi (studentGrades, STUDENTS, EXAMS)<<endl;
for (int person = 0; person < STUDENTS; person++)
cout << "The average grade for student " << person << " is "
<<setiosflags(ios::fixed | ios::showpoint)<<setprecision(2) << average(studentGrades[person], EXAMS) << endl;
}
Array Review - 6d
int mini(int grades[][EXAMS], int pupils, int tests)
{
int lowGrade = 100;
for (int i = 0; i < pupils; i++) for (int j = 0; j < tests; j++) if (grades[i][j] < lowGrade) lowGrade = grades[i][j];
return lowGrade;
}
int maxi(int grades[][EXAMS], int pupils, int tests) {
int highGrade = 0;
for (int i = 0; i < pupils; i++) for (int j = 0; j < tests; j++) if (grades[i][j] > highGrade) highGrade = grades[i][j];
return highGrade;
}
Array Review - 6e
float average(int setOfGrades[], int tests)
{
int total = 0;
for (int i = 0; i < tests; i++) total += setOfGrades[i];
return (float) total / tests;
}
void prtArray(int grades[]
[EXAMS],
int pupils, int tests) {
cout << " [0] [1] [2] [3]";
for (int i = 0; i < pupils; i++) {
cout << endl<< "studentGrades["
<< i << "] ";
for (int j = 0; j < tests; j++) cout << setiosflags(ios::left)
<< setw(5)
<< grades[i][j];
}
Array Review - 6f
function call:
average(studentGrades[person], EXAMS) float average(int setOfGrades[], int tests)
{ int total = 0;
for (int i = 0; i < tests; i++) total += setOfGrades[i];
return total }
Common Errors
Not declaring the array Not declaring the array
First element is called First element is called zero zero ; last element ; last element is one less than the number of elements is one less than the number of elements
Out of range Out of range subscripts - no warning subscripts - no warning
Error in the Error in the for for loop - check the counter loop - check the counter
Not initializing the array Not initializing the array
Common Errors
Aggregate operations not allowed Aggregate operations not allowed
Omitting array size - permitted only Omitting array size - permitted only when declared as a formal parameter when declared as a formal parameter
initialized in the declaration initialized in the declaration
If array is /* in */ only, declare the If array is /* in */ only, declare the formal parameter as
formal parameter as const const to prevent to prevent accidental modification
accidental modification
Debugging
array subscripts array subscripts
recheck array size in declaration, recheck array size in declaration,
initialization, and
initialization, and forfor loops loops Prevention - plan first!
Prevention - plan first!
Valuation tables Valuation tables
Display values with cout Display values with cout
C++ Debugger C++ Debugger