Next: Example Program: Iterative evaluation
Up: The while statement
Previous: Example while loop: Average,
A set of marks are available for a class of students. For each student the following details are available:
a candidate number - 4 digits a percentage examination mark for subject 1 a percentage coursework mark for subject 1 a percentage examination mark for subject 2 a percentage coursework mark for subject 2
A program is required which will read in the marks as above for each student and will output for each student, in one line, the above information together with a final mark for each subject. The final mark in each subject is 70% of the examination mark plus 30% of the coursework mark. The average final mark for each subject should also be output. End of input is to be signalled by input of a negative candidate number. A first algorithmic description of the required program is:
initialise. enter candidate number. while candidate number is positive { enter marks for candidate. process marks. output results for candidate. enter candidate number. } calculate subject averages. output subject averages.
A little thought shows that two accumulation variables will be
required to sum the two final subject marks, and since an average has
to be found the number of students must be counted. Initially these
sums and the count must be initialised to zero and in
process marks
the marks must be added to the sums and the count
incremented. Including these features the algorithmic description is
expanded to:
set sum1 and sum2 to zero. set count to zero. enter candidate number. while candidate number is positive { enter s1, cw1, s2, cw2. // the four candidate marks increment count. set final1 to 0.7*s1+0.3*cw1. set final2 to 0.7*s2+0.3*cw2. add final1 to sum1. add final2 to sum2. output candidate number, s1, cw1, s2, cw2, final1, final2. enter candidate number. } set subject1 average to sum1/count. set subject2 average to sum2/count. output subject1 average. output subject2 average.
This is then easily translated into the following program - the main function only is listed.
void main() { int candno; // candidate number int s1, cw1, s2, cw2; // candidate marks int final1, final2; // final subject marks int count; // number of students int sum1, sum2; // sum accumulators int subav1, subav2; // subject averages const float EXAMPC = 0.7, // mark weightings CWPC = 0.3; // initialise sum1 = 0; sum2 = 0; count = 0; // enter candidate number cout << "Input candidate number: "; cin >> candno; while (candno >= 0) { // enter marks cout << "Input candidate marks: "; cin >> s1 >> cw1 >> s2 >> cw2; // process marks count++; final1 = int(EXAMPC*s1 + CWPC*cw1); final2 = int(EXAMPC*s2 + CWPC*cw2); sum1 += final1; sum2 += final2; // output candidate number and marks cout << candno << " " << s1 << " " << cw1 << " " << s2 << " " << cw2 << " " << final1 << " " << final2 << endl; // enter next candidate number cout << "Input candidate number (negative to finish): "; cin >> candno; } // evaluate averages subav1 = sum1/count; subav2 = sum2/count; // output averages cout << endl << "Subject1 average is " << subav1 << endl << "Subject2 average is " << subav2 << endl; }
Download program.
Note that this program would fail if the first candidate number
entered was negative. The statement loop in the while
statement would
not be executed and hence count
would retain its initial value
of zero. This would lead to a division by zero when an attempt was
made to calculate the averages. It is often difficult to decide
whether a program should cope gracefully with non-existent data, after
all why would a user use the program if they had no data to enter?
However a typing error may lead to the entry of unsuitable data and it
is preferable that the program should recover gracefully from this
situation rather than fail with an obscure run-time error later. This
program could do this by either checking the sign of the first
candidate number entered and terminating with a suitable message if it
is negative or could recognise the situation by checking that count is
non-zero before proceeding to calculate the average.
This program could be extended by adding various facilities to it, for example indicating for each student whether they have passed judged by some criteria. See the exercises for possible extensions for you to try.