2017-04-22 11 views
0

チェックイン/チェックアウトシミュレーションを実行するためにネストループを取得しようとしています。私は機能を設定して、最後にループを作っていますが、どういうわけか私はいつも同じ出力を出しています。すべての顧客は、checkOut関数とisOverdue関数のように完全に無作為化されるのではなく、同じ量の本と膨大な罰金を持っています。ループが機能操作を正しく実行しない

ループは関数からランダムに生成された日付を使用し、各利用者にさまざまな罰金と異なる書籍のチェックアウトを行うようにするにはどうすればよいですか? Instructions for the project.

マイコード:

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; 
 
    }; 
 

 
    function randInRange(start, end) { 
 
     return Math.floor(Math.random() * (end - start + 1)) + start; 
 
    } 
 

 
    Book.prototype.checkOut = function() { 
 
     this.Available = false; 
 
     var dateChk = new Date(); 
 
     var randDay = randInRange(1, 25); 
 
     dateChk.setDate(dateChk.getDate() - randDay); 
 
     this.checkoutDate = dateChk; 
 
    }; 
 

 
    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); 
 
    }

+0

あなたの質問 –

+0

ヒント絞り込むください:書籍の乱数が – charlietfl

+0

@charlietfl乱数各パトロンのように、元の配列のいずれかの全体の長さに相関がない持っている別のブックをチェック番号自体ではなく、 –

答えて

1

私はそれが実際に動作するように、あなたの例に変更の数をしなければなりませんでした。

オブジェクトのメソッドを呼び出すと、コールの後ろに括弧を入れなければならないということが非常に重要です。つまり、catalog[j].checkOutではなく、catalog[j].checkOut()です。

私の変更とスクリプトの動作を確認できます。これを手にして、フォローアップの質問を策定することができます。

これが役に立ちます。

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; 
 
    }; 
 

 
    function randInRange(start, end) { 
 
     return Math.floor(Math.random() * (end - start + 1)) + start; 
 
    } 
 

 
    Book.prototype.checkOut = function() { 
 
     this.Available = false; 
 
     var dateChk = new Date(); 
 
     var randDay = randInRange(1, 25); 
 
     dateChk.setDate(dateChk.getDate() - randDay); 
 
     this.checkoutDate = dateChk; 
 
    }; 
 

 
    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; 
 
    }; 
 
    
 
    // Changed the read method 
 
    Patron.prototype.read = function(book) { 
 
     this.booksOut[book.callNumber] = book; 
 
    } 
 

 
    // Changed the return method 
 
    Patron.prototype.return = function(book) { 
 
     delete(this.booksOut[book.callNumber]); 
 
    } 
 

 
    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); 
 

 
    // Changed how Patrons are initialised. Instead of passing the full 
 
    // catalog for booksRead an empty object is passed. 
 
    var patrons = []; 
 
    patrons[0] = new Patron('Pat1', 'Wat', 1, {}, 0.00); 
 
    patrons[1] = new Patron('Pat2', 'Wot', 1, {}, 0.00); 
 
    patrons[2] = new Patron('Pat3', 'Wit', 1, {}, 0.00); 
 
    patrons[3] = new Patron('Pat4', 'Wet', 1, {}, 0.00); 
 
    patrons[4] = new Patron('Pat5', 'Wut', 1, {}, 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 < 3; i++) { 
 
     // changed the for loop 
 
     for (var j in catalog) { 
 
      // changed the for loop 
 
      for (var k in patrons) { 
 
       var fine = patrons[k].fine; 
 
       // Changed catalog[k] to catalog[j] 
 
       // moved and changed patrons[k].read() call 
 
       // added the patrons[k].return() call 
 
       if (catalog[j].Available) { 
 
        catalog[j].checkOut(); 
 
        patrons[k].read(catalog[j]); 
 
       } else if (patrons[k].booksOut[catalog[j].callNumber]) { 
 
        catalog[j].checkIn(); 
 
        patrons[k].return(catalog[j]); 
 
       } 
 
       if (catalog[j].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 in patrons[i].booksOut) { 
 
      console.log(patrons[i].booksOut[j].title); 
 
     } 
 
     console.log(patrons[i].firstName + " has fine amount: $" + patrons[i].fine); 
 
    }

編集

コメントへの回答。

これは、forループの設定方法の結果です。最初の日にはすべての本が第1の利用客に行き、第2の日には第2の利用者に行きます。

  1. 1日目、書籍1、パトロン1:ブックが利用可能であり、1
  2. 1日目パトロンに進み、書籍1、パトロン2:今は利用できません。
  3. ...
  4. 1日目、書籍2、守護1:ブックが利用可能であり、1
  5. 1日目パトロンに進み、書籍2、パトロン2:今は利用できません。
  6. ...
  7. 2日目、本1、保護者1:本は利用できません。本は返却されます。
  8. 第2日目、第1部、第2部:本は利用可能であり、第2部に行く。
  9. 第2日目、第1部、客員3:本は利用できません。
  10. ...
  11. とあなたの結果は、あなたが望んほどランダムでないように、そう
+0

3番目の顧客が常にすべての書籍を手に入れてしまうのはなぜですか? –

1

上の命令は、シミュレーション中に、書籍や常連客をシャッフルする言いませんでした。また、書籍や利用者をループすることで、標準for forループと通常のforループを使用することができます。私はlodash _.shuffleを使って、より良い結果を得るために、各ループ中に本と後援者をランダム化しています。私たちはまた、パトロンの素晴らしいロジックを隠すことができ、単純なシミュレーションでプロトタイプを返すことができます。

for (var i = 0; i < 90; i++) { 
    _.shuffle(books).forEach(function(book) { 
    _.shuffle(patrons).forEach(function(patron) { 
     if (patron.hasBookCheckedOut(book)) { 
     return patron.return(book); 
     } 

     if (book.available) { 
     patron.read(book); 
     }  
    }); 
    }); 
}; 

の作業例http://jsbin.com/teyipak/1/edit?js,console

関連する問題