PROGRAM 39
// FILE NAME: PROG39.CPP PROGRAMMER NAME: ANTHONY F. ORTIZ
// THIS PROGRAM USES A CLASS CALLED LINK LIST. THE MEMBER FUNCTIONS
// INITIALIZE THE COUNT AND LINKLIST OBJECT, ENTER OBJECTS FROM THE
// KEYBOARD, AND DISPLAY TOTAL, AVERAGE, AND COUNT OF THE OBJECTS.
#include "linklist.h"
print_menu ();
char get_selection (linklist & expenses);
pause_program ();
int main ()
{
char choice;
linklist expenses;
do
{
print_menu ();
choice = get_selection (expenses);
}
while (choice != 'Q');
return 0;
}
print_menu ()
{
clrscr ();
gotoxy (25, 1);
cout << "MENU OPTIONS";
gotoxy (30, 3);
cout << "E -- ENTER OBJECT";
gotoxy (30, 4);
cout << "T -- PRINT COUNT";
gotoxy (30, 5);
cout << "Q -- QUIT PROGRAM";
gotoxy (25, 7);
cout << "ENTER SELECTION ";
return 0;
}
char get_selection (linklist & expenses)
{
char choice;
cin >> choice;
choice = toupper (choice);
switch (choice)
{
case ('E'): {
expenses.enteritem ();
break;
}
case ('T'): {
expenses.printtotal ();
pause_program ();
break;
}
case ('Q'): {
clrscr ();
break;
}
}
return (choice);
}
pause_program ()
{
cout << endl << "PRESS ENTER KEY TO CONTINUE ..... ";
getch ();
return 0;
}
// FILE NAME: LINKLIST.H
// THIS FILE CONTAINS THE DECLARATION OF THE LINKLIST CLASS.
#ifndef linklist_h
#define linklist_h
#include
#include
#include
#include
#include
typedef float data;
struct node
{
data listdata;
node * link;
};
class linklist
{
protected:
node * head;
int count;
public:
linklist ();
// POST: CONSTRUCTOR, THE LINKLIST OBJECT IS INITIALIZED TO AN EMPTY LIST.
~linklist ();
// POST: DESTRUCTOR, THE LINKLIST OBJECT IS DEALLOCATED.
void enteritem ();
// POST: PROMPTS FOR DATA ITEM FROM THE KEYBOARD TO ENTER INTO THE LIST;
// ITEM IS ADDED TO THE BEGINNING OF THE LIST VIA MEMBER FUNCTION
// ADD (ITEM).
void printtotal (void);
// POST: PRINTS THE TOTAL OF ALL CURRENT ENTRIES. ALSO PRINTS THE CURRENT
// COUNT AND AVERAGE.
void viewlist (void);
// POST: DISPLAY CURRENT LIST WITH POSITION NUMBERS 1, 2, 3, ..., COUNT.
void changelist (void);
// POST: THIS FUNCTION IS TO CALL VIEWLIST AUTOMATICALLY WHEN INVOKED.
// USER SHOULD BE ABLE TO 'CANCEL' WITHOUT MAKING ANY CHANGES IF
// DESIRED. THERE WILL BE TWO POSSIBLE CHANGES:
// A) USER MAY ENTER A NEW ITEM TO REPLACE AN EXISTING ITEM OF THEIR
// CHOICE.
// B) USER MAY DELETE AN ITEM FROM THE LIST.
void add (data item);
// POST: ADDS A NODE TO THE HEAD OF THE LIST.
void del ();
// POST: DELETES THE POINTER TO THE FIRST NODE IN THE LIST. PRESUMES THE
// LIST IS NOT EMPTY.
void delall ();
// POST: DELETES ALL POINTERS TO THE NODES IN THE LIST. USES THE DEL ()
// FUNCTION. USED BY THE DESTRUCTOR.
};
#include "linklist.cpp"
#endif
// FILE NAME: LINKLIST.CPP
// THIS FILE CONTAINS THE IMPLEMENTATION OF THE CLASS LINKLIST.
linklist :: linklist ()
{
head = 0;
count = 0;
cout << "CONSTRUCTOR INVOKED." << endl << endl;
cout.setf (ios :: showpoint);
cout.setf (ios :: fixed);
cout << setprecision (2);
}
linklist :: ~linklist ()
{
delall ();
cout << "DESTRUCTOR INVOKED" << endl << endl;
}
void linklist :: enteritem (void)
{
data item;
clrscr ();
cout << "ENTER A OBJECT. ";
cin >> item;
add (item);
count++;
}
void linklist :: printtotal (void)
{
float sum, average;
sum = average = 0;
clrscr ();
for (node * p = head; p != 0; p = p -> link)
{
sum = sum + p -> listdata;
}
average = sum / count;
cout << "THE TOTAL IS " << sum << ". THE AVERAGE IS " << average;
cout << ". THE COUNT IS " << count << "." << endl;
}
void linklist :: viewlist (void)
{
int count2 = 1;
clrscr ();
cout << "HERE ARE ALL THE OBJECTS OF THE LIST: " << endl << endl;
for (node * p = head; p != 0; p = p -> link)
{
cout << "OBJECT " << setw (2) << count2 << ": " << setw (8);
cout << p -> listdata << endl;
count2++;
}
}
// THIS MEMBER FUNCTION IS STILL UNDER CONSTRUCTION.
void linklist :: changelist (void)
{
char choice, ans;
int position, count2;
data change;
clrscr ();
gotoxy (25, 1);
cout << "MENU CHOICES";
gotoxy (30, 3);
cout << "D -- DELETE AN ITEM";
gotoxy (30, 4);
cout << "C -- CHANGE AN ITEM";
gotoxy (25, 6);
cout << "ENTER A CHOICE: ";
cin >> choice;
choice = toupper (choice);
if (choice == 'D' || choice == 'C')
{
clrscr ();
do
{
cout << "ENTER A # FROM 1 .. " << count;
cout << " TO CHANGE AN ITEM. ";
cin >> position;
cout << endl;
}
while (position < 1 || position > count);
}
count2 = 1;
for (node * p = head; p != 0; p = p -> link)
{
if (count2 == position)
{
break;
}
count2++;
}
switch (choice)
{
case ('D'): {
clrscr ();
cout << "DELETE OBJECT " << position << " ";
cout << p -> listdata << " (Y/N)? ";
cin >> ans;
ans = toupper (ans);
if (ans == 'Y')
{
node * prevptr;
if (p == head)
{
head = head -> link;
}
else
{
prevptr = head;
while (prevptr -> link != p)
{
prevptr = prevptr -> link;
}
prevptr -> link = p -> link;
}
delete p;
count--;
cout << endl << "OBJECT DELETED " << endl;
}
else
{
cout << endl << "OBJECT NOT DELETED" << endl;
}
break;
}
case ('C'): {
clrscr ();
cout << "ENTER NEW OBJECT " << position << ": ";
cin >> change;
cout << endl << "CHANGE OBJECT " << position;
cout << " " << p -> listdata << " (Y/N)? ";
cin >> ans;
ans = toupper (ans);
if (ans == 'Y')
{
p -> listdata = change;
cout << endl << "OBJECT CHANGED" << endl;
}
else
{
cout << endl << "OBJECT NOT CHANGED" << endl;
}
break;
}
}
}
void linklist :: add (data item)
{
node * temp = new node;
temp -> link = head;
temp -> listdata = item;
head = temp;
}
void linklist :: del ()
{
node * temp = head;
head = temp -> link;
delete temp;
count--;
}
void linklist :: delall ()
{
while (head != 0)
{
del ();
}
}
// OUTFILE: PROG39.OUT
MENU OPTIONS
E -- ENTER OBJECT
T -- PRINT COUNT
Q -- QUIT PROGRAM
ENTER SELECTION q
DESTRUCTOR INVOKED
BACK TO COMP251 PAGE.