Need help understanding program control/flow.

B

Buck Rogers

Hi all! Newbie here.

Below is an example from Teach Yourself C in 21 Days. My apologies
if it is a bit long.

What I don't understand is how the "get_data" function can call the
"continue_function", and if NO is returned to "get_data", display_report
executes and the program ends? Basically I am having trouble understanding
the program flow within the "if" loop in the "main" function.

The "if" loops only initiates if cont=YES, so what happens if a function
in the loop(in this case get_data) gets cont=NO? Does this really mean
that if "something" within an "if" loop doesn't meet the condition of the
loop,
the result is that the next statement below the "something" gets executed
and the the "if" loop is exited?

Hope I made myself clear.

Thanks in advance!

===============================================================================
#include <stdio.h>

#define MAX 100
#define YES 1
#define NO 0

/*--------------------*/
/* variables */
/*--------------------*/

long income[MAX]; /* to hold incomes */
int month[MAX], day[MAX], year[MAX]; /* to hold birthdays */
int x, y, ctr; /* For counters */
int cont; /* For program control */
long month_total, grand_total; /* For totals */

/*--------------------*/
/* function prototypes*/
/*--------------------*/

int main(void);
int display_instructions(void);
void get_data(void);
void display_report(void);
int continue_function(void);

/*--------------------*/
/* start of program */
/*--------------------*/

int main(void)
{
cont = display_instructions();

if ( cont == YES ) /* <================================ LOOK HERE!
*/
{
get_data();
display_report();
}
else
printf( "\nProgram Aborted by User!\n\n");

return 0;
}
/*-----------------------------------------------------------*
* Function: display_instructions() *
* Purpose: This function displays information on how to *
* use this program and asks the user to enter 0 *
* to quit, or 1 to continue. *
* Returns: NO - if user enters 0 *
* YES - if user enters any number other than 0 *
*-----------------------------------------------------------*/
int display_instructions( void )
{
printf("\n\n");
printf("\nThis program enables you to enter up to 99 people\'s ");
printf("\nincomes and birthdays. It then prints the incomes by");
printf("\nmonth along with the overall income and overall average.");
printf("\n");

cont = continue_function();
return( cont );
}
/*-------------------------------------------------------------*
* Function: get_data() *
* Purpose: This function gets the data from the user. It *
* continues to get data until either 100 people are *
* entered, or until the user enters 0 for the month.*
* Returns: nothing *
* Notes: This allows 0/0/0 to be entered for birthdays in *
* case the user is unsure. It also allows for 31 *
* days in each month. *
*-------------------------------------------------------------*/

void get_data(void)
{
for ( cont = YES, ctr = 0; ctr < MAX && cont == YES; ctr++ )
{
printf("\nEnter information for Person %d.", ctr+1 );
printf("\n\tEnter Birthday:");

do
{
printf("\n\tMonth (0 - 12): ");
scanf("%d", &month[ctr]);
}while (month[ctr] < 0 || month[ctr] > 12 );

do
{
printf("\n\tDay (0 - 31): ");
scanf("%d", &day[ctr]);
}while ( day[ctr] < 0 || day[ctr] > 31 );

do
{
printf("\n\tYear (0 - 2002): ");
scanf("%d", &year[ctr]);
}while ( year[ctr] < 0 || year[ctr] > 2002 );

printf("\nEnter Yearly Income (whole dollars): ");
scanf("%ld", &income[ctr]);

cont = continue_function(); /*
<===================================== LOOK HERE! */
}
/* ctr equals the number of people that were entered. */
}
/*----------------------------------------------------------*
* Function: display_report() *
* Purpose: This function displays a report to the screen *
* Returns: nothing *
* Notes: More information could be printed. *
*----------------------------------------------------------*/

void display_report()
{
grand_total = 0;
printf("\n\n\n"); /* skip a few lines */
printf("\n SALARY SUMMARY");
printf("\n ==============");

for( x = 0; x <= 12; x++ ) /* for each month, including 0*/
{
month_total = 0;
for( y = 0; y < ctr; y++ )
{
if( month[y] == x )
month_total += income[y];
}
printf("\nTotal for month %d is %ld", x, month_total);
grand_total += month_total;
}
printf("\n\nReport totals:");
printf("\nTotal Income is %ld", grand_total);
printf("\nAverage Income is %ld", grand_total/ctr );

printf("\n\n* * * End of Report * * *\n");
}
/*----------------------------------------------------------------*
* Function: continue_function() *
* Purpose: This function asks the user if they wish to continue.*
* Returns: YES - if user wishes to continue *
* NO - if user wishes to quit *
*----------------------------------------------------------------*/

int continue_function( void )
{
printf("\n\nDo you wish to continue? (0=NO/1=YES): ");
scanf( "%d", &x );

while( x < 0 || x > 1 )
{
printf("\n%d is invalid!", x);
printf("\nPlease enter 0 to Quit or 1 to Continue: ");
scanf("%d", &x);
}
if(x == 0)
return(NO);
else
return(YES);
}
==================================================================================
 
R

Richard Heathfield

Buck Rogers said:
Hi all! Newbie here.

People have been posting using the name "Buck Rogers" for around four years.
I sincerely hope all those articles are not from you, because if you've
taken four years to get this far in your studies, it might be time to call
it a day. If you're a fresh-faced learner who is just starting out, though,
then forget I said anything (but possibly pick a name that is more likely
to be unique!).

Below is an example from Teach Yourself C in 21 Days. My apologies
if it is a bit long.

It is also badly-written, so - if you *must* use that book - be prepared to
unlearn some bad habits and some misconceptions later on.

What I don't understand is how the "get_data" function can call the
"continue_function", and if NO is returned to "get_data", display_report
executes and the program ends? Basically I am having trouble understanding
the program flow within the "if" loop in the "main" function.

"if" is not a loop construct. It's selection, not iteration.
The "if" loops only initiates if cont=YES, so what happens if a function
in the loop(in this case get_data) gets cont=NO?

On receiving a return value of NO from continue_function(), get_data()
terminates its loop on the next test, i.e. just about immediately, and
exits. Control now returns to the caller, within main(). The statement just
processed was get_data(), so control now flows to the next statement along,
which is display_report(). Therefore, display_report() is executed.




Does this really mean
that if "something" within an "if" loop doesn't meet the condition of the
loop,
the result is that the next statement below the "something" gets executed
and the the "if" loop is exited?

Hope I made myself clear.

Thanks in advance!

===============================================================================
#include <stdio.h>

#define MAX 100
#define YES 1
#define NO 0

/*--------------------*/
/* variables */
/*--------------------*/

long income[MAX]; /* to hold incomes */
int month[MAX], day[MAX], year[MAX]; /* to hold birthdays */
int x, y, ctr; /* For counters */
int cont; /* For program control */
long month_total, grand_total; /* For totals */

/*--------------------*/
/* function prototypes*/
/*--------------------*/

int main(void);
int display_instructions(void);
void get_data(void);
void display_report(void);
int continue_function(void);

/*--------------------*/
/* start of program */
/*--------------------*/

int main(void)
{
cont = display_instructions();

if ( cont == YES ) /* <================================ LOOK
HERE!
*/
{
get_data();
display_report();
}
else
printf( "\nProgram Aborted by User!\n\n");

return 0;
}
/*-----------------------------------------------------------*
* Function: display_instructions() *
* Purpose: This function displays information on how to *
* use this program and asks the user to enter 0 *
* to quit, or 1 to continue. *
* Returns: NO - if user enters 0 *
* YES - if user enters any number other than 0 *
*-----------------------------------------------------------*/
int display_instructions( void )
{
printf("\n\n");
printf("\nThis program enables you to enter up to 99 people\'s ");
printf("\nincomes and birthdays. It then prints the incomes by");
printf("\nmonth along with the overall income and overall average.");
printf("\n");

cont = continue_function();
return( cont );
}
/*-------------------------------------------------------------*
* Function: get_data() *
* Purpose: This function gets the data from the user. It *
* continues to get data until either 100 people are *
* entered, or until the user enters 0 for the month.*
* Returns: nothing *
* Notes: This allows 0/0/0 to be entered for birthdays in *
* case the user is unsure. It also allows for 31 *
* days in each month. *
*-------------------------------------------------------------*/

void get_data(void)
{
for ( cont = YES, ctr = 0; ctr < MAX && cont == YES; ctr++ )
{
printf("\nEnter information for Person %d.", ctr+1 );
printf("\n\tEnter Birthday:");

do
{
printf("\n\tMonth (0 - 12): ");
scanf("%d", &month[ctr]);
}while (month[ctr] < 0 || month[ctr] > 12 );

do
{
printf("\n\tDay (0 - 31): ");
scanf("%d", &day[ctr]);
}while ( day[ctr] < 0 || day[ctr] > 31 );

do
{
printf("\n\tYear (0 - 2002): ");
scanf("%d", &year[ctr]);
}while ( year[ctr] < 0 || year[ctr] > 2002 );

printf("\nEnter Yearly Income (whole dollars): ");
scanf("%ld", &income[ctr]);

cont = continue_function(); /*
<===================================== LOOK HERE! */
}
/* ctr equals the number of people that were entered. */
}
/*----------------------------------------------------------*
* Function: display_report() *
* Purpose: This function displays a report to the screen *
* Returns: nothing *
* Notes: More information could be printed. *
*----------------------------------------------------------*/

void display_report()
{
grand_total = 0;
printf("\n\n\n"); /* skip a few lines */
printf("\n SALARY SUMMARY");
printf("\n ==============");

for( x = 0; x <= 12; x++ ) /* for each month, including 0*/
{
month_total = 0;
for( y = 0; y < ctr; y++ )
{
if( month[y] == x )
month_total += income[y];
}
printf("\nTotal for month %d is %ld", x, month_total);
grand_total += month_total;
}
printf("\n\nReport totals:");
printf("\nTotal Income is %ld", grand_total);
printf("\nAverage Income is %ld", grand_total/ctr );

printf("\n\n* * * End of Report * * *\n");
}
/*----------------------------------------------------------------*
* Function: continue_function() *
* Purpose: This function asks the user if they wish to continue.*
* Returns: YES - if user wishes to continue *
* NO - if user wishes to quit *
*----------------------------------------------------------------*/

int continue_function( void )
{
printf("\n\nDo you wish to continue? (0=NO/1=YES): ");
scanf( "%d", &x );

while( x < 0 || x > 1 )
{
printf("\n%d is invalid!", x);
printf("\nPlease enter 0 to Quit or 1 to Continue: ");
scanf("%d", &x);
}
if(x == 0)
return(NO);
else
return(YES);
}
==================================================================================
 
V

Vladimir Oka

Buck said:
Hi all! Newbie here.

Below is an example from Teach Yourself C in 21 Days. My apologies
if it is a bit long.

What I don't understand is how the "get_data" function can call the
"continue_function", and if NO is returned to "get_data", display_report
executes and the program ends? Basically I am having trouble understanding
the program flow within the "if" loop in the "main" function.

The "if" loops only initiates if cont=YES, so what happens if a function
in the loop(in this case get_data) gets cont=NO? Does this really mean
that if "something" within an "if" loop doesn't meet the condition of the
loop,
the result is that the next statement below the "something" gets executed
and the the "if" loop is exited?

Hope I made myself clear.

What seems clear is that you need to go back and carefully study a good
C textbook, and I mean it in the nicest possible way.

There is no such thing as "if loop". The way `if` *statement* works is
this:

if (condition) {
/* "then" block */
} else {
/* "else" block */
}
/* "next" statement */

If `condition` (which is an expression) is non-zero, statements in the
"then" block get executed. Otherwise, statements in the "else" block
get executed. Once one of them is executed, the execution continues
with the "next" statement.

The "else" block is optional. If omitted, and the `condition` is zero,
the execution continues with the "next" statement.

In both "then" and "else" blocks curly braces are requied only if the
blocks contain more than one statement. So, you can have:

if (condition)
printf("true\n");
else
printf("false\n");

Note how the "then" statement still has to have a terminating ';'.

I'm sure your textbook (but apparently not the "...in 21 days" one) can
describe this much better, and in greater detail. I'm also sure someone
will shortly come along and correct any mistakes I made, but I think I
put across the most important things you seem to have misunderstood.

I recommend you get yourself K&R2, and read it.
Thanks in advance!

===============================================================================
#include <stdio.h>

#define MAX 100
#define YES 1
#define NO 0

/*--------------------*/
/* variables */
/*--------------------*/

long income[MAX]; /* to hold incomes */
int month[MAX], day[MAX], year[MAX]; /* to hold birthdays */
int x, y, ctr; /* For counters */
int cont; /* For program control */
long month_total, grand_total; /* For totals */

/*--------------------*/
/* function prototypes*/
/*--------------------*/

int main(void);
int display_instructions(void);
void get_data(void);
void display_report(void);
int continue_function(void);

/*--------------------*/
/* start of program */
/*--------------------*/

int main(void)
{
cont = display_instructions();

if ( cont == YES ) /* <================================ LOOK HERE!
*/
{
get_data();
display_report();
}
else
printf( "\nProgram Aborted by User!\n\n");

return 0;
}
/*-----------------------------------------------------------*
* Function: display_instructions() *
* Purpose: This function displays information on how to *
* use this program and asks the user to enter 0 *
* to quit, or 1 to continue. *
* Returns: NO - if user enters 0 *
* YES - if user enters any number other than 0 *
*-----------------------------------------------------------*/
int display_instructions( void )
{
printf("\n\n");
printf("\nThis program enables you to enter up to 99 people\'s ");
printf("\nincomes and birthdays. It then prints the incomes by");
printf("\nmonth along with the overall income and overall average.");
printf("\n");

cont = continue_function();
return( cont );
}
/*-------------------------------------------------------------*
* Function: get_data() *
* Purpose: This function gets the data from the user. It *
* continues to get data until either 100 people are *
* entered, or until the user enters 0 for the month.*
* Returns: nothing *
* Notes: This allows 0/0/0 to be entered for birthdays in *
* case the user is unsure. It also allows for 31 *
* days in each month. *
*-------------------------------------------------------------*/

void get_data(void)
{
for ( cont = YES, ctr = 0; ctr < MAX && cont == YES; ctr++ )
{
printf("\nEnter information for Person %d.", ctr+1 );
printf("\n\tEnter Birthday:");

do
{
printf("\n\tMonth (0 - 12): ");
scanf("%d", &month[ctr]);
}while (month[ctr] < 0 || month[ctr] > 12 );

do
{
printf("\n\tDay (0 - 31): ");
scanf("%d", &day[ctr]);
}while ( day[ctr] < 0 || day[ctr] > 31 );

do
{
printf("\n\tYear (0 - 2002): ");
scanf("%d", &year[ctr]);
}while ( year[ctr] < 0 || year[ctr] > 2002 );

printf("\nEnter Yearly Income (whole dollars): ");
scanf("%ld", &income[ctr]);

cont = continue_function(); /*
<===================================== LOOK HERE! */
}
/* ctr equals the number of people that were entered. */
}
/*----------------------------------------------------------*
* Function: display_report() *
* Purpose: This function displays a report to the screen *
* Returns: nothing *
* Notes: More information could be printed. *
*----------------------------------------------------------*/

void display_report()
{
grand_total = 0;
printf("\n\n\n"); /* skip a few lines */
printf("\n SALARY SUMMARY");
printf("\n ==============");

for( x = 0; x <= 12; x++ ) /* for each month, including 0*/
{
month_total = 0;
for( y = 0; y < ctr; y++ )
{
if( month[y] == x )
month_total += income[y];
}
printf("\nTotal for month %d is %ld", x, month_total);
grand_total += month_total;
}
printf("\n\nReport totals:");
printf("\nTotal Income is %ld", grand_total);
printf("\nAverage Income is %ld", grand_total/ctr );

printf("\n\n* * * End of Report * * *\n");
}
/*----------------------------------------------------------------*
* Function: continue_function() *
* Purpose: This function asks the user if they wish to continue.*
* Returns: YES - if user wishes to continue *
* NO - if user wishes to quit *
*----------------------------------------------------------------*/

int continue_function( void )
{
printf("\n\nDo you wish to continue? (0=NO/1=YES): ");
scanf( "%d", &x );

while( x < 0 || x > 1 )
{
printf("\n%d is invalid!", x);
printf("\nPlease enter 0 to Quit or 1 to Continue: ");
scanf("%d", &x);
}
if(x == 0)
return(NO);
else
return(YES);
}
==================================================================================
 
R

Richard Heathfield

Vladimir Oka said:
What seems clear is that you need to go back and carefully study a good
C textbook, and I mean it in the nicest possible way.

I was about to give you a mild slapping for forgetting to trim all that code
you didn't comment on. But... er... well... <blush fgcolor="bright red">
 
B

Buck Rogers

People have been posting using the name "Buck Rogers" for around four
years.
I sincerely hope all those articles are not from you, because if you've
taken four years to get this far in your studies, it might be time to
call
it a day.


LMAO! Yep, it's me again! Good to C you again! C was and still is just
a hobby. Back then I didn't take it very seriously, and eventually gave
it up. Recently, I tried twice to sell the book(Teach Yourself C in 21
Days) on ebay, with no buyer. So I thought I'd give it another go before
giving it another go before I give it to charity, or throw it in the trash.
So here I am. Still a newbie 4 years later - probably for the rest of my
life! :D
It is also badly-written, so - if you *must* use that book - be prepared
to
unlearn some bad habits and some misconceptions later on.

Yep, there's heaps of typo and mistakes in it, but it's good I am picking
those up, since I am taking it a bit more C-riously this time around. I am
just using it to get my toe in the C water. For a reference, I have "A book
on C", by Kelley/Pohl, which is very terse, but seems to have a better
reputation.

On receiving a return value of NO from continue_function(), get_data()
terminates its loop on the next test, i.e. just about immediately, and
exits. Control now returns to the caller, within main(). The statement
just
processed was get_data(), so control now flows to the next statement
along,
which is display_report(). Therefore, display_report() is executed.

Thanks for your help. I remember you helping me heaps years ago. :D
C you around like a fruit loop!!

Buck.
 
V

Vladimir Oka

Richard said:
Vladimir Oka said:


I was about to give you a mild slapping for forgetting to trim all that code
you didn't comment on. But... er... well... <blush fgcolor="bright red">

Great minds think alike -- even when they mess things up. ;-)

[In my defence, I'm forced to use Google from the office.]
 
P

pete

Richard said:
Buck Rogers said:

It is also badly-written,
so - if you *must* use that book - be prepared to
unlearn some bad habits and some misconceptions later on.

That's the book I learned from.
The unlearning should take about two years on clc.
 
V

void * clvrmnky()

Buck said:
LMAO! Yep, it's me again! Good to C you again! C was and still is just
a hobby. Back then I didn't take it very seriously, and eventually gave
it up. Recently, I tried twice to sell the book(Teach Yourself C in 21
Days) on ebay, with no buyer. So I thought I'd give it another go before
giving it another go before I give it to charity, or throw it in the trash.
So here I am. Still a newbie 4 years later - probably for the rest of my
life! :D
That should have been your first warning. Recycle the book and get one
of the titles recommended elsewhere.

That being said, there is no shame in taking the long road. You will be
expected to put in the hours, however.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top