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
int bDenominationCalculation(unsigned long ulCentsLeft);
int main(void)
{
char ch;
int numItems = 0;
float total = 0.0;
float price = 0.0, amtPaid = 0.0, change = 0.0;
unsigned long centsLeft = 0; // cents left to pay in change
float dollars, cents;
do
{
printf("Please enter the number of grocery items>");
scanf("%d", &numItems);
while (numItems != 0)
{
printf("\nPlease enter the price for your item>");
scanf("%f", &price);
total += price;
numItems--;
}
printf("\nPlease enter the amount paid>");
scanf("%f", &amtPaid);
change = amtPaid - total;
printf("\nchange is %0.02f\n", change);
cents = modff( change, &dollars); // Separate Dollars and cents
centsLeft = (dollars * 100) + (cents * 100);
printf("dollars = %0.02f cents = %0.02f centsLeft = %d\n", dollars, cents*100, centsLeft);
if( change > 0.0 ) // optional denomination breakdown
{
if(bDenominationCalculation(centsLeft))
{
printf("program ending, the bank is broke\n");
break;
}
}
printf("Hit the 0 key to e(X)it, any other key to repeat procedure ");
ch=toupper(getche());
printf("\n");
if (ch=='0') {
printf("Program finished");
break;
}
total = 0.0;
}
while (TRUE);
return 0;
}
int bDenominationCalculation(unsigned long ulCentsLeft)
{
unsigned long uliTempCalc = 0L;
static struct SBank
{
unsigned long uli20Dollar;
unsigned long uli10Dollar;
unsigned long uli5Dollar;
unsigned long uli1Dollar;
unsigned long uliQuarter;
unsigned long uliDime;
unsigned long uliNickel;
unsigned long uliPenny;
}SBankDenom = {10,10,10, 10, 10, 10, 10, 10};
if(SBankDenom.uli20Dollar && (ulCentsLeft / 2000))
{
if(SBankDenom.uli20Dollar >= ulCentsLeft / 2000)
{
printf("$20 - %u\n", ulCentsLeft / 2000);
SBankDenom.uli20Dollar -= ulCentsLeft/ 2000;
ulCentsLeft -= 2000 * ( ulCentsLeft / 2000 );
}
else
{
ulCentsLeft -= (SBankDenom.uli20Dollar * 2000 );
printf("$20 - %u\n", SBankDenom.uli20Dollar);
SBankDenom.uli20Dollar = 0;
}
}
if (SBankDenom.uli10Dollar && (ulCentsLeft /1000) )
{
if(SBankDenom.uli10Dollar >= ulCentsLeft / 1000)
{
printf("$10 - %u\n", ulCentsLeft / 1000);
SBankDenom.uli10Dollar -= ulCentsLeft/ 1000;
ulCentsLeft -= 1000 * ( ulCentsLeft / 1000 );
}
else
{
ulCentsLeft -= (SBankDenom.uli10Dollar * 1000 );
printf("$10 - %u\n", SBankDenom.uli10Dollar);
SBankDenom.uli10Dollar = 0;
}
}
if( SBankDenom.uli5Dollar && (ulCentsLeft / 500) )
{
if(SBankDenom.uli5Dollar >= ulCentsLeft / 500)
{
printf("$5 - %u\n", ulCentsLeft / 500);
SBankDenom.uli5Dollar -= ulCentsLeft/ 500;
ulCentsLeft -= 500 * ( ulCentsLeft / 500 );
}
else
{
ulCentsLeft -= (SBankDenom.uli5Dollar * 500 );
printf("$5 - %u\n", SBankDenom.uli5Dollar);
SBankDenom.uli5Dollar = 0;
}
}
if( SBankDenom.uli1Dollar && (ulCentsLeft / 100) )
{
if(SBankDenom.uli1Dollar >= ulCentsLeft / 100)
{
printf("$1 - %u\n", ulCentsLeft / 100);
SBankDenom.uli1Dollar -= ulCentsLeft/ 100;
ulCentsLeft -= 100 * ( ulCentsLeft / 100 );
}
else
{
ulCentsLeft -= (SBankDenom.uli1Dollar * 100 );
printf("$1 - %u\n", SBankDenom.uli1Dollar);
SBankDenom.uli1Dollar = 0;
}
}
if( SBankDenom.uliQuarter && (ulCentsLeft / 25))
{
if(SBankDenom.uliQuarter >= ulCentsLeft / 25)
{
printf("25%c - %u\n", 155, ulCentsLeft / 25);
SBankDenom.uliQuarter -= ulCentsLeft / 25;
ulCentsLeft -= 25 * ( ulCentsLeft / 25 );
}
else
{
ulCentsLeft -= (SBankDenom.uliQuarter * 25 );
printf("25%c - %u\n", 155,SBankDenom.uliQuarter );
SBankDenom.uliQuarter = 0;
}
}
if( SBankDenom.uliDime && (ulCentsLeft / 10) )
{
if(SBankDenom.uliDime >= ulCentsLeft / 10)
{
printf("10%c - %u\n", 155, ulCentsLeft / 10);
SBankDenom.uliDime -= ulCentsLeft/ 10;
ulCentsLeft -= 10 * ( ulCentsLeft / 10 );
}
else
{
ulCentsLeft -= (SBankDenom.uliDime * 10 );
printf("10%c - %u\n", 155,SBankDenom.uliDime );
SBankDenom.uliDime = 0;
}
}
if( SBankDenom.uliNickel && (ulCentsLeft / 5) )
{
if(SBankDenom.uliNickel >= ulCentsLeft / 5)
{
printf("5%c - %u\n", 155, ulCentsLeft / 5);
SBankDenom.uliNickel -= ulCentsLeft/ 5;
ulCentsLeft -= 5 * ( ulCentsLeft / 5 );
}
else
{
ulCentsLeft -= (SBankDenom.uliNickel * 5 );
printf("5%c - %u\n", 155, SBankDenom.uliNickel);
SBankDenom.uliNickel = 0;
}
}
if( ulCentsLeft && SBankDenom.uliPenny )
{
if(SBankDenom.uliPenny >= ulCentsLeft )
{
printf("1%c - %u\n", 155, ulCentsLeft);
SBankDenom.uliPenny -= ulCentsLeft;
ulCentsLeft -= ulCentsLeft ;
}
else
{
ulCentsLeft -= (SBankDenom.uliPenny );
printf("1%c - %u\n", 155,SBankDenom.uliPenny );
SBankDenom.uliPenny = 0;
}
}
#ifdef DEBUG
printf("Static struct variables:\n");
printf("$20 %u\n",SBankDenom.uli20Dollar);
printf("$10 %u\n",SBankDenom.uli10Dollar);
printf("$5 %u\n",SBankDenom.uli5Dollar);
printf("$1 %u\n",SBankDenom.uli1Dollar);
printf("Q %u\n",SBankDenom.uliQuarter);
printf("D %u\n",SBankDenom.uliDime);
printf("N %u\n",SBankDenom.uliNickel);
printf("P %u\n",SBankDenom.uliPenny);
#endif
if(ulCentsLeft)
return TRUE;
else
return FALSE;
}