#include <iostream>
#include <cstring>
#include <vector>
#include <iomanip>
using namespace std;
const static int nameLen = 25, phoneLen = 12;
struct Directory { char lastName[nameLen]; char firstName[nameLen]; char phone[phoneLen]; int element; };
std::vector<Directory>DirV;
Directory Dir;
void addName(int&);
void sort_firstName(int&);
void showRange(char[]);
void deleteName(int);
int main()
{
int newName, index = 0, compSize, numDelete;
char more, displayAll, choice;
char selName[25];
cout << " Welcome to the directory program. You can add name, contact informations and\n";
cout << " it will store in a file. You can display selected names and choose to delete\n";
cout << " anyone you want.\n\n";
do {
cout << " Please enter 'a' to add names, 's' to dispay complete list. 'r' to show \n";
cout << " range of names around a name. 'd' for delete a specific name. 'q' to quit.\n\n";
cout << " Please enter what you want to do: "; cin >> choice; cout << "\n\n";
switch (choice)
{
case 'a': //Add new names and sort
{ do { cout << " Enter last name: "; cin >> Dir.lastName;
//cout << " Enter first name: "; cin >> Dir.firstName;
addName(newName);
sort_firstName(newName);
cout << " \n\nDo you want to enter another name? "; cin >> more;
}while (tolower(more) == 'y');
break;
};//End case 'a'
case 's': //Display entire list of names and info
{ index = 0;
if(DirV.size() > 0)
{ do { cout << " Element #" << DirV[index].element <<
"] is: Last name: " << left << setw(10) << DirV[index].lastName <<
" first name: " << left << setw(10) << DirV[index].firstName << "\n\n";
index++;
} while (index < DirV.size()); break;
} else cout << " There is no name in the file.\n\n";
};//End case 's'
case 'r':
{ if (DirV.size() > 0)
{ cout << " Enter the first 2 character of the last name to search.";
cin >> selName; cout << "\n\n";
showRange(selName);//Display range before and after the name initials.
}else cout << " There is no name in the file.\n\n";
break;
};
case 'd'://Delete a name.
{ showRange(selName);
cout << " Enter the Element# of the left to be deleted: ";
cin >> numDelete;
deleteName(numDelete);
break;
};//End case 'd'
case 'q':{ cout << " Are you sure you want to quit? ";
cin >> choice; cout << "\n\n";};
default: cout << " Not a valid choice.\n";
}//End switch
} while(choice != tolower('q'));//End choice what to do
return 0;
}//End main()
void addName(int& newName)
{ int size, selCase;
DirV.push_back(Dir);//Push to next available element of DirV.
size = DirV.size();// DirV[midPt].element = midPt; newName = midPt;
int startPt = 0, endPt = size - 2, midPt = (endPt - startPt) / 2;
if((size == 1)||((strcmp(DirV[endPt].lastName, Dir.lastName) <= 0) & (size >= 2)))
selCase = 0;//Don't have to sort or anything, Dir is in last element already
//Case 0 for first entry when size = 1 OR when Dir.lastName is
// >= to last element of DirV(Dir.lastName >= DirV[endPt].lastName.
else
{if((strcmp(Dir.lastName, DirV[startPt].lastName) <= 0) && (size > 1))
selCase = 1;//If Dir smaller than DirV[0] AND (size >1)
else
{ startPt = 0, endPt = size - 2; midPt = (endPt - startPt) / 2;
do { if (strcmp(Dir.lastName, DirV[midPt].lastName) <= 0)
{ endPt = midPt; midPt = (startPt + endPt) / 2; }
else {startPt = midPt; midPt = (startPt + endPt) / 2; }
}while (startPt != midPt);
selCase = 2;
}//else selCase = 2
}//End if((strcmp(Dir.lastName, DirV[startPt].lastName) <= 0) && (size > 1))
switch(selCase)
//(size = 1) AND Dir.lastName => DirV[endPt].lastName
{case 0: { DirV[size - 1].element = size - 1; newName = size - 1; break;}
case 1://Dir.lastName <= DirV[0].lastName
{ int i;
for(i = 1; i <= (size - 1); i++)
{ DirV[size - i] = DirV[size - i - 1];
DirV[size - i].element = size - i;
DirV[size - i - 1].element = size - i - 1;
}//End for
DirV[size - i] = Dir; newName = size - i;
DirV[size - i].element = size - i;
break;
}//End case 1
case 2:
{ int j;
for(j = 1; j <= (size - endPt - 1); j++)
{ DirV[size - j] = DirV[size - j - 1];
DirV[size - j].element = size - j;
DirV[size - j - 1].element = size - j - 1;
}
DirV[size - j] = Dir; newName = size - j;
DirV[size - j].element = size - j;
break;
}//end case 2
}//End switch
}
void sort_firstName(int& newName)//DirV[newName] is the newly added name.
{ int beginLname = newName, endLname = newName;//start out all equal
int bubbleDown, bubbleUp;
Directory Temp;//Temporary structure variable to store structure Directory
Temp = DirV[newName];
bool doneUp = false, doneDown = false, moveUp = false;
bubbleUp = newName; bubbleDown = newName;
while ((bubbleUp > 0) & !doneUp)//Prevent bubbleUp going negative
{if((strcmp(DirV[newName].lastName, DirV[newName - 1].lastName) == 0)
& (strcmp(DirV[newName].firstName, DirV[newName - 1].firstName) < 0))
{DirV[newName] = DirV[newName - 1]; DirV[newName].element = newName;
DirV[newName - 1] = Temp; DirV[newName - 1].element = newName - 1;
newName--;bubbleUp--; moveUp = true;}
else (doneUp = true);
}//END while((bubbleUp > 0)& !doneUp)
if (moveUp == false)
{while ((bubbleDown < (DirV.size()-1)) & !doneDown)
{ if((strcmp(DirV[newName].lastName, DirV[newName + 1].lastName) == 0)
&(strcmp(DirV[newName].firstName, DirV[newName + 1].firstName) > 0))
{ DirV[newName] = DirV[newName + 1]; DirV[newName].element = newName;
DirV[newName + 1] = Temp; DirV[newName + 1].element = newName + 1;
newName++; bubbleDown++; }
else doneDown = true;
}//END while (decrement < bubbleUp)
}
}
void showRange(char selName[25])
{
int size = DirV.size(), stpt = 0, edpt = size - 1;
int mdpt = (stpt + edpt) / 2, index, comp;
do //search to within range using 2 characters in selName
{ comp = strncmp(selName, DirV[mdpt].lastName, 2);
if (comp != 0) {if(comp > 0){stpt = mdpt; mdpt = (stpt + edpt)/2;}
else {edpt = mdpt; mdpt = (stpt + edpt) / 2;}}
} while ((comp != 0) && (stpt + 2 <= edpt));//Matching DirV[mdpt]
for(index = -2; index <=3; index++)
{if(((mdpt + index) >= 0) && ((mdpt + index) <= (size - 1)))
{ cout << " Element #" << DirV[mdpt + index].element <<
"] is: Last name: " << left << setw(10) << DirV[mdpt + index].lastName <<
" first name: " << left << setw(10) << DirV[mdpt + index].firstName << "\n\n";}
}//End for loop to display range of names if it is valid.
}//End showRange
void deleteName(int numDelete)
{ char sure;
int edpt = DirV.size() - 1;
cout << " Is this what you chose?\n";
cout << " Element #" << DirV[numDelete].element <<
"] is: Last name: " << left << setw(10) << DirV[numDelete].lastName <<
" first name: " << left << setw(10) << DirV[numDelete].firstName << "\n\n";
cout << " Are you sure you want to delete this:\n\n"; cin >> sure;
if (tolower(sure) == 'y')
{
for(int i = 0; i < (edpt - numDelete); i++)
{ DirV[numDelete + i] = DirV[numDelete + i + 1];
DirV[numDelete + i].element = numDelete + i;}
DirV.pop_back();
}
}