{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Thorndale};}{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}
{\f28\froman\fcharset238\fprq2 Times New Roman CE{\*\falt Thorndale};}{\f29\froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Thorndale};}{\f31\froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Thorndale};}
{\f32\froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Thorndale};}{\f33\froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Thorndale};}{\f34\froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Thorndale};}
{\f35\froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Thorndale};}{\f44\fmodern\fcharset238\fprq1 Courier New CE;}{\f45\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f47\fmodern\fcharset161\fprq1 Courier New Greek;}
{\f48\fmodern\fcharset162\fprq1 Courier New Tur;}{\f49\fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f50\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f51\fmodern\fcharset186\fprq1 Courier New Baltic;}}{\colortbl;\red0\green0\blue0;
\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;
\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs24\cf1\lang1033\langfe255\cgrid\langnp1033\langfenp255 \snext0 Normal;}{
\s1\ql \li0\ri0\sb240\sa60\keepn\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 \b\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon15 \snext15 heading 1;}{\s2\ql \li0\ri0\keepn\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 
\b\fs20\cf1\lang1033\langfe255\cgrid\langnp1033\langfenp255 \sbasedon0 \snext0 heading 2;}{\*\cs10 \additive Default Paragraph Font;}{\s15\ql \li0\ri0\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 
\snext15 Default;}{\s16\ql \li0\ri0\sa120\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon15 \snext16 Text body;}{\s17\ql \fi-283\li567\ri0\sa120\nowidctlpar
\tx567\aspalpha\faauto\rin0\lin567\itap0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon16 \snext17 Hanging indent;}{\s18\ql \li0\ri0\sb240\sa120\keepn\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 
\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon15 \snext16 Heading;}{\s19\ql \fi-360\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon15 \snext19 List;}{
\s20\ql \fi-360\li720\ri0\nowidctlpar\aspalpha\faauto\rin0\lin720\itap0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon15 \snext20 List 2;}{\s21\ql \li0\ri0\nowidctlpar\tqc\tx4320\tqr\tx8640\aspalpha\faauto\rin0\lin0\itap0 
\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon15 \snext21 header;}{\s22\ql \li0\ri0\sa120\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon16 \snext22 Table Contents;}{
\s23\qc \li0\ri0\sa120\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 \b\i\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon22 \snext23 Table Heading;}{\s24\ql \li0\ri0\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 
\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon15 \snext24 Index;}{\s25\qc \li0\ri0\sb240\sa60\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 \b\fs32\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon15 \snext26 Title;}{
\s26\qc \li0\ri0\sa60\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon15 \snext16 Subtitle;}{\s27\ql \li0\ri0\nowidctlpar\tqc\tx4320\tqr\tx8640\aspalpha\faauto\rin0\lin0\itap0 
\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon15 \snext27 footer;}{\s28\ql \li0\ri0\sb120\sa120\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 \i\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon15 \snext28 caption;}{\*
\cs29 \additive \cf1\lang0\langfe255\langfenp255 Numbering Symbols;}{\*\cs30 \additive \cf1\lang0\langfe255\langfenp255 WW-Default Paragraph Font;}{\*\cs31 \additive \cf1\lang0\langfe255\langfenp255 \sbasedon30 page number;}}{\info{\author CNRS}
{\operator CNRS}{\creatim\yr2003\mo8\dy29\hr23\min17}{\revtim\yr2003\mo11\dy14\hr12\min46}{\printim\yr2003\mo10\dy10\hr9\min12}{\version6}{\edmins2}{\nofpages4}{\nofwords1595}{\nofchars9095}{\*\company CNRS-HSU}{\nofcharsws11169}{\vern8269}}
\margl1440\margr1440\margt1400\margb720 \widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\nolnhtadjtbl 
\fet0\sectd \sbknone\linex0\headery709\sectdefaultcl {\header \pard\plain \s21\ql \li0\ri0\nowidctlpar\tqc\tx4320\tqr\tx8640\aspalpha\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\fs16 CS 131 - Homework #10\tab \tab p. }
{\field{\*\fldinst {\fs16 \\page}}{\fldrslt {\fs16\lang1024\langfe1024\noproof 4}}}{
\par }{\fs16 Fall 2003
\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}
{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8
\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \s15\qc \li0\ri0\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 
\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b CS 131 - Intro to Computer Science I - Fall 2003
\par LAB #10 EXERCISE and Homework #10
\par 
\par lab #10 exercise due: Friday, November 14th, END of lab
\par }\pard \s15\qc \fi-420\li420\ri0\nowidctlpar\aspalpha\faauto\rin0\lin420\itap0 {\b HW #10 due: Friday, November 21st, }{\b\ul beginning}{\b  of lab
\par }\pard \s15\ql \fi-420\li420\ri0\nowidctlpar\aspalpha\faauto\rin0\lin420\itap0 {\b 
\par }\pard \s15\ql \li0\ri0\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 {
You are to work individually on this assignment, and you will turn in the specified files by e-mail (one file per e-mail message, with the contents included in the text and not as an attachment, and with a copy CC'd to yourself as your receipt) as you hav
e been doing since CS 131 HW #6.
\par 
\par NOTE: you are always welcome to write additional auxiliary functions for homework problems --- do be sure to e-mail me such functions if you do so, however! Just also let me know which problem(s) they are for.
\par }\pard \s15\ql \fi-420\li420\ri0\nowidctlpar\aspalpha\faauto\rin0\lin420\itap0 {\b\ul 
\par LAB #10 EXERCISE
\par }{\b 
\par }\pard \s15\ql \fi-435\li420\ri0\nowidctlpar\aspalpha\faauto\rin0\lin420\itap0 {By the end of lab...
\par }{\b 
\par }{*\tab Perform parts (a)-(d) of Homework Problem #1, below.
\par }{\b 
\par }{*\tab When you are done, add your name to the "Next:" list on the board.
\par }{\b 
\par }{*\tab When it is your turn, I will come and verify that your resulting main seems to be operating correctly, and}{
 will double-check that you are adding the required/specified comments. Once this is confirmed/completed, you have successfully completed today's lab exercise.}{\b 
\par 
\par }\pard \s15\ql \fi-420\li420\ri0\nowidctlpar\aspalpha\faauto\rin0\lin420\itap0 {\b\ul HOMEWORK #10:
\par }{\b 
\par }{\b 1.\tab }{Playing with pointers
\par }{\b 
\par \tab }{Consider the class }{\b MyNode}{ given in lecture (and now also available from the course web page). I'm going to "walk" you through some steps that will result in a main function, in file}{\b  listPlay.cpp}{,}{\b  }{
that constructs a simple, low-level linked list,  that also performs some "classic" manipulations of that list. }{\b 
\par }{
\par \tab Start with a Contract that is the usual for a main function (}{\f2 Contract : main : void -> int }{), the Purpose can be to practice with pointers and simple linked structures, and the Examples can be "not really applicable" 8-). And,
 you can set up the #include's and "skeleton" for your main function.
\par }{\b 
\par }{\tab So that I can check if you are on the right track, }{\b precede}{ the lines of code that you write for each part, below, with a }{\b comment}{ saying #1 and the letter for the part they are in answer to --- that is,  }{\b\f2 // #1 a}{\b     }{
comes before what you write for part (a), }{\b\f2 // #1 b}{   comes before what you write for part (b), etc. }{\b 
\par }{
\par }\pard \s15\ql \fi-420\li840\ri0\nowidctlpar\aspalpha\faauto\rin0\lin840\itap0 {\b (a)}{ \tab }{\b headPtr}{ is to be pointer to a MyNode, the first node in our little list-to-be, and }{\b tailPtr}{ is to be a pointer to a MyNod
e, also, but to the last node in our little list-to-be.  Declare both appropriately, and set them to the value discussed in lecture to indicate that they currently point to nothing.}{\b 
\par }{
\par }{\b (b)\tab }{Consider: what if you were adding the first element to an empty list? Both }{\b headPtr}{ and }{\b tailPtr}{ would point to that first element, wouldn't they? So...}{\b 
\par }\pard \s15\ql \fi-420\li1275\ri0\nowidctlpar\aspalpha\faauto\rin0\lin1275\itap0 {*\tab write the statement that would dynamically allocate a }{\b MyNode}{ with quant of 15 and cost of 0.99, making }{\b headPtr}{ point to the result;
\par 
\par *\tab then, write the statement that would make }{\b tailPtr}{ point to what }{\b headPtr}{ points to.
\par 
\par How might we do a quick'n'sleazy verification that these two pointers point where we want them to?
\par *\tab  Consider:
\par }{\b \tab \tab headPtr->get_cost()}{ would return the cost of the MyNode that it points to;}{\b 
\par }{\tab \tab }{\b tailPtr->get_quant()}{ would return the quant of the MyNode that it points to;}{\b 
\par }{
\par *\tab So, write one or more cout's that will use the above to print the cost of the node pointed to by headPtr and the quant of the node pointed to by tailPtr, along with messages noting what those values SHOULD be.
\par 
\par }\pard \s15\ql \fi-420\li855\ri0\nowidctlpar\aspalpha\faauto\rin0\lin855\itap0 {\b (c)\tab }{Consider: how would add an element to the }{\b end}{ of this (now not-empty) list? You'd call }{\b set_nextPtr}{ for the node pointed to by }{\b tailPtr}{
 so that that node's nextPtr would point to the new end node. Then, you'd set }{\b tailPtr}{ to point to the new node. }{\b 
\par }\pard \s15\ql \fi-420\li1275\ri0\nowidctlpar\aspalpha\faauto\rin0\lin1275\itap0 {*\tab write the statements that will do this, to add a node with quant }{\b 30}{ and cost }{\b 1.99}{ to the }{\b end}{ of our list; BUT NOTE: you should }{\b 
dynamically allocate}{ a new MyNode, pointed to by a newNodePtr, to create the new node.
\par 
\par *\tab to quickl
y-n-sleazily verify that headPtr and tailPtr now point to different nodes, write one or more cout's that will print the quant of the node pointed to by headPtr and the quant of the node pointed to by tailPtr, along with messages noting what the values SHO
ULD be.
\par 
\par }\pard \s15\ql \fi-420\li855\ri0\nowidctlpar\aspalpha\faauto\rin0\lin855\itap0 {\b (d)\tab }{Consider: how would you add an element to the }{\b beginning }{of this (now not-empty) list? You'd }{\b set_nextPtr}{ for the new node to point to what }{\b 
headPtr}{ points to now (the new node will be the new first node, the old first node will now be the second node), and then set }{\b headPtr}{ to point to the new node.}{\b 
\par }\pard \s15\ql \fi-420\li1260\ri0\nowidctlpar\aspalpha\faauto\rin0\lin1260\itap0 {*\tab write the statements that will do this, to add a node with quant }{\b 5}{ and cost }{\b 0.49}{ to the }{\b beginning}{ of our list; again, }{\b dynamically allocate}{
 a new MyNode and make a newNodePtr point to that new node, to create the new node.
\par 
\par *\tab to quickly-n-sleazily verify that headPtr points to the new node, but that the old first node is not gone, write one or more cout's that will print the quant of the node pointed to by headPtr, and the quant of the second node in
 the list (the node pointed to by the }{\b nextPtr}{ of the node pointed to by headPtr), along with messages noting what the values SHOULD be.
\par 
\par \tab What, you don't know how to get the quant of the second node in the list (the node pointed to by the nextPtr of the node pointed to by headPtr)? OK, here's some help with that:
\par }\pard \s15\ql \fi-420\li1710\ri0\nowidctlpar\aspalpha\faauto\rin0\lin1710\itap0 {*\tab you know that }{\b headPtr}{ points to the first node in the list;
\par *\tab so, }{\b headPtr->get_nextPtr() }{returns the pointer to the second node in the list, true?
\par *\tab and, given a pointer to a MyNode, }{\b ->get_quant()}{ returns the quantity of the node pointed to, true?
\par *\tab so: }{\b headPtr->get_nextPtr()->get_quant()}{ will return the quantity of the second node in the list.
\par 
\par }\pard \s15\ql \fi-420\li840\ri0\nowidctlpar\aspalpha\faauto\rin0\lin840\itap0 {\b (e)\tab }{Hmm; we'd like to make this list bigger. We'd like to ask the user how many elements to add to this
 list, and then query them for that many pairs of cost and quant values --- AND then ask whether each new element should go at the beginning or the end of the new list. Then, it should be added there. }{\b 
\par }{
\par \tab Write the statements that will do the above. Again, in creating each new node, be sure that you are dynamically allocating a new MyNode, and setting a newNodePtr to point to the new MyNode.
\par 
\par }{\b (f)\tab }{But --- we really need to verify that all went well, above. Likewise, we need to practice one of the classic link
ed-structure activities: "walking" through the linked structure (for example, to print its contents, or the sum its quantities, or to get the average cost, or to search for items with less than a certain quantity, or to find the most expensive item, or to
 find the quantity for an item with a given cost... ETC.)}{\b 
\par }{
\par \tab We want to "walk" through our list so that we can print its contents, to verify that it has been "built" correctly. 
\par 
\par \tab Here's one way to do this:
\par }\pard \s15\ql \fi-420\li1275\ri0\nowidctlpar\aspalpha\faauto\rin0\lin1275\itap0 {*\tab create a pointer to a MyNode, called }{\b currPtr}{. Set }{\b currPtr}{ to point to what }{\b headPtr}{ points to.}{\b 
\par }{
\par *\tab Important thing to note about our list: remember how, when we construct a new MyNode, we always set its }{\b nextPtr}{
 to NULL? Then, if you carefully consider how we add elements to the list, you'll see that the last element of our list always has a }{\b nextPtr}{
 of NULL, also. So, the last element in our list has a nextPtr of NULL, and that's how we can tell if we have reached the last element in the list.
\par 
\par \tab So, loop while }{\b currPtr }{is not equal to }{\b NULL}{, and INSIDE this loop:
\par }\pard \s15\ql \fi-420\li1695\ri0\nowidctlpar\aspalpha\faauto\rin0\lin1695\itap0 {*\tab ...use }{\b currPtr}{ to obtain and print the }{\b quant}{ and }{\b cost}{
 of the current node that it is pointing to.  Print the quant and cost in a message on a single line. (That is, perform whatever actions you desire on the "current" node, the current node you are pointing to.)
\par 
\par *\tab then, at the end of the loop, set }{\b currPtr}{ to point to whatever the }{\b nextPtr}{ of the "current" node points to.
\par 
\par }\pard \s15\ql \fi-420\li840\ri0\nowidctlpar\aspalpha\faauto\rin0\lin840\itap0 {That's it for }{\b linkPlay.cpp}{.
\par 
\par }\pard \s15\ql \fi-420\li420\ri0\nowidctlpar\aspalpha\faauto\rin0\lin420\itap0 {\b 2.\tab }{Create a class }{\b Student}{. A Student instance has a }{\b lastName}{ and a }{\b firstName}{; it also has a }{\b numGrades}{, and a }{\b gradesArray}{
 (a (dynamically allocated) array containing that many grades...!)}{\b 
\par }{\b 
\par \tab }{One }{\b constructor}{ for Student should create a student with a given first name, a given last last name, and an array ready to hold the given number of grades. A second, }{\b no-argument constructor}{
 should set the new Student instance's last name to be an empty string ( "" ), its first name to be an empty string, its numGrades to be 0, and its gradesArray to currently be NULL.
\par }{\b 
\par }{\tab We'll need some }{\b accessors}{, of course:
\par }\pard \s15\ql \fi-420\li825\ri0\nowidctlpar\aspalpha\faauto\rin0\lin825\itap0 {\tab get_lastName
\par \tab get_firstName
\par \tab get_numGrades
\par }\pard \s15\ql \fi-420\li1260\ri0\nowidctlpar\aspalpha\faauto\rin0\lin1260\itap0 {get_grade(int i) - returns the ith grade for that student. Return -1 if gradesArray is NULL when this is called, OR if the user c
alls it with an i that is not a "legal" index into this array.
\par }\pard \s15\ql \fi-420\li420\ri0\nowidctlpar\aspalpha\faauto\rin0\lin420\itap0 {
\par }\pard \s15\ql \fi-420\li840\ri0\nowidctlpar\aspalpha\faauto\rin0\lin840\itap0 {\tab (we }{\b WON'T}{
 provide get_gradesArray --- we might CHANGE how we implement the "set" of grades for a student, later on. So, callers can get the grades only by asking for them, one at a time.)
\par }\pard \s15\ql \fi-420\li435\ri0\nowidctlpar\aspalpha\faauto\rin0\lin435\itap0 {\b 
\par }\pard \s15\ql \fi-420\li840\ri0\nowidctlpar\aspalpha\faauto\rin0\lin840\itap0 {We'll need }{\b mutators}{, too.
\par }\pard \s15\ql \fi-420\li1275\ri0\nowidctlpar\aspalpha\faauto\rin0\lin1275\itap0 {set_lastName
\par set_firstName
\par 
\par set_numGrades --- BUT, note that it will not JUST set numGrades --- it will ALSO dynamically allocate an array of appropriate size for gradesArray to point to. (What if there WERE grades? For simplicity
, we'll be draconian: if gradesArray is not NULL at this point, we'll }{\b delete [ ]}{ its current contents, and recreate a new, uninitialized array of the specified size.)
\par 
\par set_grade(int i, double newGrade) - set the ith grade to newGrade
\par }\pard \s15\ql \fi-420\li840\ri0\nowidctlpar\aspalpha\faauto\rin0\lin840\itap0 {
\par We need a }{\b destructor}{, but we haven't talked about those yet, so here is the code for that:
\par 
\par }\pard \s15\ql \fi-420\li1260\ri0\nowidctlpar\aspalpha\faauto\rin0\lin1260\itap0 {*\tab put }{\b in Student.h}{, in public part:
\par }{\loch\af2 \hich\af0\dbch\af0\loch\f2 ~Student();
\par }{\b 
\par }{*\tab put in}{\b  Student.cpp:
\par 
\par }{\loch\af2 \hich\af0\dbch\af0\loch\f2 Student::~Student()
\par \{
\par }{\loch\af2 \hich\af0\dbch\af0\loch\f2     delete [  ] gradesArray;
\par }{\loch\af2 \}
\par }\pard \s15\ql \fi-420\li420\ri0\nowidctlpar\aspalpha\faauto\rin0\lin420\itap0 {
\par }{\tab [From Savitch, p. 731:
\par 
\par \tab "A }{\b destructor}{
 is a member function of a class that is called automatically when an object of that class goes out of scope. Among other things, this means that if an object of the class type is a local variable for a function, then the destructor is automatically calle
d
 as the last action before the function call ends. Destructors are used to eliminate any dynamic variables that have been created by the object so that the memory occupied by theser dynamic variables is returned to the freestore. Destructors may perform o
ther cleanup tasks as well. The name of a constructor symbol must consist of the tilde symbol ~ followed by the name of the class."]
\par }{\b 
\par \tab }{And, we need a few other member functions, too:
\par }\pard \s15\ql \fi-420\li840\ri0\nowidctlpar\aspalpha\faauto\rin0\lin840\itap0 {\tab avgGrade - computes the average of the grades for this student, and returns that average. Returns -1 if there are no grades for this student yet.
\par 
\par \tab hasHigherAvgThan(Student anotherSt) - true if calling object has a higher average than anotherSt, false otherwise.
\par }\pard \s15\ql \fi-420\li420\ri0\nowidctlpar\aspalpha\faauto\rin0\lin420\itap0 {\b 
\par }{\tab Finally, write a quick'n'sleazy }{\b test_Student.cpp}{ main function to create at least }{\b three}{
 Student instances, demonstrate each accessor at least once, demonstrate that each mutator works on at least one example, call avgGrade at least once, and call hasHigherAvg
Than at least three times (once where it should be true, once where it should be false with Students with two different averages, and once where it should be false because two Students have the same average). You may add additional tests as well, but only
 these are required.
\par }\pard \s15\ql \fi-15\li0\ri0\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 {
\par Throughout the homework, IF you create any helper functions, be sure to e-mail them to me along with your other homework files.
\par }\pard \s15\ql \fi-435\li420\ri0\nowidctlpar\aspalpha\faauto\rin0\lin420\itap0 {\b 
\par }\pard \s15\ql \li-15\ri0\nowidctlpar\aspalpha\faauto\rin0\lin-15\itap0 {When you are done with this homework, you should have sent me at least }{\b X}{ e-mail messages, one each for: }{\b listPlay.cpp}{, }{\b Student.h}{, }{\b Student.cpp}{, and }{\b 
test_Student.cpp}{.
\par }{\b 
\par }{\b\ul 
\par }}