Homework 2: Calculating Credit Card Interest
Please review the rules on collaboration for homework for this course, as well as the guidelines for turning in work.
In this assignment you will write a program to simulate calculating credit card interest whilst making only the minimum payment each month.
See the "Grading" section below for specific criteria for this assignment. As with all projects and homework, the style guidelines apply to this assignment, and points may be deducted for poor style, readability, and testing.
Learning outcomes
Upon completion of this assignment, students will demonstrate understanding of the following learning outcomes:
1. In the context of low-level, systems programming:- Author effectful programs using fundamental imperative operations, e.g., sequenced statements, conditionals, and loops.
- Author small, memory-safe programs that interact with the world (i.e., produce side-effects).
- Design a program by identifying relevant preconditions, postconditions, and invariants of its state.
- Navigate the file system within a CLI.
- View and edit files using a standard Unix text editor (e.g., Emacs or Vim) within a CLI.
- Author a C program involving static types, the pre-processor, mutable variables, functions, loops, and structs.
- Author a C program involving IO and dynamically allocated memory.
Background
An individual's credit card comes with an annual percentage rate (APR), which dictates how much interest you'd pay on a balance over a year. However, because users typically accrue charges over the course a billing cycle, most credit card issuers calculate a so-called daily periodic rate (or DPR) and charge you interest based on the average daily balance during your billing cycle.
Details differ by card issuer, but we will calculate the daily periodic rate as the annual percentage rate over 365.
The total interest charges accrued in your billing cycle is then your average daily balance multiplied by the DPR and the number of days in the billing cycle.
Example
Suppose your APR is 18%, then the DPR is calculated as
0.18 / 365 = 0.0004931506849
Now suppose you're not adding any new charges and your forward balance is $42. If the month corresponding to your billing cycle has 31 days, the total interest you owe is
$42 * 0.004931 * 31 = $0.64
This is a pretty underwhelming amount, but as we'll see, the compounding interest can be significant when you only pay the minimum amount each month.
The Task
Write a program called creditcard.c that establishes an
annual percentage rate and an initial balance as well as a monthly
minimum payment. The program should then display the amount paid each
month, along with the interest accrued and the remaining
balance. Once the balance is paid off, it should report how many
months it took to pay off the balance and the total amount paid.
For example, if we have a common APR of 18% and monthly minimum of $35, we might see the following for a forward balance of $500.
Cycle Month Intrst Payment Balance 0 9 $ 7.40 $35.00 $ 472.40 1 10 $ 7.22 $35.00 $ 444.62 2 11 $ 6.58 $35.00 $ 416.20 3 12 $ 6.36 $35.00 $ 387.56 4 1 $ 5.92 $35.00 $ 358.48 5 2 $ 4.95 $35.00 $ 328.43 6 3 $ 5.02 $35.00 $ 298.46 7 4 $ 4.42 $35.00 $ 267.87 8 5 $ 4.10 $35.00 $ 236.97 9 6 $ 3.51 $35.00 $ 205.47 10 7 $ 3.14 $35.00 $ 173.61 11 8 $ 2.65 $35.00 $ 141.27 12 9 $ 2.09 $35.00 $ 108.36 13 10 $ 1.66 $35.00 $ 75.01 14 11 $ 1.11 $35.00 $ 41.12 15 12 $ 0.63 $35.00 $ 6.75 16 1 $ 0.10 $ 6.86 $ 0.00 After 17 months, you paid $566.86 on an initial balance of $500.00.
Your program should also follow these requirements:
- Calculate the interest based on the number of days in the month. (Ignore leap years and pretend February is always 28 days).
- You never pay more than the minimum or your current balance.
- You never accrue new charges. Your goal is simply to pay off the card.
- The printed table of information should include everything in the example above. It does not have to have the exact format, but it should be printed in a similarly clean format that is easy for humans to read.
-
In addition to your
mainfunction, which is of course required by C, you must write and use at least one other function (more than one is allowed). It is up to you to decide how best to break up the task, but your function should take in at least one parameter and return something other thanvoid. -
Your code should be well organized (as always), but in particular, it should be very easy for a grader to find and change values for the following variables:
initial_balance, APR, monthly_minimum, andstarting_month. (Hint: This should also give you a good idea about what sorts of tests you need to run!)
Grading
Your testing should cover an appropriate range of "input" value combinations and your program's output should make it easy to assess correctness. I highly recommend for this (and all coding projects) that you make a testing plan before you start to write code. You do not need to plan to test all possible inputs to the program, but you should have a plan that will test major sections of your code and demonstrate your problem solving skills. Include this plan when you submit your code and testing transcript.
The assignment will be worth 25 points, based on the following criteria:
- Printed table includes all values requested and is neatly formatted (2 points)
- Printed message to the user at the end (1 points)
- Code is well documented (4 points)
- Interest, payment, balance, and total amount paid are all calculated correctly (6 points)
- A function (other than main) which takes in parameters and returns a non-void value is used in a way that aids in organization and understanding. (6 points)
- Testing of "edge cases" with included test plan and test script (6 points)