Searching parallel arrays

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • rangerSkip
    New Member
    • Dec 2011
    • 4

    Searching parallel arrays

    My program is designed to take input from a file containing a list of titles and authors. The file looks like so:

    title
    associated author
    next title
    associated author
    etc.

    The problem I'm having is with my showBooksByTitl e and showBooksByAuth or functions, I guess what I'm asking is how does one compare parts of strings so that if a user searched for Mal (and there was author D.S. Malik and just Malik) both would show up?

    right now this code returns only exact matches and also prints an empty newline and a new line with some spaces and a ().

    Of course any help is greatly appreciated. This is my first year programming. I've included the whole code just to be safe that I'm not leaving out anything that could be the problem.

    Code:
    #include<iostream>
    #include<string>
    #include<fstream>
    #include<cstring>
    
    using namespace std;
    
    struct Book {
           string title;
           string author;
    };
    
    const int ARRAY_SIZE = 1000;
    Book books [ARRAY_SIZE];
    
    int loadData (string);
    void showAll (int);
    int showBooksByAuthor (int, string);
    int showBooksByTitle (int, string);
    
    int main() {
        //Declare variables
        string pathname;
        string title;
        string name;
        string word;
        int count;
        char response;
        
        //ask user for pathname
        cout << "What is the path of the library file? ";
        cin >> pathname;
        cout << endl;
        count = loadData(pathname);
        
        //input data into arrays
        loadData(pathname);
        cout << endl << count << " records loaded successfully." << endl << endl;
        
        //Show user menu    
        cout << "Please enter Q to Quit, A to search for the Author, T to search for the Title, "
             << endl << "or S to Show all: ";    
        cin >> response;
        
        switch(response) {
             case 'q':
                  break;
             case 'Q':
                  break;
             case 'a':
                  cout << endl << "Please enter author's name: ";
                  cin >> name;
                  showBooksByAuthor(count, name);
                  break;
             case 'A':
                  cout << endl << "Please enter author's name: ";
                  cin >> name;
                  showBooksByAuthor(count, name);
                  break;
             case 't':
                  cout << endl << "Please enter all or part of the title: ";
                  cin >> title;
                  showBooksByTitle(count, title);
                  break;
             case 'T':
                  cout << endl << "Please enter all or part of the title: ";
                  cin >> title;
                  showBooksByTitle(count, title);
                  break;
             case 's':
                  cout << endl;
                  showAll(count);
                  break;
             case 'S':
                  cout << endl;
                  showAll(count);
                  break;
             default:
                     cout << endl << "Invaled input, please try again: ";
                     break;
        }
        
        //pause and exit
        cout << endl;
        system("PAUSE");
        return 0;
    }
    
    
    int loadData(string pathname) {
        int i = 0;
        int j = 0; 
        ifstream library;
        
        //open file, if not successful, output error message
        library.open(pathname.c_str());
        if (!library.is_open()) {
           cout << "Unable to open input file." << endl;
           return -1;
        }
        //reads title and author from file into designated string
        //this is assuming title comes first and author comes after
        while(!library.eof()) {
                getline(library, books[i].title);  
                getline(library, books[i].author);
                i++;
        }
        return i;
    }
    
    void showAll (int count) {
         for (int i = 0; i < count; i++) {
             cout << books[i].title << " (" << books[i].author << ")" << endl;
         }     
    }
    
    int showBooksByAuthor(int count, string name) {
        int found;
        for(int n = 0; n < 28; n++) {
            found = name.find(books[n].author);
            if(found != string::npos) {
               cout << endl << books[n].title << " (" << books[n].author << ")" << endl;
            }
        }
        return 0;
    }
    
    
    int showBooksByTitle (int count, string title) {
            int found;
        for(int n = 0; n < 28; n++) {
            found = title.find(books[n].title);
            if(found !=string::npos) {
               cout << endl << books[n].title << " (" << books[n].author << ")" << endl;
            }
        }
        return 0;
    }
    Attached Files
    Last edited by rangerSkip; Dec 10 '11, 09:30 PM. Reason: I've added the library.txt file if you were confused about my Malik example.
  • weaknessforcats
    Recognized Expert Expert
    • Mar 2007
    • 9214

    #2
    You are using C++ string objects. If your string name contains "Mickey Mouse" then string::find() should locate "key".

    Comment

    • rangerSkip
      New Member
      • Dec 2011
      • 4

      #3
      Thank you so much! I was using that operation but I had it backwards.

      Comment

      Working...