Address Book Program


Hi Everyone,
I have this final assignment and I have so many difficulties getting it done. I'm supposed to write/code an address book where I could add, delete, display and sort data. I'm not too familiar with C++ as this is my first semester taking a programming course. This is what I have ready but it wont run and I couldnt add the sorting data function. I need help please I have till 6pm. Thank you all in advance.

[code]

#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

struct Person
{
string name; // The name of record management system
string addr; // The number of contacts
};

// functin prototypes
void addData(AddressBook list[], int& size);
void dispData(const AddressBook list[], int size);
void saveFile(const AddressBook list[], int size);
void openFile(AddressBook list[], int& size);
char getMenuResponse();
int main(int argc, char *argv[])
{
AddressBook contactList[MAX_SIZE];
int numOfContacts = 0;
bool run = true;
do
{
cout << "Address Book - " << numOfRecs << " Number of Contacts" << endl;
switch ( getMenuResponse() )
{
case 'A': addData(contactList, numOfContacts); break;
case 'D': dispData(contactList, numOfContacts); break;
case 'O': openFile(contactList, numOfContacts); break;
case 'S': saveFile(contactList, numOfContacts); break;
case 'Q': run = false; break;
default : cout << "That is NOT a valid choice" << endl;
}
} while (run);
cout << endl << "Program Terminated" << endl;

// system("PAUSE"); // Commented out so the program exits upon request
return EXIT_SUCCESS;
}

void addData(AddressBook list[], int& size)
{
AddressBook tmp; // declare a temp contact that we will load before putting in the array
char response;
char str[256]; // needed for cin.getline; we are going to use a char array
if (size < MAX_SIZE) {
system("cls");
cout << "Enter Contact Information" << endl << endl;
cout << "Name: ";
// Get up to 256 characters from the keyboard including white space.
// Stop reading if encounter the \n first. If there's any chance of
// more than 256 characters you will have to clean up cin with
// cin.ignore before the next input.
cin.getline(str, 256, '\n'); // for char arrays; different from the other getline
tmp.name = str;
cout << "Address: ";
cin.getline(str, 256, '\n');
tmp.addr = str;
cout << endl;
cout << "Phone Number: ";
cin.getline(str, 256, '\n');
tmp.addr = str;
cout << endl;
cout << "E-mail Address: ";
cin.getline(str, 256, '\n');
tmp.addr = str;
cout << endl;
// see if this record should be added to the array
cout << "Add Contact to Address Book? (y/n) ";
cin >> response;
if (toupper(response) == 'Y')
list[size++] = tmp;
} else {
cout << "Sorry, Address Book is currently full." << endl;
system("pause");
}
system("cls");
}

void dispData(const Address Book list[], int size)
{
system("cls");

if(size < 1) {
cout << "Nothing to display" << endl;
} else {
cout << "Contacts :" << endl << endl;
cout << fixed << setprecision(2);
cout << "Contact Name Address Phone No. Email" << endl;
cout << "*******************************************" << endl;

cout << left;
for (int i = 0; i < size; i++) {
cout << setw(21) << list[i].name << right
<< setw(10) << list[i].addr<<left<<endl;
}

cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
cout << right << setw(3) << size;
cout << " Contacts"<< endl;
}

system("PAUSE");
system("cls");
}

// Save records to disc
void saveFile(const AddressBook list[], int size) {
string fileName;
ofstream outfi;
cout<<"Enter file name: ";
getline(cin,fileName);
outfi.open(fileName.c_str());

// to make sure the file stream is open before doing IO
if (!outfi.fail()) {
system("cls");
cout << "Saving Address Book to the disc ";

for(int i = 0; i < size; i++) {
outfi << list[i].name << ';'
<< list[i].addr<< ';';
// Start a new line after all but the last record
// Simplifies reading the file as EOF is at end of last line
if (i < size-1) outfi << endl;
}
cout << endl << size << " Address Book written to the disc." << endl;
outfi.close();
system("PAUSE");
system("cls");
}
else {
cout << "ERROR: problem with file" << endl;
system("PAUSE");
system("cls");
}
}

// Open file and load array
void openFile(AddressBook list[], int& size)
{
ifstream infi("AddressBook.txt");
string str;
stringstream strstrm;

// make sure the file stream is open before doing IO
if (!infi.fail()) {

system("cls");
cout << "Reading Address Book from the disc ";

size = 0; // overwrite any existing records
while(!infi.eof() && size < MAX_SIZE) {
// get and store the name
getline(infi, str, ';');
list[size].name = str;

// get, convert and store the quantity
getline(infi, str, ';');
strstrm.str(""); strstrm.clear(); // empty and clear the stringstream
strstrm << str;
strstrm >> list[size].addr;

}
cout << endl << size << " Contacts read from the disc." << endl;


system("PAUSE");
system("cls");
}
else { // something went wrong with opening the file
cout << "ERROR: problem with file" << endl;
system("PAUSE");
system("cls");
}

}

char getMenuResponse()
// Task: Put the menu on screen and get a response
// Accepts: Nothing
// Returns: The users response
// Modifies: Nothing
// NOTE: Characters are far more intuitive at the command
// line than numbers; avoid using numbers.
{
char response;
cout << endl << "Make your selection" << endl
<< "(A)dd contact, (D)isplay contact0, (O)pen File, (S)ave File, (Q)uit" << endl
<< "> ";
cin >> response;
cin.ignore(256, '\n');
// clean-up up to 256 chars including the delimiter specified (\n, the endl)
// OR stop when the \n is encountered after removing it.
return toupper(response);
// note the use of toupper, why?
}
[code]
So I know from the compiler that there is some declaration problems that caused the program to have so many errors and never compiles. I just want some hints on how can I declare Address book? and how can I add a function that will sort my data
I notice there is a "Person" structure declared at the top of your file... is there some confusion between a "Person" and an "AddressBook"?

To get your code to at least compile, I had to do the following:

. fix the typo in the dispData() parameters "const Address Book list[]..." (there's an extra space there)
. search/replace "AddressBook" with "Person"
. add a "const int MAX_SIZE = 8;" at the top (or whatever you want the maximum number of entries to be)
. replace "numOfRecs" with "numOfContacts"

As far as sorting is concerned, do you need to implement it yourself, or are you allowed to use library functions?

(note, my rationale for replacing AddressBook with Person, was because you're passing around an array to the various functions ("AddressBook list[]"), rather than declaring a std::list<Person> or something and passing a single instance of that).
Last edited on
THANK YOU SO MUCH @mmay
It finally compiles. for sorting it could be either by last name or first name or even both so I dont really know if that means using library functions or come up with my own.
@Nawaf: glad to hear you've taken a step forward (^_^)d.

The question about sorting was more aimed at your assignment goals - are you _supposed_ to be implementing a sort routine yourself, or is the "address book stuff" the more important goal?

You could, for instance, ensure that the person array is always kept in sorted order, by adding some extra code to addData() such that instead of always adding the new entries on the end ("list[size++] = tmp"), you find the "right place" to put the new entry, shift all the other entries down one slot, and place the new data in the right location. This would not help for "user sorting" though, which would require some more user input (like "sort by which column?", "sort descending/ascending?").
Hey,
I tried pretty hard but im frustrated now. I could not get the code to delete/edit/sort data. Help me please. I have only 45 minutes to get that done. Thank you
Here is what I have but it is not working because apparently I added more stuff that are not declared.

[code]


#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

struct Person
{
string name;
string addr;
string phone;
string email;
};

const int MAX_SIZE = 8; // max number of contacts

// functin prototypes
void addData(Person list[], int& size);
void dispData(const Person list[], int size);
void delData (const Person list[], int size);
void saveFile(const Person list[], int size);
void openFile(Person list[], int& size);
char getMenuResponse();
int main(int argc, char *argv[])
{
Person contactList[MAX_SIZE];
int numOfRecs = 0;
bool run = true;
do
{
cout << "Address Book - " << numOfRecs << " Number of Contacts" << endl;
switch ( getMenuResponse() )
{
case 'A': addData(contactList, numOfRecs); break;
case 'D': dispData(contactList, numOfRecs); break;
case 'T': delData(contactList, numOfRecs); break;
case 'O': openFile(contactList, numOfRecs); break;
case 'S': saveFile(contactList, numOfRecs); break;
case 'Q': run = false; break;
default : cout << "That is NOT a valid choice" << endl;
}
} while (run);
cout << endl << "Program Terminated" << endl;

// system("PAUSE"); // Commented out so the program exits upon request
return EXIT_SUCCESS;
}

void addData(Person list[], int& size)
{
Person tmp; // declare a temp contact that we will load before putting in the array
char response;
char str[256]; // needed for cin.getline; we are going to use a char array
if (size < MAX_SIZE) {
system("cls");
cout << "Enter Contact Information" << endl << endl;
cout << "Name: ";
// Get up to 256 characters from the keyboard including white space.
// Stop reading if encounter the \n first. If there's any chance of
// more than 256 characters you will have to clean up cin with
// cin.ignore before the next input.
cin.getline(str, 256, '\n'); // for char arrays; different from the other getline
tmp.name = str;
cout << endl;
cout << "Address: ";
cin.getline(str, 256, '\n');
tmp.addr = str;
cout << endl;
cout << "Phone Number: ";
cin.getline(str, 256, '\n');
tmp.phone = str;
cout << endl;
cout << "E-mail Address: ";
cin.getline(str, 256, '\n');
tmp.email = str;
cout << endl;
// see if this record should be added to the array
cout << "Add Contact to Address Book? (y/n) ";
cin >> response;
if (toupper(response) == 'Y')
list[size++] = tmp;
} else {
cout << "Sorry, Address Book is currently full." << endl;
system("pause");
}
system("cls");
}

void dispData(const Person list[], int size)
{
system("cls");

if(size < 1) {
cout << "Nothing to display" << endl;
} else {
cout << "Contacts :" << endl << endl;
cout << fixed << setprecision(2);
cout << "Contact Name Address Phone No. Email" << endl;
cout << "*******************************************" << endl;

cout << left;
for (int i = 0; i < size; i++) {
cout << setw(10) << list[i].name << right
<< setw(10) << list[i].addr<<right
<< setw(10) << list[i].phone<<left
<< setw(15) << list[i].email<<left<<endl;
}

cout << "********************************************" << endl;
cout << right << setw(3) << size;
cout << " Contacts"<< endl;
}

system("PAUSE");
system("cls");
}

void delData(const Person list[],int size) {
vector<Person> :: iterator vItr = Contact.begin();
while (vItr != Contact.end() )
{
if (vItr->Name == Name)
{
vItr = Contact.erase (vItr);
break;
}
else
vItr++;
}

// Save records to disc
void saveFile(const Person list[], int size) {
string fileName;
ofstream outfi;
cout<<"Enter file name: ";
getline(cin,fileName);
outfi.open(fileName.c_str());

// to make sure the file stream is open before doing IO
if (!outfi.fail()) {
system("cls");
cout << "Saving Address Book to the disc ";

for(int i = 0; i < size; i++) {
outfi << list[i].name << ';'
<< list[i].addr<< ';';
// Start a new line after all but the last record
// Simplifies reading the file as EOF is at end of last line
if (i < size-1) outfi << endl;
}
cout << endl << size << " Address Book written to the disc." << endl;
outfi.close();
system("PAUSE");
system("cls");
}
else {
cout << "ERROR: problem with file" << endl;
system("PAUSE");
system("cls");
}
}

// Open file and load array
void openFile(Person list[], int& size)
{
ifstream infi("AddressBook.txt");
string str;
stringstream strstrm;

// make sure the file stream is open before doing IO
if (!infi.fail()) {

system("cls");
cout << "Reading Address Book from the disc ";

size = 0; // overwrite any existing records
while(!infi.eof() && size < MAX_SIZE) {
// get and store the name
getline(infi, str, ';');
list[size].name = str;

// get, convert and store the quantity
getline(infi, str, ';');
strstrm.str(""); strstrm.clear(); // empty and clear the stringstream
strstrm << str;
strstrm >> list[size].addr;

}
cout << endl << size << " Contacts read from the disc." << endl;


system("PAUSE");
system("cls");
}
else { // something went wrong with opening the file
cout << "ERROR: problem with file" << endl;
system("PAUSE");
system("cls");
}

}

char getMenuResponse()
// Task: Put the menu on screen and get a response
// Accepts: Nothing
// Returns: The users response
// Modifies: Nothing
// NOTE: Characters are far more intuitive at the command
// line than numbers; avoid using numbers.
{
char response;
cout << endl << "Make your selection" << endl
<< "(A)dd contact, (D)isplay contact0, (O)pen File, (S)ave File, (Q)uit" << endl
<< "> ";
cin >> response;
cin.ignore(256, '\n');
// clean-up up to 256 chars including the delimiter specified (\n, the endl)
// OR stop when the \n is encountered after removing it.
return toupper(response);
// note the use of toupper, why?
}
[icode]
No help at all! Daniweb.com answers questions way faster. AVOID
it would help if you would properly define ur code
Topic archived. No new replies allowed.