Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Please read carefully. Make sure to include comments on your code. I will only g

ID: 3749486 • Letter: P

Question

Please read carefully. Make sure to include comments on your code.

I will only give a thumbs up for correct solution and comments.

1. Introduction You will create a C++ program to manage a name list. Read a file that has a lot of items that stand for the information of a name list of certain class. Then sort the records by specific attributes to alphabetical ascending order, and output to a plain text file. 2. Input and Output a. Input file 1) The input file has multiple records (number> 1). Your program should read the records one by one from the beginning of the file to the end. Each record has uniform attributes (columns), the attributes appear in a fixed order, a record should contain all the keys, no empty values part will be given. But the input file may contain duplicated records. If two records have same id value, they can be recognized as duplicated records. You should always update record with the latter one. If somebody's name has more than one words, the separator would be underline _". Other than useful information in records, no other character or space will be given. 2) 3) Each record takes one line (ends in n'), and one line only contains one

Explanation / Answer

Linked List(merge sort).cpp

#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
#include"ArgumentManager.h"

using namespace std;

struct student {
   string id;
   string first;
   string last;
   string dob;
   string gpa;
   student* next;
};
class list {
private:
   student * head;
public:
   list() {
       head = NULL;
   }
   void readin(const char* fileNameA) {
       head = new student;
       student* temp = head;
       student* searchthis = head;
       ifstream input(fileNameA);
       string finalline, temp1, temp2, temp3, temp4;
       string datatemp[5];
       int i = 0;

       if (input.is_open()) {

           while (getline(input, temp1)) {
               //basic line

               if (temp1[0] == 'd') {
                   int k = 0;
                   int position;
                   k = temp1.length();
                   string searchfor;
                   for (int l = 7; l < k; ++l) {
                       char c = temp1[l];
                       searchfor += c;
                   }

                   position = searchdelete(&searchthis, searchfor);
                   if (position == 1) {
                       temp = searchthis;
                   }
                   else if (position == 2) {
                       head = searchthis;
                   }
               }
               else {
                   stringstream ss1(temp1);
                   i = 0;
                   while (getline(getline(ss1, temp2, '{'), temp3, '}')) { //line without brackets
                       stringstream ss2(temp3);
                       while (getline(getline(ss2, temp4, ':'), finalline, ',')) { //removes : and , then stores into a string array
                           datatemp[i] = finalline;
                           ++i;
                       }
                   }
                   //splits the data up to linked
                   head->id = datatemp[0];
                   head->first = datatemp[1];
                   head->last = datatemp[2];
                   head->dob = datatemp[3];
                   head->gpa = datatemp[4];
                   head->next = new student;
                   head = head->next;
                   head->id = "0";
               }
           }
           head->next = NULL;
           head = temp;

       }

   }


   void splitter(student* head, student** a, student** b) {

       student* temp;
       temp = head;
       student* forward;
       student* back;
       if (head == NULL || head->next == NULL) {
           *a = temp;
           *b = NULL;
       }
       else {
           back = temp;
           forward = temp->next;

           while (forward != NULL) {

               forward = forward->next;
               if (forward != NULL) {
                   back = back->next;
                   forward = forward->next;
               }
           }
           //if list was 1 4 5 6 7 6 then
           *a = temp;// front of the list   1 4 5
           *b = back->next;//back of the list 6 7 6
           back->next = NULL;
       }
   }

   void mergeID(student** tempHead) {
       student* temhead = *tempHead;
       student* a = NULL;
       student* b = NULL;
       int i = 0;
       if (temhead == NULL || temhead->next == NULL) {
           return;
       }

       splitter(temhead, &a, &b);
       mergeID(&a);
       mergeID(&b);
       *tempHead = mergefinalID(a, b);
   }

   void mergeFirst(student** tempHead) {
       student* temhead = *tempHead;
       student* a = NULL;
       student* b = NULL;

       if (temhead == NULL || temhead->next == NULL) {
           return;
       }

       splitter(temhead, &a, &b);
       mergeFirst(&a);
       mergeFirst(&b);

       *tempHead = mergefinalFirst(a, b);
   }

   void mergeLast(student** tempHead) {
       student* temhead = *tempHead;
       student* a = NULL;
       student* b = NULL;

       if (temhead == NULL || temhead->next == NULL) {
           return;
       }

       splitter(temhead, &a, &b);
       mergeLast(&a);
       mergeLast(&b);

       *tempHead = mergefinalLast(a, b);
   }

   void mergeDOB(student** tempHead) {
       student* temhead = *tempHead;
       student* a = NULL;
       student* b = NULL;

       if (temhead == NULL || temhead->next == NULL) {
           return;
       }

       splitter(temhead, &a, &b);
       mergeDOB(&a);
       mergeDOB(&b);

       *tempHead = mergefinalDOBS(a, b);
   }

   void mergeGPA(student** tempHead) {
       student* temhead = *tempHead;
       student* a = NULL;
       student* b = NULL;

       if (temhead == NULL || temhead->next == NULL) {
           return;
       }

       splitter(temhead, &a, &b);
       mergeGPA(&a);
       mergeGPA(&b);

       *tempHead = mergefinalGPA(a, b);
   }

   student* mergefinalID(student* frontpart, student* backpart) {
       student* mergefinali = NULL;

       if (frontpart == NULL) {
           return backpart;
       }
       else if (backpart == NULL) {
           return frontpart;
       }
       if (frontpart->id <= backpart->id) {
           mergefinali = frontpart;
           mergefinali->next = mergefinalID(frontpart->next, backpart);
       }
       else {
           mergefinali = backpart;
           mergefinali->next = mergefinalID(frontpart, backpart->next);
       }
       return mergefinali;
   }

   student* mergefinalFirst(student* frontpart, student* backpart) {
       student* mergefinalf = NULL;
       string name1, tempname1, t1;
       string name2, tempname2, t2;
       string narr1[5];
       string narr2[5];
       int checkn1 = 0;
       int checkn2 = 0;
       int i = 0;
       int k = 0;
       int tell = 0;
       int length1, length2;
       int done = 0;

       if (frontpart == NULL) {
           return backpart;
       }
       else if (backpart == NULL) {
           return frontpart;
       }
       // use temp strings and .length() change the first letter to lower case
       tempname1 = frontpart->first;
       tempname1[0] = tolower(tempname1[0]);
       tempname2 = backpart->first;
       tempname2[0] = tolower(tempname2[0]);

       stringstream n1(tempname1);
       stringstream n2(tempname2);

       while (getline(n1, t1, '_')) {
           t1[0] = tolower(t1[0]);
           narr1[i] = t1;
           ++i;
           checkn1 = 1;
       }
       if (checkn1 == 1) {
           name1 = narr1[0];
           for (int p = 1; p < 2; ++p) {
               name1 += narr1[p];
           }
       }
       while (getline(n2, t2, '_')) {
           t2[0] = tolower(t2[0]);
           narr2[k] = t2;
           ++k;
           checkn2 = 1;
       }
       if (checkn2 == 1) {
           name2 = narr2[0];
           for (int o = 1; o < 2; ++o) {
               name2 += narr2[o];
           }
       }


       length1 = name1.length();
       length2 = name2.length();
       if (length1 == length2) {
           if (name1 == name2) {
               if (frontpart->id <= backpart->id) {
                   tell = 0;
               }
               else {
                   tell = 1;
               }
           }
       }
       if (name1[0] < name2[0]) {
           tell = 0;
       }
       else if (name2[0] < name1[0]) {
           tell = 1;
       }
       else if (length1 <= length2) {
           for (i = 0; i < length1; ++i) {
               while (name1[i] != name2[i]) {
                   if (name1[i] < name2[i]) {
                       tell = 0;
                       done = 1;
                   }
                   else {
                       tell = 1;
                       done = 1;
                   }
                   break;
               }
               if (done == 1)
                   break;
           }
       }
       else
       {
           for (int i = 0; i < length2; ++i) {
               while (name2[i] != name1[i]) {
                   if (name2[i] < name1[i]) {
                       tell = 1;
                       done = 1;
                   }
                   else {
                       tell = 0;
                       done = 1;
                   }
                   break;
               }
               if (done == 1)
                   break;
           }

       }

       if (tell == 0) {
           mergefinalf = frontpart;
           mergefinalf->next = mergefinalFirst(frontpart->next, backpart);
       }
       else {
           mergefinalf = backpart;
           mergefinalf->next = mergefinalFirst(frontpart, backpart->next);
       }
       return mergefinalf;

   }

   student* mergefinalLast(student* frontpart, student* backpart) {
       student* mergefinall = NULL;
       string name1, tempname1, t1;
       string name2, tempname2, t2;
       string narr1[5];
       string narr2[5];
       int checkn1 = 0;
       int checkn2 = 0;
       int i = 0;
       int k = 0;
       int tell = 0;
       int done = 0;
       int length1, length2;

       if (frontpart == NULL) {
           return backpart;
       }
       else if (backpart == NULL) {
           return frontpart;
       }
       // use temp strings and .length() change the first letter to lower case
       tempname1 = frontpart->last;
       tempname1[0] = tolower(tempname1[0]);
       tempname2 = backpart->last;
       tempname2[0] = tolower(tempname2[0]);

       stringstream n1(tempname1);
       stringstream n2(tempname2);

       while (getline(n1, t1, '_')) {
           t1[0] = tolower(t1[0]);
           narr1[i] = t1;
           ++i;
           checkn1 = 1;
       }
       if (checkn1 == 1) {
           name1 = narr1[0];
           for (int p = 1; p < i; ++p) {
               name1 += narr1[p];
           }
       }
       while (getline(n2, t2, '_')) {
           t2[0] = tolower(t2[0]);
           narr2[k] = t2;
           ++k;
           checkn2 = 1;
       }
       if (checkn2 == 1) {
           name2 = narr2[0];
           for (int o = 1; o < k; ++o) {
               name1 += narr1[o];
           }
       }

       length1 = name1.length();
       length2 = name2.length();
       if (length1 == length2) {
           if (name1 == name2) {
               if (frontpart->id <= backpart->id) {
                   tell = 0;
               }
               else {
                   tell = 1;
               }
           }
       }
       if (name1[0] < name2[0]) {
           tell = 0;
       }
       else if (name2[0] < name1[0]) {
           tell = 1;
       }
       else if (length1 <= length2) {
           for (i = 0; i < length1; ++i) {
               while (name1[i] != name2[i]) {
                   if (name1[i] < name2[i]) {
                       tell = 0;
                       done = 1;
                   }
                   else {
                       tell = 1;
                       done = 1;
                   }
                   break;
               }
               if (done == 1)
                   break;
           }
       }
       else
       {
           for (int i = 0; i < length2; ++i) {
               while (name2[i] != name1[i]) {
                   if (name2[i] < name1[i]) {
                       tell = 1;
                       done = 1;
                   }
                   else {
                       tell = 0;
                       done = 1;
                   }
                   break;
               }
               if (done == 1)
                   break;
           }

       }

       if (tell == 0) {
           mergefinall = frontpart;
           mergefinall->next = mergefinalLast(frontpart->next, backpart);
       }
       else {
           mergefinall = backpart;
           mergefinall->next = mergefinalLast(frontpart, backpart->next);
       }

       return mergefinall;
   }

   student* mergefinalDOBS(student* frontpart, student* backpart) {
       //Mathuranth Metivier
       student* mergefinalD = NULL;
       string date1, year1, month1, day1;
       string date2, year2, month2, day2;
       string dobarray1[3];
       string dobarray2[3];
       int i = 0;
       int j = 0;
       int tell;

       if (frontpart == NULL) {
           return backpart;
       }
       else if (backpart == NULL) {
           return frontpart;
       }

       stringstream dob1(frontpart->dob);
       stringstream dob2(backpart->dob);

       while (getline(dob1, date1, '-')) {
           dobarray1[i] = date1;
           ++i;
           while (getline(dob2, date2, '-')) {
               dobarray2[j] = date2;
               ++j;
           }
       }

       year1 = dobarray1[0];
       month1 = dobarray1[1];
       day1 = dobarray1[2];

       year2 = dobarray2[0];
       month2 = dobarray2[1];
       day2 = dobarray2[2];
       if (year1 == year2) {
           if (month1 == month2) {
               if (day1 == day2) {
                   if (frontpart->id < backpart->id) {
                       tell = 0;
                   }
                   else {
                       tell = 1;
                   }
               }
               else if (day2 < day1) {
                   tell = 1;
               }
               else {
                   tell = 0;
               }
           }
           else if (month1 < month2) {
               tell = 0;
           }
           else if (month2 < month1) {
               tell = 1;
           }
       }
       else if (year1 < year2) {
           tell = 0;
       }
       else if (year2 < year1) {
           tell = 1;
       }

       if (tell == 0) {
           mergefinalD = frontpart;
           mergefinalD->next = mergefinalDOBS(frontpart->next, backpart);
       }
       else {
           mergefinalD = backpart;
           mergefinalD->next = mergefinalDOBS(frontpart, backpart->next);
       }

       return mergefinalD;

   }

   student* mergefinalGPA(student* frontpart, student* backpart) {
       student* mergefinalG = NULL;
       double f;
       double b;


       if (frontpart == NULL) {
           return backpart;
       }
       else if (backpart == NULL) {
           return frontpart;
       }
       stringstream f1(frontpart->gpa);
       stringstream b1(backpart->gpa);
       f1 >> f;
       b1 >> b;
  
       if ((f - b) < 0.001) {
           if (frontpart->id < backpart->id) {
               mergefinalG = frontpart;
               mergefinalG->next = mergefinalGPA(frontpart->next, backpart);
           }
           else {
               mergefinalG = backpart;
               mergefinalG->next = mergefinalGPA(frontpart, backpart->next);
           }
       }
       else if (f<b) {
           mergefinalG = frontpart;
           mergefinalG->next = mergefinalGPA(frontpart->next, backpart);
       }
       else {
           mergefinalG = backpart;
           mergefinalG->next = mergefinalGPA(frontpart, backpart->next);
       }
       return mergefinalG;
   }

   void sort(const char* sortFile) {
       ifstream sortby(sortFile);
       string whatToSort;
       student* th;
       th = head;
       if (head == NULL) {}
       else {
           list::mergeID(&th);
           head = th;
           list::deleteid();
           head = th;

           while (getline(sortby, whatToSort)) {
               student* tempsort;
               tempsort = head;
               if (whatToSort == "id") { //low to high merge sort
                   mergeID(&tempsort);
                   head = tempsort;
               }
               else if (whatToSort == "first") { //a to z
                   mergeFirst(&tempsort);
                   head = tempsort;
               }
               else if (whatToSort == "last") { //a to z
                   mergeLast(&tempsort);
                   head = tempsort;
               }
               else if (whatToSort == "DOB") {//OLD TO YOUNG merge sort
                   mergeDOB(&tempsort);
                   head = tempsort;
               }
               else if (whatToSort == "GPA") {//low to high merge sort
                   mergeGPA(&tempsort);
                   head = tempsort;
               }
           }
       }
   }

   void deleteid() {
       student* save;
       save = head;
       student* check = NULL;
       student* check1 = NULL;
       student* check2 = NULL;
       student* change;
       int place = 0;

       if (head == NULL || head->next == NULL) {
           return;
       }
       else {
           check = head;
           check1 = head;
           check2 = head->next;
           while (check2 != NULL) {
               if (check1->id == check2->id) {
                   if (place == 0) {
                       change = head;
                       head = head->next;
                       check = head;
                       check1 = head;
                       check2 = head->next;
                       delete change;
                   }
                   else {
                       change = check1;
                       check->next = check1->next;
                       check1 = check;
                       delete change;
                       place = 0;
                   }
               }
               else {
                   if (place == 0) {
                       check1 = check1->next;
                       check2 = check2->next;
                       ++place;
                   }
                   else {
                       check = check->next;
                       check1 = check1->next;
                       check2 = check2->next;
                       ++place;
                   }
               }
           }

       }
       head = save;
   }

   int searchdelete(student** thead, string lookfor) {
       student* thehead = *thead;
       student* check = NULL;
       student* check1 = NULL;
       student* change;
       if (thehead == NULL) {
           return 3;
       }
       else if (thehead->next->id == "0") {
           if (thehead->id == lookfor) {
               change = thehead;
               thehead = thehead->next;
               delete change;
               return 2;
           }
           else {
               return 0;
           }
       }

       if (thehead->id == lookfor) {
           change = thehead;
           thehead = thehead->next;
           *thead = thehead;
           delete change;
           return 1;

       }
       check = thehead;
       check1 = thehead->next;
       while (check1->id != "0") {
           if (check1->id == lookfor) {
               change = check1;
               check->next = check1->next;
               delete change;
               return 0;
           }
           else {
               check = check->next;
               check1 = check1->next;
           }
       }
       return 0;
   }

   void print(const char* outfilenameB) {
       ofstream outToFile(outfilenameB);
       head = head->next;
       if (head->id == "0") {
           outToFile << "error";
       }
       else {
           while (head != NULL) {
               outToFile << "{id:" << head->id << ",first:" << head->first << ",last:" << head->last << ",DOB:" << head->dob << ",GPA:" << head->gpa << "}" << endl;
               head = head->next;
           }
       }
   }

};

int main(int argc, char* argv[]) {

   ArgumentManager clparse(argc, argv);


   string infilenameA = clparse.get("input");
   string outfilenameB = clparse.get("output");
   string sortFile = clparse.get("sort");

   list thelist;

   thelist.readin(infilenameA.c_str());
   thelist.sort(sortFile.c_str());
   thelist.print(outfilenameB.c_str());

   return 0;
}


ArgumentManager.h

#include <map>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;

// This is a class that can parse the commnad line arguments we use in COSC 2430 homework.
class ArgumentManager {
private:
   map<string, string> m_argumentMap;
public:
   ArgumentManager() { }
   ArgumentManager(int argc, char *argv[], char delimiter = ';');
   ArgumentManager(string rawArguments, char delimiter = ';');
   void parse(int argc, char *argv[], char delimiter = ';');
   void parse(string rawArguments, char delimiter = ';');
   string get(string argumentName);
   string toString();
   friend ostream& operator << (ostream &out, ArgumentManager &am);
};

void ArgumentManager::parse(string rawArguments, char delimiter) {
   stringstream currentArgumentName;
   stringstream currentArgumentValue;
   bool argumentNameFinished = false;

   for (unsigned int i = 0; i <= rawArguments.length(); i++) {
       if (i == rawArguments.length() || rawArguments[i] == delimiter) {
           if (currentArgumentName.str() != "") {
               m_argumentMap[currentArgumentName.str()] = currentArgumentValue.str();
           }
           // reset
           currentArgumentName.str("");
           currentArgumentValue.str("");
           argumentNameFinished = false;
       }
       else if (rawArguments[i] == '=') {
           argumentNameFinished = true;
       }
       else {
           if (argumentNameFinished) {
               currentArgumentValue << rawArguments[i];
           }
           else {
               // ignore any spaces in argument names.
               if (rawArguments[i] == ' ')
                   continue;
               currentArgumentName << rawArguments[i];
           }
       }
   }
}

void ArgumentManager::parse(int argc, char *argv[], char delimiter) {
   if (argc > 1) {
       for (int i = 1; i<argc; i++) {
           parse(argv[i], delimiter);
       }
   }
}

ArgumentManager::ArgumentManager(int argc, char *argv[], char delimiter) {
   parse(argc, argv, delimiter);
}

ArgumentManager::ArgumentManager(string rawArguments, char delimiter) {
   parse(rawArguments, delimiter);
}

string ArgumentManager::get(string argumentName) {
   map<string, string>::iterator iter = m_argumentMap.find(argumentName);

   //If the argument is not found, return a blank string.
   if (iter == m_argumentMap.end()) {
       return "";
   }
   else {
       return iter->second;
   }
}

string ArgumentManager::toString() {
   stringstream ss;
   for (map<string, string>::iterator iter = m_argumentMap.begin(); iter != m_argumentMap.end(); iter++) {
       ss << "Argument name: " << iter->first << endl;
       ss << "Argument value: " << iter->second << endl;
   }
   return ss.str();
}

ostream& operator << (ostream &out, ArgumentManager &am) {
   out << am.toString();
   return out;
}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote