Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h> // Needed for modff
#include <conio.h> // Needed for getche
#define FALSE 0
#define TRUE !FALSE
#define DEBUG
#define QUARTERS 25
#define DIMES 10
#define NICKELS 5
#define PENNIES 1
#define BADPENNY -1
#define BOOL int
typedef struct SBankReturn
{
unsigned long ulBankQuarter;
unsigned long ulBankDime;
unsigned long ulBankNickel;
unsigned long ulBankPenny;
BOOL bBankBroke;
} SBankFundsInfo;
SBankFundsInfo SBankDenom = {10,10,10, 10, FALSE };
unsigned long ulCentsLeft = 0L; // cents left to pay in change
float fGetTotalCost(int iTotalItems)
{
float fTotal = 0.0;
float fPrice = 0.0;
while (iTotalItems != 0)
{
printf("\nPlease enter the price for your item>");
scanf("%f", &fPrice);
fTotal += fPrice;
iTotalItems--;
}
return fTotal;
}
BOOL bUpdateBank(unsigned long ulDenominationCount, int iDenomination)
{
if(iDenomination == QUARTERS )
{
if(SBankDenom.ulBankQuarter >= ulDenominationCount)
{
SBankDenom.ulBankQuarter -= ulDenominationCount;
ulCentsLeft -= ulDenominationCount * QUARTERS ;
}
else
{
ulCentsLeft -= (SBankDenom.ulBankQuarter * QUARTERS );
SBankDenom.ulBankQuarter = 0L;
}
}
if(iDenomination == DIMES )
{
if(SBankDenom.ulBankDime >= ulDenominationCount)
{
SBankDenom.ulBankDime -= ulDenominationCount;
ulCentsLeft -= ulDenominationCount * DIMES ;
}
else
{
ulCentsLeft -= (SBankDenom.ulBankDime * DIMES );
SBankDenom.ulBankDime = 0L;
}
}
if(iDenomination == NICKELS )
{
if(SBankDenom.ulBankNickel >= ulDenominationCount)
{
SBankDenom.ulBankNickel -= ulDenominationCount;
ulCentsLeft -= ulDenominationCount * NICKELS;
}
else
{
ulCentsLeft -= (SBankDenom.ulBankNickel * NICKELS );
SBankDenom.ulBankNickel = 0L;
}
}
if(iDenomination == PENNIES )
{
if(SBankDenom.ulBankPenny >= ulDenominationCount)
{
SBankDenom.ulBankPenny -= ulDenominationCount;
ulCentsLeft = 0L;
}
else
{
ulCentsLeft -= SBankDenom.ulBankPenny;
SBankDenom.ulBankPenny = 0L;
}
}
#ifdef DEBUG
printf("Static struct variables:\n");
printf("Q %u\n",SBankDenom.ulBankQuarter);
printf("D %u\n",SBankDenom.ulBankDime);
printf("N %u\n",SBankDenom.ulBankNickel);
printf("P %u\n",SBankDenom.ulBankPenny);
#endif
if( !SBankDenom.ulBankQuarter && !SBankDenom.ulBankDime && !SBankDenom.ulBankNickel && !SBankDenom.ulBankPenny)
{
SBankDenom. bBankBroke = TRUE;
return TRUE;
}
else
return FALSE;
}
int CalulateQuarters(unsigned long ulCentsLeft, unsigned long ulQuartersInBank)
{
int iQuartersReturned = 0;
if(ulQuartersInBank >= (ulCentsLeft / QUARTERS))
iQuartersReturned = (ulCentsLeft / QUARTERS);
else
iQuartersReturned = ulQuartersInBank;
bUpdateBank(iQuartersReturned, QUARTERS);
return iQuartersReturned;
}
int CalulateDimes(unsigned long ulCentsLeft, unsigned long ulDimesInBank)
{
int iDimesReturned = 0;
if(ulDimesInBank >= (ulCentsLeft / DIMES))
iDimesReturned = (ulCentsLeft / DIMES);
else
iDimesReturned = ulDimesInBank;
bUpdateBank(iDimesReturned, DIMES);
return iDimesReturned;
}
int CalulateNickels(unsigned long ulCentsLeft, unsigned long ulNickelsInBank)
{
int iNickelsReturned = 0;
if(ulNickelsInBank >= (ulCentsLeft / NICKELS))
iNickelsReturned = (ulCentsLeft / NICKELS);
else
iNickelsReturned = ulNickelsInBank;
bUpdateBank(iNickelsReturned, NICKELS);
return iNickelsReturned;
}
int CalulatePennies(unsigned long ulCentsLeft, unsigned long ulPenniesInBank)
{
BOOL bNotEnoughPennies = FALSE;
int iPenniesReturned = 0;
if(ulPenniesInBank >= (ulCentsLeft / PENNIES))
iPenniesReturned = (ulCentsLeft / PENNIES);
else
{
bNotEnoughPennies = TRUE;
iPenniesReturned = ulPenniesInBank;
}
bUpdateBank(iPenniesReturned, PENNIES);
if(bNotEnoughPennies == FALSE)
return iPenniesReturned;
else
return BADPENNY;
}
void DisplayResults(unsigned long ulQuarters, unsigned long ulDimes, unsigned long ulNickles, unsigned long ulPennies)
{
printf("\nOur change is as follows:\n");
if(ulPennies != BADPENNY)
printf("%ld Quarters, %ld Dimes, %ld Nickels, %ld Pennies\n\n\n",ulQuarters, ulDimes, ulNickles, ulPennies);
else
printf("%ld Quarters, %ld Dimes, %ld Nickels, *** Pennies returned a -1 ***\n\n\n",ulQuarters, ulDimes, ulNickles);
}
int main(void)
{
unsigned long ulQuartersReturned, ulDimesReturned, ulNicklesReturned, ulPenniesReturned;
int iNumItems = 0;
float fTotal = 0.0;
float fAmtPaid = 0.0, fChange = 0.0;
float fDollars, fCents;
do
{
printf("Please enter the number of grocery items>");
scanf("%d", &iNumItems);
fTotal = fGetTotalCost(iNumItems);
printf("\nPlease enter the amount paid>");
scanf("%f", &fAmtPaid);
fChange = fAmtPaid - fTotal;
printf("\nchange is %0.02f\n", fChange);
fCents = modff( fChange, &fDollars); // Separate Dollars and cents
ulCentsLeft = (fDollars * 100) + (fCents * 100);
printf("dollars = %0.02f cents = %0.02f centsLeft = %ld\n", fDollars, fCents*100, ulCentsLeft);
if( fChange > 0.0 )
{
ulQuartersReturned = CalulateQuarters(ulCentsLeft,SBankDenom.ulBankQuarter );
ulDimesReturned = CalulateDimes(ulCentsLeft,SBankDenom.ulBankDime );
ulNicklesReturned = CalulateNickels(ulCentsLeft,SBankDenom.ulBankNickel );
ulPenniesReturned = CalulatePennies(ulCentsLeft,SBankDenom.ulBankPenny );
DisplayResults(ulQuartersReturned,ulDimesReturned, ulNicklesReturned, ulPenniesReturned );
if(SBankDenom.bBankBroke)
{
printf("Program ending, the bank is broke\n");
break;
}
}
printf("Hit the X key to e(X)it, any other key to repeat procedure ");
if(toupper(getche()) == 'X')
{
printf("\nProgram finished\n");
break;
}
else printf("\n");
fChange = fCents = fDollars = fTotal = fAmtPaid = 0.0;
}
while (TRUE);
return 0;
}