Lab 2 - Simple C++ Functions

For this lab, you will need to clone another repository using the invitation link below:

This repository will be used for a few small lab projects. (We will leave Lab1 in the homework repo).

Writing a bigger program

Now that we have seen how to put a simple program together that uses C++ functions, let’s build a program that does the most basic job all students have to contend with, process the grades on a test and produce a summary of the results. The big wrinkle in this is that I want this to be a multi-file program.

We want to do three simple things:

  • Figure out the best score of all scores produced
  • Figure out the worst score of all scores produced
  • Assign a letter grade for each score produced

Here is our list of grades to process:

int grades[15] = {  55, 87, 93, 77, 92, 88, 67, 81, 84, 73, 81, 92, 89, 100, 62 };

This is formally an array of numbers. We will look at arrays later, but they work much like lists in Python.

The big difference here, is that when we ask C++ to hand an array of data to a function, we actually just hand the address of the first element of the array to the function. We need to tell the function how many elements are in the array and then use that number to loop over the array to make sure we use the array correctly.

Warning

Messing this up is a huge source of bugs in programs!

Here is an example to make sure we do things right:

void show_grades(int data[], int num_values);

int main(int argc, char * argv[]) {
    int grades[15] = { 55, 87, 93, 77, 92, 88, 67, 81, 84, 73, 81, 92, 89, 100, 62 };

    show_grades(grades, 15);
}

Place this code in a file named grader.cpp

Here is the function that will display the grades:

#include <iostream>
using namespace std;

void show_grades(int data[], int num_values) {
    for(int i=0 i<num_values;i++)
        cout << data[i] << endl;
    }
}

This code is set up to live in a separate file, probably called something useful, like utilities.cpp.

When this code runs, the function wakes up with data actually pointing to the grades array from the caller’s data area. It also is using a value for num_values set to 15, since that is what the caller indicated was the right value.

It is up to the caller to make sure the right value is sent to the function. By doing things this way we can write a general purpose function that can be used for any data array of any size. That is kind of handy. But it is easy to mess things up if the caller does things wrong. Oh well, that is a small price to pay for such a useful system.

From our lecture, we should set up a header file to connect the main code and this function properly.

Here it the header file we should create. Name it utilities.h:

#ifndef UTILITIES_H
#define UTILITIES_H

void show_grades(int data[], int num_values);

#endif

In many real header files, the parameter names are omitted. I like to include them as a form of documentation. We will learn more about all of this later in the course.

Building the Code

You will need to compile each code file (ending in .cpp) separately, and build an associated object file (ending with .o). The link step will list all of the object files like this:

> g++ grader.o utilities.o -o grader.exe

Remember that you can edit the command lines you have previously entered. Just use the up arrow key to work through the set of compile steps. Then link the final code.

Your lab project

You need to complete this lab by writing three functions in the utilities ffile. Modify the header file and list the prototypes for each function.

You will call each function with the grades array as a parameter, and the number of values in that array in your main routine and make it do the following work:

  • Use the max value function to print out the max value found in the grade array.
  • Use the min value function to print out the min value found in the grade array
  • Use the letter grade function to print out the grade number and the associated letter grade for each score in the array. This will require a nested if-then else statement to figure this out.

Do not worry about making this output extremely pretty. All we are doing here is trying to get our first fairly involved C++ program put together. Place all of this code in a folder named LAB2 in the new labs-username rrpository