// tyler taormina // cst 116 // lab 7 // number 1 #include #include #include #include #include #include using namespace std; const int MAX = 20; void RmString(string arr[], int); void ClearBuffer(); void DisplayMenu(int&); void ProcessMenuChoice (int&, int&, int&, int&, std::string first[MAX], std::string last[MAX], std::string phone[MAX], std::string bday[MAX]); void DisplayEditMenu(int&); void FindIndex(int& index, int record_counter, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]); void ProcessEditChoice (int edit_choice, int index, int& check, int record_counter, std::string first[MAX], std::string last[MAX], std::string phone[MAX], std::string bday[MAX]); void Edit(int index, int record_counter, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]); void FindName(int record_counter, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]); void SortData(int record_counter, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]); void AddPerson(int, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]); void PrintData(int, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]); void FindString (string first[], string last[], string phone[], string bday[], int); int ReadData (ifstream & inFile, std::string first[MAX], std::string last[MAX], std::string phone[MAX], std::string bday[MAX]); void OutData(ofstream & outFile, string first[], string last[], string phone[], string bday[], int record_counter ); std::string f_name[MAX]; std::string l_name[MAX]; std::string phone[MAX]; std::string bday[MAX]; int main() { int record_counter = 0; int menu_choice; int flag = 1; int index_flag; ifstream inFile; //open file and read data inFile.open ( "data.txt"); if ( inFile.is_open ( ) ) { record_counter = ReadData (inFile, f_name, l_name, phone, bday); inFile.close ( ); } else { cout << "Trouble Opening File: inFile"; cout << "\n\n\t\t ** About to EXIT NOW! ** "; } //User interacts with program here. SortData(record_counter, f_name, l_name, phone, bday); while (flag != 0) { DisplayMenu(menu_choice); ProcessMenuChoice(menu_choice, flag, record_counter, index_flag, f_name, l_name, phone, bday); SortData(record_counter, f_name, l_name, phone, bday); ClearBuffer(); } //Writes changes to the data.txt file ofstream outFile ( "data.txt" ); if ( outFile.is_open ( ) ) { OutData(outFile, f_name, l_name, phone, bday, record_counter); outFile.close ( ); } else { cout << "Trouble Opening File: outFile"; cout << "\n\n\t\t ** About to EXIT NOW! ** "; } return 0; } void SortData(int record_counter, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]) { int i, j, k; string temp_first; string temp_last; string temp_phone; string temp_bday; for (i = 0; i < record_counter - 1; i++) { transform(last[i].begin(), last[i].end(), last[i].begin(), ::tolower); transform(first[i].begin(), first[i].end(), first[i].begin(), ::tolower); for (j = i + 1; j < record_counter; j++) { transform(first[j].begin(), first[j].end(), first[j].begin(), ::tolower); for (k = 0; k < last[i].length(); k++) { if (last[i][k] > last[j][k]) { temp_last = last[j]; last[j] = last[i]; last[i] = temp_last; temp_first = first[j]; first[j] = first[i]; first[i] = temp_first; temp_phone = phone[j]; phone[j] = phone[i]; phone[i] = temp_phone; temp_bday = bday[j]; bday[j] = bday[i]; bday[i] = temp_bday; k = last[i].length(); } else if (last[i][k] < last[j][k]) { k = last[i].length(); } } } } } int ReadData ( ifstream & inFile, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]) { int counter = 0; inFile >> first[counter] >> last[counter] >> phone[counter] >> bday[counter]; // Priming Read while ( !inFile.eof ( ) ) { counter++; inFile >> first[counter] >> last[counter] >> phone[counter] >> bday[counter]; } return counter; } void FindIndex(int& index, int record_counter, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]) { // Check for a substring inside of one of the input strings. // Prints whether or not the string was found. If found // prints the index of the list where the string was found // and what the string was that contained the substring. string search; int flag = 0; int left = 0; int right = record_counter; int mid; cout << "Enter the last name of the person you wish to find: "; getline(cin, search); transform(search.begin(), search.end(), search.begin(), ::tolower); while (left <= right && flag == 0) { mid = (left + right) / 2; if (search == last[mid]) { cout << "WE FOUND IT!" << endl; cout << first[mid] << " " << last[mid] << " " << phone[mid] << " " << bday[mid] << endl; index = mid; flag = 1; } else if(search > last[mid]) { left = mid + 1; } else { right = mid - 1; } } if (flag == 0) cout << "The last name you entered doesn't exist in our database. Please check spelling and try again." << endl; } void FindName(int record_counter, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]) { // Check for a substring inside of one of the input strings. // Prints whether or not the string was found. If found // prints the index of the list where the string was found // and what the string was that contained the substring. string search; int flag = 0; int left = 0; int right = record_counter; int mid; cout << "Enter the last name of the person you wish to find: "; getline(cin, search); transform(search.begin(), search.end(), search.begin(), ::tolower); while (left <= right && flag == 0) { mid = (left + right) / 2; if (search == last[mid]) { cout << "WE FOUND IT!" << endl; cout << first[mid] << " " << last[mid] << " " << phone[mid] << " " << bday[mid] << endl; flag = 1; } else if(search > last[mid]) { left = mid + 1; } else { right = mid - 1; } } if (flag == 0) cout << "The name you entered doesn't exist in our database. Please check spelling and try again." << endl; } void PrintData(int record_counter, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]) { //Displays all strings stored. int i = 0; cout << "==================================================================\n"; cout << "This is what we have in our database so far..." << endl; cout << "==================================================================\n"; while (i < record_counter) { cout << i+1 << ") " << first[i] << " " << last[i] << " " << phone[i] << " " << bday[i] << endl; i++; } } void AddPerson(int record_counter, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]) { int i = record_counter - 1; std::string temp; cout << "Enter the first name of the person you'd like to add: " << endl; cin >> temp; first[i] = temp; cout << "Enter the last name of the person you'd like to add: " << endl; cin >> temp; last[i] = temp; cout << "Enter the phone number of the person you'd like to add: " << endl; cin >> temp; phone[i] = temp; cout << "Enter the birthday of the person you'd like to add: " << endl; cin >> temp; bday[i] = temp; } void Edit(int index, int record_counter, string first[MAX], string last[MAX], string phone[MAX], string bday[MAX]) { int edit_choice; int check = 1; while (check != 0) { DisplayEditMenu(edit_choice); ProcessEditChoice(edit_choice, index, check, record_counter, first, last, phone, bday); } } void DisplayEditMenu(int& edit_choice) { //Displays the menu of functions for the user to choose from. edit_choice = 0; cout << "==================================================================\n"; cout << " MENU" << endl; cout << "==================================================================\n"; cout << "1) Edit First Name.\n"; cout << "2) Edit Last Name.\n"; cout << "3) Edit Phone Number.\n"; cout << "4) Edit Birth Date.\n"; cout << "Enter: "; cin >> edit_choice; if (edit_choice > 4 || edit_choice < 1) { cout << "Invalid Entry. Please enter a number from the options list provided.\n\n\n\n" << endl; DisplayMenu(edit_choice); } } void ProcessEditChoice (int edit_choice, int index, int& check, int record_counter, std::string first[MAX], std::string last[MAX], std::string phone[MAX], std::string bday[MAX]) { //Takes in user input for menu choice and calls the appropriate function. string temp; ClearBuffer(); switch(edit_choice) { case 1: cout << "Enter the updated First name: "; cin >> temp; first[index] = temp; break; case 2: cout << "Enter the updated Last name: "; cin >> temp; last[index] = temp; SortData(record_counter, f_name, l_name, phone, bday); break; case 3: cout << "Enter the updated Phone Number: "; cin >> temp; phone[index] = temp; break; case 4: cout << "Enter the updated Birthday: "; cin >> temp; bday[index] = temp; break; default: break; } cout << "Enter 0 to end editing.\n" << endl; cout << "Enter any other number to continue editing.\n" << endl; cin >> check; } void DisplayMenu(int& menu_choice) { //Displays the menu of functions for the user to choose from. menu_choice = 0; cout << "==================================================================\n"; cout << " MENU" << endl; cout << "==================================================================\n"; cout << "1) Find a person's information.\n"; cout << "2) Add a new person to the database.\n"; cout << "3) Edit information for a certain individual.\n"; cout << "4) Display full database.\n"; cout << "5) Exit Program.\n\n"; cout << "Enter: "; cin >> menu_choice; if (menu_choice > 5 || menu_choice < 1) { cout << "Invalid Entry. Please enter a number from the options list provided.\n\n\n\n" << endl; DisplayMenu(menu_choice); } } void ProcessMenuChoice (int& menu_choice, int& flag, int& record_counter, int& index, std::string first[MAX], std::string last[MAX], std::string phone[MAX], std::string bday[MAX]) { //Takes in user input for menu choice and calls the appropriate function. ClearBuffer(); flag = 0; switch(menu_choice) { case 1: FindName(record_counter, first, last, phone, bday); break; case 2: record_counter++; AddPerson(record_counter, first, last, phone, bday); SortData(record_counter, first, last, phone, bday); break; case 3: FindIndex(index, record_counter, first, last, phone, bday); Edit(index, record_counter, first, last, phone, bday); break; case 4: PrintData(record_counter, first, last, phone, bday); break; case 5: cout << "Ending program." << endl; cout << "Are you sure you want to quit?" << endl; break; default: break; } cout << "Press 0 to close the program.\n" << endl; cout << "Press any other number to continue the program.\n" << endl; cin >> flag; } void OutData(ofstream & outFile, string first[], string last[], string phone[], string bday[], int record_counter ) { int i; cout << "Writing Changes..." << endl; for (i = 0; i < record_counter; i++) { outFile << first[i] << " " << last[i] << " " << phone[i] << " " << bday[i] << endl; } } void ClearBuffer() { // clears buffer after menu choice so as not to interfere with the following user inputs. char c; do { c = getchar(); } while (c != '\n' && c != EOF); }