Painter Quote and Receipt Problem
Write a program for scheduling a building paint job. Both interior and exterior.
The program will do the following:
Get the following data from the customer:
- Ask the customer to enter his/her name.
- Ask the customer to enter the month number that they want to schedule the paint job for
(Let the customer know the valid entries are 1 – 12).
- Ask the customer to enter the size of the interior and exterior walls (per square feet) that they want to be painted.
- example: interior: 7600
exterior: 6400
- Ask the customer for their credit card number (Let the user know AMEX, VISA, & MC
cards are accepted)
- (Have in mind that AMEX cards are 15 digits, VISA/MC cards are 16 digits)
- example: 312345678912345 (Amex example)
4987654321234567 (Visa example)
Perform the following calculations:
- Calculate the following:
- Total number of gallons(cans) of paint needed for the interior (a whole number)
- Total number of gallons(cans) of paint needed for the exterior (a whole number)
- Total number of gallons(cans) of paint needed altogether (a whole number)
§ Perform your calculations based on the following information:
- Each 1 gallon can of paint can paint 400 SQFT
calculate how many cans (gallons) you need.
- the total cost of interior paint
- the total cost of exterior paint
- the total cost of paint altogether
§ Perform your calculations based on the following pricing:
• Exterior paint is weatherproof and more expensive.
• Price to paint the interior walls: $300.00 (per gallon).
• Price to paint the exterior walls: $600.00 (per gallon).
Create a receipt for the customer that looks as:
- [tab]Date: followed by [Today’s date]
- Code for today’s Date is DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss")
- [tab]Name: followed by [Customer name]
- [tab]Card Number: followed by [Customer credit card number as described below]
- Display the card as six (6) stars followed by the last 4 digits of their card number.
- Example, if card number: 1234567890123456, display: ******3456
- Use Substring.
- [tab]Month Scheduled: followed by [month]
- The month will be displayed in the following format:
§ The 3-letter name of the month followed by a space and then the month the number inside a pair parenthesis.
§ Example: if month = 11, then display: NOV (11)
§ Use enum (if not sure how, replace month name with “???”, ex: ??? (11))
Line 1: [tab]Date: [Today’s Date]
Line 2: [tab]Name: Name
Line 3: [tab]Card Number: ******[Last 4 digits]
Line 4: [tab]Month Scheduled: NOV (11)
<------------ 40 chars ----------->
Only 10 digits of the card number are displayed
Month Scheduled, is the [3-letter Month Name] ([Month Number])
Followed by receipt details.
- A line of space, followed by details.
- Details are as follows:
§ Line 1: [tab]Header row (Type, Area (sqft), Paint (gal), Cost ($) )
§ Line 2: [tab]dashes
§ Line 3: [tab]Interior detail
§ Line 4: [tab]Exterior detail
§ Line 5: [tab]dashes
§ Line 6: [tab]Totals
- The receipt will look something like the following example:
Date: Today's Date
Name: XXXX
Card Number: ******3450
Month Scheduled: NOV (11)
Type Area (SqFt) Paint (Gal) Cost ($)
--------- ----------- ----------- -----------
Interior 7600 19 $5,700.0
Exterior 5500 14 $8,400.0
--------- ----------- ----------- -----------
Total 13100 33 $14,100.0
Solution:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MatthewAssignment
{
class Program
{
// Declare ENUM for credit card type
enum CreditCardType
{
NONE,
AMEX,
VISA,
MASTERCARD
}
// Declare a constant that defines the number of square feets that can be painted with a gallon
const int SQFT_PER_GALLON = 400;
// Declare constants for prices (per gallon)
const int INTERIOR_PRICE = 300;
const int EXTERIOR_PRICE = 600;
static int getMonth()
{
// Ask user for a month and check for valid inputs. Display error message if the input
// is not valid and reprompt
int month;
while (true)
{
try
{
Console.Write("Enter month to schedule the paint job (1-12): ");
month = Convert.ToInt32(Console.ReadLine());
if (month >= 1 && month <= 12)
return month;
else
Console.WriteLine("Please enter a valid month number.");
}
catch(Exception ex)
{
Console.WriteLine("Please enter a valid month number.");
}
}
}
static int getInteriorSquareFeets()
{
// Ask user for a number for the size of the area and check for valid inputs. Display error message if the input
// is not valid and reprompt
int sqft;
while (true)
{
try
{
Console.Write("Enter size of interior area (square-feets): ");
sqft = Convert.ToInt32(Console.ReadLine());
if (sqft > 0)
return sqft;
else
Console.WriteLine("Please enter a valid number.");
}
catch (Exception ex)
{
Console.WriteLine("Please enter a valid number.");
}
}
}
static int getExteriorSquareFeets()
{
// Ask user for a number for the size of the area and check for valid inputs. Display error message if the input
// is not valid and reprompt
int sqft;
while (true)
{
try
{
Console.Write("Enter size of exterior area (square-feets): ");
sqft = Convert.ToInt32(Console.ReadLine());
if (sqft > 0)
return sqft;
else
Console.WriteLine("Please enter a valid number.");
}
catch (Exception ex)
{
Console.WriteLine("Please enter a valid number.");
}
}
}
static long getCreditCard()
{
// Ask user for a number if the credit card and check for valid inputs. Display error message if the input
// is not valid and reprompt
long cc;
String cc_str;
while (true)
{
try
{
Console.Write("Enter size of your credit card number: ");
cc_str = Console.ReadLine();
cc = long.Parse(cc_str);
// check if the number has between 15 and 16 digits, and that the type of credit card is valid
if ((cc_str.Length == 15 || cc_str.Length ==16) && getCreditCardType(cc) != CreditCardType.NONE)
return cc;
else
Console.WriteLine("Please enter a valid credit card number.");
}
catch (Exception ex)
{
Console.WriteLine("Please enter a valid credit card number.");
}
}
}
static CreditCardType getCreditCardType(long number)
{
// convert number to string
String cc_str = number.ToString();
// check if the credit card has 15 numbers
if (cc_str.Length == 15) // it is AMEX
return CreditCardType.AMEX;
else // it has 16 digits
{
// check if the number begins with 4
if (cc_str[0] == '4')
return CreditCardType.VISA;
else if (cc_str[0] == '5') // master
return CreditCardType.MASTERCARD;
}
// if none of the conditions are met, then the credit card is of an unknown type
return CreditCardType.NONE;
}
static int calculateRequiredGallons(int area)
{
// Given the size of the area (Square-Feet), calculate the required number
// of gallons of paint
// Calculate
int gallons = 0;
while(area > 0)
{
gallons += 1;
area -= SQFT_PER_GALLON;
}
return gallons;
}
static int calculateInteriorCost(int interior)
{
// calculate the price to paint interior walls
// Calculate number of gallons
int gallons = calculateRequiredGallons(interior);
return gallons* INTERIOR_PRICE;
}
static int calculateExteriorCost(int exterior)
{
// calculate the price to paint exterior walls
// calculate number of gallons
int gallons = calculateRequiredGallons(exterior);
return gallons * EXTERIOR_PRICE;
}
static void generateReceipt(String name, int month, long credit_card, int interior, int exterior)
{
/*
* This functiion receives all the user's parameters and prints a receipt detailing the client name,
* the month to perform the paint job, credit card number and total costs
*
*/
// Convert card number to string
String cc_str = credit_card.ToString();
// Create a string filled with asterisks and only display the last 4 digits
String card_str = "";
for (int i = 0; i < cc_str.Length-4; i++)
card_str += "*";
card_str += cc_str.Substring(cc_str.Length - 4);
// Given the month id, get the name
String month_name = CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(month).ToUpper();
String receipt_str = "\tDate: " + DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss") + "\n";
receipt_str += "\tName: " + name + "\n";
receipt_str += "\tCard Number: " + card_str + "\n";
receipt_str += "\tMonth Scheduled: " + month_name + " (" + month.ToString() + ")\n\n";
// Calculate costs
int interior_cost = calculateInteriorCost(interior);
int exterior_cost = calculateExteriorCost(exterior);
// Calculate gallons
int interior_gallons = calculateRequiredGallons(interior);
int exterior_gallons = calculateRequiredGallons(exterior);
int total_area = interior + exterior;
int total_gallons = interior_gallons + exterior_gallons;
int total_cost = interior_cost + exterior_cost;
Console.WriteLine(receipt_str);
Console.WriteLine("\t{0,-10}{1,25}{2,25}{3,25}", "Type", "Area (sqft)", "Paint (gal)", "Cost ($)");
Console.WriteLine("\t{0,-10}{1,25}{2,25}{3,25}", "----", "-----------", "-----------", "--------");
Console.WriteLine("\t{0,-10}{1,25}{2,25}{3,25}", "Interior", interior.ToString(), interior_gallons.ToString(), "$"+string.Format("{0:0.0}", interior_cost));
Console.WriteLine("\t{0,-10}{1,25}{2,25}{3,25}", "Exterior", exterior.ToString(), exterior_gallons.ToString(), "$" + string.Format("{0:0.0}", exterior_cost));
Console.WriteLine("\t{0,-10}{1,25}{2,25}{3,25}", "----", "-----------", "-----------", "--------");
Console.WriteLine("\t{0,-10}{1,25}{2,25}{3,25}", "Total", total_area.ToString(), total_gallons.ToString(), "$" + string.Format("{0:0.0}", total_cost));
}
static void Main(string[] args)
{
String name; // store user name here
int month, interior, exterior; // store month, interior and exterior areas
long credit_card; // store credit card number here
// Ask user for name
Console.Write("Enter your name: ");
name = Console.ReadLine();
// Ask for month
month = getMonth();
// Ask for interior and exterior sizes
interior = getInteriorSquareFeets();
// Ask for exterior
exterior = getExteriorSquareFeets();
// Ask for credit card number
credit_card = getCreditCard();
generateReceipt(name, month, credit_card, interior, exterior);
Console.Read();
}
}
}