## Overdue Books (dates)

 /*** Overdue Library Books ************************** Sheila works in the school library.  She needs a quick way to calcuate a fine for overdue books, based on this table:    0.25 per day, up to 6 days.    1.50 for 7-13 days    3.00 for 14-20 days    etc, 1.50 per week for each week The logic is not difficult, but it's much simpler if she can type in the original due date and the current date, and the computer tells the appropriate fine. *****************************************************/ public class OverdueBooks {   public OverdueBooks()   {     String today = input("Today's date (dd.mm)");     String another = "";     while(another.equals(""))     {       String dueDate = input("Due date (dd.mm)");       int days = daysLate(today, dueDate);       System.out.println("Today = " + today);       System.out.println("Due = " + dueDate);       System.out.println("Days overdue = " + days);             if(days<=0)       { System.out.println("No fine"); }       else if(days<=6)       { System.out.println("Fine = " + (days*0.25)); }       else if(days<=13)       { System.out.println("Fine = " + 1.50); }       else if(days<=20)       { System.out.println("Fine = " + 3.00); }       else if(days<=27)       { System.out.println("Fine = " + 4.50); }       else       { System.out.println("Over 4 weeks late - talk to librarian"); }       another = input("Press [Enter] for another book");     }   }     int daysLate(String today,String dueDate)   {     int td = Integer.parseInt(today.substring(0,2));    // today's day     int tm = Integer.parseInt(today.substring(3,5));    // today's month         int dd = Integer.parseInt(dueDate.substring(0,2));  // dueDate's day     int dm = Integer.parseInt(dueDate.substring(3,5));  // dueDate's month         if(tm == dm)     {       if(dd >= td)                            {  return -1; }                     // not overdue       else       {  return td-dd; }                  // days overdue     }     else if (dm > tm)     {  return -1; }                        // not overdue     else     {                                      // tm > dm, due last month       return (tm-dm)*30 + (td-dd);        // count 30 days per month         }   }     public static void main(String[] args)   {  new OverdueBooks();  }     public String input(String prompt)   { return javax.swing.JOptionPane.showInputDialog(null,prompt); } } Today = 15.07 Due = 01.07 Days overdue = 14 Fine = 3.0

### String Commands

The program inputs two Strings that represent dates, in the format dd.mm, e.g. 25.12 for 25 Dec, or 01.01 for New Year's day.
If the user types a different format, like 12/25 for Dec 25, then the program will not function correctly.  A really good program
would check whether the date is VALID (in the correct format) before processing the data, but that part is left as a practice
exercise for the reader.

The program parses each date String.  Parse means to take apart the String into smaller meaningful pieces.  Each String
starts with 2 digits for the day, followed by a period '.', and finally 2 digits for the month.  The substring method extracts
part of a String, for example:

String  S = "29.10";
String  D = S.substring(0,2);   ==>  "29"
String  M = S.substring(3,5);   ==>  "10"

Converting from String to Integer

After extracting the small Strings containing numbers, the program uses the Processing int( ) function to change these
to actual numbers that can be used in a calculation, to determine the number over due days, or be used in a comparison
like:
if(D > 31)
{ output("The day part of the date is too large"); }

if(M < 0 || M > 12)
{  output("The month value is not valid."); }

Complex Logic

Calculating the overdue charge is not a simple calculation, but rather uses various categories to determine the cost.
The correct category is determined by a complex  if..else if..else if..else command.

This sort of complex logic is known as business rules.  It has nothing to do with natural laws or mathematics,
as these rules are determined by a business and can be changed whenever they wish.  In this program, books that are
over 4 weeks overdue require a human consultation with the librarian to determine the charge (the else part).

Methods

The calculation of DaysLate is done in a separate method.  This calculation could have been done inside
the main setup method, but writing a separate method makes the program a bit easier to read.  It also
creates a method that could be re-used in other programs, or called more than once in this program.  Notice that
the method uses return to send an answer back to the main program.

Programming Practice

• Download the programRun it and test various combinations of dates to convince yourself
that it works correctly.  For example, what happens if the due date is in one month, but the return
date is in the next month?
• Change the business rules so that it costs 0.50 per day in the first week,
0.40 per day in the second week, 0.20 per day in the third week, and 0.10 per day
in all weeks after the third week.  Test your program to make sure it still works
if the book is 2 months overdue.
• Change the program to use the USA date format:  MM / DD
• Add commands that VALIDATE the dates before doing a calculation.
For example, a user might type :  9.12 .
Then the String commands will not function properly.
Your commands should check that the period appears in position 2 (e.g. the 3rd character).
If not, it should output "date is not valid" and NOT attempt to calculate anything.
• What happens if the due date is in December and the book is returned in the following January?
Describe how this can be fixed.