ICOM 4015 Advanced Programming Lecture 5 Procedural Abstraction

ICOM 4015 Advanced Programming Lecture 5 Procedural Abstraction III Reading: Chapter 3 Prof. Bienvenido Velez 3/6/2021 ICOM 4015 1

Administrivia • Program 0 (Due Feb 16) • Office Hours – Lunes y Miércoles 10: 30 -12: 30 – or by appointment – Office T-212 • Email – Make sure your email address is correct and functional – Check your email daily! 3/6/2021 ICOM 4015 2

Procedural Abstraction III Outline • Procedural arguments • Top-down stepwise refinement 3/6/2021 ICOM 4015 3

Integration Without Procedural Arguments #include <iostream> // Forward definitions double integrate. Sqr(double a, double b, double n); double integrate. Cube(double a, double b, double n); int main() { cout << "Integral of x^2 in [0, 1] = " << integrate. Sqr(0. 0, 10000) << endl; cout << "Integral of x^3 in [0, 1] = " << integrate. Cube(0. 0, 10000) << endl; } double integrate. Sqr(double a, double b, double n) { double delta = (b-a) / double(n); double sum = 0. 0; for (int i=0; i<n; i++) { float x = a + delta * i; sum += x * delta; } return sum; } double integrate. Cube(double a, double b, double n) { double delta = (b-a) / double(n); double sum = 0. 0; for (int i=0; i<n; i++) { float x = a + delta * i; sum += x * x * delta; } return sum; } [bvelez@amadeus] ~/icom 4015/lec 05 >> example 2 Integral of x^2 in [0, 1] = 0. 333283 Integral of x^3 in [0, 1] = 0. 24995 [bvelez@amadeus] ~/icom 4015/lec 05 >> 3/6/2021 ICOM 4015 4

Example 3 Integration With Procedural Arguments #include <iostream> // Forward definitions double integrate(double a, double b, double n, double f(double x)); double cube(double x); double sqr(double x); int main() { cout << "Integral of x^2 in [0, 1] = " << integrate(0. 0, 10000, sqr) << endl; cout << "Integral of x^3 in [0, 1] = " << integrate(0. 0, 10000, cube) << endl; } double integrate(double a, double b, double n, double f(double x)) { double delta = (b-a) / double(n); double sum = 0. 0; for (int i=0; i<n; i++) { sum += f(a + delta * i) * delta; } return sum; } double cube(double x) { return x * x; } double sqr(double x) { return x * x; } [bvelez@amadeus] ~/icom 4015/lec 05 >> example 2 Integral of x^2 in [0, 1] = 0. 333283 [0, 1] = 0. 24995 3/6/2021 Integral of x^3 in ICOM 4015 [bvelez@amadeus] ~/icom 4015/lec 05 >> 5

Step 0 - Outline // // // top-down. cc Computes weighted average score of grades. Grades include two assignments two midterm exams and one final exam. All grades are input from standard input, but the weights of each type of grade are hard coded. // C header files extern "C" { } // Standard C++ header files #include <iostream> // My own C++ header files // Macro definitions // Forward definitions of auxiliary functions // Global declarations // Main function int main() { // Read assignment grades // Read exam grades // Read final exam grade // Calculate average // Print report return 0; } // Auxiliary functions 3/6/2021 ICOM 4015 6

Step 1 – Code + Stubs int main() { float assignment 1, assignment 2; float exam 1, exam 2; float final. Exam; read. Assignment. Grades(assignment 1, assignment 2); read. Exam. Grades(exam 1, exam 2); read. Final. Grade(final. Exam); float avg; avg = calculate. Average(assignment 1, assignment 2, exam 1, exam 2, final. Exam ); print. Report(assignment 1, assignment 2, exam 1, exam 2, final. Exam, avg); return 0; } // Auxiliary functions void read. Assignment. Grades(float& assignment 1, float& assignment 2) {} void read. Exam. Grades(float& ex 1, float& ex 2) {} void read. Final. Grade(float& final) {} float calculate. Average(float assignment 1, float assignment 2, float exam 1, float exam 2, float final. Exam) {} void print. Report(float assignment 1, float assignment 2, float exam 1, float exam 2, float final. Exam, float average) {} 3/6/2021 ICOM 4015 7

Step 2 - Refine // Auxiliary functions void read. Assignment. Grades(float& assignment 1, float& assignment 2) { // Read a float in [0, 100] into assignment 1 // Read a float in [0, 100] into assignment 2 } void read. Exam. Grades(float& ex 1, float& ex 2) { // Read a float in [0, 100] into ex 1 // Read a float in [0, 100] into ex 2 } void read. Final. Grade(float& final) { // Read a float in [0, 100] into final } float calculate. Average(float assignment 1, float assignment 2, float exam 1, float exam 2, float final. Exam) { // Calculate assignments average // Calculate exams average // Calculate weighted average } void print. Report(float assignment 1, float assignment 2, float exam 1, float exam 2, float final. Exam, float average) { // print assignment grades // print exam grades // print final exam grades // print weighted average } 3/6/2021 ICOM 4015 8

Top-down stepwise refinement cycle outline refine code + stubs 3/6/2021 ICOM 4015 9

Summary of Concepts • Procedural arguments – Allow abstraction over processes and functions • Top-Down design / stepwise refinement – A cyclic development technique – Each cycle adds a level of detail to the code – We have a functioning (although incomplete) program after every iteration of the process 3/6/2021 ICOM 4015 10
- Slides: 10