Re: Need help understanding program control/flow.




Buck Rogers wrote:
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);
}
==================================================================================

.



Relevant Pages

  • Re: Need help understanding program control/flow.
    ... "if" is not a loop construct. ... int display_instructions; ... void display_report; ... Purpose: This function gets the data from the user. ...
    (comp.lang.c)
  • Need help understanding program control/flow.
    ... int display_instructions; ... void display_report; ... cont = display_instructions; ... Purpose: This function gets the data from the user. ...
    (comp.lang.c)
  • Re: Execution Problem w/memory object
    ... >> rather than void main. ... >> promoting the void mainapproach, without even mentioning the int ... Online tutorial aren't a good way to learn the language. ... compiler raises a warning but does allow program execution. ...
    (comp.lang.cpp)
  • Re: (Info) Test Your C Programming Strengths
    ... sufficient to store an int. ... Now, by declaring main as void, you end up with soemthing different: ... So the execution ... there any guarantee that the seqeuence of bytes stored at that address ...
    (comp.lang.c)
  • Re: Access violation at the end of the program
    ... Not, while the AV itself isn't a strange thig, ... "return" the execution jumps to some strange locatin, ... void RetrieveDateTime; ... void LogEvent2File(FILE *file, int event_counter); ...
    (microsoft.public.vc.language)