# c program help - functions



## Sleepwalker817 (Mar 12, 2008)

Hello, I need some help with the program included below.



```
#include <stdio.h>
#include <conio.h>

int main(void)
{
              
              /* Declare Variables */
			  /* ----------------- */

	int x, number_of_deposits, number_of_withdrawals;
	float deposits[50], withdrawals[50];
	float current_balance;
	float balance;
	float total_deposits = 0, total_withdrawals = 0;
    char    first_name[20];
    
          /* Output initial greeting */
          /* ------------------------*/
        
        printf("Welcome to the Sears Banking System.\n\n");
        printf ("Please enter your first name: ");
        scanf ("%s", first_name);
        fflush(stdin);
        printf("\nHello, %s.\n\n", first_name);   
        
        /* Prompt user for current balance in dollars and cents. */
        /* ----------------------------------------------------- */

  do
  {

		printf ("Please enter your current balance in dollars and cents: ");
		scanf ("%f",&current_balance);
		fflush(stdin);


		if (current_balance < 0)
			printf ("Error: Beginning balance must be at least zero, please re-enter!\n\n");

  } while (current_balance < 0); /* end do-while loop */

        /* Prompt user for the number of withdrawals */
	    /* ----------------------------------------- */

  do
  {

		printf ("\nEnter the number of withdrawals: ");
		scanf ("%i",&number_of_withdrawals);
		fflush (stdin);


		if (number_of_withdrawals < 0 || number_of_withdrawals > 50)
			printf ("Error: Number of withdrawals must be between zero and 50, please re-enter!\n\n");

  } while (number_of_withdrawals < 0 || number_of_withdrawals > 50); /* end do-while trap loop */

        /* Prompt user to enter the number of deposits. */
	    /* -------------------------------------------- */

  do
  {

		printf ("\nEnter the number of deposits: ");
		scanf ("%i",&number_of_deposits);
		fflush (stdin);

		if ( number_of_deposits < 0 || number_of_deposits > 50)
			printf ("Error: Number of deposits must be between 0 and 50, please re-enter!\n\n");

  } while (number_of_deposits < 0 || number_of_deposits > 50); /* end do-while trap loop */
  
  printf("\n");
		
        /* Prompt user for positive deposits and withdrawals. */
	    /* -------------------------------------------------- */

  for (x = 1; x <= number_of_deposits; x++)
  {

	 do
	{

		printf ("Enter the amount of deposit #%i: ", x);
		scanf ("%f",&deposits[x]);
		fflush (stdin);

		if (deposits[x] <= 0)
			printf ("*** Deposit amount must be greater than zero. Please re-enter! ***\n");

	} while (deposits[x] <= 0);

  total_deposits = total_deposits + deposits[x];

  }// end for loop
  
  printf("\n");

  for (x = 1; x <= number_of_withdrawals; x++)
  {
	  do
	  {
		  printf ("Enter the amount of withdrawal #%i: ", x);
		  scanf ("%f",&withdrawals[x]);
		  fflush (stdin);

		  if (withdrawals[x] > current_balance)
				printf ("***Withdrawal amount exceeds current balance.***\n");
		  else
		  if (withdrawals[x] <= 0)
				printf ("*** Withdrawal amout must be greater than zero. Please re-enter! ***");

	} while (withdrawals[x] > current_balance || withdrawals[x] <= 0); /* end do-while loop */

  total_withdrawals = total_withdrawals + withdrawals[x];
  
        /* If balance goes to zero, reset the withdrawal count */
		/* -------------------------------------------------- */

  balance = current_balance - total_withdrawals + total_deposits;

	if (balance == 0)
	{
		 printf ("\n *** Balance is now zero. No more withdrawals can be made at this time. ***\n");
		 number_of_withdrawals = x;
		 break;

	} // end-if

  } //end for loop


		/* Calculate and display the closing balance */
		/* ---------------------------------------- */

	printf ("\n*** Your closing balance is $%.2f, %s*** \n", balance, first_name);


	if (balance >= 5000.00)
		printf ("*** Time to invest some money!*** \n\n");
	else if (balance >= 15000.00 && balance <= 49999.99)
		printf ("*** Maybe you should consider a CD.*** \n\n");
	else if (balance >= 1000.00 && balance <= 14999.99)
		printf ("*** Keep up the good work.*** \n\n");
	else
		printf ("*** %s, your balance is getting low!*** \n\n", first_name);

		/* Display bank record */
		/* ------------------ */
	
    printf ("     *** Bank Record ***\n");

	printf ("\nStarting Balance:$   %13.2f\n\n", current_balance);


	for (x = 1; x <= number_of_deposits; x++)
	{
	 printf ("Deposit #%i:          %13.2f\n", x, deposits[x]);
	}


	for (x = 1; x <= number_of_withdrawals; x++)
	{
	 printf ("\nWithdrawal  #%i:      %13.2f", x, withdrawals[x]);
	}


	printf ("\n\nEnding Balance is:$  %13.2f\n", balance);
	
	{
     getch();
     return 0;
    }
} /*end main*/
```
I need to alter this program so that it uses at least three "non-trivial" functions (non-trivial meaning that it does more than just print a line of text). My problem is that the text book I am using isn't very helpful so any help would be much appreciated.

Thanks


----------



## jamiemac2005 (Jul 5, 2007)

If you want a nice tutorial on functions (and anything else C or C++ related) you can go to www.cprogramming.com I believe the information you're seeking is here:

http://www.cprogramming.com/tutorial/c/lesson4.html

Hope it helps,
Jamey

p.s. after having looked through your code there is alot which could be proceduralised (contained in a function to make the code re-useable, etc etc)... so take a look at that tutorial and it should help


----------



## jamiemac2005 (Jul 5, 2007)

Oh, also, when seeking help on C, etc. you should use the Programming sub-forum, this is web-design&programming (all web-based)...

The Programming forum is here:

http://www.techsupportforum.com/conversation-pit/programming/

Cheers,
Jamey


----------



## Sleepwalker817 (Mar 12, 2008)

Hello, This is what I have so far. 



```
#include <stdio.h>

float get_startingbalance(void);
float getCntOfWithdrawls();
float getCntOfDeposits();
float getEachDeposit();
float getEachWithdrawl();
float checkBalance();
float calcAndDisplayBalance();
float displayBankRecord()
void print_withdrawalnumber(int num_withdrawals);
void print_depositnumbers(int num_deposits);
void print_startingbalance(float start_balance);
void print_endbalance(float current_balance);
int main()
{
/* Declare Variables */
int num_withdrawals, num_deposits, x;
float deposits[50] = {0.0}; 
float withdrawals[50] = {0.0}; 
float current_balance = {0.0};
float start_balance = {0.0};
char first_name[20];

/* Output initial greeting */
printf("Welcome to the Sears Banking System.\n");
printf("Please enter your first name: ");
scanf("%s", first_name);
fflush(stdin);
printf("\nHello, %s\n\n", first_name);

/* Prompt user for current balance. */

start_balance = get_startingbalance();

printf("You entered %.2f ", start_balance);

getchar();



} /* end main */
/*START FUNCTION GET STARTING BALANCE*/

float get_startingbalance()
{
float start_bal;
do
{
printf("Please enter your current balance in dollars and cents: ");
scanf("%f", &start_bal);
fflush(stdin);
if(start_bal < 0)
printf("Invalid entry. Starting balance must be at least zero!\n\n");
}while(start_bal < 0); /*END DO WHILE*/

return start_bal;

} /* end function get starting balance */
/*START FUNCTION GET NUMBER OF WITHDRAWLS*/

float getCntOfWithdrawls()
{
float num_withdrawls
do
{
printf ("\nEnter the number of withdrawals: ");
scanf ("%i",&num_withdrawals);
fflush (stdin);
if (num_withdrawals < 0 || num_withdrawals > 50)
printf ("Error: Number of withdrawals must be between zero and 50, please re-enter!\n\n");
} while (num_withdrawals < 0 || number_withdrawals > 50); /* end do-while trap loop */

return num_withdrawls;

}/* end function number of withdrawls */
/*START FUNCTION GET NUMBER OF DEPOSITS*/

float getCntOfDeposits()
{
float num_deposits
do
{
printf ("\nEnter the number of deposits: ");
scanf ("%i",&num_deposits);
fflush (stdin);
if ( num_deposits < 0 || number_deposits > 50)
printf ("Error: Number of deposits must be between 0 and 50, please re-enter!\n\n");
} while (number_deposits < 0 || number_deposits > 50); /* end do-while trap loop */
  
return num_deposits;

}/* end function number of deposits */
/*START FUNCTION GET EACH DEPOSIT*/

float getEachDeposit()
{
float num_deposits
for (x = 1; x <= num_deposits; x++)
{
do
{
printf ("Enter the amount of deposit #%i: ", x);
scanf ("%f",&deposits[x]);
fflush (stdin);
if (deposits[x] <= 0)
printf ("*** Deposit amount must be greater than zero. Please re-enter! ***\n");
} while (deposits[x] <= 0);
total_deposits = total_deposits + deposits[x];
}/*end for loop*/
/*end function get each deposit*/
/*START FUNCTION GET EACH WITHDRAWL*/

float getEachWithdrawl()
{
float num_withdrawls
for (x = 1; x <= num_withdrawals; x++)
{
do
{
printf ("Enter the amount of withdrawal #%i: ", x);
scanf ("%f",&withdrawals[x]);
fflush (stdin);
if (withdrawals[x] > current_balance)
printf ("***Withdrawal amount exceeds current balance.***\n");
else
if (withdrawals[x] <= 0)
printf ("*** Withdrawal amout must be greater than zero. Please re-enter! ***");
} while (withdrawals[x] > current_balance || withdrawals[x] <= 0); /* end do-while loop */
total_withdrawals = total_withdrawals + withdrawals[x];
/*end function get each withdrawl*/
/*START FUNCTION CHECK BALANCE*/

float checkBalance()
{
float current_balance
balance = current_balance - total_withdrawals + total_deposits;
if (balance == 0)
{
printf ("\n *** Balance is now zero. No more withdrawals can be made at this time. ***\n");
num_withdrawals = x;
break;
} /*end-if*/
} /*end for loop*/
/*end function check balance*/
/*START FUNCTION CALC AND DISPLAY BALANCE*/

float calcAndDisplayBalance()
{
printf ("\n*** Your closing balance is $%.2f, %s*** \n", balance, first_name);
if (balance >= 5000.00)
printf ("*** Time to invest some money!*** \n\n");
else if (balance >= 15000.00 && balance <= 49999.99)
printf ("*** Maybe you should consider a CD.*** \n\n");
else if (balance >= 1000.00 && balance <= 14999.99)
printf ("*** Keep up the good work.*** \n\n");
else
printf ("*** %s, your balance is getting low!*** \n\n", first_name);
}/*end-if*/
/*end function calc and display balance*/
/*START FUNCTION DISPLAY BANK RECORD*/

float displayBankRecord()
printf ("     *** Bank Record ***\n");
printf ("\nStarting Balance:$   %13.2f\n\n", current_balance);
for (x = 1; x <= number_of_deposits; x++)
{
printf ("Deposit #%i:          %13.2f\n", x, deposits[x]);
}
for (x = 1; x <= number_of_withdrawals; x++)
{
printf ("\nWithdrawal  #%i:      %13.2f", x, withdrawals[x]);
}
printf ("\n\nEnding Balance is:$  %13.2f\n", balance);
/*end function display bank record*/
```
Can someone tell me if I am on the right track? I have to admit that using function is really confusing me for some reason.


----------



## jamiemac2005 (Jul 5, 2007)

What you have so far looks fine, you've done everything as you have to. Well done =]... As long as you understand why functions are used and how to use them right now the more practice you get the easier it will seem.

Glad you sorted it out,
Jamey


----------



## snowman7000 (Apr 2, 2008)

Sleepwalker817 said:


> Can someone tell me if I am on the right track? I have to admit that using function is really confusing me for some reason.


Try not to think about functions as normal code where you know what information you start with and end with. Some argue you should not access global variables with function, that all the data they need to work should be passed to them.

ex: 
int sum( int x, int y ); // you know want you start with and will always get x + y as result.


// assuming included time.h of c standard library
time_t now;
time( now ); // system will fill the structure with the current time.






I am a little curious why you seem to be interested in learning c and avoiding c++. In c++ it expands the concepts of functions so they protect your data, without global variables. In classes the functions (also called methods) have access to the data passed to them as parameters and the variables declared in the class. You declared classes like the default c types;

class account{

int AccountNumber;
double Balance;
vector<transaction> History;
name CustomerName;

double loadHistory(); // I am assuming that the bank would store their history in database, so lets say it gets history for this AccountNumber 

public:

account( int account_number ): AccountNumber(account_number){
loadHistory();
}

double getBalance();
vector<double>& getDeposits(); // returns an array of all transactions that change is positive
vector<double>& getWithdrawls(); // returns an array of all transactions that are negative
double displayBankRecord(); // I was not sure what you were going for here, floats are not usually used for status codes 

bool makeDeposit( double amount );
bool makeWithdrawl( double amount );
void payInterest( double percent );

friend ostream& operator<<( ostream &os, const account &a );

};

ostream& operator<<( ostream &os, const account &a ){
os << "Current Account Balance of " << CustomerName << " $" << Balance << ". Thank you for banking with us.";
return os;
}

This organizations simplifies handling multiple accounts at once, and reuse of code. It also limits the number of ways that data can be changed to those that if needed will verify that the data will not be corrupted. It also reduces conflict when multiple files are included, even more so if namespaces are used.


A function here would screen the data to change then do it and return true, if problem occurs return false. 
Note: this is an example you would probably use either an exception or at least a return code in real life, and more validation.

bool makeDeposit( double amount ){
if( amount < 0 ) return false;

Balance += amount;

time_t now;
time( now );

transaction NewTransaction( amount, now );

History.push_back( NewTransaction );
History.storeChangesToDatabase(); // not a actual method of vector class but imagine it is for this example
}




Using a class:

int MyAccountNumber = 555555555;
account MySavingsAccount( MyAccountNumber );

cout << MySavingsAccount << endl;

MySavingsAccount.makeDeposit( 500.00 );
MySavingsAccount.makeWithdrawl( 100.00 );

cout << MySavingsAccount << endl;


Would print out:

Current Account Balance of Snowman $10000. Thank you for banking with us.
Current Account Balance of Snowman $10400. Thank you for banking with us.


----------

