Here's my solution to your problem based on my interpretation of your specs listed above. I haven't tested it much. So, it's your responsiblity to find the bugs and verify it meets your specs.

Have fun

Bob
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;
}