Evening to everyone. I have a new project that is rather lengthy, but I am almost done with it. Sorry about the long read, but I was hoping to answer any questions that you may have upfront by posting all that I know about this project. Thanks
Here's the assignment:
Write a program that provides a way for you to store and retrieve telephone numbers. Design a user interface (for those that want an adventure, try using the GUI tools in Visual C++, or just make a usable interface that runs at the command prompt) that provides the following operations:
Add: Add a person’s name and phone number to the phone book.
Delete: Deletes a given person’s name and phone number from the phone book, given only the name.
Find: Locate a person’s phone number, given only the person’s name.
Change: Changes a person’s phone number, given the person’s name and new phone number.
Quit: Quits the application, after first saving the phone book in a text file.
Proceed as follows:
1. Design and implement the class Person, which represents the name and phone number of a person. You will store instances of this class in the phone book.
2. Design and implement the class PhoneBook, which represents the phone book. The class should contain a binary search tree as a data field. This tree contains the people in the book.
3. Add methods that use a text file to save and restore the tree. (Think about the traversal methods we discussed in class.)
4. Design and implement the class Menu, which provides the program’s user interface.
The program should read data from a text file when it begins and save data into a text file when the user quits the program.
My errors that I am getting:
Warning 1 warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\documents and settings\cs306\desktop\mcn312lab3\homework project 3\person.cpp 7
Warning 2 warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\documents and settings\cs306\desktop\mcn312lab3\homework project 3\person.cpp 9
Warning 3 warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\documents and settings\cs306\desktop\mcn312lab3\homework project 3\person.cpp 10
Warning 4 warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\documents and settings\cs306\desktop\mcn312lab3\homework project 3\person.cpp 17
Warning 5 warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\documents and settings\cs306\desktop\mcn312lab3\homework project 3\person.cpp 18
Warning 6 warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\documents and settings\cs306\desktop\mcn312lab3\homework project 3\person.cpp 19
Error 7 error C2360: initialization of 'pers' is skipped by 'case' label c:\documents and settings\cs306\desktop\mcn312lab3\homework project 3\menu.cpp 67
Error 8 error C2361: initialization of 'pers' is skipped by 'default' label c:\documents and settings\cs306\desktop\mcn312lab3\homework project 3\menu.cpp 72
Warning 9 warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\documents and settings\cs306\desktop\mcn312lab3\homework project 3\phonebook.cpp 205
Warning 10 warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\documents and settings\cs306\desktop\mcn312lab3\homework project 3\phonebook.cpp 207
Warning 11 warning C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\documents and settings\cs306\desktop\mcn312lab3\homework project 3\phonebook.cpp 208
#ifndef PERSON_H
#define PERSON_H
#include <iostream>
#include <string>
using namespace std;
class person
{
public:
person(); // default constructor
person(string n);
person(string n, string pn);
friend bool operator< (person, person);
friend bool operator> (person, person);
friend bool operator==(person, person);
person operator=(person);
string fname;
string lname;
string phone;
}; // end Person
#endif
#include <iostream>
#include <cstdlib>
#include "person.h"
using namespace std;
class PhoneBook
{
private:
struct tree_node
{
tree_node* left;
tree_node* right;
person data;
void printnode();
};
tree_node* root;
public:
PhoneBook()
{
root = NULL;
}
bool isEmpty() const { return root==NULL; }
void load(const string& fname);
void store(const string& fname);
void find(person d);
void print_inorder();
void clear();
void inorder(tree_node*);
void insert(person);
void remove(person);
void edit(person d);
};
#include "person.h"
#include <string>
#include <cstring>
person::person(string n, string ph){
char* cstr = new char[n.size()+1];
strcpy(cstr,n.c_str());
fname.assign(strtok(cstr," "));
lname.assign(strtok(NULL," "));
phone = ph;
}
person::person(string n)
{
char* cstr = new char[n.size()+1];
strcpy(cstr,n.c_str());
fname.assign(strtok(cstr," "));
lname.assign(strtok(NULL," "));
}
person::person()
{
// Person is empty here
}
bool operator< (person p1, person p2){
if(p1.lname == p2.lname)
return p1.fname < p2.fname;
else
return p1.lname < p2.lname;
}
bool operator> (person p1,person p2){
if(p1.lname == p2.lname)
return p1.fname > p2.fname;
else
return p1.lname > p2.lname;
}
bool operator==(person p1,person p2){
if( p1.fname == p2.fname && p1.lname == p2.lname && p1.phone == p2.phone )
return true;
else
return false;
}
person person::operator=(person p1){
fname = p1.fname;
lname = p1.lname;
phone = p1.phone;
return *this;
}
#include "PhoneBook.h"
#include "person.h"
#include <fstream>
void PhoneBook::insert(person d)
{
tree_node* t = new tree_node;
tree_node* parent;
t->data = d;
t->left = NULL;
t->right = NULL;
parent = NULL;
if(isEmpty()) root = t;
else {
tree_node* curr;
curr = root;
while(curr){
parent = curr;
if(t->data > curr->data)
curr = curr->right;
else
curr = curr->left;
}
if(t->data < parent->data)
parent->left = t;
else
parent->right = t;
}
}
void PhoneBook::remove(person d){
bool found = false;
if(isEmpty()) {
cout<<" Tree has no nodes, empty tree. "<<endl;
return;
}
tree_node* curr;
tree_node* parent;
curr = root;
while(curr != NULL) {
if(curr->data.fname == d.fname && curr->data.lname == d.lname ) {
found = true;
break;
}
else {
parent = curr;
if(d > curr->data)
curr = curr->right;
else curr = curr->left;
}
}
if(!found){
cout<<" Cannot find any data! "<<endl;
return;
}
if((curr->left == NULL && curr->right != NULL)|| (curr->left != NULL&& curr->right == NULL)){
if(curr->left == NULL && curr->right != NULL) {
if(curr == root){
root = curr->right;
delete curr;
return;
}
if(parent->left == curr) {
parent->left = curr->right;
delete curr;
}
else {
parent->right = curr->right;
delete curr;
}
}
else {
if(curr == root){
root = curr->left;
delete curr;
return;
}
if(parent->left == curr){
parent->left = curr->left;
delete curr;
}
else{
parent->right = curr->left;
delete curr;
}
}
return;
}
if( curr->left == NULL && curr->right == NULL){
if(curr == root){
root = NULL;
return;
}
if(parent->left == curr)
parent->left = NULL;
else
parent->right = NULL;
delete curr;
return;
}
if (curr->left != NULL && curr->right != NULL){
tree_node* chkr;
chkr = curr->right;
if((chkr->left == NULL) && (chkr->right == NULL)) {
curr = chkr;
delete chkr;
curr->right = NULL;
}
else {
if((curr->right)->left != NULL){
tree_node* lcurr;
tree_node* lcurrp;
lcurrp = curr->right;
lcurr = (curr->right)->left;
while(lcurr->left != NULL){
lcurrp = lcurr;
lcurr = lcurr->left;
}
curr->data = lcurr->data;
delete lcurr;
lcurrp->left = NULL;
}
else {
tree_node* tmp;
tmp = curr->right;
curr->data = tmp->data;
curr->right = tmp->right;
delete tmp;
}
}
return;
}
}
void PhoneBook::print_inorder()
{
inorder(root);
}
void PhoneBook::inorder(tree_node* p)
{
if(p != NULL)
{
if(p->left) inorder(p->left);
p->printnode();
if(p->right) inorder(p->right);
}
else
return;
}
void PhoneBook::find(person d){
bool found = false;
if(isEmpty()) {
cout<<" Tree has no nodes, empty tree. "<<endl;
return;
}
tree_node* curr;
tree_node* parent;
curr = root;
while(curr != NULL) {
if(curr->data.fname == d.fname && curr->data.lname == d.lname ) {
found = true;
curr->printnode();
break;
}
else {
parent = curr;
if(d > curr->data)
curr = curr->right;
else curr = curr->left;
}
}
if(!found)
{
cout<<" Cannot find any data! "<<endl;
return;
}
}
void PhoneBook::clear(){
root = NULL;
}
void PhoneBook::tree_node::printnode(){
cout<<data.fname + " " + data.lname + " - " + data.phone + "\n";
}
void PhoneBook::load(const string& fname) {
ifstream in( fname.c_str() );
string n,p;
if ( in.is_open() ) {
while (!in.eof()){
getline(in,n);
if(n.empty())
break;
char* cstr = new char[n.size()+1];
strcpy(cstr,n.c_str());
n.clear();
n.assign(strtok(cstr,"-"));
p.assign(strtok(NULL," \n"));
person pers(n,p);
insert(pers);
}
in.close();
if(!in.is_open())
cout << "Finished Loading File!\n";
else
cout << "Error Closing File!\n";
}
else
cout << "Error opening file!\n";
}
void PhoneBook::store(const string& fname) {
ofstream out(fname.c_str());
if(out.is_open())
cout << "Opening for writing...\n";
else
cout << "Error opening file!\n";
streambuf* sbuf = cout.rdbuf();
cout.rdbuf(out.rdbuf());
print_inorder();
cout.rdbuf(sbuf);
cout << "Finished writing!\n";
out.close();
if(!out.is_open()){
cout << "File Closed!\n";
return;
}
else
cout<<"Error Closing file!";
}
void PhoneBook::edit(person d)
{
bool found = false;
if(isEmpty()) {
cout<<" This Tree is empty! "<<endl;
return;
}
tree_node* curr;
tree_node* parent;
curr = root;
while(curr != NULL) {
if(curr->data.fname == d.fname && curr->data.lname == d.lname )
{
found = true;
curr->data.phone = d.phone;
curr->printnode();
break;
}
else {
parent = curr;
if(d > curr->data)
curr = curr->right;
else curr = curr->left;
}
}
if(!found)
{
cout<<" Data not found! "<<endl;
return;
}
}
#include "person.h"
#include "PhoneBook.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
char get_input();
int main() {
PhoneBook phonebook;
bool quit = false;
phonebook.load("yellowpages.txt");
do {
string n,p;
switch ( get_input() ) {
case '1': {
cout << "Name:";
cin.ignore();
getline(cin,n);
cout << "Phone: ";
getline(cin,p);
person pers(n,p);
phonebook.insert(pers);
cout << "Contact created.\n" << flush;
break;
}
case '3': {
cout << "Name: ";
cin.ignore();
getline(cin,n);
person pers(n);
phonebook.remove(pers);
cout << "Contact deleted.\n"<< flush;
break;
}
//
case '2': {
cout << "Name: ";
cin.ignore();
getline(cin,n);
person pers(n);
phonebook.find(pers);
break;
}
case '5': {
phonebook.print_inorder();
break;
}
case '4':
cout << "Name: ";
cin.ignore();
getline(cin, n);
cout << "Number: ";
getline(cin, p);
person pers(n, p);
phonebook.edit(pers);
cout << endl;
break;
case '6': {
quit = true;
phonebook.load("yellowpages.txt");
break;
}
default :
cout << '?' << endl;
}
} while ( !quit );
};
char get_input() {
string com;
std::cout << "1:Create a Contact: " << endl;
std::cout << "2:Search for a Contact: " << endl;
std::cout << "3:Delete a Contact: " << endl;
std::cout << "4:Edit a Contact: " << endl;
std::cout << "5:Display all Contacts: " << endl;
std::cout << "6: Terminate program" << flush;
cin >> com;
return com[0];
};