Search code examples
javascriptloopsprototypenested-loops

Javascript - Loop doesn't work correctly while performing a simulation


I am trying to run a simulation of a library check in/out system with prototypes, objects and nested loops. I am having trouble properly integrating the pseudo code into the loop itself and would appreciate any help.

//while loop or for loop for 90 days
      //For loop over catalog
         //forloop over patrons 
             //Check if available , if so check book out
             //If not available check book back in
                 //check checking back in check to see if book is overdue and if so add a fine
    //When down loop over patrons to see their fees

Loop

for (var i = 0; i < 90; i++) {
        for (var j = 0; j < catalog.length; j++) {
            for (var k = 0; k < patrons.length; i++) {
                var fine = patrons[k].fine;
                if (catalog[k].Available) {
                    catalog[k].checkOut;
                } else {
                    catalog[k].checkIn;
                    patrons[k].read;
                }
                if (catalog[k].isOverdue) {
                    fine = fine + 5.00;
                }
            }
        }
        patrons[i].fine = fine;
    }

All the code

var Book = function(title, Available, publicationDate, checkoutDate, callNumber, Authors) {
    this.title = title;
    this.Available = Available;
    this.publicationDate = publicationDate;
    this.checkoutDate = checkoutDate;
    this.callNumber = callNumber;
    this.Authors = Authors;
};

var Author = function(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
};

var Patron = function(firstName, lastName, libCardNum, booksOut, fine) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.libCardNum = libCardNum;
    this.booksOut = booksOut;
    this.fine = fine;
};

Book.prototype.checkOut = function() {
    this.Available = false;
    var temp = new Date(1000000000);
    var date = new Date() - temp;
    var res = new Date(date);
    this.checkoutDate = res;
};

Book.prototype.checkIn = function() {
    this.Available = true;
};

Book.prototype.isOverdue = function() {
    var singleDay = 1000 * 60 * 60 * 24;
    var todayDate = new Date().getTime();
    var difference = todayDate - this.checkoutDate.getTime();
    if (Math.round(difference / singleDay) >= 14) {
        return true;
    }
    return false;
};

Patron.prototype.read = function(book) {
    this.booksOut.add(book);
}

Patron.prototype.return = function(book) {
    this.booksOut.remove(this.booksOut.length);
}

var authors = [];
authors[0] = new Author("Auth", "One");
authors[1] = new Author("AutL", "Two");

var catalog = [];
catalog[0] = new Book('Bk1', true, new Date(2001, 1, 21), new Date(), 123456, authors);
catalog[1] = new Book('Bk2', true, new Date(2002, 2, 22), new Date(), 987656, authors);
catalog[2] = new Book('Bk3', true, new Date(2003, 3, 23), new Date(), 092673, authors);
catalog[3] = new Book('Bk4', true, new Date(2004, 4, 24), new Date(), 658342, authors);
catalog[4] = new Book('Bk5', true, new Date(2005, 5, 25), new Date(), 345678, authors);

var patrons = [];
patrons[0] = new Patron('Pat1', 'Wat', 1, catalog, 0.00);
patrons[1] = new Patron('Pat2', 'Wot', 1, catalog, 0.00);
patrons[2] = new Patron('Pat3', 'Wit', 1, catalog, 0.00);
patrons[3] = new Patron('Pat4', 'Wet', 1, catalog, 0.00);
patrons[4] = new Patron('Pat5', 'Wut', 1, catalog, 0.00);

//while loop or for loop for 90 days
      //For loop over catalog
         //forloop over patrons 
             //Check if available , if so check book out
             //If not available check book back in
                 //check checking back in check to see if book is overdue and if so add a fine
    //When down loop over patrons to see their fees

for (var i = 0; i < 90; i++) {
    for (var j = 0; j < catalog.length; j++) {
        for (var k = 0; k < patrons.length; i++) {
            var fine = patrons[k].fine;
            if (catalog[k].Available) {
                catalog[k].checkOut;
            } else {
                catalog[k].checkIn;
                patrons[k].read;
            }
            if (catalog[k].isOverdue) {
                fine = fine + 5.00;
            }
        }
    }
    patrons[i].fine = fine;
}

for (i = 0; i < patrons.length; i++) {
    console.log(patrons[i].firstName + " has checked out the following books:");
    for (j = 0; j < patrons[i].booksOut.length; j++) {
        console.log(patrons[i].booksOut[j].title);
    }
    console.log(patrons[i].firstName + " has fine amount: $" + patrons[i].fine);
}

I am trying to write a loop that simulates checkouts and checkins for a 3 month period. Every day I iterate over the catalog, and every person in the patrons array. If the patron currently has the book checked out then I check it in. If it is not checked out then I add it to the patrons list of books via the patrons read method. If the book is overdue then I add a fine of $5.00 to the patron returning it. At the end of the 3 month period, I have to display each patron, the books they have currently checked out and any fine they may have.


Solution

  • you have typo error in your loops (for var k ... i++). See the snippet

    var Book = function(title, Available, publicationDate, checkoutDate, callNumber, Authors) {
        this.title = title;
        this.Available = Available;
        this.publicationDate = publicationDate;
        this.checkoutDate = checkoutDate;
        this.callNumber = callNumber;
        this.Authors = Authors;
    };
    
    var Author = function(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    };
    
    var Patron = function(firstName, lastName, libCardNum, booksOut, fine) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.libCardNum = libCardNum;
        this.booksOut = booksOut;
        this.fine = fine;
    };
    
    Book.prototype.checkOut = function() {
        this.Available = false;
        var temp = new Date(1000000000);
        var date = new Date() - temp;
        var res = new Date(date);
        this.checkoutDate = res;
    };
    
    Book.prototype.checkIn = function() {
        this.Available = true;
    };
    
    Book.prototype.isOverdue = function() {
        var singleDay = 1000 * 60 * 60 * 24;
        var todayDate = new Date().getTime();
        var difference = todayDate - this.checkoutDate.getTime();
        if (Math.round(difference / singleDay) >= 14) {
            return true;
        }
        return false;
    };
    
    Patron.prototype.read = function(book) {
        this.booksOut.add(book);
    }
    
    Patron.prototype.return = function(book) {
        this.booksOut.remove(this.booksOut.length);
    }
    
    var authors = [];
    authors[0] = new Author("Auth", "One");
    authors[1] = new Author("AutL", "Two");
    
    var catalog = [];
    catalog[0] = new Book('Bk1', true, new Date(2001, 1, 21), new Date(), 123456, authors);
    catalog[1] = new Book('Bk2', true, new Date(2002, 2, 22), new Date(), 987656, authors);
    catalog[2] = new Book('Bk3', true, new Date(2003, 3, 23), new Date(), 092673, authors);
    catalog[3] = new Book('Bk4', true, new Date(2004, 4, 24), new Date(), 658342, authors);
    catalog[4] = new Book('Bk5', true, new Date(2005, 5, 25), new Date(), 345678, authors);
    
    var patrons = [];
    patrons[0] = new Patron('Pat1', 'Wat', 1, catalog, 0.00);
    patrons[1] = new Patron('Pat2', 'Wot', 1, catalog, 0.00);
    patrons[2] = new Patron('Pat3', 'Wit', 1, catalog, 0.00);
    patrons[3] = new Patron('Pat4', 'Wet', 1, catalog, 0.00);
    patrons[4] = new Patron('Pat5', 'Wut', 1, catalog, 0.00);
    
    //while loop or for loop for 90 days
          //For loop over catalog
             //forloop over patrons 
                 //Check if available , if so check book out
                 //If not available check book back in
                     //check checking back in check to see if book is overdue and if so add a fine
        //When down loop over patrons to see their fees
    
    for (var i = 0; i < 90; i++) {
        for (var j = 0; j < catalog.length; j++) {
            for (var k = 0; k < patrons.length; k++) {
                var fine = patrons[k].fine;
                if (catalog[k].Available) {
                    catalog[k].checkOut;
                } else {
                    catalog[k].checkIn;
                    patrons[k].read;
                }
                if (catalog[k].isOverdue) {
                    fine = fine + 5.00;
                }
                 patrons[k].fine = fine;
            }
        }
       
    }
    
    for (i = 0; i < patrons.length; i++) {
        console.log(patrons[i].firstName + " has checked out the following books:");
        for (j = 0; j < patrons[i].booksOut.length; j++) {
            console.log(patrons[i].booksOut[j].title);
        }
        console.log(patrons[i].firstName + " has fine amount: $" + patrons[i].fine);
    }