C++ HELP Write a program to handle a user\'s rolodex entries. (A rolodex is a sy
ID: 3691577 • Letter: C
Question
C++ HELP
Write a program to handle a user's rolodex entries. (A rolodex is a system with tagged cards each representing a contact. It would contain a name, address, and phone number. In this day and age, it would probably have an email address as well.)
Typical operations people want to do to a rolodex entry are:
You can decide what the maximum number of rolodex entries is and how long each part of an entry is (name, address, etc.).
When they choose to edit an entry, give them the option of selecting from the current rolodex entries or returning to the main menu — don't force them to edit someone just because they chose that option.
Similarly for deleting an entry. Also don't forget that when deleting an entry, you must move all following entries down to fill in the gap.
If they want to add an entry and the rolodex is full, offer them the choice to return to the main menu or select a person to overwrite.
When they choose the print option, make a nicely formatted table of their current entries (if any). (See the class roster lab for an example of a fine table format — and possible gotcha's.)
When they choose to find an entry, go to a submenu:
All of these searches are to be case-insensitive content searches. (In other words, if the rolodex contains a person named Vishal Herrera, they should be found by searches by name of: sh, SH, al h, al H, herrera,HERRERA, etc. as well as of Vishal Herrera.)
Question: Should you print all matches to a search or just the first one?
All menus are to be choosable by both number and capitalized letter(s).
Hint: You'll only have one class — most likely. It might look something like this:
(But see the options below...)
Hint: This class should have its own library. Other libraries may also be used for collections of functions (like a generic list searching function? or special string searching functions).
Explanation / Answer
main.cpp
#include <iostream>
#include "RolodexEntry.h"
#include <vector>
#include <climits>
#include <cctype>
using namespace std;
//function dec
void printMainMenu();
void printEditMenu(vector<RolodexEntry> & list);
void editContactSub(const short c, vector<RolodexEntry> & list);
void printSearchMenu(vector<RolodexEntry> & list);
void printList(vector<RolodexEntry> & list);
void eraseEntry(vector<RolodexEntry> & list, short index);
int main(void)
{
bool isRunning = true;
vector<RolodexEntry> list;
do
{
char c;
printMainMenu();
cin >> c;
cin.ignore(INT_MAX, ' ');
switch(tolower(c))
{
case '1': case 'a':
{
RolodexEntry newEntry;
newEntry.readIn();
list.push_back(newEntry);
break;
}
case '2': case 'e':
{
printEditMenu(list);
break;
}
case '3': case 'd':
{
printList(list);
cout << " Select Contact to delete:";
if(cin.fail())
{
cin.clear();
cin.ignore();
}
short c;
cin >> c;
eraseEntry(list, c-1);//resizes and moves back
break;
}
case '4': case 's':
{
printSearchMenu(list);
break;
}
case '5': case 'p':
{
printList(list);
break;
}
case '6': case 'q':
{
isRunning = false;
break;
}
default:
{
cout << "Invalid selection.";
break;
}
}
}while(isRunning);
return 0;
}
void printMainMenu()
{
cout << " Main Menu "
<< "1. Add contact "
<< "2. Edit contact "
<< "3. Delete contact "
<< "4. Search contacts "
<< "5. Print all contacts "
<< "6. Quit ";
return;
}
void printEditMenu(vector<RolodexEntry> & list)
{
cout << " ";
printList(list);
cout << " Select Contact to edit:";//read in choice
if(cin.fail())
{
cin.clear();
cin.ignore();
}
short c;
cin >> c;
cin.ignore(INT_MAX, ' ');
editContactSub(c, list);
return;
}
void editContactSub(const short c, vector<RolodexEntry> & list)//and work
{
short index = c;
if(index >= 0 && index < list.size())//it's gooooood!
{
RolodexEntry edited = list[static_cast<short>(c)-1];
//edit menu
cout << "1. edit First name "
<< "2. edit Last name "
<< "3. edit Address "
<< "4. edit Phone number "
<< "5. edit Email ";
char sel;
cin >> sel;
cin.ignore(INT_MAX, ' ');
switch(tolower(sel))
{
case '1': case 'f':
{
cout << " Enter new first name: ";
string newName;
cin >> newName;
edited.setFName(newName);
break;
}
case '2': case 'l':
{
cout << " Enter new last name: ";
string newName;
cin >> newName;
edited.setLName(newName);
break;
}
case '3': case 'a':
{
cout << " Enter new street number and street: ";
string newStreet;
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, newStreet);
edited.setStreet(newStreet);
cout << " Enter new town: ";
string newtown;
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, newtown);
edited.setTown(newtown);
cout << " Enter new state: ";
string newstate;
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, newstate);
edited.setState(newstate);
cout << " Enter new zipcode: ";
long newzip;
cin >> newzip;
if(newzip > 99999)//long zip
{
edited.setZip(newzip);
edited.setSZipLong();//finds szip from long zip
}
else
{
edited.setSZip(newzip);
}
break;
}
case '4': case 'p':
{
cout << " Enter new areacode: ";
short newarea;
cin >> newarea;
edited.setArea(newarea);
cout << " Enter new exchange number: ";
short newex;
cin >> newex;
edited.setExchange(newex);
cout << " Enter new line: ";
short newLine;
cin >> newLine;
edited.setPLine(newLine);
break;
}
case '5': case 'e':
{
cout << " Enter new email: ";
string newemail;
cin >> newemail;
edited.setEmail(newemail);
break;
}
}
}
else
{
cout << "Contact at this index does not exist.";
}
return;
}
void printSearchMenu(vector<RolodexEntry> & list)//and work
{
cout << "1. search by Name "
<< "2. search by Address "
<< "3. search by Phone number "
<< "4. search by Email "
<< "5. Return to Main menu ";
char c;
cin >> c;
cin.ignore(INT_MAX, ' ');
switch(tolower(c))
{
case '1': case 'n':
{
cout << " Enter search term: ";
string search;
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, search);
for(vector<RolodexEntry>::size_type i = 0; i < list.size(); i++)
{
if(list[i].getFName().find(search) != string::npos ||
list[i].getLName().find(search) != string::npos)
{
list[i].printEntry();
}
}
break;
}
case '2': case 'a':
{
cout << " Enter search term: ";
string search;
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, search);
for(vector<RolodexEntry>::size_type i = 0; i < list.size(); i++)
{
if(list[i].getStreet().find(search) != string::npos ||
list[i].getTown().find(search) != string::npos ||
list[i].getState().find(search) != string::npos)
{
list[i].printEntry();
}
}
break;
}
case '3': case 'p':
{
cout << " Enter part of phone number (last four digits gives best results): ";
short search;
while(cin.fail())
{
cin.clear();
cin.ignore();
}
cin >> search;
for(vector<RolodexEntry>::size_type i = 0; i < list.size(); i++)
{
if(list[i].getArea() == search || list[i].getExchange() == search ||
list[i].getPLine() == search)
{
list[i].printEntry();
}
}
break;
}
case '4': case 'e':
{
cout << " Enter email: ";
string search;
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, search);
for(vector<RolodexEntry>::size_type i = 0; i < list.size(); i++)
{
if(list[i].getEmail().find(search) != string::npos)
{
list[i].printEntry();
}
}
break;
}
case '5': case 'q':
{
break;
}
default:
{
cout << " Invalid seletion.";
break;
}
}
}
void printList(vector<RolodexEntry> & list)
{
cout << ' ';
for(vector<RolodexEntry>::size_type i = 0; i < list.size(); i++)
{
cout << i+1 << ".";
list[i].printEntry();
}
return;
}
void eraseEntry(vector<RolodexEntry> & list, short index)
{
vector<RolodexEntry>::size_type pos = index-1;
vector<RolodexEntry>::size_type k;
if (pos < list.size() && pos >= 0)
{
for (k = pos+1; k != list.size(); k++)
{
list[k-1] = list[k];
}
list.pop_back();
}
else
{
cout << "Out of bounds.";
}
return;
}
RolodexEntry.h
#ifndef ROLODEXENTRY_H_INCLUDED
#define ROLODEXENTRY_H_INCLUDED
#include <string>
//using namespace std;
//base project only
class RolodexEntry
{
private:
std::string fName, lName, street, town, state;
long zip;
short szip, area, exchange, line;
std::string email;
public:
RolodexEntry(void):fName(), lName(), street(), town(),
state(), zip(000000000), szip(00000),
area(0), exchange(0), line(0), email() {}
RolodexEntry(std::string fname, std::string lname):street(), town(),
state(""), zip(000000000),
szip(00000), area(0),
exchange(0), line(0), email() {}
RolodexEntry(const RolodexEntry & r):fName(r.fName), lName(r.lName),
street(r.street), town(r.town),
state(r.state), zip(r.zip), szip(r.szip),
area(r.area), exchange(r.exchange),
line(r.line), email(r.email) {}
std::string getFName() const {return fName;}
void setFName(std::string first){fName = first;}
std::string getLName() const {return lName;}
void setLName(std::string last){lName = last;}
std::string getStreet() const{return street;}
void setStreet(std::string str){street = str;}
std::string getTown() const {return town;}
void setTown(std::string newtown){town = newtown;}
std::string getState() const {return state;}
void setState(std::string newstate){state = newstate;}
long getZip() const {return zip;}
void setZip(long newzip){zip = newzip;}
short getSZip() const {return szip;}
void setSZipLong(){szip = zip / 10000;}
void setSZip(short newszip){szip = newszip;}
short getArea() const {return area;}
void setArea(short newarea){area = newarea;}
short getExchange() const {return exchange;}
void setExchange(short exch){exchange = exch;}
short getPLine() const {return line;}
void setPLine(short newline){line = newline;}
std::string getEmail(){return email;}
void setEmail(std::string Email){email = Email;}
void printEntry();//other fns
void readIn();
bool isEqual(RolodexEntry e){return e.fName == fName && e.lName == lName &&
e.street == street && e.town == town &&
e.state == state && e.zip == zip && e.szip == szip &&
e.area == area && e.exchange == exchange && e.line == line &&
e.email == email;}
};
#endif // ROLODEXENTRY_H_INCLUDED
RolodexEntry.cpp
#include "RolodexEntry.h"
#include <iostream>
using namespace std;
void RolodexEntry::printEntry()
{
cout << " Name: " << fName << " " << lName;
cout << " Address: " << street <<
" " << town << ", " <<
state << ' ';
if(zip != 0)
{
cout << zip;
}
else
{
cout << szip;
}
cout << " Phone: (" << area << ')' << exchange << '-' << line << " ";
}
void RolodexEntry::readIn()
{
cout << " Enter new contact's first name: ";
cin >> fName;
cout << " Enter new contacts's last name: ";
cin >> lName;
cout << " Enter new contacts's address (number and street): ";
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, street);
cout << " Enter new contacts's town: ";
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, town);
cout << " Enter new contacts's state: ";
cout.flush();
if (cin.peek() == ' ')
{
cin.ignore();
}
getline(cin, state);
cout << " Enter new contacts's zipcode: ";
long tempZip;
cin >> tempZip;
if(tempZip > 99999)//long zip
{
zip = tempZip;
setSZipLong();//finds szip from long zip
}
else
{
szip = tempZip;
}
cout << " Enter new contacts's phone number (separated by spaces): ";
cin >> area >> exchange >> line;
cout << " Enter new contacts's email: ";
cin >> email;
}
sample output
Main Menu
1. Add contact
2. Edit contact
3. Delete contact
4. Search contacts
5. Print all contacts
6. Quit
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.